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
/
REC22A.AQM
/
REC22A.ASM
Wrap
Assembly Source File
|
2000-06-30
|
4KB
|
297 lines
;Recovery program to reinstate deleted disk files
;Copyright (C) David R Back 1982
;requires CP/M2.2
;SYNTAX: rec22 [ambiguous]filename.ext
;
;REC22A.ASM created 11/15/84 by Keith Petersen, W8SDZ. No
;changes made other than reformatting file to make reading
;code easier. The original had only a single space between
;columns and was all lower case.
;
BDOS EQU 5
CR EQU 0DH
LF EQU 0AH
;
ORG 100H
;
BEGIN: JMP START
DB 'COPYRIGHT (C) DAVID R BACK 1982'
;
START: LXI H,0
DAD SP
SHLD USERSP
LXI SP,USERSP
LDA 5DH ;test for blank filename
CPI ' '
LXI D,BLKFIL
JZ BLKER
MVI C,9
LXI D,SIGNON
CALL BDOS ;signon message
MVI C,12
CALL BDOS ;get version
MOV A,L
CPI 20H
LXI D,BDSEL
JC BLKER
MVI C,25 ;get current disk
CALL BDOS
STA DISK ;save default
MOV C,A
LXI D,5CH
LDAX D ;required drive
ORA A
MOV E,C
JZ SETALL
DCR A
MOV E,A
;
SETALL: PUSH D
MVI C,14 ;select disk
CALL BDOS ;make sure drive has been selected
POP B
LXI D,1 ;already selected
CALL SELDSK ;get .dphd
LXI D,8
DAD D
MOV E,M
INX H
MOV D,M ;DE=.DIRBUF
MOV L,E
MOV H,D
SHLD DBUF ;save .DIRBUF
MVI C,26 ;setdma
CALL BDOS
MVI C,32
MVI E,0FFH ;get user
CALL BDOS
STA US ;save current user
MVI C,32 ;set user
MVI E,5 ;user 5
CALL BDOS
LXI D,5CH
MVI A,'?'
STAX D
MVI C,17 ;sfirst
;
LOOP: CALL BDOS
CPI 0FFH
JZ EXIT
ADD A
ADD A
ADD A
ADD A
ADD A
MOV C,A
MVI B,0
LHLD DBUF ;dirbuf
DAD B
PUSH H
MVI C,11 ;ignore ext
LXI D,5CH
CALL COMP ;compare with fcb
POP H
RAR
JC NXT
MOV A,M
CPI 0E5H ;recover only deleted files
JNZ NXT
PUSH H
PUSH H
MOV A,M
MVI B,11
INX H
;
NAMOUT: MOV A,M
CALL CNVRT ;convert to printing chars
CALL OPCHR ;o/p char to co
DCR B
INX H
JNZ NAMOUT
CALL CRLF
MVI B,32
POP H
;
FCBOUT: MOV A,B
ANI 3
CZ WRSPC ;o/p space to co
MOV A,M
CALL BINASC ;binary to hex ascii
INX H
DCR B
JNZ FCBOUT
CALL CRLF
LXI D,RECO
CALL PSTR ;printstring
CALL CI
POP H
CPI 3 ;^C exit
JZ EXIT
CPI 'Y'
JZ REC
CPI 'y'
JNZ NXT
;
REC: MVI M,0 ;recover file to user 0
MVI C,12
CALL RESET ;reset attributes of recovered file
MVI C,1 ;directory write
CALL WRITE ;write dir sector to disk
ORA A
JNZ WRERR
;
NXT: LXI D,5CH
MVI A,0E0H
STAX D
MVI C,18 ;snext
JMP LOOP
;
BLKER: MVI C,9
CALL BDOS
JMP EXIT1
;
WRERR: LXI D,ERMSG
;
WRERR1: MVI C,9
CALL BDOS
;
EXIT: MVI C,13 ;reset system
CALL BDOS
LDA DISK
MOV E,A
MVI C,14
CALL BDOS ;reset original drive
MVI C,32 ;reselect original user
LDA US
MOV E,A
CALL BDOS
;
EXIT1: LHLD USERSP
SPHL
RET ;to ccp
;
COMP: INX D
INX H ;dont compare drives
;
COMPR1: LDAX D
ANI 7FH
CPI '?'
JZ COMPR2
MOV B,A
MOV A,M
ANI 7FH
CMP B
JNZ COMPF
;
COMPR2: INX H
INX D
DCR C
JNZ COMPR1
XRA A
RET
;
COMPF: XRA A
CMA
RET
;
RESET: MOV A,M
ANI 7FH
MOV M,A
INX H
DCR C
JNZ RESET
RET
;
PSTR: LDAX D
CPI '$'
RZ
CALL OPCHR
INX D
JMP PSTR
;
OPCHR: PUSH B
PUSH D
PUSH H
MOV C,A
CALL CO
POP H
POP D
POP B
RET
;
CRLF: MVI A,CR
CALL OPCHR
MVI A,LF
CALL OPCHR
RET
;
WRSPC: MVI A,' '
CALL OPCHR
RET
;
HASC: CPI 10
JC HASC1
ADI '7'
CALL OPCHR
RET
;
HASC1: ADI '0'
CALL OPCHR
RET
;
BINASC: PUSH PSW
RAR
RAR
RAR
RAR
ANI 0FH
CALL HASC
POP PSW
ANI 0FH
CALL HASC
RET
;
CNVRT: CPI ' '
JC CNVRT1
CPI 61H
JNC CNVRT1
RET
;
CNVRT1: MVI A,'-'
RET
;
CI: LHLD 1
LXI D,6 ;bios ci
DAD D
PCHL
;
CO: LHLD 1
LXI D,9 ;bios co
DAD D
PCHL
;
;req C=drive 0,1... lsb E=1
SELDSK: LHLD 1
LXI D,24 ;bios seldsk
DAD D
PCHL
;
WRITE: LHLD 1
LXI D,39
DAD D ;bios write
PCHL
;
BLKFIL: DB CR,LF,'NO FILE SPECIFIED',CR,LF,'$'
BDSEL: DB CR,LF,'CP/M 2.0 or later is required.',CR,LF,'$'
RECO: DB 'RECOVER ?',CR,LF,'$'
ERMSG: DB CR,LF,'DIRECTORY WRITE ERROR',CR,LF,'$'
SIGNON: DB CR,LF,'Disk File Recover D.R.Back V2.2',CR,LF,'$'
;
DS 32 ;stack
USERSP: DS 2
DISK: DS 1 ;original default drive
US: DS 1 ;original user
DBUF: DS 2 ;dirbuf
;
END BEGIN