home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
tdossigi
/
delall.mqc
/
DELALL.MAC
Wrap
Text File
|
1986-07-05
|
6KB
|
282 lines
; DELALL - delete all (junk) files
;
; this program has two modes:
; 1. NO ARGUMENT:
; deletes all *.BAK, *.$$$ and -PRINT-?.??? files on current drive
; 2. FILENAME ARGUMENT:
; deletes all files matching filespec, ignoring drive/user
;
; N_O_T_E
;
; THIS PROGRAM ACTS ON ALL USER AREAS AT ONCE AND MAY ONLY BE RUN
; BY A PRIVILEGED USER!
; DUE TO THE NATURE OF THE PROGRAM, I SPECIFICALLY DISCLAIM *ANYTHING*
; INCLUDING USABILITY OF THE PROGRAM. THE AUTHOR MUST NOT BE HELD
; RESPONSIBLE FOR THE USE OF OR BUGS IN THE PROGRAM. IT IS THUS THE
; OPERATOR'S SOLE RESPONSIBILITY TO MAKE SURE THE PROGRAM REALLY
; WORKS AS CLAIMED.
; SOURCE IS PROVIDED FOR THE KNOWLEDGEABLE USER TO BE ABLE TO SEE THAT
; THERE REALLY ARE NO BOOBY TRAPS IN THIS CODE.
; ESKAY SOFTWARE, S. KLUGER, 7120 SKILLMAN #2104, DALLAS TX 75231
; PHONE (214) 553-1363
;
cr equ 0dh
lf equ 0ah
sfirst equ 17
snext equ 18
delete equ 19
getdr equ 25
gsusr equ 32
priv equ 12
cfunc equ 5
tfunc equ 50h
;
; syslib calls are used throughout and denoted by "##"
;
.request syslib
.z80
;
; data section
;
dseg
;
bakfn: db '????????BAK'
dolfn: db '????????$$$'
prtfn: db '-PRINT-????'
cusfn: db ' ' ; custom filename
;
cusflg: db 0 ; custom file flag
countd: dw 0 ; count of deleted files
countt: dw 0 ; count of attempts
;
delfcb: db 0,' ',0,0,0,0 ; delete file fcb
ds 22
;
srhfcb: db '?' ; dummy search fcb
ds 100
stack equ $
;
; code section
;
cseg
;
start: ld sp,stack
ld c,priv ; check if privileged
call tfunc
bit 7,b
jr nz,..isp
call print##
cr,lf,lf,7
'ERROR: non-privileged user',cr,lf,lf,0
rst 0
;
..isp: ld hl,5dh ; point to possible argument
ld a,(hl)
cp ' ' ; no arg?
jr z,..narg
ld de,cusfn
ld bc,11
ldir
ld a,0ffh
ld (cusflg),a
..narg: call print##
cr,lf
' ---------------------------------'
cr,lf
' | DELALL v1.10 by ESKAY |'
cr,lf,0
ld a,(cusflg)
or a
jr z,..na1
call print##
' | Deletes specified files in all |',cr,lf
' | user areas on current drive |',cr,lf,0
jr ..na2
;
..na1: call print##
' | Deletes BAK,$$$ and PRINT files |',cr,lf
' | in all user areas on this drive |',cr,lf,0
..na2: call print##
' ---------------------------------'
cr,lf,lf,0
ld hl,5dh ; point to argument
ld a,(cusflg) ; custom filename?
or a
jp z,..na3 ; no, continue normally
ld b,11 ; 11 chars to check
ld a,'?' ; see if *.*
..nacl: cp (hl)
jp nz,..na3 ; no match, must not be *.*
inc hl
djnz ..nacl
call print
'WARNING: you are about to erase everything in sight!',cr,lf
'Is this REALLY what you wish to do? (Say YES or NO) ',0
ld a,1 ; set for caps
call bbline## ; get input line
or a
jp z,exit ; nothing typed - quit
ld a,(hl)
cp 'Y' ; first char a "Y"?
jp nz,exit ; no, get out
call print
cr,lf,lf,0
..na3: ld de,srhfcb ; point to search fcb
ld c,sfirst ; search first
call cfunc ; turn up disk label
srhlp: ld de,srhfcb ; point to search fcb
ld c,snext ; get next dir entry
call cfunc
cp 0ffh ; end of directory
jp z,exit ; yes, quit
call moven ; move name if match and delete
call condin## ; see if console abort
cp 3
jp z,exit
jr srhlp ; get next
;
; move name if it matches
; enter with A=0,1,2,3
; delete if we can
;
moven: ld c,a ; move count to c
ld a,80h
..gal: dec c
jp m,..gad
add a,20h
jr ..gal
;
..gad: ld l,a
ld h,0 ; hl now points to filename
ld a,(hl) ; get first byte
cp 0e5h ; deleted file?
ret z ; yes, return to get next
ld a,(cusflg) ; custom fn specified?
or a
jr z,..ncs ; no, skip
ld de,cusfn ; get custom fn
call test ; test against match fn
call z,delet ; delete if match
ret
;
..ncs: ld de,bakfn ; check .BAK
call test
jr nz,..nbk
jp delet
;
..nbk: ld de,dolfn ; check .$$$
call test
jr nz,..ndo
jp delet
;
..ndo: ld de,prtfn ; check -PRINT-
call test
ret nz
;
; delete filename at HL
;
delet: ld d,h
ld e,l
push de ; save fn pointer
call print##
cr,lf
'File: [',0
ld a,(hl) ; get user number
cp 10 ; 10 or more
jr nc,..ov9
call print##
' ',0
..ov9: call pafdc## ; print user number
push de
ld c,getdr
call cfunc
add a,'A'
call cout
pop de
ld a,':' ; colon
call cout##
inc de ; point to filename
call pfn1## ; print it
pop de ; get fn pointer
ld a,(de) ; get user area
push de ; save fn pointer again
ld e,a ; user into e
ld c,gsusr ; set user
call cfunc ; do it
ld hl,(countt) ; increment total file match count
inc hl
ld (countt),hl
pop de ; get fn ptr
ld hl,9 ; offset to RO tag
add hl,de
bit 7,(hl) ; RO?
jr z,notro
call print
'] not deleted, Read Only',7,0
ret
;
notro: ld hl,1 ; offset to FIFO tag
add hl,de
bit 7,(hl)
jr z,notff
call print
'] not deleted, FIFO',7,0
ret
;
notff: ld c,delete
xor a
ld (de),a
call cfunc
or a
jr z,deltok
call print
'] not deleted',7,0
ret
;
deltok: call print
'] deleted',0
ld hl,(countd)
inc hl
ld (countd),hl
ret
;
; test filename:
; HL = pointer to found filename
; DE = pointer to match filename
; return with HL intact, Z=match, NZ=no match
;
test: push hl ; save hl
inc hl ; point to first character
ld b,11 ; 11 chars to check
..tstl: ld a,(de) ; get match byte
cp '?' ; a wildcard character?
jr z,..autm ; yes, automatic match
ld c,(hl) ; get target byte
res 7,c ; strip high bit
cp c ; matching target?
jr nz,..noma ; no match!
..autm: inc hl
inc de
djnz ..tstl
..noma: pop hl ; all set
ret ; to ret
;
exit: call print##
cr,lf,lf
'[END OF EXECUTION - DELETED ',0
ld hl,(countd)
call phlfdc##
call print##
' OF ',0
ld hl,(countt)
call phlfdc##
call print##
' FILES]',cr,lf,lf,0
rst 0
end
call print
'] not deleted, FIFO',7,0
ret
;
notff: ld