0fd515d7a027fd9c0f3d45f24abcee3274348de7
[eightysix] / kern / src / intrent.asm
1 ; interrupt entry routines
2         cpu 8086
3         bits 16
4         section .text
5
6 extern dispatch_intr
7
8 %macro INTR_ENTRY 2
9 global intr_entry_%2
10 intr_entry_%2:
11         push bp
12         push ax
13         push bp
14         mov bp, sp
15         mov ax, %1
16         mov [bp + 4], ax
17         pop bp
18         pop ax
19         jmp intr_entry_common
20 %endmacro
21
22 intr_entry_common:
23         push ax
24         mov ax, sp
25         add ax, 2
26         push cx
27         push dx
28         push bx
29         push ax ; saved sp
30         push bp
31         push si
32         push di
33         call dispatch_intr
34         pop di
35         pop si
36         pop bp
37         pop bx  ; throw away saved sp
38         pop bx
39         pop dx
40         pop cx
41         pop ax
42         add sp, 2       ; remove interrupt number from the stack
43         iret
44
45 ; CPU exceptions
46 INTR_ENTRY 0, div
47 INTR_ENTRY 1, trap
48 INTR_ENTRY 2, nmi
49 INTR_ENTRY 3, break
50 INTR_ENTRY 4, ovf
51 INTR_ENTRY 5, bound
52 INTR_ENTRY 6, ill
53 ; IRQs
54 INTR_ENTRY 8, irq0
55 INTR_ENTRY 9, irq1
56 INTR_ENTRY 10, irq2
57 INTR_ENTRY 11, irq3
58 INTR_ENTRY 12, irq4
59 INTR_ENTRY 13, irq5
60 INTR_ENTRY 14, irq6
61 INTR_ENTRY 15, irq7
62
63 ; vi:ts=8 sts=8 sw=8 ft=nasm: