Rework interrupt handling, realign stuff for relative jumps

This commit is contained in:
Nero 2019-09-10 21:38:52 +00:00
parent e4dec4b14c
commit e86bde72f8
2 changed files with 54 additions and 60 deletions

View File

@ -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 ; Register a interrupt handler
; in: AL interrupt number ; in: AL interrupt number
; ES:DI far ptr to routine/data ; ES:DI far ptr to routine/data

View File

@ -1,45 +1,18 @@
cpu 8086 cpu 8086
org 0x0100 org 0x0100
push cs jmp init
pop es
mov di, isr_dos_main
mov ax, 0x21
call intr_register
int3
cli
.halt:
hlt
jmp .halt
isr_dos_main: isr_dos_main:
; Bail out if subfunction number too high cmp ah, 0x01
cmp ah, 0x0F je isr_getc_echo
jnc isr_invalid cmp ah, 0x02
je isr_putc
jmp isr_invalid
; allocate our return address %include "chario.asm"
push bx %include "intr.asm"
; actual BX backup
push bx
; transfer subfunction number into BX %include "cache.asm"
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 for invalid subfunctions or unimplemented
isr_invalid: isr_invalid:
@ -58,31 +31,21 @@ isr_error:
isr_return: isr_return:
iret iret
; Table for DOS subfunctions init:
dos_functions: push cs
; AH 00-03 pop es
dw isr_invalid mov di, isr_dos_main
dw isr_getc_echo mov ax, 0x21
dw isr_putc call intr_register
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" mov di, kernel_end
call cache_init
%include "chario.asm" int3
cli
.halt:
hlt
jmp .halt
kernel_end: kernel_end: