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 / UTILS / DIRUTL / ERASE.LBR / ERASE.MQC / ERASE.MAC
Text File  |  2000-06-30  |  9KB  |  442 lines

  1. ;  PROGRAM:  ERASE
  2. ;  VERSION:  2.0
  3. ;  DATE:  18 NOV 81
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSION:  1.2 (12 APR 81), 1.3 (25 OCT 81), 1.4 (26 OCT 81)
  6. ;  PREVIOUS VERSION:  1.0 (14 JUN 80), 1.1 (19 OCT 80)
  7. VERS    equ    20    ; Version Number
  8.  
  9. ;
  10. ;  ERASE COMMAND --
  11. ;    Erase files specified in command line.  Command is of the form --
  12. ;        ERASE X:FILENAME.TYP /I /S /R
  13. ;    If /I option is given, Inspection of each file is performed and
  14. ; the user is given the option to erase the file or not.  If /S option is
  15. ; given, System files are included in erase procedure.  Drive specification
  16. ; is optional.  If /R option is given, R/O files are erased without prompting.
  17. ;
  18.  
  19. ;  MAXIMUM NUMBER OF FILES (CP/M 2.2)
  20. MAX$FILES    EQU    128
  21.  
  22.     EXT    PADC    ; PRINT A AS DECIMAL CHARS
  23.     EXT    PRINT    ; PRINT ROUTINE
  24.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  25.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  26.     EXT    CAPS    ; CAPITALIZE ROUTINE
  27.     EXT    CRLF
  28.     EXT    DIRECT    ; DIRECTORY ROUTINE
  29.  
  30. ;
  31. ;  CP/M EQUATES
  32. ;
  33. CPM    EQU    0    ; WARM BOOT
  34. BDOS    EQU    5    ; BDOS ENTRY
  35. FCB    EQU    5CH    ; FCB
  36. BUFF    EQU    80H    ; INPUT LINE BUFFER
  37. CR    EQU    13    ; <CR>
  38. LF    EQU    10    ; <LF>
  39.  
  40.     LXI    H,0    ; GET STACK PTR
  41.     DAD    SP
  42.     SHLD    STACK    ; SAVE IT
  43.     LXI    SP,STACK    ; SET SP
  44.     CALL    PRINT
  45.     DB    'ERASE  Version '
  46.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  47.     LDA    FCB+1    ; ANY FILES SPECIFIED?
  48.     CPI    ' '    ; <SP> IF NOT
  49.     JZ    HELP
  50.     CPI    '/'    ; OPTION CAUGHT?
  51.     JNZ    ECONT
  52.  
  53. ;  PRINT HELP INFORMATION
  54. HELP:
  55.     CALL    PRINT
  56.     DB    CR,LF,'ERASE Command --'
  57.     DB    CR,LF,'  ERASE x:filename.typ /o'
  58.     DB    CR,LF,LF,'Only filename.typ is required, and wild cards (?,*)'
  59.     DB    CR,LF,'are permitted.  /o is optional, and valid options are -'
  60.     DB    CR,LF,'    /I -- Inspect Mode (Give user option to delete)'
  61.     DB    CR,LF,'    /R -- Erase R/O Files without prompting user'
  62.     DB    CR,LF,'    /S -- Include System Files'
  63.     DB    0
  64.  
  65. ;  RETURN TO OS
  66. RETURN:
  67.     LHLD    STACK    ; GET OLD STACK
  68.     SPHL        ; SET IT
  69.     RET
  70.  
  71. ;  SCAN BUFFER FOR DRIVE SPECIFICATION AND LOG IN DISK IF SET
  72. ECONT:
  73.     LXI    H,BUFF    ; PT TO BUFFER
  74.     PUSH    H
  75.     MOV    A,M    ; GET COUNT
  76.     ADD    L    ; PT TO END OF BUFFER
  77.     MOV    L,A
  78.     MOV    A,H
  79.     ACI    0
  80.     MOV    H,A
  81.     INX    H
  82.     MVI    M,0
  83.     POP    H    ; GET PTR
  84.  
  85. ;  EXTRACT FLAGS IF PRESENT
  86.     XRA    A    ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES
  87.     STA    INSPECT
  88.     STA    READONLY
  89.     STA    SYSTEM
  90.     STA    FILECNT    ; SET FILE COUNT
  91.     LXI    H,BUFF    ; PT TO BUFFER
  92. OPTION:
  93.     MOV    A,M    ; GET BYTE
  94.     ORA    A    ; DONE?
  95.     JZ    DSPEC
  96.     INX    H    ; PT TO NEXT
  97.     CPI    '/'    ; OPTION?
  98.     JNZ    OPTION
  99.     MOV    A,M    ; GET OPTION CHAR
  100.     CPI    'I'    ; INSPECT?
  101.     JZ    OPTINS
  102.     CPI    'R'    ; READ/ONLY?
  103.     JZ    OPTRO
  104.     CPI    'S'    ; SYSTEM FILES?
  105.     JNZ    HELP
  106.     MVI    A,80H    ; SET MSB FOR SYSTEM
  107.     STA    SYSTEM
  108.     JMP    OPTION
  109. OPTINS:
  110.     MVI    A,0FFH    ; INSPECT
  111.     STA    INSPECT
  112.     JMP    OPTION
  113. OPTRO:
  114.     MVI    A,0FFH    ; SET R/O
  115.     STA    READONLY
  116.     JMP    OPTION
  117.  
  118. ;  EXTRACT DRIVE SPECIFICATION
  119. DSPEC:
  120.     LXI    H,BUFF
  121.     MOV    A,M    ; GET COUNT
  122.     ORA    A    ; DONE?
  123.     JZ    ERASE
  124.     INX    H    ; PT TO 1ST BYTE
  125. DSPEC0:
  126.     MOV    A,M    ; GET BYTE
  127.     ORA    A    ; DONE?
  128.     JZ    ERASE
  129.     INX    H    ; PT TO NEXT
  130.     CPI    ' '    ; <SP>?
  131.     JZ    DSPEC0
  132.     MOV    B,A    ; SAVE POSSIBLE DRIVE SPEC
  133.     MOV    A,M    ; GET POSSIBLE COLON
  134.     CPI    ':'    ; DRIVE SPEC?
  135.     JNZ    ERASE
  136.     MOV    A,B    ; GET DRIVE NAME
  137.     SUI    'A'    ; CONVERT TO 0-3
  138.     JC    DERR
  139.     CPI    4
  140.     JC    DSPEC1
  141. DERR:
  142.     CALL    PRINT
  143.     DB    CR,LF,'Invalid Drive Specification',0
  144.     JMP    RETURN
  145.  
  146. ;  LOG IN SPECIFIED DISK
  147. DSPEC1:
  148.     MOV    E,A    ; DISK NUMBER IN E
  149.     MVI    C,14    ; LOG IN DISK
  150.     CALL    BDOS
  151.  
  152. ;  LOAD DIRECTORY
  153. ERASE:
  154. ;  ERASE R/W DIR FILES
  155.     CALL    ERAFILES
  156.  
  157. ;  SELECT R/O FILES
  158.     LXI    H,FCB+9    ; PT TO R/O BYTE
  159.     MOV    A,M    ; GET IT
  160.     CPI    '?'    ; DON'T SET IF '?'
  161.     JZ    ERASES
  162.     ORI    80H    ; SET MSB
  163.     MOV    M,A    ; PUT IT
  164.  
  165. ;  ERASE R/O DIR FILES
  166.     CALL    ERAFILES
  167.  
  168. ;  CHECK TO SEE IF SYSTEM FILES ARE ALSO TO BE CONSIDERED
  169. ERASES:    LDA    SYSTEM    ; SYSTEM FILES DESIRED?
  170.     ORA    A    ; 0=NO
  171.     JZ    ERASED
  172.  
  173. ;  ERASE SELECTED SYSTEM FILES
  174.     LXI    H,FCB+9    ; RESET R/O BYTE
  175.     MOV    A,M
  176.     ANI    7FH
  177.     MOV    M,A
  178.     INX    H    ; PT TO SYSTEM BYTE
  179.     MOV    A,M    ; GET IT
  180.     CPI    '?'    ; DON'T SET '?'
  181.     JZ    QSKP1
  182.     ORI    80H    ; SET MSB
  183.     MOV    M,A    ; PUT IT
  184.  
  185. ;  ERASE R/W SYSTEM FILES
  186.     CALL    ERAFILES
  187.  
  188. ;  SET R/O ATTRIBUTE BIT
  189. QSKP1:
  190.     LXI    H,FCB+9    ; SET R/O BYTE
  191.     MOV    A,M
  192.     CPI    '?'    ; DON'T SET '?'
  193.     JZ    ERASED
  194.     ORI    80H
  195.     MOV    M,A
  196.  
  197. ;  ERASE R/O SYSTEM FILES
  198.     CALL    ERAFILES
  199.  
  200. ;  ERASE COMPLETE
  201. ERASED:
  202.     CALL    PRCOUNT    ; PRINT FILE COUNT
  203.     JMP    RETURN
  204.  
  205. ;  LOAD DIRECTORY AND ERASE SELECTED FILES IF ANY LOADED
  206. ERAFILES:
  207.     XRA    A    ; A=0 FOR FN, FT ALPHABETIZE
  208.     LXI    H,DIR    ; PT TO DIRECTORY BUFFER
  209.     LXI    D,FCB+1    ; PT TO FCB
  210.     CALL    DIRECT    ; LOAD AND ALPHABETIZE DIRECTORY
  211.     ORA    A    ; ANY ERASURES?
  212.     CNZ    ERASE1    ; ERASE SELECTED FILES
  213.     RET
  214.  
  215. ;  ERASE FILES
  216. ERASE1:
  217.     MOV    C,A    ; NUMBER OF FILES IN C
  218.  
  219. ERASE2:
  220. ;  DETERMINE IF FILE IS TO BE CONSIDERED
  221.     PUSH    H    ; SAVE PTR TO FCB
  222.     MOV    A,L    ; GET LOW
  223.     ADI    10    ; PT TO SYSTEM BYTE
  224.     MOV    L,A
  225.     MOV    A,H
  226.     ACI    0    ; HL NOW PTS TO SYSTEM BYTE
  227.     MOV    A,M    ; GET BYTE
  228.     ANI    80H    ; EXTRACT MSB
  229.     JZ    ERA1
  230.  
  231. ;  FILE IS A SYSTEM FILE -- CONTINUE?
  232.     LDA    SYSTEM    ; SYSTEM FILE -- IS ATTRIBUTE SET?
  233.     ORA    A    ; 0=NO
  234.     JNZ    ERA1
  235.  
  236. ;  REJECT FILE DUE TO ATTRIBUTES
  237. ERA0:
  238.     POP    H    ; GET HL (PTR TO 1ST BYTE)
  239.     JMP    ERASE4    ; REJECT FILE
  240.  
  241. ;  POSSIBLE ERASE
  242. ERA1:
  243.     POP    H    ; GET PTR TO FCB
  244.  
  245. ;  PRINT FILE NAME
  246. ERA1PR:
  247.     CALL    CRLF    ; NEW LINE
  248.     PUSH    H    ; SAVE PTR TO FCB
  249.     INX    H    ; PT TO FILE NAME
  250.     MVI    B,8    ; PRINT NAME
  251.     CALL    PRNT
  252.     MVI    A,'.'    ; DECIMAL
  253.     CALL    COUT
  254.     MVI    B,3    ; PRINT TYPE
  255.     CALL    PRNT
  256.     POP    H    ; GET PTR
  257.  
  258. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  259.     LDA    INSPECT    ; GET FLAG
  260.     ORA    A    ; 0=NO
  261.     JZ    ERASE3
  262.  
  263. ;  PROMPT USER FOR ERASE
  264.     CALL    ERAQ    ; ERASE QUESTION
  265.     CPI    'Q'    ; QUIT?
  266.     JZ    QUIT
  267.     CPI    'Y'    ; YES?
  268.     JZ    ERASE3
  269.  
  270. ;  DON'T ERASE FILE
  271. ERANO:
  272.     CALL    PRINT
  273.     DB    '  ++ NOT Erased ++',0
  274.     JMP    ERASE4
  275.  
  276. ;  PROMPT USER FOR ERASE
  277. ERAQ:
  278.     CALL    PRINT    ; PRINT PROMPT
  279.     DB    ' -- Erase (Y/N/Q=Quit)? ',0
  280. ERAQ1:
  281.     CALL    CIN    ; GET RESPONSE
  282.     CALL    CAPS    ; CAPITALIZE
  283.     CALL    COUT    ; ECHO
  284.     CPI    'Y'    ; YES?
  285.     RZ
  286.     CPI    'N'    ; NO?
  287.     RZ
  288.     CPI    'Q'    ; QUIT?
  289.     RZ
  290.     CALL    PRINT
  291.     DB    CR,LF,'    Error -- Type Y for Yes, N for No, or Q for Quit'
  292.     DB    CR,LF,'    Erase (Y/N/Q)? ',0
  293.     JMP    ERAQ1
  294.  
  295. ;  QUIT ERASE PROGRAM
  296. QUIT:
  297.     CALL    PRCOUNT    ; PRINT COUNT OF FILES ERASED
  298.     CALL    PRINT
  299.     DB    '  ++ QUIT -- Returning to CP/M ++',0
  300.     JMP    RETURN
  301.  
  302. ;  ERASE FILE
  303. ERASE3:
  304.     PUSH    B    ; SAVE BC, HL
  305.     PUSH    H
  306.     XCHG        ; DE PTS TO FCB
  307.     PUSH    D    ; SAVE PTR
  308.     MVI    A,9    ; PT TO R/O ATTRIBUTE
  309.     ADD    E
  310.     MOV    E,A
  311.     MOV    A,D
  312.     ACI    0
  313.     MOV    D,A    ; DE PT TO R/O ATTRIBUTE
  314.     LDAX    D    ; GET ATTRIBUTE
  315.     ANI    80H    ; R/O?
  316.     JZ    ERA31    ; R/W - PROCEED
  317.     LDA    READONLY    ; GET R/O ERASE FLAG
  318.     ORA    A    ; 0=QUERY
  319.     JNZ    ERA30    ; ERASE WITHOUT QUESTION IF FLAG SET
  320.     CALL    PRINT    ; NOTIFY USER AND PROMPT
  321.     DB    CR,LF,' File is R/O',0
  322.     CALL    ERAQ    ; ASK QUESTION
  323.     CPI    'Q'    ; QUIT?
  324.     JZ    QUIT
  325.     CPI    'Y'    ; ERASE R/O
  326.     JZ    ERA30
  327.  
  328. ;  DO NOT ERASE FILE
  329.     POP    D    ; CLEAR STACK
  330.     POP    H
  331.     POP    B
  332.     JMP    ERANO    ; DO NOT ERASE
  333.  
  334. ;  ERASE R/O FILE
  335. ERA30:
  336.     CALL    DET$VERS    ; DETERMINE VERSION NUMBER
  337.     JZ    ERA31    ; IF CP/M 1.X - DO NOT RESET ATTRIBUTE
  338.     LDAX    D    ; GET R/O ATTRIBUTE
  339.     ANI    7FH    ; MAKE R/W
  340.     STAX    D
  341.     POP    D    ; GET PTR TO FCB
  342.     PUSH    D    ; SAVE PTR AGAIN
  343.     MVI    C,30    ; SET FILE ATTRIBUTES
  344.     CALL    BDOS
  345.  
  346. ;  ERASE R/W FILE
  347. ERA31:
  348.     POP    D    ; GET PTR TO FCB
  349.     MVI    C,19    ; DELETE FILE
  350.     CALL    BDOS
  351.     CALL    PRINT
  352.     DB    '  ++ Erased ++',0
  353.     LDA    FILECNT    ; INCREMENT COUNT
  354.     INR    A
  355.     STA    FILECNT
  356.     POP    H    ; GET HL, BC
  357.     POP    B
  358.  
  359. ;  PT TO NEXT ENTRY
  360. ERASE4:
  361.     LXI    D,32    ; PT TO NEXT ENTRY
  362.     DAD    D
  363.     DCR    C    ; COUNT DOWN
  364.     JNZ    ERASE2
  365.  
  366. ;  RETURN TO CALLER
  367.     RET
  368.  
  369. ;
  370. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  371. ;
  372. PRNT:
  373.     MOV    A,M    ; GET CHAR
  374.     CALL    COUT
  375.     INX    H    ; PT TO NEXT
  376.     DCR    B    ; COUNT DOWN
  377.     JNZ    PRNT
  378.     RET
  379.  
  380. ;
  381. ;  PRINT COUNT OF NUMBER OF FILES ERASED
  382. ;
  383. PRCOUNT:
  384.     CALL    CRLF    ; NEW LINE
  385.     CALL    PRINT
  386.     DB    CR,LF,'++ ',0
  387.     LDA    FILECNT    ; GET COUNT
  388.     ORA    A    ; NONE?
  389.     JZ    PRNO
  390.     CALL    PADC    ; PRINT DECIMAL COUNT
  391.     JMP    PRMS
  392. PRNO:
  393.     CALL    PRINT
  394.     DB    'No ',0
  395. PRMS:
  396.     LDA    FILECNT    ; 1 FILE ERASED?
  397.     CPI    1
  398.     JZ    PRSING
  399.     CALL    PRINT
  400.     DB    ' Files Erased ++',0
  401.     RET
  402. PRSING:
  403.     CALL    PRINT
  404.     DB    ' File  Erased ++',0
  405.     RET
  406.  
  407. ;
  408. ;  DETERMINE CP/M VERSION NUMBER
  409. ;    RETURN W/ZERO FLAG SET IF CP/M 1.X
  410. ;
  411. DET$VERS:
  412.     PUSH    B
  413.     PUSH    D
  414.     PUSH    H
  415.     MVI    C,12    ; DET VERS
  416.     CALL    BDOS
  417.     MOV    A,H    ; SET FLAG
  418.     ORA    L
  419.     POP    H
  420.     POP    D
  421.     POP    B
  422.     RET
  423.  
  424. ;
  425. ;  BUFFERS
  426. ;
  427. INSPECT:
  428.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  429. SYSTEM:
  430.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  431. READONLY:
  432.     DS    1    ; READ/ONLY FLAG (0=QUERY FOR R/O, 0FFH=DON'T)
  433. FILECNT:
  434.     DS    1    ; COUNT OF NUMBER OF FILES ERASED
  435.     DS    100    ; STACK AREA
  436. STACK:
  437.     DS    2    ; OLD STACK PTR
  438.  
  439. DIR    EQU    4000H    ; SET ADDRESS OF DIRECTORY BUFFER
  440.  
  441.     END
  442.