; 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