; vi:filetype=nasm ts=8 sts=8 sw=8: PIC1_CMD equ 020h PIC1_DATA equ 021h PIC2_CMD equ 0a0h PIC2_DATA equ 0a1h OCW2_EOI equ 020h OCW3_ISR equ 00bh IRQ_OFFSET equ 32 %define IRQ_TO_INTR(x) ((x) + IRQ_OFFSET) %define INTR_TO_IRQ(x) ((x) - IRQ_OFFSET) %macro set_trap 2 push dword %2 push dword %1 call set_intr add esp, 8 %endmacro %macro set_irq_vector 2 push dword %2 push dword IRQ_TO_INTR(%1) call set_intr add esp, 8 %endmacro %macro mask_irq 1 %if %1 < 8 in al, PIC1_DATA or al, (1 << %1) out PIC1_DATA, al %else in al, PIC2_DATA or al, (1 << (%1 - 8)) out PIC2_DATA, al %endif %endmacro %macro unmask_irq 1 %if %1 < 8 in al, PIC1_DATA and al, ~(1 << %1) out PIC1_DATA, al %else in al, PIC2_DATA and al, ~(1 << (%1 - 8)) out PIC2_DATA, al %endif %endmacro %macro end_of_irq 1 mov al, OCW2_EOI %if %1 >= 8 out PIC2_CMD, al %endif out PIC1_CMD, al %endmacro extern idt %ifndef INTR_ASM_ extern init_intr extern set_intr %endif