diff --git a/boot/kernel.asm b/boot/kernel.asm index 7ea98a5..adcb7d2 100644 --- a/boot/kernel.asm +++ b/boot/kernel.asm @@ -3,6 +3,7 @@ %include "inc/bpb.asm" %include "inc/mbr.asm" +%include "inc/fcb.asm" ; kernel stack size in words %define stacksize 512 @@ -22,18 +23,30 @@ print_banner: mov si, banner cmp al, 0x0D jnz .loop + cmp dl, 0x80 + jc .k + sub dl, (0x80-2) +.k: mov [defdrv], dl + call dskrst - mov dl, 0 - call dsksel + mov bx, testfcb + call fcbfst hlt: hlt jmp hlt +%include "kernel/fcb.asm" +%include "kernel/drive.asm" + +section .data + %defstr VERSIONSTR VERSION banner: db "RDOS ", VERSIONSTR, 0x0A, 0x0D -%include "kernel/drive.asm" +testfcb: db 0 + db "HELLO ", "COM" + times 30 db 0 section .bss diff --git a/inc/fcb.asm b/inc/fcb.asm new file mode 100644 index 0000000..5a00c81 --- /dev/null +++ b/inc/fcb.asm @@ -0,0 +1,10 @@ +struc fcb +.drive resb 1 +.filename resb 8 +.type resb 3 +.fn2 resb 8 +.tp2 resb 3 +.dirpos resw 1 +.cluster resw 1 +.recordnum resb 1 +endstruc diff --git a/kernel/drive.asm b/kernel/drive.asm index 1ee0729..32cd58b 100644 --- a/kernel/drive.asm +++ b/kernel/drive.asm @@ -1,6 +1,6 @@ section .bss - ; drive selected for I/O + ; drive actually selected for I/O dsknum: resb 1 ; current sector number dskseek: resd 1 diff --git a/kernel/fcb.asm b/kernel/fcb.asm index bcec2df..aba293f 100644 --- a/kernel/fcb.asm +++ b/kernel/fcb.asm @@ -1,8 +1,23 @@ -; in FCB required -; word offset in rootdir -; used for search -; word current cluster -; byte record num in cluster +section .bss + + ; default drive if field in FCB = 0 +defdrv: resb 1 + +section .text + ; Functions here generally expect the FCB to be at ES:BX + + ; Helper function: read the drive number from FCB, + ; apply default if necessary, + ; and make it current I/O drive +setdrv: mov dl, [es:bx+fcb.drive] ; A=1 + test dl, dl + jnz .nofix + mov dl, [defdrv] ; A=0 + inc dl + mov [es:bx+fcb.drive], dl ; A=1 + ; now set as current i/o drive +.nofix: dec dl ; A=0 for dsksel + jmp dsksel ; FCB open fcbopn: ; call fcbfst @@ -16,12 +31,10 @@ fcbcls: ; flush disk buffer ret ; FCB find first -fcbfst: ; init search state in FCB - ; jmp to fcbnxt - ret - +fcbfst: mov word [es:bx+fcb.dirpos], 0 ; FCB find next -fcbnxt: ; load rootdir sector from state +fcbnxt: call setdrv + ; load rootdir sector from state ; search until next match ; next sec & loop if mismatch ; err exit if no further matches @@ -31,6 +44,7 @@ fcbnxt: ; load rootdir sector from state fcbdel: ; call fcbfst ; get search state, load root dir from there ; mark file as deleted + ; mark buffer dirty ret ; FCB read