home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
utils
/
dirutl
/
erase.lbr
/
ERASE.MQC
/
ERASE.MAC
Wrap
Text File
|
1985-10-31
|
9KB
|
442 lines
; 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 ; <CR>
LF EQU 10 ; <LF>
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 ' ' ; <SP> 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 ' ' ; <SP>?
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