diff options
Diffstat (limited to 'drivers/keyboard.cc')
-rw-r--r-- | drivers/keyboard.cc | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/drivers/keyboard.cc b/drivers/keyboard.cc new file mode 100644 index 0000000..268ce2b --- /dev/null +++ b/drivers/keyboard.cc @@ -0,0 +1,147 @@ +#include "keyboard.h" +#include <stdlib.h> + +Keyboard::Keyboard() : InterruptHandler(0x01) { + // eat all previous keystrikes + while (commandport.read() & 0x1) dataport.read(); + commandport.write(0xae); // ??? + commandport.write(0x20); // get state ??? + auto status = (dataport.read() | 1) & ~0x10; + commandport.write(0x60); // set state ??? + dataport.write(status); // ??? + dataport.write(0xf4); // ??? +} + +void Keyboard::trigger() { + 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; + } + } +} |