summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-06 20:03:12 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-06 20:03:12 +0200
commit36de2495d62c1652236ac1ffcba46b0b12ddabeb (patch)
tree4c34581841f3bb8f063f0f4769a302aed2d86548
parentbd7d4366b6643b5c6cd04f40dd32f5d9c9575fd6 (diff)
keymap
-rw-r--r--kernel/include/font.h3
-rw-r--r--kernel/include/keymap.h358
-rw-r--r--kernel/src/devices/keyboard.c75
-rw-r--r--kernel/src/main.c2
4 files changed, 433 insertions, 5 deletions
diff --git a/kernel/include/font.h b/kernel/include/font.h
index 678a6c2..2bb00fa 100644
--- a/kernel/include/font.h
+++ b/kernel/include/font.h
@@ -19,7 +19,6 @@ typedef struct {
/* font i used: /usr/share/kbd/consolefonts/lat9-16.psf.gz */
/* xxd -i font.psf */
-#endif
unsigned char font[] = {
0x72, 0xb5, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
@@ -367,3 +366,5 @@ unsigned char font[] = {
0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00
};
unsigned int font_len = 4128;
+
+#endif
diff --git a/kernel/include/keymap.h b/kernel/include/keymap.h
new file mode 100644
index 0000000..c027146
--- /dev/null
+++ b/kernel/include/keymap.h
@@ -0,0 +1,358 @@
+#ifndef KEYMAP_H
+#define KEYMAP_H
+
+#include <stdint.h>
+
+#define KEY_ESCAPE 0x01
+#define KEY_1 0x02
+#define KEY_2 0x03
+#define KEY_3 0x04
+#define KEY_4 0x05
+#define KEY_5 0x06
+#define KEY_6 0x07
+#define KEY_7 0x08
+#define KEY_8 0x09
+#define KEY_9 0x0A
+#define KEY_0 0x0B
+#define KEY_MINUS 0x0C
+#define KEY_EQUAL 0x0D
+#define KEY_BACKSPACE 0x0E
+#define KEY_TAB 0x0F
+#define KEY_Q 0x10
+#define KEY_W 0x11
+#define KEY_E 0x12
+#define KEY_R 0x13
+#define KEY_T 0x14
+#define KEY_Y 0x15
+#define KEY_U 0x16
+#define KEY_I 0x17
+#define KEY_O 0x18
+#define KEY_P 0x19
+#define KEY_LBRACKET 0x1A
+#define KEY_RBRACKET 0x1B
+#define KEY_ENTER 0x1C
+#define KEY_LEFT 0x1D
+#define KEY_A 0x1E
+#define KEY_S 0x1F
+#define KEY_D 0x20
+#define KEY_F 0x21
+#define KEY_G 0x22
+#define KEY_H 0x23
+#define KEY_J 0x24
+#define KEY_K 0x25
+#define KEY_L 0x26
+#define KEY_ 0x27
+#define KEY_SQUOTE 0x28
+#define KEY_BACK_TICK 0x29
+#define KEY_LSHIFT 0x2A
+#define KEY_LSLASH 0x2B
+#define KEY_Z 0x2C
+#define KEY_X 0x2D
+#define KEY_C 0x2E
+#define KEY_V 0x2F
+#define KEY_B 0x30
+#define KEY_N 0x31
+#define KEY_M 0x32
+#define KEY_COMMA 0x33
+#define KEY_DOT 0x34
+#define KEY_RSLASH 0x35
+#define KEY_RSHIFT 0x36
+#define KEY_ASTERISK 0x37
+#define KEY_LALT 0x38
+#define KEY_SPACE 0x39
+#define KEY_CAPSLOCK 0x3A
+#define KEY_F1 0x3B
+#define KEY_F2 0x3C
+#define KEY_F3 0x3D
+#define KEY_F4 0x3E
+#define KEY_F5 0x3F
+#define KEY_F6 0x40
+#define KEY_F7 0x41
+#define KEY_F8 0x42
+#define KEY_F9 0x43
+#define KEY_F10 0x44
+#define KEY_NUMLOCK 0x45
+#define KEY_SCLOCK 0x46
+#define KEY_NUMPAD_7 0x47
+#define KEY_NUMPAD_8 0x48
+#define KEY_NUMPAD_9 0x49
+#define KEY_NUMPAD_MINUS 0x4A
+#define KEY_NUMPAD_4 0x4B
+#define KEY_NUMPAD_5 0x4C
+#define KEY_NUMPAD_6 0x4D
+#define KEY_NUMPAD_PLUS 0x4E
+#define KEY_NUMPAD_1 0x4F
+#define KEY_NUMPAD_2 0x50
+#define KEY_NUMPAD_3 0x51
+#define KEY_NUMPAD_0 0x52
+#define KEY_NUMPAD_DOT 0x53
+#define KEY_F11 0x57
+#define KEY_F12 0x58
+
+char keymap[] = {
+ ' ',
+ ' ',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ '0',
+ '-',
+ '=',
+ ' ',
+ ' ',
+ 'q',
+ 'w',
+ 'e',
+ 'r',
+ 't',
+ 'y',
+ 'u',
+ 'i',
+ 'o',
+ 'p',
+ '[',
+ ']',
+ '\n',
+ ' ',
+ 'a',
+ 's',
+ 'd',
+ 'f',
+ 'g',
+ 'h',
+ 'j',
+ 'k',
+ 'l',
+ ';',
+ '\'',
+ '`',
+ ' ',
+ '\\',
+ 'z',
+ 'x',
+ 'c',
+ 'v',
+ 'b',
+ 'n',
+ 'm',
+ ',',
+ '.',
+ '/',
+ ' ',
+ '*',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ '7',
+ '8',
+ '9',
+ '-',
+ '4',
+ '5',
+ '6',
+ '+',
+ '1',
+ '2',
+ '3',
+ '0',
+ '.',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+};
+
+uint16_t keymap_len = 128;
+
+char shift_keymap[] = {
+ ' ',
+ ' ',
+ '!',
+ '@',
+ '#',
+ '$',
+ '%',
+ '^',
+ '&',
+ '*',
+ '(',
+ ')',
+ '_',
+ '+',
+ ' ',
+ ' ',
+ 'Q',
+ 'W',
+ 'E',
+ 'R',
+ 'T',
+ 'Y',
+ 'U',
+ 'I',
+ 'O',
+ 'P',
+ '{',
+ '}',
+ '\n',
+ ' ',
+ 'A',
+ 'S',
+ 'D',
+ 'F',
+ 'G',
+ 'H',
+ 'J',
+ 'K',
+ 'L',
+ ':',
+ '\"',
+ '~',
+ ' ',
+ '|',
+ 'Z',
+ 'X',
+ 'C',
+ 'V',
+ 'B',
+ 'N',
+ 'M',
+ '<',
+ '>',
+ '?',
+ ' ',
+ '*',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ '7',
+ '8',
+ '9',
+ '-',
+ '4',
+ '5',
+ '6',
+ '+',
+ '1',
+ '2',
+ '3',
+ '0',
+ '.',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+ ' ',
+};
+
+uint16_t shift_keymap_len = 128;
+
+#endif
diff --git a/kernel/src/devices/keyboard.c b/kernel/src/devices/keyboard.c
index 105c3a8..bf4948d 100644
--- a/kernel/src/devices/keyboard.c
+++ b/kernel/src/devices/keyboard.c
@@ -1,13 +1,62 @@
#include <stdint.h>
+#include <stdbool.h>
+
#include <pic.h>
#include <io.h>
#include <graphics.h>
#include <debug.h>
+#include <keymap.h>
#define KEYBOARD_DATA_PORT 0x60
#define KEYBOARD_STATUS_PORT 0x64
-uint8_t i = 0;
+static uint32_t x;
+static uint32_t y;
+bool is_pressed[128];
+
+uint32_t strlen(const char *s);
+
+uint32_t stoi(const char *s)
+{
+ static uint32_t num;
+ uint32_t s_len = strlen(s);
+
+ for (int i = s_len - 1; i >= 0; i--) {
+ num += s[i] - '0';
+ }
+
+ return num;
+}
+
+void itos(uint32_t num, char** s)
+{
+ uint32_t i;
+ for (i = 0; num; num/=10, i++) {
+ *s[i] = num%10 - '0';
+ }
+ *s[i] = '\0';
+}
+
+void print_char(char c)
+{
+ if (x * 8 >= fb.width) {
+ x = 0;
+ y++;
+ }
+ if (y * 16 >= fb.height) {
+ x = 0;
+ y = 0;
+ }
+ fb_draw_character(fb, c, x * 8, y * 16, WHITE, BLACK);
+ x++;
+}
+
+void print_string(char* s)
+{
+ for (uint32_t i = 0; i < strlen(s); i++) {
+ print_char(s[i]);
+ }
+}
void keyboard_handler(void)
{
@@ -16,5 +65,27 @@ void keyboard_handler(void)
return;
}
uint8_t keycode = inb(KEYBOARD_DATA_PORT);
- fb_draw_character(fb, keycode, 0, 0, RED, BLACK);
+ if (keycode < keymap_len) {
+ is_pressed[keycode] = true;
+ if (keycode == KEY_SPACE) {
+ print_char(' ');
+
+ } else if (keycode == KEY_BACKSPACE) {
+ if (!x) return;
+ x--;
+ print_char(' ');
+ x--;
+ } else if (keycode == KEY_ENTER) {
+ x = 0;
+ y++;
+ } else {
+ if (keymap[keycode] == ' ') return;
+ if (is_pressed[KEY_LSHIFT] || is_pressed[KEY_RSHIFT])
+ print_char(shift_keymap[keycode]);
+ else
+ print_char(keymap[keycode]);
+ }
+ } else {
+ is_pressed[keycode - 128] = false;
+ }
}
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 96f3572..2653b4d 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -9,8 +9,6 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
init_idt();
init_fb(multiboot_bootinfo, multiboot_magic);
- fb_draw_string(fb, "Still working...", 8, 0, WHITE, BLACK);
-
for(;;) {
__asm__ volatile ("hlt;");
}