diff --git a/boot/kernel.asm b/boot/kernel.asm index bc529c9..51be791 100644 --- a/boot/kernel.asm +++ b/boot/kernel.asm @@ -2,8 +2,10 @@ org 0x500 jmp 0:(init+0x7C00-$$) - %include "inc/bpb.asm" - %include "inc/mbr.asm" +%include "kernel/fd.asm" +%include "kernel/con.asm" +%include "inc/bpb.asm" +%include "inc/mbr.asm" ; Far call via interrupt vector %macro intcall 1 @@ -217,10 +219,11 @@ intlp: movsw stosw loop intlp - ; print banner to indicate we are booted - mov si, banner - mov ah, 9 - int 0x21 + ; print banner + mov dx, banner + mov cx, 13 + mov bx, 0 + call con_write call dnconv mov al, dl diff --git a/kernel/con.asm b/kernel/con.asm new file mode 100644 index 0000000..488174b --- /dev/null +++ b/kernel/con.asm @@ -0,0 +1,22 @@ +con_ftab: dw con_read + dw con_write + +con_read: stc + ret + +con_write: push si + push bx + push cx + test cx, cx + jz .end + mov si, dx + mov ah, 0x0E + xor bx, bx +.loop: lodsb + int 0x10 + loop .loop + pop cx +.end: pop bx + pop si + ret + diff --git a/kernel/fd.asm b/kernel/fd.asm new file mode 100644 index 0000000..b3860f1 --- /dev/null +++ b/kernel/fd.asm @@ -0,0 +1,32 @@ +%define fd_num 32 + + section .bss + +fd_table: resb (0x10 * fd_num) + + section .text + +fd_to_ptr: push cx + mov cl, 4 + sal bx, cl + add bx, fd_table + pop cx + ret + +fd_read: cmp bx, fd_num + jnc fd_inv_hnd + call fd_to_ptr + ; read ptr to ftab + mov bx, [bx] + ; jmp to addr in ftab[0] + jmp [bx] + +fd_write: cmp bx, fd_num + jnc fd_inv_hnd + call fd_to_ptr + mov bx, [bx] + jmp [bx+2] + +fd_inv_hnd: mov ax, 6 + stc + ret