Перевёл проц в защищенный режим, наковырял вывод на экран и ввод с клавиатуры в нём:
Код:
// вызывается в цикле ядром
void kernel_upd()
{
char keyboard_input = KeyboardIsr();
if (keyboard_input != 0)
{
putchar(keyboard_input);
}
// TODO если 8, стереть последний введённый символ
}
Код:
// code.h
char codes[] = {0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8,'\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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,'-', 0, 0, 0,'+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char codes_sh[] = {0, 0, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')','_', '+', 8, '\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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0, '+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// 8 - backspace, на ctrl, alt и пр. стоят заглушки - 0.
Код:
// keyboard.c
#include "code.h"
unsigned shift_state = 0;
char KeyboardIsr()
{
char new_scan_code = inportb(0x60);
switch(new_scan_code) {
case 0x2a:
shift_state = 1;
break;
case 0xaa:
shift_state = 0;
break;
default:
if (new_scan_code & 0x80) {
return 0;
} else {
return (shift_state ? codes_sh : codes)[new_scan_code];
}
break;
}
outportb(0x20,0x20);
}
И как не странно, работает. Но есть проблема - он так быстро выводит, что 1 лёгким нажатием какой-либо кнопки отбивает несколько страниц символов, как его замедлить?
И ещё если нажать шифт и отпустить, он с точки зрения ос остаётся зажатым, событие его отпускания как будто не происходит.