diff --git a/boot/kernel.asm b/boot/kernel.asm index ba7b8b4..424c8d1 100644 --- a/boot/kernel.asm +++ b/boot/kernel.asm @@ -45,12 +45,10 @@ hlt: hlt jmp hlt %include "kernel/syscall.asm" -%include "kernel/far.asm" +%include "kernel/char.asm" %include "kernel/fcb.asm" -%include "kernel/find.asm" %include "kernel/drive.asm" %include "kernel/printf.asm" -%include "kernel/char.asm" section .data diff --git a/kernel/far.asm b/kernel/far.asm deleted file mode 100644 index e24a464..0000000 --- a/kernel/far.asm +++ /dev/null @@ -1,47 +0,0 @@ -; Utilities to help with far pointers - -; exchange DS:SI with ES:DI -xchgs: push ds - push es - pop ds - pop es - xchg si, di - ret - -; far pointer load -; IN ES:BX far pointer to data -; CX number of bytes to copy -; 0:DX destination buffer - -lod: push es - - ; ES:DI := DS:DX - mov ax, ds - mov es, ax - mov di, dx - ; DS:SI := 0:BX - xor ax, ax - mov ds, ax - mov si, bx - ; copy - pushf - cld - rep movsb - popf - ; reset DS to kernel data - mov ds, cx - - pop es - ret - -; far pointer store -; IN ES:BX far ptr -; CX number of bytes -; 0:DX source buffer -; only CX is trashed - -sto: mov si, dx - mov di, bx - cld - rep movsb - ret diff --git a/kernel/fcb.asm b/kernel/fcb.asm index 6cca5fc..d4c2a51 100644 --- a/kernel/fcb.asm +++ b/kernel/fcb.asm @@ -4,12 +4,11 @@ section .bss 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] ; A=1 +_setdrv: mov dl, [es:bx] ; A=1 test dl, dl jnz .nofix mov dl, [defdrv] ; A=0 @@ -18,3 +17,63 @@ setdrv: mov dl, [es:bx] ; 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 diff --git a/kernel/find.asm b/kernel/find.asm deleted file mode 100644 index 868a809..0000000 --- a/kernel/find.asm +++ /dev/null @@ -1,59 +0,0 @@ - ; 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