Microkernel thing OS experiment (Zig ⚡)
1const arch = @import("../root.zig");
2const out = arch.port.out;
3const pic = @import("pic.zig");
4const Idt = arch.structures.Idt;
5const PIT_HZ = 1_193_180;
6const DATA_PORT = 0x40;
7const DATA_PORT_1 = 0x41;
8const DATA_PORT_2 = 0x42;
9const CMD_PORT = 0x43;
10
11// If we want a repeating square wave
12pub fn set_frequency(hz: u32) void {
13 const divider = PIT_HZ / hz;
14 @import("std").log.debug("divider = {}", .{divider});
15 // Square Wave Generator, lobyte/hibyte
16 const mode = 0b0011_0110;
17
18 out(u8, CMD_PORT, mode);
19 out(u8, DATA_PORT, @truncate(divider));
20 out(u8, DATA_PORT, @truncate(divider >> 8));
21}
22
23pub inline fn mode0(ms: u32) void {
24 out(u8, CMD_PORT, 0xb0);
25
26 // Interrupt On Terminal Count
27 const latch = (PIT_HZ / (1000 / ms));
28 out(u8, 0x42, @truncate(latch));
29 out(u8, 0x42, @truncate(latch >> 8));
30}
31
32var ctr: usize = 0;
33pub fn handler(_: *Idt.InterruptStackFrame) callconv(.{ .x86_64_interrupt = .{} }) void {
34 if (ctr % 1000 == 0)
35 @import("std").log.warn("PIT!", .{});
36 ctr += 1;
37 pic.end_of_timer_interrupt();
38}