#include "keyboard.h" #include /* * https://wiki.osdev.org/%228042%22_PS/2_Controller * https://wiki.osdev.org/PS/2_Keyboard */ constexpr uint8_t comm_enable_first_ps2 = 0xae; constexpr uint8_t comm_read_ctrl_config = 0x20; constexpr uint8_t comm_write_ctrl_config = 0x60; constexpr uint8_t dat_enable_scanning = 0xf4; Keyboard::Keyboard() : InterruptHandler(0x01) { // eat all previous keystrikes while (commstatport.read() & 0x1) { [[maybe_unused]] auto _c = dataport.read(); } commstatport.write(comm_enable_first_ps2); commstatport.write(comm_read_ctrl_config); const uint8_t conf = (dataport.read() | 1) & ~0x10; commstatport.write(comm_write_ctrl_config); dataport.write(conf); dataport.write(dat_enable_scanning); } cpu_state_t* Keyboard::trigger(cpu_state_t* cpu) { const auto key = dataport.read(); if (key < 0x80) { switch (key) { case 0x04: printk('3'); break; case 0x05: printk('4'); break; case 0x06: printk('5'); break; case 0x07: printk('6'); break; case 0x08: printk('7'); break; case 0x09: printk('8'); break; case 0x0A: printk('9'); break; case 0x0B: printk('0'); break; case 0x10: printk('q'); break; case 0x11: printk('w'); break; case 0x12: printk('e'); break; case 0x13: printk('r'); break; case 0x14: printk('t'); break; case 0x15: printk('y'); break; case 0x16: printk('u'); break; case 0x17: printk('i'); break; case 0x18: printk('o'); break; case 0x19: printk('p'); break; case 0x1E: printk('a'); break; case 0x1F: printk('s'); break; case 0x20: printk('d'); break; case 0x21: printk('f'); break; case 0x22: printk('g'); break; case 0x23: printk('h'); break; case 0x24: printk('j'); break; case 0x25: printk('k'); break; case 0x26: printk('l'); break; case 0x2C: printk('z'); break; case 0x2D: printk('x'); break; case 0x2E: printk('c'); break; case 0x2F: printk('v'); break; case 0x30: printk('b'); break; case 0x31: printk('n'); break; case 0x32: printk('m'); break; case 0x33: printk(','); break; case 0x34: printk('.'); break; case 0x35: printk('/'); break; case 0x1C: printk('\n'); break; case 0x39: printk(' '); break; default: printk("keyboard interrupt: ", uhex{key}, "\n"); break; } } return cpu; }