summaryrefslogtreecommitdiff
path: root/kernel/src/devices/keyboard.c
blob: 76c12c7b70c4f58412621b729230710494843b29 (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
#include <types.h>
#include <keyboard.h>

#include <pic.h>
#include <io.h>
#include <keymap.h>
#include <libk/stdio.h>
#include <libk/math.h>

#define KEYBOARD_DATA_PORT	0x60
#define KEYBOARD_STATUS_PORT	0x64

bool is_pressed[128];

void keyboard_handler(void)
{
	uint8_t status = inb(KEYBOARD_STATUS_PORT);
	if (!(status & 0x1)) {
		return;
	}
	uint8_t keycode = inb(KEYBOARD_DATA_PORT);
	if (keycode < keymap_len) {
		is_pressed[keycode] = true;
		if (keycode == KEY_SPACE) {
			printf(" ");

		} else if (keycode == KEY_BACKSPACE) {
			printf("\b \b");
		} else if (keycode == KEY_ENTER) {
			printf("%c", keymap[keycode]);
		} else {
			if (keymap[keycode] == ' ') return;
			if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT])
				printf("%c", shift_keymap[keycode]);
			else
				printf("%c", keymap[keycode]);
		}
	} else {
		is_pressed[keycode - 128] = false;
	}
}