Changes

Jump to: navigation, search

ACU March 1985 - Type-ins

3,152 bytes removed, 14:50, 31 July 2009
/* Unerase */
=Unerase=
The =Manipulating the Amstrad CPC464 Screen Display=UNERASE.ASM contains the Z80 assembler code for David Link's Unerase program.<br/>
See Amstrad Computer User, March 1985, page 40 for more details.
<pre>
; Unerase a file in CP/M - 04/11/84
; Copyright David Link 1984
 
; A program to unerase a file that has been accidentally
; erased. Should be used immediately after erasing the
; file since if user later, some blocks may have been re-used.
 
; Format is - UNERA filename
 
DEFCB EQU &5C
 
fnamelen EQU 8
extlen EQU 3
extent EQU 12
dirlen EQU 32
 
; CP/M BDOS call numbers
 
OPEN EQU 15
CLOSE EQU 16
SEARCH EQU 17
SRCH_AGAIN EQU 18
MAKE EQU 22
SETDMA EQU 26
 
; Default workspace for file reads
 
tbuff EQU 128
 
; Macro to call CP/M setting DE and C
 
DOS MAC
LD DE,=0
LD C,=1
CALL Dos
ENDM
 
; Macro to call CP/M setting C.
 
SDOS MAC
LD C,=0
CALL Dos
ENDM
 
; COM files begin at &100
 
ORG &100
 
LD SP,(6) ; set stack to top of TPA
DOS DEFCB,SEARCH ; Does file exist?
INC A
JP NZ,0 ; File exists, return to CCP
LD HL,FCBSPACE ; Initialise pointer to current FCB
LD (FCBPTR),HL
DOS tbuff,SETDMA ; set disc I/O to tbuff
DOS DUMFCB,SEARCH ; and search for the first entry in directory
 
More_Search INC A
JR Z,End_of_Directory ; No more entries
 
; Compare found filename with the required filename
 
Continue DEC A ; adjust because we INCed it
ADD A,A ; multiply by dirlen to get postion
ADD A,A ; of entry in catalogue
ADD A,A
ADD A,A
ADD A,A
LD D,0
LD E,A
LD HL,tbuff ; point to found file
ADD HL,DE
 
Again PUSH HL ; and compare it with required filename
INC HL
LD B,fnamelen+extlen ; both name and type (8, name : 3, type)
LD DE,DEFCB+1 ; filename starts at FCB + 1
 
Match LD A,(DE)
LD C,(HL)
RES 7,C ; some CP/Ms set bits on filename
CP C ; so make sure top bit is reset for comparison
INC HL
INC DE
JR NZ,NoMatch ; not this one
DJNZ Match ; good so far... keep going
 
; Match found
 
POP HL ; filename match, but...
PUSH HL
LD A,(HL) ; ... is it erased?
CP &E5 ; e% in first byte of directory = erased
JR NZ,NoMatch ; not erased... so search some more
LD (HL),0 ; it was erased, so unerase it
LD DE,(FCBPTR) ; and store the FCB information in
LD BC,dirlen ; our temporary table
LDIR
LD (FCBPTR),DE ; updating our table pointer afterwards
 
; Search for another entry
 
NoMatch POP HL
DOS DUMFCB,SRCH_AGAIN ; search for next entry in directory
JR More_Search
 
; we have now exhausted the directory search and built
; up our table of directory entries for the required file
 
End_of_Dir LD DE,FCBSPACE ; start processing table of matched
; directory entries
MAIN_LOOP LD HL,(FCBPTR) ; have we reached end of table?
OR A
SBC HL,DE
JP Z,0 ; finished, so return
PUSH DE ; save table pointer
LD HL,extent ; address extent byte
ADD HL,DE
LD A,(HL) ; make an extent of new,
LD (DEFCB+extent),a ; unerased file...
DOS DEFCB,MAKE
POP DE ; recover pointer to FCB...
SDOS CLOSE ; and close it
LD HL,dirlen
ADD HL,DE ; have we reached end of table?
EX DE,HL
JR MAIN_LOOP
 
Dos PUSH HL
PUSH DE
PUSH BC
CALL 5
POP BC
POP DE
POP HL
RET
 
FCBPTR DEFS 2
 
DUMFCB DEFM "????????????"
DEFW 0,0
DEFS 16
DEFW 0,0
 
FCBSPACE EQU $
</pre>
[[Category:Type Ins]]
3,699
edits