80 lines
1.3 KiB
NASM
80 lines
1.3 KiB
NASM
section .bss
|
|
|
|
; default drive if field in FCB = 0
|
|
defdrv: resb 1
|
|
|
|
section .text
|
|
|
|
; Helper function: read the drive number from FCB,
|
|
; apply default if necessary,
|
|
; and make it current I/O drive
|
|
_setdrv: mov dl, [es:bx] ; A=1
|
|
test dl, dl
|
|
jnz .nofix
|
|
mov dl, [defdrv] ; A=0
|
|
inc dl
|
|
mov [es:bx], dl ; A=1
|
|
; now set as current i/o drive
|
|
.nofix: dec dl ; A=0 for dsksel
|
|
jmp logdrv
|
|
|
|
; Load root directory entry
|
|
; IN ax number of directory entry
|
|
lddir: push ax
|
|
mov cl, 4
|
|
shr ax, cl
|
|
xor dx, dx
|
|
call maprd
|
|
; get si to point to entry
|
|
pop si
|
|
mov cl, 5
|
|
shl si, cl
|
|
and si, 0x1FF
|
|
add si, dskbuf
|
|
ret
|
|
|
|
; find next file
|
|
fnfile: mov ax, [es:bx+FCBDEN]
|
|
inc word [es:bx+FCBDEN]
|
|
; bail out if we are at end of dir
|
|
cmp ax, [bpb+BPBRDE]
|
|
jnc .err
|
|
; load entry and first byte
|
|
push bx
|
|
call lddir
|
|
pop bx
|
|
; next if hidden, dir or vol label
|
|
test byte [si+0x0B], 0xDA
|
|
jnz fnfile
|
|
; bail out if end of dir
|
|
mov al, [si]
|
|
cmp al, 0
|
|
je .err
|
|
; next if deleted entry
|
|
cmp al, 0xE5
|
|
je fnfile
|
|
clc
|
|
ret
|
|
.err: stc
|
|
ret
|
|
|
|
; initialize a FCB for directory scanning
|
|
open: mov word [es:bx+FCBDEN], 0
|
|
.search: call fnfile
|
|
mov al, 0xFF
|
|
jc .ret
|
|
push si
|
|
lea di, [bx+1]
|
|
mov cx, 11
|
|
rep cmpsb
|
|
pop si
|
|
jne .search
|
|
mov al, 0
|
|
.ret: ret
|
|
|
|
putfn: mov cx, 11
|
|
.loop: lodsb
|
|
call pputc
|
|
loop .loop
|
|
ret
|