Rework interrupt handling, realign stuff for relative jumps
This commit is contained in:
parent
e4dec4b14c
commit
e86bde72f8
@ -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
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user