rdos/kernel/intr.asm

87 lines
1.0 KiB
NASM

; 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
intr_register:
; backup original values
push ax
push es
push di
; pop as ax later
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
pop ax
stosw
; store segment
pop ax
stosw
pop di
pop es
pop ax
ret
; Get address for a interrupt vector
; in AL interrupt number
; out DS:SI far ptr to routine/data
intr_load:
push ax
; SI = AL * 4
mov ah, 4
mul ah
mov si, ax
; DS = 0
xor ax, ax
mov ds, ax
; load segment and offset in one go
lds si, [si]
pop ax
ret