kernel-zig/src/ps2.zig

90 lines
1.6 KiB
Zig

usingnamespace @import("index.zig");
// const x86 = @import("x86");
const PS2_DATA = 0x60;
const PS2_STATUS = 0x64;
const KEYMAP_MAX = 59;
const KEYMAP_US = [_][2]u8{
"\x00\x00",
"\x00\x00", //escape
"1!",
"2@",
"3#",
"4$",
"5%",
"6^",
"7&",
"8*",
"9(",
"0)",
"-_",
"=+",
"\x08\x08", //backspace
"\x00\x00", //tab
"qQ",
"wW",
"eE",
"rR",
"tT",
"yY",
"uU",
"iI",
"oO",
"pP",
"[{",
"]}",
"\n\n",
"\x00\x00", //left_control
"aA",
"sS",
"dD",
"fF",
"gG",
"hH",
"jJ",
"kK",
"lL",
";:",
"'\"",
"`~",
"\x00\x00", //left shift
"\\|",
"zZ",
"xX",
"cC",
"vV",
"bB",
"nN",
"mM",
",<",
".>",
"/?",
"\x00\x00", //right shift
"**",
"\x00\x00", //left alt
" ",
"\x00\x00", //capslock
};
fn ps2_scancode() u8 {
var scancode: u8 = 0;
while (true) if (x86.inb(PS2_DATA) != scancode) {
scancode = x86.inb(PS2_DATA);
if (scancode > 0) return scancode;
};
}
fn key_isrelease(scancode: u8) bool {
return scancode & (1 << 7) != 0;
}
pub var keyboard_callback: fn (u8) void = undefined;
pub fn keyboard_handler() void {
const scancode = ps2_scancode();
if (scancode > KEYMAP_US.len) return;
if (key_isrelease(scancode)) return; // don't process releases
const shift = false; // don't know about modifiers yet
const character = KEYMAP_US[scancode][if (shift) 1 else 0];
if (keyboard_callback != undefined) keyboard_callback(character);
}