rdos/kernel/main.asm

89 lines
1.3 KiB
NASM

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
isr_dos_main:
; Bail out if subfunction number too high
cmp ah, 0x0F
jnc isr_invalid
; allocate our return address
push bx
; actual BX backup
push bx
; 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
; ISR for invalid subfunctions or unimplemented
isr_invalid:
mov bp, 0xFEFE
int3
.hlt:
hlt
jmp .hlt
; ISR tail to set carry flag to signal error
isr_error:
push bp
mov bp, sp
; set carry flag
or WORD [SS:BP+6], 1
pop bp
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
%include "intr.asm"
%include "chario.asm"
kernel_end: