blob: 55bf7a73ca901fdd9add8ade1183d90ef7044e27 [file] [log] [blame]
#include "io.h"
#include "kbd.h"
#include "log.h"
#include "pic.h"
bool pressed_keys[LAST_KBD_KEY];
char special_key_mappings[LAST_KBD_KEY - FIRST_KBD_KEY] =
{
[KBD_ENTER - FIRST_KBD_KEY] = '\n',
[KBD_SPACEBAR - FIRST_KBD_KEY] = ' ',
[KBD_TAB - FIRST_KBD_KEY] = '\t',
[KBD_BACKSPACE - FIRST_KBD_KEY] = '\b',
0
};
void outb(ushort port, uchar val)
{
asm volatile("outb %1, %0" : : "dN"(port), "a"(val));
}
uchar inb(ushort port)
{
uchar ret;
asm volatile("inb %1, %0" : "=a"(ret) : "dN"(port));
return ret;
}
ushort inw(ushort port)
{
ushort ret;
asm volatile("inw %1, %0" : "=a"(ret) : "dN"(port));
return ret;
}
void *memset(void *s, int c, size_t n)
{
for (size_t i = 0; i < n; i++)
{
((uchar *)s)[i] = c;
}
return s;
}
void *memcpy(void *dest, const void *src, size_t n)
{
for (size_t i = 0; i < n; i++)
{
((uchar *)dest)[i] = ((uchar *)src)[i];
}
return dest;
}
void io_wait()
{
asm volatile("outb %0, $0x80" ::"a"(0));
}
uchar kbd_scan_code()
{
return inb(KBD_DATA_PORT);
}
static bool kbd_shift_pressed()
{
return pressed_keys[KBD_LEFT_SHIFT] || pressed_keys[KBD_RIGHT_SHIFT] ||
pressed_keys[KBD_CAPS_LOCK];
}
void kbd_handle_input(struct registers *registers)
{
uchar byte = kbd_scan_code();
struct kbd_scan_codes code = scan_code_set_1[byte];
if (code.ascii && !code.brk)
{
kprintf("%c", kbd_shift_pressed() && code.up_symbol ? code.up_symbol
: code.symbol);
}
else if (!code.brk && special_key_mappings[code.symbol - FIRST_KBD_KEY])
{
kprintf("%c", special_key_mappings[code.symbol - FIRST_KBD_KEY]);
}
pressed_keys[code.symbol] = !code.brk;
}
void init_kbd()
{
memset(pressed_keys, 0, LAST_KBD_KEY);
add_interrupt_handler(33, kbd_handle_input);
}