rdos/kernel/fcb.asm

80 lines
1.3 KiB
NASM
Raw Normal View History

2020-10-13 22:10:23 +02:00
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
2020-10-13 22:10:23 +02:00
test dl, dl
jnz .nofix
mov dl, [defdrv] ; A=0
inc dl
mov [es:bx], dl ; A=1
2020-10-13 22:10:23 +02:00
; 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