Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

189 lines
4.6 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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