foo
[eightysix] / kern / src / intrent.asm
diff --git a/kern/src/intrent.asm b/kern/src/intrent.asm
new file mode 100644 (file)
index 0000000..0fd515d
--- /dev/null
@@ -0,0 +1,63 @@
+; interrupt entry routines
+       cpu 8086
+       bits 16
+       section .text
+
+extern dispatch_intr
+
+%macro INTR_ENTRY 2
+global intr_entry_%2
+intr_entry_%2:
+       push bp
+       push ax
+       push bp
+       mov bp, sp
+       mov ax, %1
+       mov [bp + 4], ax
+       pop bp
+       pop ax
+       jmp intr_entry_common
+%endmacro
+
+intr_entry_common:
+       push ax
+       mov ax, sp
+       add ax, 2
+       push cx
+       push dx
+       push bx
+       push ax ; saved sp
+       push bp
+       push si
+       push di
+       call dispatch_intr
+       pop di
+       pop si
+       pop bp
+       pop bx  ; throw away saved sp
+       pop bx
+       pop dx
+       pop cx
+       pop ax
+       add sp, 2       ; remove interrupt number from the stack
+       iret
+
+; CPU exceptions
+INTR_ENTRY 0, div
+INTR_ENTRY 1, trap
+INTR_ENTRY 2, nmi
+INTR_ENTRY 3, break
+INTR_ENTRY 4, ovf
+INTR_ENTRY 5, bound
+INTR_ENTRY 6, ill
+; IRQs
+INTR_ENTRY 8, irq0
+INTR_ENTRY 9, irq1
+INTR_ENTRY 10, irq2
+INTR_ENTRY 11, irq3
+INTR_ENTRY 12, irq4
+INTR_ENTRY 13, irq5
+INTR_ENTRY 14, irq6
+INTR_ENTRY 15, irq7
+
+; vi:ts=8 sts=8 sw=8 ft=nasm: