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;
}
|