foo
[eightysix] / kern / src / intr.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         ; int86 implementation
64         global int86
65 int86:
66         push bp
67         mov bp, sp
68         push bx
69         push si
70         push di
71         pushf
72
73         mov ax, [bp + 4]
74         mov [cs:.intop + 1], al ; modify int instruction
75
76         mov [saved_sp], sp
77         mov sp, [bp + 6]
78         pop ax
79         pop bx
80         pop cx
81         pop dx
82         pop si
83         pop di
84         popf
85         mov sp, [saved_sp]
86
87 .intop: int 0xff
88
89         mov [saved_ax], ax
90         pushf
91         pop ax
92         mov sp, [bp + 8]
93         add sp, 14      ; sp at end of outregs
94         push ax         ; flags
95         mov ax, [saved_ax]
96         push di
97         push si
98         push dx
99         push cx
100         push bx
101         push ax
102
103         mov sp, [saved_sp]
104         popf
105         pop di
106         pop si
107         pop bx
108         pop bp
109         ret
110
111 saved_sp dw 0
112 saved_ax dw 0
113
114 ; vi:ts=8 sts=8 sw=8 ft=nasm: