aboutsummaryrefslogtreecommitdiff
path: root/mirai/interrupts/pic/init.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai/interrupts/pic/init.zig')
-rw-r--r--mirai/interrupts/pic/init.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/mirai/interrupts/pic/init.zig b/mirai/interrupts/pic/init.zig
new file mode 100644
index 0000000..2f84b8a
--- /dev/null
+++ b/mirai/interrupts/pic/init.zig
@@ -0,0 +1,41 @@
+//! PIC Initialization
+
+const ports = @import("ports.zig");
+const asm_io = @import("../../asm/io/io.zig");
+
+pub fn remap() void {
+ const mask1 = asm_io.inb(ports.pic1_data);
+ const mask2 = asm_io.inb(ports.pic2_data);
+
+ asm_io.outb(ports.pic1_command, ports.icw1_init | ports.icw1_icw4);
+ io_wait();
+ asm_io.outb(ports.pic2_command, ports.icw1_init | ports.icw1_icw4);
+ io_wait();
+
+ asm_io.outb(ports.pic1_data, ports.vector_offset_master);
+ io_wait();
+ asm_io.outb(ports.pic2_data, ports.vector_offset_slave);
+ io_wait();
+
+ asm_io.outb(ports.pic1_data, 4);
+ io_wait();
+ asm_io.outb(ports.pic2_data, 2);
+ io_wait();
+
+ asm_io.outb(ports.pic1_data, ports.icw4_8086);
+ io_wait();
+ asm_io.outb(ports.pic2_data, ports.icw4_8086);
+ io_wait();
+
+ asm_io.outb(ports.pic1_data, mask1);
+ asm_io.outb(ports.pic2_data, mask2);
+}
+
+pub fn disable() void {
+ asm_io.outb(ports.pic1_data, 0xFF);
+ asm_io.outb(ports.pic2_data, 0xFF);
+}
+
+fn io_wait() void {
+ asm_io.outb(0x80, 0);
+}