mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
189 lines
4.6 KiB
NASM
189 lines
4.6 KiB
NASM
; Figure 5-17
|
||
;
|
||
; GNF
|
||
; This subroutine returns an FCB setup with either the first
|
||
; file matched by an ambiguous file name, or (if specified
|
||
; by entry parameter) the next file name.
|
||
;
|
||
; Note : this subroutine is context sensitive. You must not
|
||
; have more than one ambiguous file name sequence in
|
||
; process at any given time.
|
||
;
|
||
;>>> Warning : This subroutine changes the DMA Address inside
|
||
;>>> the BDOS.
|
||
;
|
||
; Entry Parameters
|
||
;
|
||
; DE -> Possibly Ambiguous File Name
|
||
; (00-byte terminated)
|
||
; (Only needed for FIRST request)
|
||
; HL -> File Control Block
|
||
; A = 0 : Return FIRST file name that matches
|
||
; = NZ : Return NEXT file name that matches
|
||
;
|
||
; Exit Parameters
|
||
;
|
||
; Carry set : A = FF, no file name matches
|
||
; A not = 0FFH, error in input file name
|
||
; Carry clear : FCB setup with next name
|
||
; HL -> Directory Entry returned by
|
||
; Search First/Next
|
||
;
|
||
; Calling sequence
|
||
;
|
||
; LXI D,FILENAME
|
||
; LXI H,FCB
|
||
; MVI A,0 ;or MVI A,1 for NEXT
|
||
; CALL GNF
|
||
;
|
||
B$SEARCHF EQU 17 ;Search for First file name
|
||
B$SEARCHN EQU 18 ;Search for Next file name
|
||
B$SETDMA EQU 26 ;Setup DMA Address
|
||
BDOS EQU 5 ;BDOS Entry Point
|
||
;
|
||
GNFDMA EQU 80H ;Default DMA Address
|
||
GNFSVL EQU 13 ;Save Length (no. of chars to move)
|
||
GNFFCL EQU 36 ;File Control Block length
|
||
GNFSV: DS GNFSVL ;Save area for file name/type
|
||
;
|
||
GNF:
|
||
PUSH H ;Save FCB pointer
|
||
PUSH D ;Save File Name pointer
|
||
PUSH PSW ;Save First/Next flag
|
||
|
||
LXI D,GNFDMA ;Set DMA to known address
|
||
MVI C,B$SETDMA ;Function code
|
||
CALL BDOS
|
||
POP PSW ;Recover First/Next flag
|
||
POP H ;Recover File Name pointer
|
||
POP D ;Recover FCB Pointer
|
||
PUSH D ;Re-save FCB Pointer
|
||
|
||
ORA A ;Check if FIRST or NEXT
|
||
JNZ GNFN ;NEXT
|
||
CALL BF ;Build File Control BLock
|
||
POP H ;Recover FCB Pointer (to balance stack)
|
||
RC ;Return if error in File Name
|
||
PUSH H ;Resave FCB pointer
|
||
|
||
;Move Ambiguous File Name to save area
|
||
;HL -> FCB
|
||
LXI D,GNFSV ;DE -> save area
|
||
MVI C,GNFSVL ;Get save length
|
||
CALL MOVE
|
||
POP D ;Recover FCB Pointer
|
||
PUSH D ;and re-save
|
||
|
||
MVI C,B$SEARCHF ;Search FIRST
|
||
CALL BDOS
|
||
POP H ;Recover FCB Pointer
|
||
CPI 0FFH ;Check for error
|
||
JZ GNFEX ;Error exit
|
||
JMP GNFC ;Common code
|
||
;
|
||
GNFN:
|
||
;Execute search FIRST to re-establish
|
||
;contact with previous file
|
||
;User's FCB still has Name/Type in it
|
||
CALL GNFZF ;Zero-fill all but File Name/Type
|
||
POP D ;Recover FCB address
|
||
PUSH D ;and re-save
|
||
MVI C,B$SEARCHF ;Re-find the file
|
||
CALL BDOS
|
||
POP D ;Recover FCB Pointer
|
||
PUSH D ;and re-save
|
||
LXI H,GNFSV ;Move File Name from save area into FCB
|
||
MVI C,GNFSVL ;Save area length
|
||
CALL MOVE
|
||
|
||
MVI C,B$SEARCHN ;Search NEXT
|
||
CALL BDOS
|
||
POP H ;Recover FCB address
|
||
CPI 0FFH ;Check for error
|
||
JZ GNFEX ;Error exit
|
||
GNFC:
|
||
PUSH H ;Save FCB Address
|
||
ADD A ;Multiply BDOS Return Code * 32
|
||
ADD A ;* 4
|
||
ADD A ;* 8
|
||
ADD A ;* 16
|
||
ADD A ;* 32
|
||
LXI H,GNFDMA ;HL -> DMA Address
|
||
MOV E,A ;Make Code * 32 a word value in DE
|
||
MVI D,0
|
||
DAD D ;HL -> File's directory entry
|
||
|
||
;Move File Name into FCB
|
||
POP D ;Recover FCB Address
|
||
PUSH H ;Save Directory Entry pointer
|
||
PUSH D ;and re-save
|
||
MVI C,GNFSVL ;Length of save area
|
||
CALL MOVE
|
||
LDA GNFSV ;Get Disk Drive from save area
|
||
POP D ;Recover FCB Address
|
||
STAX D ;Overwrite user number in FCB
|
||
|
||
;Setup to zero-fill tail end of FCB
|
||
CALL GNFZF ;Zero-fill
|
||
POP H ;Recover Directory Entry Pointer
|
||
XRA A ;Clear Carry
|
||
RET
|
||
;
|
||
GNFEX:
|
||
STC ;Set Carry to indicate error
|
||
RET
|
||
|
||
;
|
||
; GNFZF
|
||
; Get Next File - Zero Fill
|
||
; This subroutine Zero-fills the rest of the bytes in an FCB
|
||
; that follow the File Name and Type.
|
||
;
|
||
; Entry Parameters
|
||
;
|
||
; DE -> File Control Block
|
||
;
|
||
GNFZF:
|
||
LXI H,GNFSVL ;Bypass area that holds file name
|
||
DAD D ;HL -> FCB + GNFSVL
|
||
MOV D,H ;DE -> FCB + GNFSVL
|
||
MOV E,L
|
||
INX D ;DE -> FCB + GNFSVL + 1
|
||
MVI M,0 ;FCB + GNFSVL = 0
|
||
MVI C,GNFFCL-GNFSVL ;Remainder of File Control Block
|
||
; Drop into MOVE ;Spread 0's through remainder of FCB
|
||
; v
|
||
;
|
||
; MOVE
|
||
; This subroutine moves C bytes from (HL) to (DE).
|
||
;
|
||
MOVE:
|
||
MOV A,M ;Get source byte
|
||
STAX D ;Save destination byte
|
||
INX D ;Increment destination pointer
|
||
INX H ;Increment source pointer
|
||
DCR C ;Downdate count
|
||
JNZ MOVE ;Go back for more
|
||
RET
|
||
;
|
||
; BF
|
||
; Build File Control Block
|
||
;
|
||
; This subroutine formats a 00H-byte terminated string
|
||
; (presumed to be a File Name) into an FCB, setting the
|
||
; Disk, File name and Type and clearing the remainder of the
|
||
; FCB to 0's.
|
||
;
|
||
; Entry Parameters
|
||
;
|
||
; DE -> File Control Block (36 Bytes)
|
||
; HL -> File Name String (00H-byte terminated)
|
||
;
|
||
; Exit Parameters
|
||
;
|
||
; The built File Control block.
|
||
;
|
||
; This subroutine is shown in full in Figure 5.32
|
||
;
|
||
BF: RET ;Dummy subroutine for this example
|
||
|