#include #include #include #include static bool is_in_shift; char buffer[100]; static size_t i; static unsigned char keyboard_char(unsigned char scancode) { if (0x01 < scancode && scancode < 0x0B) { return scancode - 2 + '1'; } if (scancode == 0x0B) { return '0'; } switch (scancode) { case 0x10: return 'Q'; case 0x11: return 'W'; case 0x12: return 'E'; case 0x13: return 'R'; case 0x14: return 'T'; case 0x15: return 'Y'; case 0x16: return 'U'; case 0x17: return 'I'; case 0x18: return 'O'; case 0x19: return 'P'; case 0x1a: return '['; case 0x1b: return ']'; case 0x1c: return '\n'; case 0x1d: return '\b'; case 0x1e: return 'A'; case 0x1f: return 'S'; case 0x20: return 'D'; case 0x21: return 'F'; case 0x22: return 'G'; case 0x23: return 'H'; case 0x24: return 'J'; case 0x25: return 'K'; case 0x26: return 'L'; case 0x27: return ';'; case 0x28: return '\''; case 0x29: return '`'; case 0x2a: is_in_shift = true; break; case 0x2b: return '\\'; case 0x2c: return 'Z'; case 0x2d: return 'X'; case 0x2e: return 'C'; case 0x2f: return 'V'; case 0x30: return 'B'; case 0x31: return 'N'; case 0x32: return 'M'; case 0x33: return ','; case 0x34: return '.'; case 0x35: return '/'; case 0x36: is_in_shift = true; break; case 0x39: return ' '; case 0xaa: is_in_shift = false; break; case 0xb6: is_in_shift = false; break; } return -1; } void handle_keyboard(uint8_t scancode) { char character; if (is_in_shift) { character = keyboard_char(scancode); } else { character = to_lower_char(keyboard_char(scancode)); } if (character == -1) { return; } buffer[i] = character; i++; terminal_putchar(character); }