[keyb] Shift / ctrl / alt
This commit is contained in:
parent
018fe42d40
commit
3e17b661bb
116
core/kbd.c
116
core/kbd.c
@ -1,5 +1,13 @@
|
||||
#include <system.h>
|
||||
|
||||
struct keyboard_states {
|
||||
uint32_t shift : 1;
|
||||
uint32_t alt : 1;
|
||||
uint32_t ctrl : 1;
|
||||
} keyboard_state;
|
||||
|
||||
typedef void (*keyboard_handler_t)(int scancode);
|
||||
|
||||
char kbd_us[128] = {
|
||||
0, 27,
|
||||
'1','2','3','4','5','6','7','8','9','0',
|
||||
@ -39,21 +47,111 @@ char kbd_us[128] = {
|
||||
0, /* everything else */
|
||||
};
|
||||
|
||||
char kbd_us_l2[128] = {
|
||||
0, 27,
|
||||
'!','@','#','$','%','^','&','*','(',')',
|
||||
'_','+','\b',
|
||||
'\t', /* tab */
|
||||
'Q','W','E','R','T','Y','U','I','O','P','{','}','\n',
|
||||
0, /* control */
|
||||
'A','S','D','F','G','H','J','K','L',':','"', '~',
|
||||
0, /* left shift */
|
||||
'|','Z','X','C','V','B','N','M','<','>','?',
|
||||
0, /* right shift */
|
||||
'*',
|
||||
0, /* alt */
|
||||
' ', /* space */
|
||||
0, /* caps lock */
|
||||
0, /* F1 [59] */
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, /* ... F10 */
|
||||
0, /* 69 num lock */
|
||||
0, /* scroll lock */
|
||||
0, /* home */
|
||||
0, /* up */
|
||||
0, /* page up */
|
||||
'-',
|
||||
0, /* left arrow */
|
||||
0,
|
||||
0, /* right arrow */
|
||||
'+',
|
||||
0, /* 79 end */
|
||||
0, /* down */
|
||||
0, /* page down */
|
||||
0, /* insert */
|
||||
0, /* delete */
|
||||
0, 0, 0,
|
||||
0, /* F11 */
|
||||
0, /* F12 */
|
||||
0, /* everything else */
|
||||
};
|
||||
|
||||
|
||||
|
||||
void norm(int scancode) {
|
||||
if (scancode & 0x80) {
|
||||
return;
|
||||
}
|
||||
if (!kbd_us[scancode]) {
|
||||
return;
|
||||
}
|
||||
if (keyboard_state.shift) {
|
||||
putch(kbd_us_l2[scancode]);
|
||||
} else if (keyboard_state.ctrl) {
|
||||
putch('^');
|
||||
putch(kbd_us_l2[scancode]);
|
||||
} else {
|
||||
putch(kbd_us[scancode]);
|
||||
}
|
||||
}
|
||||
|
||||
void shft(int scancode) {
|
||||
keyboard_state.shift ^= 1;
|
||||
}
|
||||
|
||||
void altk(int scancode) {
|
||||
keyboard_state.alt ^= 1;
|
||||
}
|
||||
|
||||
void ctlk(int scancode) {
|
||||
keyboard_state.ctrl ^= 1;
|
||||
|
||||
}
|
||||
|
||||
void func(int scancode) {
|
||||
|
||||
}
|
||||
|
||||
keyboard_handler_t key_method[] = {
|
||||
/* 00 */ NULL, NULL, norm, norm, norm, norm, norm, norm,
|
||||
/* 08 */ norm, norm, norm, norm, norm, norm, norm, norm,
|
||||
/* 10 */ norm, norm, norm, norm, norm, norm, norm, norm,
|
||||
/* 18 */ norm, norm, norm, norm, norm, ctlk, norm, norm,
|
||||
/* 20 */ norm, norm, norm, norm, norm, norm, norm, norm,
|
||||
/* 28 */ norm, norm, shft, norm, norm, norm, norm, norm,
|
||||
/* 30 */ norm, norm, norm, norm, norm, norm, shft, norm,
|
||||
/* 38 */ altk, norm, NULL, func, func, func, func, func,
|
||||
/* 40 */ func, func, func, func, func, NULL, NULL, NULL,
|
||||
/* 48 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/* 50 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, func,
|
||||
/* 58 */ func, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/* 60 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/* 68 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/* 70 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
/* 78 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
keyboard_handler(
|
||||
struct regs *r
|
||||
) {
|
||||
unsigned char scancode;
|
||||
scancode = inportb(0x60);
|
||||
if (scancode & 0x80) {
|
||||
/* key up */
|
||||
} else {
|
||||
if (kbd_us[scancode] == 'q') {
|
||||
/* Page Fault Time */
|
||||
uint32_t *ptr = (uint32_t *)0xA0000000;
|
||||
uint32_t do_page_fault = *ptr;
|
||||
}
|
||||
putch(kbd_us[scancode]);
|
||||
keyboard_handler_t handler;
|
||||
handler = key_method[(int)scancode & 0x7f];
|
||||
if (handler) {
|
||||
handler(scancode);
|
||||
}
|
||||
}
|
||||
|
||||
|
18
main.c
18
main.c
@ -152,19 +152,23 @@ dump_multiboot(
|
||||
int
|
||||
main(struct multiboot *mboot_ptr) {
|
||||
mboot_ptr = copy_multiboot(mboot_ptr);
|
||||
gdt_install();
|
||||
idt_install();
|
||||
isrs_install();
|
||||
irq_install();
|
||||
init_video();
|
||||
|
||||
/* Boot Stage 1 */
|
||||
gdt_install(); /* Global descriptor table */
|
||||
idt_install(); /* IDT */
|
||||
isrs_install(); /* Interrupt service requests */
|
||||
irq_install(); /* Hardware interrupt requests */
|
||||
init_video(); /* VGA driver */
|
||||
|
||||
settextcolor(12,0);
|
||||
kprintf("[%s %s]\n", KERNEL_UNAME, KERNEL_VERSION_STRING);
|
||||
paging_install(mboot_ptr->mem_upper);
|
||||
dump_multiboot(mboot_ptr);
|
||||
resettextcolor();
|
||||
|
||||
/* Boot Stage 2 */
|
||||
timer_install();
|
||||
keyboard_install();
|
||||
/* Yes, yes, these are #define'd strings, consider this a nice test of kprintf */
|
||||
resettextcolor();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user