/* * libcaca Colour ASCII-Art library * Copyright (c) 2006 Sam Hocevar * 2009 Jean-Yves Lamoureux * All Rights Reserved * * This library is free software. It comes without any warranty, to * the extent permitted by applicable law. You can redistribute it * and/or modify it under the terms of the Do What The Fuck You Want * To Public License, Version 2, as published by Sam Hocevar. See * http://sam.zoy.org/wtfpl/COPYING for more details. */ #include "klibc.h" #define PIC_MASTER_ICW1 0x20 #define PIC_MASTER_ICW2 0x21 #define PIC_SLAVE_ICW1 0xA0 #define PIC_SLAVE_ICW2 0xA1 void init_pic(void) { /* MASTER */ outbp(PIC_MASTER_ICW1, 0x11); // Init 8259A-1 /* ICW2 - start vector = 32 */ outbp(PIC_MASTER_ICW2, 0x20); // IRQ 0-7 mapped to 0x20-0x27 /* IICW3 */ outbp(PIC_MASTER_ICW2, 0x04); // 8259A-1 has slave /* ICW4 */ outbp(PIC_MASTER_ICW2, 0x01); /* Int mask */ outbp(PIC_MASTER_ICW2, 0xFF); /* SLAVE */ outbp(PIC_SLAVE_ICW1, 0x11); /* ICW2 - start vector = 96 */ outbp(PIC_SLAVE_ICW2, 0x70); /* ICW3 */ outbp(PIC_SLAVE_ICW2, 0x02); /* ICW4 */ outbp(PIC_SLAVE_ICW2, 0x01); /* Int Mask */ outbp(PIC_SLAVE_ICW2, 0xFF); /* Unmask irqs */ outbp(0x21, 0xFD); } static unsigned int cached_irq_mask = 0xffff; #define __byte(x,y) (((unsigned char *)&(y))[x]) #define cached_21 (__byte(0,cached_irq_mask)) #define cached_A1 (__byte(1,cached_irq_mask)) void disable_interrupt(char irq) { unsigned int mask = 1 << irq; cached_irq_mask |= mask; if (irq & 8) { outb(0xA1, cached_A1); } else { outb(0x21, cached_21); } } void enable_interrupt(char irq) { unsigned int mask = ~(1 << irq); cached_irq_mask &= mask; if (irq & 8) { outb(0xA1, cached_A1); } else { outb(0x21, cached_21); } }