aboutsummaryrefslogtreecommitdiff
path: root/drivers/keyboard.cc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/keyboard.cc')
-rw-r--r--drivers/keyboard.cc147
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;
+ }
+ }
+}