summaryrefslogtreecommitdiff
path: root/src/keyboard.c
blob: 30dc5b7581074fcea05cc1ea4a871ad223566a92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

#include <stdint.h>
#include "vga.h"

enum special_key {
	K_ESCAPE = 0x1b,
	K_BACKSPACE = 0x08,
	K_F1 = 0x0E,
	K_F2 = 0x0F,
	K_F3 = 0x10,
	K_F4 = 0x11,
	K_F5 = 0x12,
	K_F6 = 0x13,
	K_F7 = 0x14,
	K_F8 = 0x15,
	K_F9 = 0x16,
	K_F10 = 0x17,
	K_F11 = 0x18,
	K_F12 = 0x19
};

enum mod_scancodes {
	SC_LSHIFT = 0x2A,
	SC_RSHIFT = 0x36,
	SC_LCTRL = 0x1D,
	SC_LALT = 0x38,
	SC_META = 0x3A
};

char keymap_unshift[] = {
	0,K_ESCAPE,'1','2','3','4','5','6','7','8','9','0','-','=',K_BACKSPACE,
	'\t','q','w','e','r','t','y','u','i','o','p','[',']','\n',0,
	'a','s','d','f','g','h','j','k','l',';','\'','`',0,'\\',
	'z','x','c','v','b','n','m',',','.','/',0,'*',0,' ',0,
	K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,0,0,
	'7','8','9','-','4','5','6','1','2','3','0','.',0,0,0,K_F11,K_F12
};
char keymap_shift[] = {
	0,K_ESCAPE,'!','@','#','$','%','^','&','*','(',')','_','+',K_BACKSPACE,
	'\t','Q','W','E','R','T','Y','U','I','O','P','{','}','\n',0,
	'A','S','D','F','G','H','J','K','L',':','"','~',0,'|',
	'Z','X','C','V','B','N','M','<','>','?',0,'*',0,' ',0,
	K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,0,0,
	'7','8','9','-','4','5','6','1','2','3','0','.',0,0,0,K_F11,K_F12
};

char *keymap = keymap_unshift;

struct {
	int shift;
	int ctrl;
	int alt;
	int meta;
} mod_keys = {0};

void keydown(char c) {
	vputchar(c);
}

void keyup(char c) {

}

void process_scancode(uint8_t c) {
	uint8_t code;
	int release;
	if (c > 0x80 && c <= 0xD8) {
		release = 1;
		code = c - 0x80;
	} else {
		release = 0;
		code = c;
	}
	switch (code) {
		default:
			if (code <= 0x58 && keymap[code] != 0) {
				if (!release)
					keydown(keymap[code]);
				else
					keyup(keymap[code]);
			}
			break;
		case SC_LSHIFT:
		case SC_RSHIFT:
			mod_keys.shift = !release;
			keymap = release ? keymap_unshift : keymap_shift;
			break;
		case SC_LCTRL:
			mod_keys.ctrl = !release;
			break;
		case SC_LALT:
			mod_keys.alt = !release;
			break;
		case SC_META:
			mod_keys.meta = !release;
			break;
	}
}