aboutsummaryrefslogtreecommitdiff
path: root/mirai/interrupts/pic/mask.zig
blob: 3b98e28d05728900fb068222e96f223e6f060d61 (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
//! PIC IRQ Masking

const ports = @import("ports.zig");
const asm_io = @import("../../asm/io/io.zig");

pub fn enable_irq(irq: u4) void {
    if (irq < 8) {
        const mask = asm_io.inb(ports.pic1_data);
        asm_io.outb(ports.pic1_data, mask & ~(@as(u8, 1) << @truncate(irq)));
    } else {
        const mask = asm_io.inb(ports.pic2_data);
        asm_io.outb(ports.pic2_data, mask & ~(@as(u8, 1) << @truncate(irq - 8)));
    }
}

pub fn disable_irq(irq: u4) void {
    if (irq < 8) {
        const mask = asm_io.inb(ports.pic1_data);
        asm_io.outb(ports.pic1_data, mask | (@as(u8, 1) << @truncate(irq)));
    } else {
        const mask = asm_io.inb(ports.pic2_data);
        asm_io.outb(ports.pic2_data, mask | (@as(u8, 1) << @truncate(irq - 8)));
    }
}

pub fn mask_all() void {
    asm_io.outb(ports.pic1_data, 0xFF);
    asm_io.outb(ports.pic2_data, 0xFF);
}

pub fn unmask_all() void {
    asm_io.outb(ports.pic1_data, 0x00);
    asm_io.outb(ports.pic2_data, 0x00);
}

pub fn get_mask() u16 {
    const low = asm_io.inb(ports.pic1_data);
    const high = asm_io.inb(ports.pic2_data);
    return @as(u16, high) << 8 | low;
}