rdos/kernel/intr.asm

123 lines
2.4 KiB
NASM

; Data table for interrupts
; cs:word for service routine
intr_table0:
dw iret ; 00 Divide by Zero
dw iret ; 01 Single Step
dw iret ; 02 Parity error routine (NMI)
dw debug_reg_ir ; 03 Break
dw iret ; 04 Overflow
dw iret ; 05 Print Screen
dw iret ; 06 Mouse button control
dw isr_dosmain ; 07 Reserved
dw irq0 ; 08 System Clock interrupt
dw irq1 ; 09 Keyboard interrupt
dw irq2 ; 0a RTC interrupt
dw irq3 ; 0b COMMS
dw irq4 ; 0c COMMS
dw irq5 ; 0d Hard Disk
dw irq6 ; 0e Floppy Disk interrupt routine
dw irq7 ; 0f Printer interrupt
intr_table2:
dw iret ; 20
dw isr_dosmain ; 21
dw iret ; 22
dw iret ; 23
dw iret ; 24
dw iret ; 25
dw iret ; 26
dw iret ; 27
dw iret ; 28
dw iret ; 29
dw iret ; 2a
dw iret ; 2b
dw iret ; 2c
dw iret ; 2d
dw iret ; 2e
dw iret ; 2f
; LSB is IRQ0, MSB is IRQ16
; A IRQ will set their bit to 1, so userspace may poll it via wait_irq
intr_flip:
dw 0
intr_init:
push ds
push es
; backup intr 0x0n to 0x4n
xor ax, ax
mov ds, ax ; read from IVT
mov es, ax ; write to IVT
mov si, ax ; read from start of IVT table
mov di, 0x0100 ; write to offset of int 0x40 address
mov cx, 0x0020 ; 0x10 vectors, segment:offset each
repe movsw
; now setup our own handlers (0x0n)
mov ax, cs
mov ds, ax ; read from local segment
mov si, intr_table0 ; read from intr_table
mov di, 0x0000 ; write to start of IVT table
mov cx, 0x0010 ; 0x10 vectors, one offset each
.loop0:
movsw ; read offset; write offset
mov ax,cs
stosw ; write segment
loop .loop0
; second vector block (0x2n)
mov si, intr_table2 ; read from intr_table
mov di, 0x0080 ; write to int 20h vector and above
mov cx, 0x0010 ; 0x10 vectors, one offset each
.loop2:
movsw ; read offset; write offset
mov ax,cs
stosw ; write segment
loop .loop2
pop es
pop ds
ret
irq0:
int 0x48
or byte [cs:intr_flip], 0x01
jmp irqret
irq1:
int 0x49
or byte [cs:intr_flip], 0x02
jmp irqret
irq2:
int 0x4A
or byte [cs:intr_flip], 0x04
jmp irqret
irq3:
int 0x4B
or byte [cs:intr_flip], 0x08
jmp irqret
irq4:
int 0x4C
or byte [cs:intr_flip], 0x10
jmp irqret
irq5:
int 0x4D
or byte [cs:intr_flip], 0x20
jmp irqret
irq6:
int 0x4E
or byte [cs:intr_flip], 0x40
jmp irqret
irq7:
int 0x4F
or byte [cs:intr_flip], 0x80
jmp irqret
hwiret:
mov al,20h
out 20h,al
irqret:
iret:
iret