Dynamic IRQ handling
This commit is contained in:
@@ -56,6 +56,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#define CASCADE_IRQ 2
|
||||
|
||||
static void pic_mask_all(void) {
|
||||
ioport_out8(PIC1_DATA, 0xFF);
|
||||
ioport_wait();
|
||||
ioport_out8(PIC2_DATA, 0xFF);
|
||||
ioport_wait();
|
||||
}
|
||||
|
||||
void pic_init(void) {
|
||||
// remap & disable
|
||||
|
||||
@@ -82,21 +89,41 @@ void pic_init(void) {
|
||||
ioport_out8(PIC2_DATA, ICW4_8086);
|
||||
ioport_wait();
|
||||
|
||||
pic_mask();
|
||||
pic_mask_all();
|
||||
}
|
||||
|
||||
void pic_mask(void) {
|
||||
ioport_out8(PIC1_DATA, 0xFF);
|
||||
ioport_wait();
|
||||
ioport_out8(PIC2_DATA, 0xFF);
|
||||
ioport_wait();
|
||||
void pic_unmask_irq(uint8_t irq) {
|
||||
uint16_t port;
|
||||
uint8_t value;
|
||||
|
||||
irq -= 0x20;
|
||||
|
||||
if (irq < 8) {
|
||||
port = PIC1_DATA;
|
||||
} else {
|
||||
port = PIC2_DATA;
|
||||
irq -= 8;
|
||||
}
|
||||
|
||||
value = ioport_in8(port) & ~(1<<irq);
|
||||
ioport_out8(port, value);
|
||||
}
|
||||
|
||||
void pic_unmask(void) {
|
||||
ioport_out8(PIC1_DATA, 0);
|
||||
ioport_wait();
|
||||
ioport_out8(PIC2_DATA, 0);
|
||||
ioport_wait();
|
||||
void pic_mask_irq(uint8_t irq) {
|
||||
uint16_t port;
|
||||
uint8_t value;
|
||||
|
||||
irq -= 0x20;
|
||||
|
||||
if (irq < 8) {
|
||||
port = PIC1_DATA;
|
||||
} else {
|
||||
port = PIC2_DATA;
|
||||
irq -= 8;
|
||||
}
|
||||
|
||||
value = ioport_in8(port) | (1<<irq);
|
||||
ioport_out8(port, value);
|
||||
}
|
||||
|
||||
void pic_fini(uint8_t trap) {
|
||||
|
||||
Reference in New Issue
Block a user