aboutsummaryrefslogtreecommitdiff
path: root/mirai/interrupts/pic/init.zig
blob: 2f84b8a46cbe3d4456a19d7257d21ad7362fe0dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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);
}