123 lines
2.4 KiB
NASM
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 |