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 / ZSYS / SIMTEL20 / ZCPR3 / ERASE.MAC < prev    next >
Text File  |  2000-06-30  |  10KB  |  493 lines

  1. ;  PROGRAM:  ERASE
  2. ;  VERSION:  5.0
  3. ;  DATE:  18 MAY 84
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSION:  4.0 (16 JAN 83)
  6. ;  PREVIOUS VERSION:  3.3 (6 JAN 83), 3.2 (7 DEC 82)
  7. ;  PREVIOUS VERSION:  3.1 (9 NOV 82), 3.0 (18 OCT 82), 2.0 (18 NOV 81)
  8. ;  PREVIOUS VERSION:  1.2 (12 APR 81), 1.3 (25 OCT 81), 1.4 (26 OCT 81)
  9. ;  PREVIOUS VERSION:  1.0 (14 JUN 80), 1.1 (19 OCT 80)
  10. VERS    equ    50
  11. z3env    SET    0f400h
  12.  
  13. ;
  14. ;  ERASE COMMAND --
  15. ;    Erase files specified in command line.  Command is of the form --
  16. ;        ERASE DIR:FILENAME.TYP,... ISR
  17. ;    If I option is given, Inspection of each file is performed and
  18. ; the user is given the option to erase the file or not.  If S option is
  19. ; given, System files are included in erase procedure.  Drive specification
  20. ; is optional.  If R option is given, R/O files are erased without prompting.
  21. ;
  22.  
  23. FALSE    EQU    0
  24. TRUE    EQU    NOT FALSE
  25.  
  26. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRQ ROUTINE)
  27.  
  28.     EXT    DIRQ    ; DIRECTORY PROCESSOR
  29.  
  30.     EXT    Z3INIT    ; INIT Z3 ENV
  31.     EXT    ZFNAME    ; FILE NAME PARSER
  32.     EXT    Z3LOG    ; LOG INTO Z3 FCB SPEC
  33.  
  34.     EXT    PUTUD    ; SAVE CURRENT DU
  35.     EXT    GETUD    ; GET CURRENT DU
  36.     EXT    PHLDC    ; PRINT HL AS DECIMAL CHARS
  37.     EXT    EPRINT    ; PRINT ROUTINE
  38.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  39.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  40.     EXT    CAPS    ; CAPITALIZE ROUTINE
  41.     EXT    CRLF    ; NEW LINE ROUTINE
  42.     EXT    FILLB    ; FILL ROUTINE
  43.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  44.  
  45. ;
  46. ;  CP/M EQUATES
  47. ;
  48. CPM    EQU    0    ; WARM BOOT
  49. BDOS    EQU    5    ; BDOS ENTRY
  50. FCB    EQU    5CH    ; FCB
  51. BUFF    EQU    80H    ; INPUT LINE BUFFER
  52. CR    EQU    13    ; <CR>
  53. LF    EQU    10    ; <LF>
  54.  
  55. ;
  56. ; Environment Definition
  57. ;
  58.     if    z3env ne 0
  59. ;
  60. ; External ZCPR3 Environment Descriptor
  61. ;
  62.     jmp    start
  63.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  64.     db    1    ;External Environment Descriptor
  65. z3eadr:
  66.     dw    z3env
  67. start:
  68.     lhld    z3eadr    ;pt to ZCPR3 environment
  69. ;
  70.     else
  71. ;
  72. ; Internal ZCPR3 Environment Descriptor
  73. ;
  74.     MACLIB    Z3BASE.LIB
  75.     MACLIB    SYSENV.LIB
  76. z3eadr:
  77.     jmp    start
  78.     SYSENV
  79. start:
  80.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  81.     endif
  82.  
  83. ;
  84. ; Start of Program -- Initialize ZCPR3 Environment
  85. ;
  86.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  87. ;
  88.     LXI    H,0    ; GET STACK PTR
  89.     DAD    SP
  90.     SHLD    STACK    ; SAVE IT
  91. ;
  92. ; Compute Buffer Locations
  93. ;
  94.     CALL    CODEND    ; DETERMINE FREE SPACE
  95.     SHLD    CMDLNE    ; SET PTR TO COMMAND LINE
  96.     LXI    D,100H    ; BUFFER SIZE
  97.     DAD    D    ; COMMAND LINE
  98.     SHLD    ERAFCB    ; FCB FOR ERASE
  99.     DAD    D
  100.     SHLD    DIRBUF    ; SET PTR TO DIRECTORY BUFFER
  101.     SPHL        ; SET STACK PTR
  102. ;
  103. ; Save Location
  104. ;
  105.     CALL    PUTUD    ; SAVE AWAY CURRENT DU
  106.  
  107. ;
  108. ; Print Banner
  109. ;
  110.     CALL    EPRINT
  111.     DB    'ERASE  Version '
  112.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  113.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  114.     CPI    '/'    ; OPTION CAUGHT?
  115.     JNZ    ECONT
  116.  
  117. ;  PRINT HELP INFORMATION
  118. HELP:
  119.     CALL    EPRINT
  120.     DB    CR,LF,'  ERASE dir:filename.typ,dir:fn.ft,... o...'
  121.     DB    CR,LF,'Options:'
  122.     DB    CR,LF,'   I -- Inspect Mode'
  123.     DB    CR,LF,'   R -- Erase R/O Files without prompting user'
  124.     DB    CR,LF,'   S -- Include System Files'
  125.     DB    0
  126.     JMP    RETURN
  127.  
  128. ;  RETURN TO OS
  129. RETURN:
  130.     CALL    GETUD    ; RESET USER IF NECESSARY
  131. RETX:
  132.     LHLD    STACK    ; GET OLD STACK
  133.     SPHL        ; SET IT
  134.     RET
  135.  
  136. ;  COPY BUFFER INTO TEMP BUFFER
  137. ECONT:
  138.     LHLD    CMDLNE    ; PT TO COMMAND LINE
  139.     XCHG        ; ... IN DE
  140.     LXI    H,BUFF+1    ; PT TO BUFFER
  141.     MVI    B,80H    ; BUFFER SIZE (MAX)
  142.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  143.  
  144. ;  EXTRACT FLAGS IF PRESENT
  145.     XRA    A    ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES
  146.     STA    INSPECT
  147.     STA    READONLY
  148.     MVI    A,80H    ; SELECT NON-SYS
  149.     STA    SYSTEM
  150.     LXI    H,0    ; SET FILE COUNT
  151.     SHLD    FILECNT
  152.     LHLD    CMDLNE    ; PT TO BUFFER
  153.  
  154. ;  SKIP TO FILE NAME STRING
  155. SBLANK:
  156.     MOV    A,M    ; SKIP TO NON-BLANK
  157.     CPI    ' '    ; <SP>?
  158.     JNZ    SBL1
  159.     INX    H    ; PT TO NEXT CHAR
  160.     JMP    SBLANK
  161.  
  162. ;  SKIP TO END OF FILE NAME STRING
  163. SBL1:
  164.     MOV    A,M    ; SKIP TO <SP> OR EOL
  165.     ORA    A    ; DONE?
  166.     JZ    OPT
  167.     CPI    ' '    ; <SP>
  168.     JZ    OPT
  169.     INX    H    ; PT TO NEXT
  170.     JMP    SBL1
  171.  
  172. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  173. OPT:
  174.     CPI    '/'    ; OPTION CHAR?
  175.     JNZ    OPTION
  176.     INX    H    ; SKIP SLASH
  177.  
  178. ;  PROCESS LIST OF OPTIONS
  179. OPTION:
  180.     MOV    A,M    ; GET BYTE
  181.     ORA    A    ; DONE?
  182.     JZ    DSPEC
  183.     INX    H    ; PT TO NEXT CHAR
  184.     CPI    ' '    ; SKIP OVER SPACES
  185.     JZ    OPTION
  186.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  187.     JZ    HELP
  188.     CPI    'I'    ; INSPECT?
  189.     JZ    OPTINS
  190.     CPI    'R'    ; READ/ONLY?
  191.     JZ    OPTRO
  192.     CPI    'S'    ; SYSTEM FILES?
  193.     JNZ    HELP
  194.  
  195. ;  SET SYS SELECTION
  196.     MVI    A,0C0H    ; SET FOR SYS AND NON-SYS FILES
  197.     STA    SYSTEM
  198.     JMP    OPTION
  199.  
  200. ;  SET INSPECT OPTION
  201. OPTINS:
  202.     MVI    A,0FFH    ; INSPECT
  203.     STA    INSPECT
  204.     JMP    OPTION
  205.  
  206. ;  SET R/O OPTION
  207. OPTRO:
  208.     MVI    A,0FFH    ; SET R/O
  209.     STA    READONLY
  210.     JMP    OPTION
  211.  
  212. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  213. DSPEC:
  214.     LHLD    CMDLNE    ; PT TO BEFORE FIRST BYTE
  215.     DCX    H    ; PT TO BEFORE FIRST BYTE FOR FOLLOWING INX
  216. DSPEC0:
  217.     INX    H    ; PT TO BYTE
  218.     MOV    A,M    ; GET BYTE
  219.     ORA    A    ; DONE?
  220.     JZ    HELP
  221.     CPI    ' '    ; <SP>?
  222.     JZ    DSPEC0
  223. ;
  224. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  225. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  226. ;
  227. DSPEC1:
  228.     CALL    GETUD    ; RETURN HOME
  229.     LXI    D,FCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  230.     MVI    A,0    ; SCAN FOR DIR FORM BEFORE DU
  231.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  232.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  233.     LXI    H,FCB+1    ; SEE IF FILE NAME IS ALL WILD
  234.     MVI    B,11    ; 11 BYTES
  235. WTEST:
  236.     MOV    A,M    ; GET BYTE
  237.     INX    H    ; PT TO NEXT
  238.     CPI    '?'    ; WILD?
  239.     JNZ    NOWILD
  240.     DCR    B    ; COUNT DOWN
  241.     JNZ    WTEST
  242.     LDA    INSPECT    ; INSPECT?
  243.     ORA    A    ; 0=NO
  244.     JNZ    NOWILD
  245.     CALL    EPRINT
  246.     DB    CR,LF,'Erase All Files? ',0
  247.     CALL    CIN    ; GET RESPONSE
  248.     CALL    CAPS    ; CAPITALIZE
  249.     CALL    COUT    ; ECHO
  250.     CPI    'Y'    ; YES?
  251.     JZ    NOWILD
  252.     CALL    EPRINT
  253.     DB    CR,LF,'Aborting',0
  254.     JMP    RETX
  255. NOWILD:
  256.     LXI    D,FCB    ; PT TO FCB
  257.     CALL    Z3LOG    ; LOG INTO DIRECTORY
  258.  
  259. ;  LOAD DIRECTORY AND ERASE FILES
  260. ERASE:
  261.     LHLD    DIRBUF    ; PT TO DIR BUFFER
  262.     LDA    SYSTEM    ; GET SYS/NON-SYS FLAGS
  263.     LXI    D,FCB    ; PT TO FCB
  264.     CALL    DIRQ    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  265.  
  266. ;  ERASE DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
  267.     CALL    ERAFILES
  268.  
  269. ;  CHECK FOR NEXT FILE SPEC
  270.     LHLD    NEXTCH    ; GET PTR
  271.     MOV    A,M    ; GET DELIM
  272.     CPI    ','    ; ANOTHER FILE?
  273.     JNZ    ERADONE
  274.     INX    H    ; PT TO CHAR AFTER COMMA
  275.     JMP    DSPEC1    ; CONTINUE PROCESSING
  276.  
  277. ;  ERASE COMPLETE -- PRINT COUNT AND EXIT
  278. ERADONE:
  279.     CALL    PRCOUNT    ; PRINT FILE COUNT
  280.     JMP    RETURN
  281.  
  282. ;  ERASE SELECTED FILES
  283. ERAFILES:
  284.     MOV    A,B    ; CHECK FOR ANY FILES LOADED
  285.     ORA    C
  286.     RZ
  287.  
  288. ;  PRINT FILE NAME
  289. ERAFLP:
  290.     PUSH    B    ; SAVE ENTRY COUNT
  291.     CALL    CRLF    ; NEW LINE
  292.     PUSH    H    ; SAVE PTR TO FCB
  293.     INX    H    ; PT TO FILE NAME
  294.     MVI    B,8    ; PRINT NAME
  295.     CALL    PRNT
  296.     MVI    A,'.'    ; DECIMAL
  297.     CALL    COUT
  298.     MVI    B,3    ; PRINT TYPE
  299.     CALL    PRNT
  300.     POP    H    ; GET PTR
  301.  
  302. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  303.     LDA    INSPECT    ; GET FLAG
  304.     ORA    A    ; 0=NO
  305.     JZ    ERAIT
  306.  
  307. ;  PROMPT USER FOR ERASE
  308.     CALL    ERAQ    ; ERASE QUESTION
  309.     CPI    'Q'    ; QUIT?
  310.     JZ    QUIT
  311.     CPI    'Y'    ; YES?
  312.     JZ    ERAIT
  313.  
  314. ;  DON'T ERASE FILE
  315. ERANO:
  316.     CALL    EPRINT
  317.     DB    '  NOT Erased',0
  318.     JMP    ERATEST
  319.  
  320. ;  PROMPT USER FOR ERASE
  321. ERAQ:
  322.     CALL    EPRINT    ; PRINT PROMPT
  323.     DB    ' -- Erase (Y/N/Q=Quit/other=N)? ',0
  324.     CALL    CIN    ; GET RESPONSE
  325.     CALL    CAPS    ; CAPITALIZE
  326.     CALL    COUT    ; ECHO
  327.     RET
  328.  
  329. ;  QUIT ERASE PROGRAM
  330. QUIT:
  331.     CALL    PRCOUNT    ; PRINT COUNT OF FILES ERASED
  332.     JMP    RETURN
  333.  
  334. ;  ERASE FILE
  335. ERAIT:
  336.     PUSH    H
  337.     LXI    D,9    ; PT TO R/O ATTRIBUTE
  338.     DAD    D
  339.     MOV    A,M    ; GET R/O ATTRIBUTE
  340.     POP    H    ; RESTORE PTR
  341.     ANI    80H    ; R/O?
  342.     JZ    ERAIT1    ; R/W - PROCEED
  343.     LDA    READONLY    ; GET R/O ERASE FLAG
  344.     ORA    A    ; 0=QUERY
  345.     JNZ    ERAIT0    ; ERASE WITHOUT QUESTION IF FLAG SET
  346.     CALL    EPRINT    ; NOTIFY USER AND PROMPT
  347.     DB    CR,LF,' File is R/O',0
  348.     CALL    ERAQ    ; ASK QUESTION
  349.     CPI    'Q'    ; QUIT?
  350.     JZ    QUIT
  351.     CPI    'Y'    ; ERASE R/O
  352.     JNZ    ERATEST    ; DO NOT ERASE IF NOT YES
  353.  
  354. ;  ERASE R/O FILE
  355. ERAIT0:
  356.     PUSH    H    ; SAVE PTR TO FILE ENTRY
  357.     LXI    D,9    ; PT TO R/O ATTRIBUTE
  358.     DAD    D
  359.     MOV    A,M    ; GET ATTRIBUTE
  360.     ANI    7FH    ; MAKE R/W
  361.     MOV    M,A
  362.     POP    H    ; GET PTR TO FCB
  363.     PUSH    H    ; SAVE PTR AGAIN
  364.     XCHG        ; DE PTS TO FCB
  365.     XRA    A    ; MAKE SURE CURRENT DISK IS SELECTED
  366.     STAX    D
  367.     MVI    C,30    ; SET FILE ATTRIBUTES
  368.     CALL    BDOS
  369.     POP    H
  370.  
  371. ;  ERASE R/W FILE
  372. ERAIT1:
  373.     PUSH    H    ; SAVE PTR TO FILE NAME TO ERASE
  374.     INX    H    ; PT TO FIRST BYTE OF NAME
  375.     PUSH    H    ; SAVE HL
  376.     LHLD    ERAFCB    ; SET UP FCB
  377.     XCHG        ; ... IN DE
  378.     POP    H    ; GET HL
  379.     PUSH    D    ; SAVE PTR
  380.     XRA    A    ; A=0
  381.     STAX    D    ; CURRENT DISK
  382.     INX    D    ; PT TO FIRST CHAR
  383.     MVI    B,11    ; COPY 11 BYTES
  384.     CALL    MOVEB    ; COPY HL TO DE FOR 11 BYTES
  385.     XCHG        ; HL PTS TO REST OF FCB
  386.     MVI    B,24    ; FILL REST OF FCB WITH ZEROES
  387.     XRA    A    ; A=0
  388.     CALL    FILLB
  389.     POP    D    ; GET PTR
  390.     MVI    C,19    ; DELETE FILE
  391.     CALL    BDOS
  392.     CALL    EPRINT
  393.     DB    '      Erased',0
  394.     LHLD    FILECNT    ; INCREMENT COUNT
  395.     INX    H
  396.     SHLD    FILECNT
  397.     POP    H    ; GET PTR TO DIRECTORY ENTRY
  398.  
  399. ;  PT TO NEXT ENTRY
  400. ERATEST:
  401.     LXI    D,ESIZE    ; PT TO NEXT ENTRY
  402.     DAD    D
  403.     POP    B    ; GET COUNT
  404.     DCX    B    ; COUNT DOWN
  405.     MOV    A,B    ; CHECK FOR ZERO
  406.     ORA    C
  407.     JNZ    ERAFLP
  408.  
  409. ;  RETURN TO CALLER
  410.     RET
  411.  
  412. ;
  413. ;  COPY HL TO DE FOR B BYTES
  414. ;
  415. MOVEB:
  416.     MOV    A,M    ; GET BYTE
  417.     STAX    D    ; PUT BYTE
  418.     INX    H    ; PT TO NEXT
  419.     INX    D
  420.     DCR    B    ; COUNT DOWN
  421.     JNZ    MOVEB
  422.     RET
  423.  
  424. ;
  425. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  426. ;
  427. PRNT:
  428.     MOV    A,M    ; GET CHAR
  429.     CALL    COUT
  430.     INX    H    ; PT TO NEXT
  431.     DCR    B    ; COUNT DOWN
  432.     JNZ    PRNT
  433.     RET
  434.  
  435. ;
  436. ;  PRINT COUNT OF NUMBER OF FILES ERASED
  437. ;
  438. PRCOUNT:
  439.     CALL    CRLF    ; NEW LINE
  440.     LHLD    FILECNT    ; GET COUNT
  441.     MOV    A,L    ; CHECK FOR NONE
  442.     ORA    H
  443.     JZ    PRNO
  444.     CALL    PHLDC    ; PRINT DECIMAL COUNT
  445.     JMP    PRMS
  446. PRNO:
  447.     CALL    EPRINT
  448.     DB    'No',0
  449. PRMS:
  450.     LHLD    FILECNT    ; 1 FILE ERASED?
  451.     MOV    A,H    ; HIGH ZERO?
  452.     ORA    A
  453.     JNZ    PRMULT
  454.     MOV    A,L    ; LOW ONE?
  455.     CPI    1
  456.     JZ    PRSING
  457. PRMULT:
  458.     CALL    EPRINT
  459.     DB    ' Files Erased',0
  460.     RET
  461. PRSING:
  462.     CALL    EPRINT
  463.     DB    ' File  Erased',0
  464.     RET
  465.  
  466. ;
  467. ;  BUFFERS
  468. ;
  469. INSPECT:
  470.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  471. SYSTEM:
  472.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  473. READONLY:
  474.     DS    1    ; READ/ONLY FLAG (0=QUERY FOR R/O, 0FFH=DON'T)
  475. USER:
  476.     DS    1    ; NEW USER, OR 0FFH IF NO CHANGE
  477. CURUSER:
  478.     DS    1    ; CURRENT USER NUMBER
  479. NEXTCH:
  480.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  481. FILECNT:
  482.     DS    2    ; COUNT OF NUMBER OF FILES ERASED
  483. ERAFCB:
  484.     DS    2    ; PTR TO FCB FOR ERASE
  485. CMDLNE:
  486.     DS    2    ; PTR TO COMMAND LINE
  487. DIRBUF:
  488.     DS    2    ; PTR TO DIRECTORY BUFFER
  489. STACK:
  490.     DS    2    ; OLD STACK PTR
  491.  
  492.     END
  493.