interrupts half-done
[ld45_start_nothing] / src / intr.inc
diff --git a/src/intr.inc b/src/intr.inc
new file mode 100644 (file)
index 0000000..95b18d6
--- /dev/null
@@ -0,0 +1,45 @@
+; vi:filetype=nasm ts=8 sts=8 sw=8:
+
+%define IRQ_OFFSET     32
+%define IRQ_TO_INTR(x) ((x) + IRQ_OFFSET)
+%define INTR_TO_IRQ(x) ((x) - IRQ_OFFSET)
+
+%macro set_irq_vector 2
+       push dword IRQ_TO_INTR(%1)
+       push dword %2
+       call set_intr
+%endmacro
+
+%macro mask_irq 1
+%if %1 < 8
+%assign port PIC1_DATA
+%assign mask (1 << %1)
+%else
+%assign port PIC2_DATA
+%assign mask (1 << (%1 - 8))
+%endif
+       in al, port
+       or al, mask
+       out port, al
+%endmacro
+
+%macro unmask_irq 1
+%if %1 < 8
+%assign port PIC1_DATA
+%assign mask ~(1 << %1)
+%else
+%assign port PIC2_DATA
+%assign mask ~(1 << (%1 - 8))
+%endif
+       in al, port
+       and al, mask
+       out port, al
+%endmacro
+
+%macro end_of_irq 1
+       mov al, OCW2_EOI
+%if %1 >= 8
+       out PIC2_CMD, al
+%endif
+       out PIC1_CMD, al
+%endmacro