diff --git a/kernel/intr.asm b/kernel/intr.asm index 0c2d34b..21419c2 100644 --- a/kernel/intr.asm +++ b/kernel/intr.asm @@ -1,3 +1,34 @@ +; Register a interrupt handler (21h AH=25h) +; in: AL interrupt number +; DS:DX far ptr +isr_intr_register: + ; backup previous stos ptr + push es + push di + + ; DI = AL * 4 + mov ah, 4 + mul ah + mov di, ax + + ; ES = 0 + xor ax, ax + mov es, ax + + ; store offset + mov ax, dx + stosw + + ; store segment + mov ax, ds + stosw + + ; restore previous stos ptr + pop di + pop es + + iret + ; Register a interrupt handler ; in: AL interrupt number ; ES:DI far ptr to routine/data diff --git a/kernel/main.asm b/kernel/main.asm index 1688548..d48c4ff 100644 --- a/kernel/main.asm +++ b/kernel/main.asm @@ -1,45 +1,18 @@ cpu 8086 org 0x0100 - push cs - pop es - mov di, isr_dos_main - mov ax, 0x21 - call intr_register - - int3 - - cli -.halt: - hlt - jmp .halt +jmp init isr_dos_main: - ; Bail out if subfunction number too high - cmp ah, 0x0F - jnc isr_invalid + cmp ah, 0x01 + je isr_getc_echo + cmp ah, 0x02 + je isr_putc + jmp isr_invalid - ; allocate our return address - push bx - ; actual BX backup - push bx +%include "chario.asm" +%include "intr.asm" - ; transfer subfunction number into BX - xor bx, bx - mov bl, ah - ; table offset = AH * 2 - shl bx, 1 - ; fetch from table - mov bx, [dos_functions+bx] - - ; inject our address into the stack - add sp, 4 - push bx - sub sp, 2 - - ; restore BX - pop bx - ; reads our address from the stack and jumps there - ret +%include "cache.asm" ; ISR for invalid subfunctions or unimplemented isr_invalid: @@ -58,31 +31,21 @@ isr_error: isr_return: iret -; Table for DOS subfunctions -dos_functions: - ; AH 00-03 - dw isr_invalid - dw isr_getc_echo - dw isr_putc - dw isr_invalid - ; AH 04-07 - dw isr_invalid - dw isr_invalid - dw isr_invalid - dw isr_invalid - ; AH 08-0B - dw isr_invalid - dw isr_invalid - dw isr_invalid - dw isr_invalid - ; AH 0C-0F - dw isr_invalid - dw isr_invalid - dw isr_invalid - dw isr_invalid +init: + push cs + pop es + mov di, isr_dos_main + mov ax, 0x21 + call intr_register -%include "intr.asm" + mov di, kernel_end + call cache_init -%include "chario.asm" + int3 + + cli +.halt: + hlt + jmp .halt kernel_end: