home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
TURBODSG
/
DCHECK.MQC
/
DCHECK.MAC
Wrap
Text File
|
2000-06-30
|
6KB
|
427 lines
; DCHECK v1.00 - DUPCHECK two better - by ESKAY
;
cr equ 0dh
lf equ 0ah
;
.z80
.request syslib
;
start: ld sp,stack
call print##
cr,lf,lf,lf
' ------------------------------------------------',cr,lf
' | DCHECK v1.00 22 Jun 85 by ESKAY |',cr,lf
' | Disk Check Program displays missing and double |',cr,lf
' | allocation blocks and affected file names. |',cr,lf
' ------------------------------------------------'
cr,lf,lf,0
ld a,(5ch)
or a
jr nz,havdrv
call print##
'ERROR: no drive specified',cr,lf,7,0
rst 0
;
havdrv: ld c,14 ; select the drive
ld e,a
dec e
call bdos##
ld c,19
call 50h ; return alloc info
cp 0ffh
jr nz,netok
call print##
'Network error',7,cr,lf,0
rst 0
;
netok: ld a,h
or a
jr nz,alocok
call print##
'ERROR: cannot process small drives',cr,lf,7,0
rst 0
;
alocok: call print##
'Loading allocation map...',cr,lf,0
call codend##
ld (bitmap),hl
push hl
pop ix
ld bc,4000h
..zl: ld (hl),0
inc hl
dec bc
ld a,b
or c
jr nz,..zl
ld de,dirfcb
call f$open##
rlp: call f$read##
ld iy,80h
..rl1: ld a,(iy+15)
cp 0ffh ; dirlbl?
jr z,..sklb ; yes
cp 0feh ; bitmap?
jr nz,endmap ; no, end of map
inc iy
ld ix,(bitmap)
ld b,14 ; 14 bytes to move
call movxy
inc iy
ld b,16
call movxy
ld a,(iy)
cp 0e5h
ld (bitmap),ix
jr z,..rl1
jr rlp
;
..sklb: ld iy,0a0h
jr ..rl1
;
movxy: ld a,(iy)
ld (ix),a
inc ix
inc iy
djnz movxy
ret
;
; bit map read into ram
;
endmap: push ix
pop hl
ld l,0
inc h
ld (newmap),hl
ld de,dirfcb
call f$close##
call print##
'Checking for unallocated blocks...',cr,lf,0
ld a,'?'
ld (dirfcb),a
call codend##
ld (bitmap),hl
ld de,dirfcb
ld c,17
call bdos##
loop: ld de,dirfcb
ld c,18
call bdos##
cp 0ffh
jp z,done
ld b,a
or a
jr nz,..ski
ld hl,(testc)
inc hl
ld (testc),hl
..ski: inc b
ld a,80h
ld c,20h
..c: dec b
jr z,..dn
add a,c
jr ..c
..dn: ld l,a
ld h,0
ld a,(hl)
cp 0e5h
jr z,loop
push hl
push hl
pop hl
ld (fnptr),hl
pop de
ld b,8
ld de,10h
add hl,de
..ram: ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,d
or e
jr nz,..ram1
djnz ..ram
jr ..ramq
;
..ram1: ex de,hl
push de
push bc
call bitchk
pop bc
pop hl
djnz ..ram
..ramq: xor a
ld (noprev),a
ld (double),a
jp loop
;
bitchk: ld (blocka),hl
call bitclc
ld b,a
inc b
ld a,1
..bitc: dec b
jr z,..bitd
add a,a
jr ..bitc
;
..bitd: ld de,(newmap)
push hl
add hl,de
ld b,a
ld a,(hl)
and b
call nz,barfdb ; double alloc
ld a,b
or (hl)
ld (hl),a
pop hl
ld de,(bitmap)
add hl,de
ld a,(hl)
and b
ret nz
ld a,1
ld (noprev),a
push de
push hl
ld hl,(blocka)
call print##
cr,lf
'Unallocated block # ',0
call phl4hc##
call print##
' in file ',0
ld de,(fnptr)
ld a,(de)
inc de
call pafdc##
ld c,25
call bdos##
add a,'A'
call cout##
ld a,':'
call cout##
call pfn1##
pop hl
pop de
ret
;
barfdb: ld a,1
ld (double),a
push de
push hl
ld de,(blocka)
ld hl,(dptr)
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (dptr),hl
ld hl,dnum
inc (hl)
pop hl
pop de
ret
;
done: ld a,(dnum)
or a
jr nz,dodbls
call print##
cr,lf
'No duplicate blocks found.',cr,lf,lf,0
rst 0
;
; go through directory again (with sfirst/snext) and display
; names of all files and the allocation block address in
; question if it is a multiple.
;
dodbls: call print##
cr,lf
'Checking for multiple allocation blocks...',cr,lf,0
ld de,dirfcb
ld c,17
call bdos## ; swallow dir label
dodlp: ld de,dirfcb
ld c,18
call bdos##
cp 0ffh
jp z,finish
ld b,a
inc b
ld a,80h
ld c,20h
..c1: dec b
jr z,..dn1
add a,c
jr ..c1
;
..dn1: ld l,a
ld h,0
ld a,(hl)
cp 0e5h ; erased?
jr z,dodlp ; yes, do next
push hl ; save filename ptr
ld de,16
add hl,de ; point to allocation blocks
ld b,8 ; up to 8 to check
alckl: ld e,(hl)
inc hl
ld d,(hl)
inc hl
call chkdup ; check if it's a dupe
jr c,isdp ; if it is, show filename
djnz alckl
pop hl
jr dodlp
;
isdp: call print##
cr,lf
'Multiple alloc : ',0
pop de ; get filename ptr
push de
ld a,(de) ; get user area
cp 10
jr nc,..nt10
ld a,' '
call cout##
..nt10: ld a,(de)
inc de
call pafdc##
ld c,25
call bdos##
add a,'A'
call cout##
ld a,':'
call cout##
call pfn1##
call print##
' - ',7,0
pop hl
ld de,16
add hl,de
ld b,8
..dall: ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,d
or e
jp z,dodlp
ex de,hl
call phl4hc##
ex de,hl
ld a,' '
call cout##
djnz ..dall
jp dodlp
;
; check for duplicate, preserve hl,de,bc
;
chkdup: push hl
push de
push bc
ld a,d
or e
jr z,chkdux
ld hl,doubla ; pointer to list
ld a,(dnum) ; length of list in words
ld b,a ; counter
chkdu1: ld a,(hl)
inc hl
cp e
jr z,chkdum
inc hl
jr chkdu2
;
chkdum: ld a,(hl)
inc hl
cp d
jr z,chkduf
chkdu2: djnz chkdu1
xor a
jr chkdux
;
chkduf: scf
chkdux: pop bc
pop de
pop hl
ret
;
; this routine is passed a bitmap address in HL.
; In HL, the relative byte address is returned, A has the bit number.
;
bitclc: ld a,l
and 7
push af
ld a,l
and 0f8h
ld l,a
pop af
or a
srl h
rr l
srl h
rr l
srl h
rr l
ret
;
; done after finding stuff
;
finish: call print##
cr,lf,lf
'*** AFFECTED BLOCK ADDRESS(ES):',cr,lf,0
ld a,(dnum)
ld b,a
ld hl,doubla
finilp: ld e,(hl)
inc hl
ld d,(hl)
inc hl
ex de,hl
ld a,b
and 7
call z,crlf##
call phl4hc##
ex de,hl
call print
' ',0
djnz finilp
call print##
cr,lf,lf
'DCHECK completed - check all multiply allocated files, then',cr,lf
'cause everyone to log off. Delete bad files and IMMEDIATELY',cr,lf
'execute the FIXMAP command to prevent further damage.',cr,lf,lf,0
rst 0
;
noprev: db 0
double: db 0
lps: db 20
testc: dw 0
newmap: dw 0 ; new bitmap
bitmap: dw 0 ; bitmap base
blocka: dw 0 ; block to be tested
dirfcb: db 0,'$ DIR',0,0,0,0
ds 22
;
; storage for doubles:
;
dnum: db 0
dptr: dw doubla
doubla: ds 200 ; enough!
;
fnptr: dw 0
;
ds 100
stack equ $
end
bit number.
;
bitclc: ld a,l
and 7
push af