foo
[ld45_start_nothing] / src / intr.inc
1 ; vi:filetype=nasm ts=8 sts=8 sw=8:
2
3 PIC1_CMD        equ 020h
4 PIC1_DATA       equ 021h
5 PIC2_CMD        equ 0a0h
6 PIC2_DATA       equ 0a1h
7 OCW2_EOI        equ 020h
8 OCW3_ISR        equ 00bh
9 IRQ_OFFSET      equ 32
10 %define IRQ_TO_INTR(x)  ((x) + IRQ_OFFSET)
11 %define INTR_TO_IRQ(x)  ((x) - IRQ_OFFSET)
12
13
14 %macro set_irq_vector 2
15         push dword %2
16         push dword IRQ_TO_INTR(%1)
17         call set_intr
18         add esp, 8
19 %endmacro
20
21 %macro mask_irq 1
22 %if %1 < 8
23         in al, PIC1_DATA
24         or al, (1 << %1)
25         out PIC1_DATA, al
26 %else
27         in al, PIC2_DATA
28         or al, (1 << (%1 - 8))
29         out PIC2_DATA, al
30 %endif
31 %endmacro
32
33 %macro unmask_irq 1
34 %if %1 < 8
35         in al, PIC1_DATA
36         and al, ~(1 << %1)
37         out PIC1_DATA, al
38 %else
39         in al, PIC2_DATA
40         and al, ~(1 << (%1 - 8))
41         out PIC2_DATA, al
42 %endif
43 %endmacro
44
45 %macro end_of_irq 1
46         mov al, OCW2_EOI
47 %if %1 >= 8
48         out PIC2_CMD, al
49 %endif
50         out PIC1_CMD, al
51 %endmacro
52
53         extern idt
54
55 %ifndef INTR_ASM_
56         extern init_intr
57         extern set_intr
58 %endif