Initial download from archive
http://web.archive.org/web/20210423124630/https://github.com/jdah/tetris-os/blob/master/README.md
This commit is contained in:
66
src/keyboard.c
Normal file
66
src/keyboard.c
Normal file
@@ -0,0 +1,66 @@
|
||||
#include "keyboard.h"
|
||||
#include "irq.h"
|
||||
#include "system.h"
|
||||
#include "timer.h"
|
||||
|
||||
u8 keyboard_layout_us[2][128] = {
|
||||
{
|
||||
KEY_NULL, KEY_ESC, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
|
||||
'-', '=', KEY_BACKSPACE, KEY_TAB, 'q', 'w', 'e', 'r', 't', 'y', 'u',
|
||||
'i', 'o', 'p', '[', ']', KEY_ENTER, 0, 'a', 's', 'd', 'f', 'g', 'h', 'j',
|
||||
'k', 'l', ';', '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm',
|
||||
',', '.', '/', 0, 0, 0, ' ', 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5,
|
||||
KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, 0, 0, KEY_HOME, KEY_UP,
|
||||
KEY_PAGE_UP, '-', KEY_LEFT, '5', KEY_RIGHT, '+', KEY_END, KEY_DOWN,
|
||||
KEY_PAGE_DOWN, KEY_INSERT, KEY_DELETE, 0, 0, 0, KEY_F11, KEY_F12
|
||||
}, {
|
||||
KEY_NULL, KEY_ESC, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
|
||||
'_', '+', KEY_BACKSPACE, KEY_TAB, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U',
|
||||
'I', 'O', 'P', '{', '}', KEY_ENTER, 0, 'A', 'S', 'D', 'F', 'G', 'H',
|
||||
'J', 'K', 'L', ':', '\"', '~', 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N',
|
||||
'M', '<', '>', '?', 0, 0, 0, ' ', 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4,
|
||||
KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, 0, 0, KEY_HOME, KEY_UP,
|
||||
KEY_PAGE_UP, '-', KEY_LEFT, '5', KEY_RIGHT, '+', KEY_END, KEY_DOWN,
|
||||
KEY_PAGE_DOWN, KEY_INSERT, KEY_DELETE, 0, 0, 0, KEY_F11, KEY_F12
|
||||
}
|
||||
};
|
||||
|
||||
struct Keyboard keyboard;
|
||||
|
||||
// bad hack! for a better RNG
|
||||
static bool seeded = false;
|
||||
|
||||
static void keyboard_handler(struct Registers *regs) {
|
||||
u16 scancode = (u16) inportb(0x60);
|
||||
|
||||
if (!seeded) {
|
||||
seed(((u32) scancode) * 17 + timer_get());
|
||||
seeded = true;
|
||||
}
|
||||
|
||||
if (KEY_SCANCODE(scancode) == KEY_LALT ||
|
||||
KEY_SCANCODE(scancode) == KEY_RALT) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_ALT), KEY_IS_PRESS(scancode));
|
||||
} else if (
|
||||
KEY_SCANCODE(scancode) == KEY_LCTRL ||
|
||||
KEY_SCANCODE(scancode) == KEY_RCTRL) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_CTRL), KEY_IS_PRESS(scancode));
|
||||
} else if (
|
||||
KEY_SCANCODE(scancode) == KEY_LSHIFT ||
|
||||
KEY_SCANCODE(scancode) == KEY_RSHIFT) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_SHIFT), KEY_IS_PRESS(scancode));
|
||||
} else if (KEY_SCANCODE(scancode) == KEY_CAPS_LOCK) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_CAPS_LOCK), KEY_IS_PRESS(scancode));
|
||||
} else if (KEY_SCANCODE(scancode) == KEY_NUM_LOCK) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_NUM_LOCK), KEY_IS_PRESS(scancode));
|
||||
} else if (KEY_SCANCODE(scancode) == KEY_SCROLL_LOCK) {
|
||||
keyboard.mods = BIT_SET(keyboard.mods, HIBIT(KEY_MOD_SCROLL_LOCK), KEY_IS_PRESS(scancode));
|
||||
}
|
||||
|
||||
keyboard.keys[(u8) (scancode & 0x7F)] = KEY_IS_PRESS(scancode);
|
||||
keyboard.chars[KEY_CHAR(scancode)] = KEY_IS_PRESS(scancode);
|
||||
}
|
||||
|
||||
void keyboard_init() {
|
||||
irq_install(1, keyboard_handler);
|
||||
}
|
||||
Reference in New Issue
Block a user