//! sets new interrupt vector void setvect(int intno, void(&vect) (), int flags) { //! install interrupt handler! This overwrites prev interrupt descriptor i86_install_ir(intno, (uint16_t)(I86_IDT_DESC_PRESENT | I86_IDT_DESC_BIT32 | flags), 0x8, vect); }
void i86_irq_initialize(uint16_t codeSel) { for(uint8_t i = 0; i < IRQ_COUNT; i++) { irq_routines[i] = 0; } // Remap IRQ 0-15 to interrupts 32-47 outport(IRQ_PRIMARY_PIC_COMMAND_PORT, IRQ_ICW1); outport(IRQ_SECONDARY_PIC_COMMAND_PORT, IRQ_ICW1); outport(IRQ_PRIMARY_PIC_DATA_PORT, IRQ_ICW2_PRIMARY_PIC); outport(IRQ_SECONDARY_PIC_DATA_PORT, IRQ_ICW2_SECONDARY_PIC); outport(IRQ_PRIMARY_PIC_DATA_PORT, IRQ_ICW3_PRIMARY_PIC); outport(IRQ_SECONDARY_PIC_DATA_PORT, IRQ_ICW3_SECONDARY_PIC); outport(IRQ_PRIMARY_PIC_DATA_PORT, IRQ_ICW4); outport(IRQ_SECONDARY_PIC_DATA_PORT, IRQ_ICW4); // Zero data port outport(IRQ_PRIMARY_PIC_DATA_PORT, 0); outport(IRQ_SECONDARY_PIC_DATA_PORT, 0); uint16_t _flags = I86_IDT_DESC_PRESENT + I86_IDT_DESC_RING0 + I86_IDT_DESC_INT32; // Set up default IDT for IRQs i86_install_ir(32, _flags, codeSel, (I86_IRQ_HANDLER) irq0); i86_install_ir(33, _flags, codeSel, (I86_IRQ_HANDLER) irq1); i86_install_ir(34, _flags, codeSel, (I86_IRQ_HANDLER) irq2); i86_install_ir(35, _flags, codeSel, (I86_IRQ_HANDLER) irq3); i86_install_ir(36, _flags, codeSel, (I86_IRQ_HANDLER) irq4); i86_install_ir(37, _flags, codeSel, (I86_IRQ_HANDLER) irq5); i86_install_ir(38, _flags, codeSel, (I86_IRQ_HANDLER) irq6); i86_install_ir(39, _flags, codeSel, (I86_IRQ_HANDLER) irq7); i86_install_ir(40, _flags, codeSel, (I86_IRQ_HANDLER) irq8); i86_install_ir(41, _flags, codeSel, (I86_IRQ_HANDLER) irq9); i86_install_ir(42, _flags, codeSel, (I86_IRQ_HANDLER) irq10); i86_install_ir(43, _flags, codeSel, (I86_IRQ_HANDLER) irq11); i86_install_ir(44, _flags, codeSel, (I86_IRQ_HANDLER) irq12); i86_install_ir(45, _flags, codeSel, (I86_IRQ_HANDLER) irq13); i86_install_ir(46, _flags, codeSel, (I86_IRQ_HANDLER) irq14); i86_install_ir(47, _flags, codeSel, (I86_IRQ_HANDLER) irq15); }
//! sets new interrupt vector void setvect (int intno, void (far *vect) ( ) ) { //! install interrupt handler! This overwrites prev interrupt descriptor i86_install_ir (intno, I86_IDT_DESC_PRESENT | I86_IDT_DESC_BIT32, 0x8, vect); }