; PROGRAM: ERASE ; VERSION: 2.0 ; DATE: 18 NOV 81 ; AUTHOR: RICHARD CONN ; PREVIOUS VERSION: 1.2 (12 APR 81), 1.3 (25 OCT 81), 1.4 (26 OCT 81) ; PREVIOUS VERSION: 1.0 (14 JUN 80), 1.1 (19 OCT 80) VERS equ 20 ; Version Number ; ; ERASE COMMAND -- ; Erase files specified in command line. Command is of the form -- ; ERASE X:FILENAME.TYP /I /S /R ; If /I option is given, Inspection of each file is performed and ; the user is given the option to erase the file or not. If /S option is ; given, System files are included in erase procedure. Drive specification ; is optional. If /R option is given, R/O files are erased without prompting. ; ; MAXIMUM NUMBER OF FILES (CP/M 2.2) MAX$FILES EQU 128 EXT PADC ; PRINT A AS DECIMAL CHARS EXT PRINT ; PRINT ROUTINE EXT COUT ; CONSOLE OUTPUT ROUTINE EXT CIN ; CONSOLE INPUT ROUTINE EXT CAPS ; CAPITALIZE ROUTINE EXT CRLF EXT DIRECT ; DIRECTORY ROUTINE ; ; CP/M EQUATES ; CPM EQU 0 ; WARM BOOT BDOS EQU 5 ; BDOS ENTRY FCB EQU 5CH ; FCB BUFF EQU 80H ; INPUT LINE BUFFER CR EQU 13 ; LF EQU 10 ; LXI H,0 ; GET STACK PTR DAD SP SHLD STACK ; SAVE IT LXI SP,STACK ; SET SP CALL PRINT DB 'ERASE Version ' DB VERS/10+'0','.',(VERS MOD 10)+'0',0 LDA FCB+1 ; ANY FILES SPECIFIED? CPI ' ' ; IF NOT JZ HELP CPI '/' ; OPTION CAUGHT? JNZ ECONT ; PRINT HELP INFORMATION HELP: CALL PRINT DB CR,LF,'ERASE Command --' DB CR,LF,' ERASE x:filename.typ /o' DB CR,LF,LF,'Only filename.typ is required, and wild cards (?,*)' DB CR,LF,'are permitted. /o is optional, and valid options are -' DB CR,LF,' /I -- Inspect Mode (Give user option to delete)' DB CR,LF,' /R -- Erase R/O Files without prompting user' DB CR,LF,' /S -- Include System Files' DB 0 ; RETURN TO OS RETURN: LHLD STACK ; GET OLD STACK SPHL ; SET IT RET ; SCAN BUFFER FOR DRIVE SPECIFICATION AND LOG IN DISK IF SET ECONT: LXI H,BUFF ; PT TO BUFFER PUSH H MOV A,M ; GET COUNT ADD L ; PT TO END OF BUFFER MOV L,A MOV A,H ACI 0 MOV H,A INX H MVI M,0 POP H ; GET PTR ; EXTRACT FLAGS IF PRESENT XRA A ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES STA INSPECT STA READONLY STA SYSTEM STA FILECNT ; SET FILE COUNT LXI H,BUFF ; PT TO BUFFER OPTION: MOV A,M ; GET BYTE ORA A ; DONE? JZ DSPEC INX H ; PT TO NEXT CPI '/' ; OPTION? JNZ OPTION MOV A,M ; GET OPTION CHAR CPI 'I' ; INSPECT? JZ OPTINS CPI 'R' ; READ/ONLY? JZ OPTRO CPI 'S' ; SYSTEM FILES? JNZ HELP MVI A,80H ; SET MSB FOR SYSTEM STA SYSTEM JMP OPTION OPTINS: MVI A,0FFH ; INSPECT STA INSPECT JMP OPTION OPTRO: MVI A,0FFH ; SET R/O STA READONLY JMP OPTION ; EXTRACT DRIVE SPECIFICATION DSPEC: LXI H,BUFF MOV A,M ; GET COUNT ORA A ; DONE? JZ ERASE INX H ; PT TO 1ST BYTE DSPEC0: MOV A,M ; GET BYTE ORA A ; DONE? JZ ERASE INX H ; PT TO NEXT CPI ' ' ; ? JZ DSPEC0 MOV B,A ; SAVE POSSIBLE DRIVE SPEC MOV A,M ; GET POSSIBLE COLON CPI ':' ; DRIVE SPEC? JNZ ERASE MOV A,B ; GET DRIVE NAME SUI 'A' ; CONVERT TO 0-3 JC DERR CPI 4 JC DSPEC1 DERR: CALL PRINT DB CR,LF,'Invalid Drive Specification',0 JMP RETURN ; LOG IN SPECIFIED DISK DSPEC1: MOV E,A ; DISK NUMBER IN E MVI C,14 ; LOG IN DISK CALL BDOS ; LOAD DIRECTORY ERASE: ; ERASE R/W DIR FILES CALL ERAFILES ; SELECT R/O FILES LXI H,FCB+9 ; PT TO R/O BYTE MOV A,M ; GET IT CPI '?' ; DON'T SET IF '?' JZ ERASES ORI 80H ; SET MSB MOV M,A ; PUT IT ; ERASE R/O DIR FILES CALL ERAFILES ; CHECK TO SEE IF SYSTEM FILES ARE ALSO TO BE CONSIDERED ERASES: LDA SYSTEM ; SYSTEM FILES DESIRED? ORA A ; 0=NO JZ ERASED ; ERASE SELECTED SYSTEM FILES LXI H,FCB+9 ; RESET R/O BYTE MOV A,M ANI 7FH MOV M,A INX H ; PT TO SYSTEM BYTE MOV A,M ; GET IT CPI '?' ; DON'T SET '?' JZ QSKP1 ORI 80H ; SET MSB MOV M,A ; PUT IT ; ERASE R/W SYSTEM FILES CALL ERAFILES ; SET R/O ATTRIBUTE BIT QSKP1: LXI H,FCB+9 ; SET R/O BYTE MOV A,M CPI '?' ; DON'T SET '?' JZ ERASED ORI 80H MOV M,A ; ERASE R/O SYSTEM FILES CALL ERAFILES ; ERASE COMPLETE ERASED: CALL PRCOUNT ; PRINT FILE COUNT JMP RETURN ; LOAD DIRECTORY AND ERASE SELECTED FILES IF ANY LOADED ERAFILES: XRA A ; A=0 FOR FN, FT ALPHABETIZE LXI H,DIR ; PT TO DIRECTORY BUFFER LXI D,FCB+1 ; PT TO FCB CALL DIRECT ; LOAD AND ALPHABETIZE DIRECTORY ORA A ; ANY ERASURES? CNZ ERASE1 ; ERASE SELECTED FILES RET ; ERASE FILES ERASE1: MOV C,A ; NUMBER OF FILES IN C ERASE2: ; DETERMINE IF FILE IS TO BE CONSIDERED PUSH H ; SAVE PTR TO FCB MOV A,L ; GET LOW ADI 10 ; PT TO SYSTEM BYTE MOV L,A MOV A,H ACI 0 ; HL NOW PTS TO SYSTEM BYTE MOV A,M ; GET BYTE ANI 80H ; EXTRACT MSB JZ ERA1 ; FILE IS A SYSTEM FILE -- CONTINUE? LDA SYSTEM ; SYSTEM FILE -- IS ATTRIBUTE SET? ORA A ; 0=NO JNZ ERA1 ; REJECT FILE DUE TO ATTRIBUTES ERA0: POP H ; GET HL (PTR TO 1ST BYTE) JMP ERASE4 ; REJECT FILE ; POSSIBLE ERASE ERA1: POP H ; GET PTR TO FCB ; PRINT FILE NAME ERA1PR: CALL CRLF ; NEW LINE PUSH H ; SAVE PTR TO FCB INX H ; PT TO FILE NAME MVI B,8 ; PRINT NAME CALL PRNT MVI A,'.' ; DECIMAL CALL COUT MVI B,3 ; PRINT TYPE CALL PRNT POP H ; GET PTR ; CHECK FOR INSPECTION AND INSPECT IF SET LDA INSPECT ; GET FLAG ORA A ; 0=NO JZ ERASE3 ; PROMPT USER FOR ERASE CALL ERAQ ; ERASE QUESTION CPI 'Q' ; QUIT? JZ QUIT CPI 'Y' ; YES? JZ ERASE3 ; DON'T ERASE FILE ERANO: CALL PRINT DB ' ++ NOT Erased ++',0 JMP ERASE4 ; PROMPT USER FOR ERASE ERAQ: CALL PRINT ; PRINT PROMPT DB ' -- Erase (Y/N/Q=Quit)? ',0 ERAQ1: CALL CIN ; GET RESPONSE CALL CAPS ; CAPITALIZE CALL COUT ; ECHO CPI 'Y' ; YES? RZ CPI 'N' ; NO? RZ CPI 'Q' ; QUIT? RZ CALL PRINT DB CR,LF,' Error -- Type Y for Yes, N for No, or Q for Quit' DB CR,LF,' Erase (Y/N/Q)? ',0 JMP ERAQ1 ; QUIT ERASE PROGRAM QUIT: CALL PRCOUNT ; PRINT COUNT OF FILES ERASED CALL PRINT DB ' ++ QUIT -- Returning to CP/M ++',0 JMP RETURN ; ERASE FILE ERASE3: PUSH B ; SAVE BC, HL PUSH H XCHG ; DE PTS TO FCB PUSH D ; SAVE PTR MVI A,9 ; PT TO R/O ATTRIBUTE ADD E MOV E,A MOV A,D ACI 0 MOV D,A ; DE PT TO R/O ATTRIBUTE LDAX D ; GET ATTRIBUTE ANI 80H ; R/O? JZ ERA31 ; R/W - PROCEED LDA READONLY ; GET R/O ERASE FLAG ORA A ; 0=QUERY JNZ ERA30 ; ERASE WITHOUT QUESTION IF FLAG SET CALL PRINT ; NOTIFY USER AND PROMPT DB CR,LF,' File is R/O',0 CALL ERAQ ; ASK QUESTION CPI 'Q' ; QUIT? JZ QUIT CPI 'Y' ; ERASE R/O JZ ERA30 ; DO NOT ERASE FILE POP D ; CLEAR STACK POP H POP B JMP ERANO ; DO NOT ERASE ; ERASE R/O FILE ERA30: CALL DET$VERS ; DETERMINE VERSION NUMBER JZ ERA31 ; IF CP/M 1.X - DO NOT RESET ATTRIBUTE LDAX D ; GET R/O ATTRIBUTE ANI 7FH ; MAKE R/W STAX D POP D ; GET PTR TO FCB PUSH D ; SAVE PTR AGAIN MVI C,30 ; SET FILE ATTRIBUTES CALL BDOS ; ERASE R/W FILE ERA31: POP D ; GET PTR TO FCB MVI C,19 ; DELETE FILE CALL BDOS CALL PRINT DB ' ++ Erased ++',0 LDA FILECNT ; INCREMENT COUNT INR A STA FILECNT POP H ; GET HL, BC POP B ; PT TO NEXT ENTRY ERASE4: LXI D,32 ; PT TO NEXT ENTRY DAD D DCR C ; COUNT DOWN JNZ ERASE2 ; RETURN TO CALLER RET ; ; PRINT CHARS PTED TO BY HL FOR B BYTES ; PRNT: MOV A,M ; GET CHAR CALL COUT INX H ; PT TO NEXT DCR B ; COUNT DOWN JNZ PRNT RET ; ; PRINT COUNT OF NUMBER OF FILES ERASED ; PRCOUNT: CALL CRLF ; NEW LINE CALL PRINT DB CR,LF,'++ ',0 LDA FILECNT ; GET COUNT ORA A ; NONE? JZ PRNO CALL PADC ; PRINT DECIMAL COUNT JMP PRMS PRNO: CALL PRINT DB 'No ',0 PRMS: LDA FILECNT ; 1 FILE ERASED? CPI 1 JZ PRSING CALL PRINT DB ' Files Erased ++',0 RET PRSING: CALL PRINT DB ' File Erased ++',0 RET ; ; DETERMINE CP/M VERSION NUMBER ; RETURN W/ZERO FLAG SET IF CP/M 1.X ; DET$VERS: PUSH B PUSH D PUSH H MVI C,12 ; DET VERS CALL BDOS MOV A,H ; SET FLAG ORA L POP H POP D POP B RET ; ; BUFFERS ; INSPECT: DS 1 ; INSPECT FLAG (0=NO, 0FFH=YES) SYSTEM: DS 1 ; SYSTEM FLAG (0=NO, 80H=YES) READONLY: DS 1 ; READ/ONLY FLAG (0=QUERY FOR R/O, 0FFH=DON'T) FILECNT: DS 1 ; COUNT OF NUMBER OF FILES ERASED DS 100 ; STACK AREA STACK: DS 2 ; OLD STACK PTR DIR EQU 4000H ; SET ADDRESS OF DIRECTORY BUFFER END