; 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