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 / ZCPR2 / ERASE.MQC / ERASE.MAC
Text File  |  2000-06-30  |  15KB  |  715 lines

  1. ;  PROGRAM:  ERASE
  2. ;  VERSION:  4.0
  3. ;  DATE:  16 JAN 83
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSION:  3.3 (6 JAN 83), 3.2 (7 DEC 82)
  6. ;  PREVIOUS VERSION:  3.1 (9 NOV 82), 3.0 (18 OCT 82), 2.0 (18 NOV 81)
  7. ;  PREVIOUS VERSION:  1.2 (12 APR 81), 1.3 (25 OCT 81), 1.4 (26 OCT 81)
  8. ;  PREVIOUS VERSION:  1.0 (14 JUN 80), 1.1 (19 OCT 80)
  9. VERS    equ    40
  10.  
  11. ;
  12. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  13. ;    All Rights Reserved
  14. ;
  15. ;    ZCPR2 and its utilities, including this one, are released
  16. ; to the public domain.  Anyone who wishes to USE them may do so with
  17. ; no strings attached.  The author assumes no responsibility or
  18. ; liability for the use of ZCPR2 and its utilities.
  19. ;
  20. ;    The author, Richard Conn, has sole rights to this program.
  21. ; ZCPR2 and its utilities may not be sold without the express,
  22. ; written permission of the author.
  23. ;
  24.  
  25.  
  26. ;
  27. ;  ERASE COMMAND --
  28. ;    Erase files specified in command line.  Command is of the form --
  29. ;        ERASE DIR:FILENAME.TYP ISR
  30. ;    If I option is given, Inspection of each file is performed and
  31. ; the user is given the option to erase the file or not.  If S option is
  32. ; given, System files are included in erase procedure.  Drive specification
  33. ; is optional.  If R option is given, R/O files are erased without prompting.
  34. ;
  35.  
  36. FALSE    EQU    0
  37. TRUE    EQU    NOT FALSE
  38.  
  39. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  40.  
  41.     EXT    DIRF    ; DIRECTORY PROCESSOR
  42.  
  43.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  44.     EXT    ZGPINS    ; ZCPR2 BUFFER INIT
  45.  
  46.     EXT    PHLDC    ; PRINT HL AS DECIMAL CHARS
  47.     EXT    PRINT    ; PRINT ROUTINE
  48.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  49.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  50.     EXT    CAPS    ; CAPITALIZE ROUTINE
  51.     EXT    CRLF    ; NEW LINE ROUTINE
  52.     EXT    FILLB    ; FILL ROUTINE
  53.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  54.  
  55. ;
  56. ;  CP/M EQUATES
  57. ;
  58. CPM    EQU    0    ; WARM BOOT
  59. BDOS    EQU    5    ; BDOS ENTRY
  60. FCB    EQU    5CH    ; FCB
  61. BUFF    EQU    80H    ; INPUT LINE BUFFER
  62. CR    EQU    13    ; <CR>
  63. LF    EQU    10    ; <LF>
  64.  
  65. ;
  66. ;  Branch to Start of Program
  67. ;
  68.     JMP    START
  69.  
  70. ;
  71. ;******************************************************************
  72. ;
  73. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  74. ;
  75. ;    This data block precisely defines the data format for
  76. ; initial features of a ZCPR2 system which are required for proper
  77. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  78. ;
  79.  
  80. ;
  81. ;  EXTERNAL PATH DATA
  82. ;
  83. EPAVAIL:
  84.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  85. EPADR:
  86.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  87.  
  88. ;
  89. ;  INTERNAL PATH DATA
  90. ;
  91. INTPATH:
  92.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  93.             ; DISK = 1 FOR A, '$' FOR CURRENT
  94.             ; USER = NUMBER, '$' FOR CURRENT
  95.     DB    0,0
  96.     DB    0,0
  97.     DB    0,0
  98.     DB    0,0
  99.     DB    0,0
  100.     DB    0,0
  101.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  102.     DB    0    ; END OF PATH
  103.  
  104. ;
  105. ;  MULTIPLE COMMAND LINE BUFFER DATA
  106. ;
  107. MCAVAIL:
  108.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  109. MCADR:
  110.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  111.  
  112. ;
  113. ;  DISK/USER LIMITS
  114. ;
  115. MDISK:
  116.     DB    4    ; MAXIMUM NUMBER OF DISKS
  117. MUSER:
  118.     DB    31    ; MAXIMUM USER NUMBER
  119.  
  120. ;
  121. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  122. ;
  123. DOK:
  124.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  125. UOK:
  126.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  127.  
  128. ;
  129. ;  PRIVILEGED USER DATA
  130. ;
  131. PUSER:
  132.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  133. PPASS:
  134.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  135.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  136.  
  137. ;
  138. ;  CURRENT USER/DISK INDICATOR
  139. ;
  140. CINDIC:
  141.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  142.  
  143. ;
  144. ;  DMA ADDRESS FOR DISK TRANSFERS
  145. ;
  146. DMADR:
  147.     DW    80H    ; TBUFF AREA
  148.  
  149. ;
  150. ;  NAMED DIRECTORY INFORMATION
  151. ;
  152. NDRADR:
  153.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  154. NDNAMES:
  155.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  156. DNFILE:
  157.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  158.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  159.  
  160. ;
  161. ;  REQUIREMENTS FLAGS
  162. ;
  163. EPREQD:
  164.     DB    0FFH    ; EXTERNAL PATH?
  165. MCREQD:
  166.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  167. MXREQD:
  168.     DB    0FFH    ; MAX USER/DISK?
  169. UDREQD:
  170.     DB    0FFH    ; ALLOW USER/DISK CHANGE?
  171. PUREQD:
  172.     DB    0FFH    ; PRIVILEGED USER?
  173. CDREQD:
  174.     DB    0FFH    ; CURRENT INDIC AND DMA?
  175. NDREQD:
  176.     DB    0FFH    ; NAMED DIRECTORIES?
  177. Z2CLASS:
  178.     DB    0    ; CLASS 0
  179.     DB    'ZCPR2'
  180.     DS    10    ; RESERVED
  181.  
  182. ;
  183. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  184. ;
  185. ;******************************************************************
  186. ;
  187.  
  188. ;
  189. ;  Start of Program
  190. ;
  191. START:
  192.     LXI    H,0    ; GET STACK PTR
  193.     DAD    SP
  194.     SHLD    STACK    ; SAVE IT
  195.     LXI    SP,STACK    ; SET SP
  196.     MVI    E,0FFH    ; GET CURRENT USER
  197.     MVI    C,32
  198.     CALL    BDOS
  199.     STA    CURUSER    ; SAVE IT
  200.     MVI    A,0FFH    ; SET DEFAULT USER
  201.     STA    USER
  202.  
  203.     CALL    ZGPINS    ; INIT BUFFERS
  204.     CALL    PRINT
  205.     DB    'ERASE  Version '
  206.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  207.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  208.     CPI    '/'    ; OPTION CAUGHT?
  209.     JNZ    ECONT
  210.  
  211. ;  PRINT HELP INFORMATION
  212. HELP:
  213.     CALL    PRINT
  214.     DB    CR,LF,'ERASE Command --'
  215.     DB    CR,LF,'  ERASE dir:filename.typ,dir:fn.ft,dir:fn.ft,... ooo'
  216.     DB    CR,LF,LF,'d is disk, u is user, and o is one or more option '
  217.     DB    'letters.'
  218.     DB    CR,LF,'If one or more options are specified, the o MUST be '
  219.     DB    'preceded by a space.'
  220.     DB    CR,LF,'Nothing is required, and wild cards (?,*) are '
  221.     DB    CR,LF,'permitted.  o is optional, and valid options are -'
  222.     DB    CR,LF,'    I -- Inspect Mode (Give user option to delete)'
  223.     DB    CR,LF,'    R -- Erase R/O Files without prompting user'
  224.     DB    CR,LF,'    S -- Include System Files'
  225.     DB    CR,LF,'dir: is a named directory or the form du:.'
  226.     DB    CR,LF,'Named Directories are ',0
  227.     LDA    NDREQD    ; NAMED DIRS ON?
  228.     ORA    A    ; 0=NO
  229.     JNZ    HELP1
  230.     CALL    PRINT
  231.     DB    'NOT ',0
  232. HELP1:
  233.     CALL    PRINT
  234.     DB    'Permitted in this Version of ERASE'
  235.     DB    CR,LF,'If u is omitted, current user is assumed, as with d.'
  236.     DB    CR,LF,LF,'Special forms are:'
  237.     DB    CR,LF,'    ERASE dir:    <-- Erase all files in named directory'
  238.     DB    CR,LF,'    ERASE du:    <-- Erase all files in disk d, user u'
  239.     DB    CR,LF,'    ERASE u:    <-- Erase all files in user u on '
  240.     DB    'current disk'
  241.     DB    CR,LF,'    ERASE d:    <-- Erase all files on disk d in '
  242.     DB    'current user'
  243.     DB    0
  244.     JMP    RETURN
  245.  
  246. ;  RESET USER NUMBER IF IT HAS CHANGED
  247. RSETU:
  248.     PUSH    H    ; SAVE REGS
  249.     PUSH    D
  250.     PUSH    B
  251.     LDA    CURUSER    ; GET CURRENT USER
  252.     MOV    E,A    ; ... IN E
  253.     MVI    C,32    ; PREP TO CHANGE USER
  254.     LDA    USER    ; USER CHANGED?
  255.     CPI    0FFH    ; NO CHANGE?
  256.     CNZ    BDOS    ; IF NO 0FFH, THEN CHANGE OCCURRED
  257.     POP    B    ; RESTORE REGS
  258.     POP    D
  259.     POP    H
  260.     RET
  261.  
  262. ;  RETURN TO OS
  263. RETURN:
  264.     CALL    RSETU    ; RESET USER IF NECESSARY
  265. RETX:
  266.     LHLD    STACK    ; GET OLD STACK
  267.     SPHL        ; SET IT
  268.     RET
  269.  
  270. ;  USER CHANGE NOT ALLOWED ERROR
  271. UNOK:
  272.     CALL    PRINT
  273.     DB    CR,LF,'User Number Change Not Allowed -- Aborting',0
  274.     JMP    RETURN
  275.  
  276. ;  DISK CHANGE NOT ALLOWED ERROR
  277. DNOK:
  278.     CALL    PRINT
  279.     DB    CR,LF,'Disk Change Not Allowed -- Aborting',0
  280.     JMP    RETURN
  281.  
  282. ;  PLACE ZERO AT END OF BUFFER
  283. ECONT:
  284.     LXI    H,BUFF    ; PT TO BUFFER
  285.     MOV    A,M    ; GET COUNT
  286.     INX    H    ; PT TO FIRST CHAR
  287.     ADD    L    ; PT TO END OF BUFFER
  288.     MOV    L,A
  289.     MOV    A,H
  290.     ACI    0
  291.     MOV    H,A
  292.     MVI    M,0
  293.  
  294. ;  COPY BUFFER INTO TEMP BUFFER
  295.     LXI    H,BUFF    ; PT TO BUFFER
  296.     MOV    B,M    ; GET CHAR COUNT
  297.     INX    H    ; PT TO FIRST CHAR
  298.     INR    B    ; ADD ENDING 0
  299.     LXI    D,CMDLNE    ; PT TO CMDLNE BUFFER
  300.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  301.  
  302. ;  EXTRACT FLAGS IF PRESENT
  303.     XRA    A    ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES
  304.     STA    INSPECT
  305.     STA    READONLY
  306.     MVI    A,80H    ; SELECT NON-SYS
  307.     STA    SYSTEM
  308.     LXI    H,0    ; SET FILE COUNT
  309.     SHLD    FILECNT
  310.     LXI    H,CMDLNE    ; PT TO BUFFER
  311. ;  SKIP TO FILE NAME STRING
  312. SBLANK:
  313.     MOV    A,M    ; SKIP TO NON-BLANK
  314.     CPI    ' '    ; <SP>?
  315.     JNZ    SBL1
  316.     INX    H    ; PT TO NEXT CHAR
  317.     JMP    SBLANK
  318. ;  SKIP TO END OF FILE NAME STRING
  319. SBL1:
  320.     MOV    A,M    ; SKIP TO <SP> OR EOL
  321.     ORA    A    ; DONE?
  322.     JZ    OPT
  323.     CPI    ' '    ; <SP>
  324.     JZ    OPT
  325.     INX    H    ; PT TO NEXT
  326.     JMP    SBL1
  327. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  328. OPT:
  329.     CPI    '/'    ; OPTION CHAR?
  330.     JNZ    OPTION
  331.     INX    H    ; SKIP SLASH
  332. ;  PROCESS LIST OF OPTIONS
  333. OPTION:
  334.     MOV    A,M    ; GET BYTE
  335.     ORA    A    ; DONE?
  336.     JZ    DSPEC
  337.     INX    H    ; PT TO NEXT CHAR
  338.     CPI    ' '    ; SKIP OVER SPACES
  339.     JZ    OPTION
  340.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  341.     JZ    HELP
  342.     CPI    'I'    ; INSPECT?
  343.     JZ    OPTINS
  344.     CPI    'R'    ; READ/ONLY?
  345.     JZ    OPTRO
  346.     CPI    'S'    ; SYSTEM FILES?
  347.     JNZ    HELP
  348.     MVI    A,0C0H    ; SET FOR SYS AND NON-SYS FILES
  349.     STA    SYSTEM
  350.     JMP    OPTION
  351. OPTINS:
  352.     MVI    A,0FFH    ; INSPECT
  353.     STA    INSPECT
  354.     JMP    OPTION
  355. OPTRO:
  356.     MVI    A,0FFH    ; SET R/O
  357.     STA    READONLY
  358.     JMP    OPTION
  359.  
  360. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  361. DSPEC:
  362.     LXI    H,CMDLNE-1    ; PT TO BEFORE FIRST BYTE
  363. DSPEC0:
  364.     INX    H    ; PT TO BYTE
  365.     MOV    A,M    ; GET BYTE
  366.     ORA    A    ; DONE?
  367.     JZ    HELP
  368.     CPI    ' '    ; <SP>?
  369.     JZ    DSPEC0
  370. ;
  371. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  372. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  373. ;
  374. DSPEC1:
  375.     CALL    RSETU    ; RESET USER IF NECESSARY
  376.     LXI    D,FCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  377.  
  378.     PUSH    H    ; SAVE HL PTR
  379.     CALL    CODEND    ; GET ADDRESS OF SCRATCH AREA
  380.     MOV    B,H    ; ADDRESS IN BC
  381.     MOV    C,L
  382.     POP    H
  383.  
  384.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  385.     JZ    DERR    ; ERROR HANDLER
  386.  
  387.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  388.     PUSH    B    ; SAVE BC
  389.     LXI    H,FCB+1    ; SEE IF FILE NAME IS ALL WILD
  390.     MVI    B,11    ; 11 BYTES
  391. WTEST:
  392.     MOV    A,M    ; GET BYTE
  393.     INX    H    ; PT TO NEXT
  394.     CPI    '?'    ; WILD?
  395.     JNZ    NOWILD
  396.     DCR    B    ; COUNT DOWN
  397.     JNZ    WTEST
  398.     LDA    INSPECT    ; INSPECT?
  399.     ORA    A    ; 0=NO
  400.     JNZ    NOWILD
  401.     CALL    PRINT
  402.     DB    CR,LF,'Erase All Files? ',0
  403.     CALL    CIN    ; GET RESPONSE
  404.     CALL    CAPS    ; CAPITALIZE
  405.     CALL    COUT    ; ECHO
  406.     CPI    'Y'    ; YES?
  407.     JZ    NOWILD
  408.     CALL    PRINT
  409.     DB    CR,LF,'Aborting',0
  410.     JMP    RETX
  411. NOWILD:
  412.     POP    B    ; GET BC
  413.     MOV    A,C    ; GET NEW USER
  414.     STA    USER    ; SAVE IT
  415.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  416.     CPI    0FFH    ; CURRENT DISK?
  417.     JZ    USPEC
  418.     LDA    MDISK    ; GET MAX DISK NUMBER
  419.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  420.     CMP    B    ; WITHIN BOUNDS?
  421.     MOV    A,B    ; GET DISK NUMBER IN A
  422.     JNC    DSPEC2
  423. DERR:
  424.     CALL    PRINT
  425.     DB    CR,LF,'Invalid Drive or User Specification',0
  426.     JMP    RETURN
  427.  
  428. ;  LOG IN SPECIFIED DISK
  429. DSPEC2:
  430.     PUSH    B    ; SAVE BC
  431.     MOV    E,A    ; DISK NUMBER IN E
  432.     LDA    DOK    ; OK TO DO SO?
  433.     ORA    A    ; 0=NO
  434.     JZ    DNOK    ; NOT ALLOWED ABORT
  435.     MVI    C,14    ; LOG IN DISK
  436.     CALL    BDOS
  437.     POP    B    ; GET BC
  438.  
  439. ;  CHECK FOR USER NUMBER
  440. USPEC:
  441.     MOV    A,C    ; GET NEW USER NUMBER
  442.     CPI    0FFH    ; DEFAULT USER?
  443.     JZ    ERASE
  444.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  445.     JZ    UERR
  446.     LDA    MUSER    ; GET MAX USER NUMBER
  447.     CMP    C
  448.     MOV    A,C    ; USER NUMBER IN A
  449.     JNC    ULOG
  450. UERR:
  451.     CALL    PRINT
  452.     DB    CR,LF,'Invalid User Number',0
  453.     JMP    RETURN
  454. ULOG:
  455.     MOV    E,A    ; USER NUMBER IN E
  456.     LDA    UOK    ; ALLOWED?
  457.     ORA    A    ; 0=NO
  458.     JZ    UNOK    ; DISALLOWED AND ABORT
  459.     MVI    C,32    ; SELECT USER
  460.     CALL    BDOS
  461.  
  462. ;  LOAD DIRECTORY AND ERASE FILES
  463. ERASE:
  464.     CALL    CODEND    ; PT TO END OF CODE
  465.     LDA    SYSTEM    ; GET SYS/NON-SYS FLAGS
  466.     LXI    D,FCB    ; PT TO FCB
  467.     CALL    DIRF    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  468.  
  469. ;  ERASE DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
  470.     CALL    ERAFILES
  471.  
  472. ;  CHECK FOR NEXT FILE SPEC
  473.     LHLD    NEXTCH    ; GET PTR
  474.     MOV    A,M    ; GET DELIM
  475.     CPI    ','    ; ANOTHER FILE?
  476.     JNZ    ERADONE
  477.     INX    H    ; PT TO CHAR AFTER COMMA
  478.     JMP    DSPEC1    ; CONTINUE PROCESSING
  479.  
  480. ;  ERASE COMPLETE -- PRINT COUNT AND EXIT
  481. ERADONE:
  482.     CALL    PRCOUNT    ; PRINT FILE COUNT
  483.     JMP    RETURN
  484.  
  485. ;  ERASE SELECTED FILES
  486. ERAFILES:
  487.     MOV    A,B    ; CHECK FOR ANY FILES LOADED
  488.     ORA    C
  489.     RZ
  490.  
  491. ;  PRINT FILE NAME
  492. ERAFLP:
  493.     PUSH    B    ; SAVE ENTRY COUNT
  494.     CALL    CRLF    ; NEW LINE
  495.     PUSH    H    ; SAVE PTR TO FCB
  496.     INX    H    ; PT TO FILE NAME
  497.     MVI    B,8    ; PRINT NAME
  498.     CALL    PRNT
  499.     MVI    A,'.'    ; DECIMAL
  500.     CALL    COUT
  501.     MVI    B,3    ; PRINT TYPE
  502.     CALL    PRNT
  503.     POP    H    ; GET PTR
  504.  
  505. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  506.     LDA    INSPECT    ; GET FLAG
  507.     ORA    A    ; 0=NO
  508.     JZ    ERAIT
  509.  
  510. ;  PROMPT USER FOR ERASE
  511.     CALL    ERAQ    ; ERASE QUESTION
  512.     CPI    'Q'    ; QUIT?
  513.     JZ    QUIT
  514.     CPI    'Y'    ; YES?
  515.     JZ    ERAIT
  516.  
  517. ;  DON'T ERASE FILE
  518. ERANO:
  519.     CALL    PRINT
  520.     DB    '  ++ NOT Erased ++',0
  521.     JMP    ERATEST
  522.  
  523. ;  PROMPT USER FOR ERASE
  524. ERAQ:
  525.     CALL    PRINT    ; PRINT PROMPT
  526.     DB    ' -- Erase (Y/N/Q=Quit/other=N)? ',0
  527.     CALL    CIN    ; GET RESPONSE
  528.     CALL    CAPS    ; CAPITALIZE
  529.     CALL    COUT    ; ECHO
  530.     RET
  531.  
  532. ;  QUIT ERASE PROGRAM
  533. QUIT:
  534.     CALL    PRCOUNT    ; PRINT COUNT OF FILES ERASED
  535.     CALL    PRINT
  536.     DB    '  ++ QUIT -- Returning to CP/M ++',0
  537.     JMP    RETURN
  538.  
  539. ;  ERASE FILE
  540. ERAIT:
  541.     PUSH    H
  542.     LXI    D,9    ; PT TO R/O ATTRIBUTE
  543.     DAD    D
  544.     MOV    A,M    ; GET R/O ATTRIBUTE
  545.     POP    H    ; RESTORE PTR
  546.     ANI    80H    ; R/O?
  547.     JZ    ERAIT1    ; R/W - PROCEED
  548.     LDA    READONLY    ; GET R/O ERASE FLAG
  549.     ORA    A    ; 0=QUERY
  550.     JNZ    ERAIT0    ; ERASE WITHOUT QUESTION IF FLAG SET
  551.     CALL    PRINT    ; NOTIFY USER AND PROMPT
  552.     DB    CR,LF,' File is R/O',0
  553.     CALL    ERAQ    ; ASK QUESTION
  554.     CPI    'Q'    ; QUIT?
  555.     JZ    QUIT
  556.     CPI    'Y'    ; ERASE R/O
  557.     JNZ    ERATEST    ; DO NOT ERASE IF NOT YES
  558.  
  559. ;  ERASE R/O FILE
  560. ERAIT0:
  561.     CALL    DET$VERS    ; DETERMINE VERSION NUMBER
  562.     JZ    ERAIT1    ; IF CP/M 1.X - DO NOT RESET ATTRIBUTE
  563.     PUSH    H    ; SAVE PTR TO FILE ENTRY
  564.     LXI    D,9    ; PT TO R/O ATTRIBUTE
  565.     DAD    D
  566.     MOV    A,M    ; GET ATTRIBUTE
  567.     ANI    7FH    ; MAKE R/W
  568.     MOV    M,A
  569.     POP    H    ; GET PTR TO FCB
  570.     PUSH    H    ; SAVE PTR AGAIN
  571.     XCHG        ; DE PTS TO FCB
  572.     XRA    A    ; MAKE SURE CURRENT DISK IS SELECTED
  573.     STAX    D
  574.     MVI    C,30    ; SET FILE ATTRIBUTES
  575.     CALL    BDOS
  576.     POP    H
  577.  
  578. ;  ERASE R/W FILE
  579. ERAIT1:
  580.     PUSH    H    ; SAVE PTR TO FILE NAME TO ERASE
  581.     INX    H    ; PT TO FIRST BYTE OF NAME
  582.     LXI    D,ERAFCB    ; SET UP FCB
  583.     PUSH    D    ; SAVE PTR
  584.     XRA    A    ; A=0
  585.     STAX    D    ; CURRENT DISK
  586.     INX    D    ; PT TO FIRST CHAR
  587.     MVI    B,11    ; COPY 11 BYTES
  588.     CALL    MOVEB    ; COPY HL TO DE FOR 11 BYTES
  589.     XCHG        ; HL PTS TO REST OF FCB
  590.     MVI    B,24    ; FILL REST OF FCB WITH ZEROES
  591.     XRA    A    ; A=0
  592.     CALL    FILLB
  593.     POP    D    ; GET PTR
  594.     MVI    C,19    ; DELETE FILE
  595.     CALL    BDOS
  596.     CALL    PRINT
  597.     DB    '  ++ Erased ++',0
  598.     LHLD    FILECNT    ; INCREMENT COUNT
  599.     INX    H
  600.     SHLD    FILECNT
  601.     POP    H    ; GET PTR TO DIRECTORY ENTRY
  602.  
  603. ;  PT TO NEXT ENTRY
  604. ERATEST:
  605.     LXI    D,ESIZE    ; PT TO NEXT ENTRY
  606.     DAD    D
  607.     POP    B    ; GET COUNT
  608.     DCX    B    ; COUNT DOWN
  609.     MOV    A,B    ; CHECK FOR ZERO
  610.     ORA    C
  611.     JNZ    ERAFLP
  612.  
  613. ;  RETURN TO CALLER
  614.     RET
  615.  
  616. ;
  617. ;  COPY HL TO DE FOR B BYTES
  618. ;
  619. MOVEB:
  620.     MOV    A,M    ; GET BYTE
  621.     STAX    D    ; PUT BYTE
  622.     INX    H    ; PT TO NEXT
  623.     INX    D
  624.     DCR    B    ; COUNT DOWN
  625.     JNZ    MOVEB
  626.     RET
  627.  
  628. ;
  629. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  630. ;
  631. PRNT:
  632.     MOV    A,M    ; GET CHAR
  633.     CALL    COUT
  634.     INX    H    ; PT TO NEXT
  635.     DCR    B    ; COUNT DOWN
  636.     JNZ    PRNT
  637.     RET
  638.  
  639. ;
  640. ;  PRINT COUNT OF NUMBER OF FILES ERASED
  641. ;
  642. PRCOUNT:
  643.     CALL    CRLF    ; NEW LINE
  644.     CALL    PRINT
  645.     DB    CR,LF,'++ ',0
  646.     LHLD    FILECNT    ; GET COUNT
  647.     MOV    A,L    ; CHECK FOR NONE
  648.     ORA    H
  649.     JZ    PRNO
  650.     CALL    PHLDC    ; PRINT DECIMAL COUNT
  651.     JMP    PRMS
  652. PRNO:
  653.     CALL    PRINT
  654.     DB    'No ',0
  655. PRMS:
  656.     LHLD    FILECNT    ; 1 FILE ERASED?
  657.     MOV    A,H    ; HIGH ZERO?
  658.     ORA    A
  659.     JNZ    PRMULT
  660.     MOV    A,L    ; LOW ONE?
  661.     CPI    1
  662.     JZ    PRSING
  663. PRMULT:
  664.     CALL    PRINT
  665.     DB    ' Files Erased ++',0
  666.     RET
  667. PRSING:
  668.     CALL    PRINT
  669.     DB    ' File  Erased ++',0
  670.     RET
  671.  
  672. ;
  673. ;  DETERMINE CP/M VERSION NUMBER
  674. ;    RETURN W/ZERO FLAG SET IF CP/M 1.X
  675. ;
  676. DET$VERS:
  677.     PUSH    B
  678.     PUSH    D
  679.     PUSH    H
  680.     MVI    C,12    ; DET VERS
  681.     CALL    BDOS
  682.     MOV    A,H    ; SET FLAG
  683.     ORA    L
  684.     POP    H
  685.     POP    D
  686.     POP    B
  687.     RET
  688.  
  689. ;
  690. ;  BUFFERS
  691. ;
  692. INSPECT:
  693.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  694. SYSTEM:
  695.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  696. READONLY:
  697.     DS    1    ; READ/ONLY FLAG (0=QUERY FOR R/O, 0FFH=DON'T)
  698. USER:
  699.     DS    1    ; NEW USER, OR 0FFH IF NO CHANGE
  700. CURUSER:
  701.     DS    1    ; CURRENT USER NUMBER
  702. NEXTCH:
  703.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  704. FILECNT:
  705.     DS    2    ; COUNT OF NUMBER OF FILES ERASED
  706. ERAFCB:
  707.     DS    40    ; FCB FOR ERASE
  708. CMDLNE:
  709.     DS    256    ; ALLOW MAX SIZE OF COMMAND LINE
  710.     DS    100    ; STACK AREA
  711. STACK:
  712.     DS    2    ; OLD STACK PTR
  713.  
  714.     END
  715.