From 1ae3c7a0b99d297e898dd7eaf744e424bfba5a13 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Sun, 29 Sep 2019 12:23:39 +0000 Subject: [PATCH] Implement FCB parsing in kernel --- kernel/exec.asm | 14 ++++++++++ kernel/fcb.asm | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ kernel/main.asm | 26 ++++++++++++++----- 3 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 kernel/exec.asm create mode 100644 kernel/fcb.asm diff --git a/kernel/exec.asm b/kernel/exec.asm new file mode 100644 index 0000000..c136375 --- /dev/null +++ b/kernel/exec.asm @@ -0,0 +1,14 @@ +; Exec the cmdline at SI or 0x81 +exec_chain: + mov si, 0x81 +exec: + push bx + sub sp, 36 + mov bx, sp + + call fcb_parse + call fcb_print + + add sp, 36 + pop bx + ret diff --git a/kernel/fcb.asm b/kernel/fcb.asm new file mode 100644 index 0000000..5473259 --- /dev/null +++ b/kernel/fcb.asm @@ -0,0 +1,68 @@ +; Parse ASCIIZ string into FCB +; IN SI ptr to filename +; BX ptr to FCB +fcb_parse: + push si + push di + push ax + mov di, bx + inc di +.cleanout: + push di + mov cx, 0x0A + mov al, 0x20 + rep stosb + pop di +.base_loop: + call .read + cmp al, 0x2E + je .ext_start + cmp al, 0x20 + je .ret + stosb + jmp .base_loop +.ext_start: + mov di, bx + add di, 9 +.ext_loop: + call .read + cmp al, 0x20 + je .ret + stosb + jmp .ext_loop +.read: + lodsb + test al, al + jz .eret + cmp al, 0x0D + je .eret + ret +.eret: + pop ax +.ret: + pop ax + pop di + pop si + ret + +; Print a FCB (for debugging) +; IN BX ptr FCB +fcb_print: + push dx + push cx + push si + mov si, bx + inc si + mov cx, 11 +.loop: + lodsb + mov dl, al + call putc + loop .loop + mov dl, 0x26 + call putc +.ret: + pop si + pop cx + pop dx + ret diff --git a/kernel/main.asm b/kernel/main.asm index bff56aa..5d17b6d 100644 --- a/kernel/main.asm +++ b/kernel/main.asm @@ -1,9 +1,19 @@ cpu 8086 ; Memory layout (starting from top) -%define self 0xF000 +%define self 0xF000 + +; A single sector for disk i/o %define diskbuf (self-0x200) -%define stack (diskbuf) ; end addr, grows down + +; BYTE sectors/track and BYTE number of sides +; 4 times for A: B: C: and D: +%define chstab (diskbuf - (4*2)) + +; DWORD partition offset for C: and D: +%define parttab (chstab - (2*4)) + +%define stack (parttab) org self jmp init @@ -28,13 +38,18 @@ init: mov sp, stack call print_banner - int3 + + mov si, init_program + call exec cli .halt: hlt jmp .halt +init_program: + db "HELLO.COM", 0 + cpm_syscall: cmp cl, 0x02 je putc @@ -52,6 +67,5 @@ putc: pop ax ret -%include "string.asm" - -kernel_end: +%include "exec.asm" +%include "fcb.asm"