format elf64 include 'pic_constants.incS' extrn irq_pic_IntHandler extrn irq_pic_IRQHandler_Data extrn irq_pic_IRQHandlerRaw public irq_pic_IntHandler20h public irq_pic_IntHandler21h public irq_pic_IntHandler22h public irq_pic_IntHandler23h public irq_pic_IntHandler24h public irq_pic_IntHandler25h public irq_pic_IntHandler26h public irq_pic_IntHandler27h public irq_pic_IntHandler28h public irq_pic_IntHandler29h public irq_pic_IntHandler2ah public irq_pic_IntHandler2bh public irq_pic_IntHandler2ch public irq_pic_IntHandler2dh public irq_pic_IntHandler2eh public irq_pic_IntHandler2fh section '.text' executable macro inth op1 { push rax mov rax, [irq_pic_IRQHandlerRaw+op1*8] test rax, rax jz .noraw ; has raw handler mov al, PIC_CMD_EOI if op1 >= 8 out PIC2_COMMAND, al end if out PIC1_COMMAND, al pop rax jmp qword [irq_pic_IRQHandlerRaw+op1*8] .noraw: push rdi mov rdi, op1 push rsi push rdx push rcx push r8 push r9 push r10 push r11 call irq_pic_IntHandler pop r11 pop r10 pop r9 pop r8 pop rcx pop rdx pop rsi pop rdi pop rax iretq } irq_pic_IntHandler20h: inth 0 irq_pic_IntHandler21h: inth 1 irq_pic_IntHandler22h: inth 2 irq_pic_IntHandler23h: inth 3 irq_pic_IntHandler24h: inth 4 irq_pic_IntHandler25h: inth 5 irq_pic_IntHandler26h: inth 6 irq_pic_IntHandler27h: inth 7 irq_pic_IntHandler28h: inth 8 irq_pic_IntHandler29h: inth 9 irq_pic_IntHandler2ah: inth 10 irq_pic_IntHandler2bh: inth 11 irq_pic_IntHandler2ch: inth 12 irq_pic_IntHandler2dh: inth 13 irq_pic_IntHandler2eh: inth 14 irq_pic_IntHandler2fh: inth 15