interrupts half-done
[ld45_start_nothing] / src / intr.asm
diff --git a/src/intr.asm b/src/intr.asm
new file mode 100644 (file)
index 0000000..1bbf319
--- /dev/null
@@ -0,0 +1,60 @@
+; vi:filetype=nasm ts=8 sts=8 sw=8:
+       section .text
+
+%include "intr.inc"
+
+       global init_intr
+init_intr:
+       call init_pic
+       ret
+
+       global set_intr
+set_intr:
+       ret
+
+PIC1_CMD equ 20h
+PIC1_DATA equ 21h
+PIC2_CMD equ 0a0h
+PIC2_DATA equ 0a1h
+
+; PIC initialization command word 1 bits
+ICW1_ICW4_NEEDED       equ 01h
+ICW1_SINGLE            equ 02h
+ICW1_INTERVAL4         equ 04h
+ICW1_LEVEL             equ 08h
+ICW1_INIT              equ 10h
+; PIC initialization command word 4 bits
+ICW4_8086              equ 01h
+ICW4_AUTO_EOI          equ 02h
+ICW4_BUF_SLAVE         equ 08h
+ICW4_BUF_MASTER                equ 0ch
+ICW4_SPECIAL           equ 10h
+; PIC operation command word 2 bits
+OCW2_EOI               equ 20h
+
+init_pic:
+       ; send ICW1 saying we'll follow with ICW4 later on
+       mov al, ICW1_INIT | ICW1_ICW4_NEEDED
+       out PIC1_CMD, al
+       out PIC2_CMD, al
+       ; send ICW2 with IRQ remapping
+       mov al, IRQ_OFFSET
+       out PIC1_DATA, al
+       add al, 8
+       out PIC2_DATA, al
+       ; send ICW3 to setup the master/slave relationship
+       ; ... set bit3 = 3rd interrupt input has a slave
+       mov al, 4
+       out PIC1_DATA, al
+       ; ... set slave ID to 2
+       mov al, 2
+       out PIC2_DATA, al
+       ; send ICW4 to set 8086 mode (no calls generated)
+       mov al, ICW4_8086
+       out PIC1_DATA, al
+       out PIC2_DATA, al
+       ; done, reset the data port to 0
+       xor al, al
+       out PIC1_DATA, al
+       out PIC2_DATA, al
+       ret