56 lines
1.2 KiB
Zig
56 lines
1.2 KiB
Zig
const io = @import("ioports.zig");
|
|
|
|
const PIC1_COMMAND = 0x20;
|
|
const PIC1_DATA = 0x21;
|
|
const PIC2_COMMAND = 0xA0;
|
|
const PIC2_DATA = 0xA1;
|
|
const PIC_EOI = 0x20;
|
|
|
|
const ICW1_INIT = 0x10;
|
|
const ICW1_ICW4 = 0x01;
|
|
const ICW4_8086 = 0x01;
|
|
|
|
inline fn ioDelay() void {
|
|
io.outb(0x80, 0);
|
|
}
|
|
|
|
/// Remap the PIC so that all IRQs are remapped to 0x20-0x2f.
|
|
pub fn remapPIC() void {
|
|
io.outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4);
|
|
ioDelay();
|
|
io.outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4);
|
|
ioDelay();
|
|
|
|
io.outb(PIC1_DATA, 0x20);
|
|
ioDelay();
|
|
|
|
io.outb(PIC2_DATA, 0x28);
|
|
ioDelay();
|
|
|
|
io.outb(PIC1_DATA, 4);
|
|
ioDelay();
|
|
io.outb(PIC2_DATA, 2);
|
|
ioDelay();
|
|
|
|
io.outb(PIC1_DATA, ICW4_8086);
|
|
ioDelay();
|
|
io.outb(PIC2_DATA, ICW4_8086);
|
|
ioDelay();
|
|
|
|
changePICMasks(0b11111111, 0b11111111);
|
|
}
|
|
|
|
/// Update the PIC masks.
|
|
pub fn changePICMasks(pic1_mask: u8, pic2_mask: u8) void {
|
|
io.outb(PIC1_DATA, pic1_mask);
|
|
ioDelay();
|
|
io.outb(PIC2_DATA, pic2_mask);
|
|
ioDelay();
|
|
}
|
|
|
|
/// Send an end-of-interrupt signal to the PIC.
|
|
pub fn picEOI(irq: u8) void {
|
|
if (irq >= 8) io.outb(PIC2_COMMAND, PIC_EOI);
|
|
io.outb(PIC1_COMMAND, PIC_EOI);
|
|
}
|