здравствуйте, не получается обработать брейк коды при отпускании клавиш в QEMU.
Я узнал, что при нажатии на клавишу приходит одно прерывание со сканкодом а при отпускании последовательно два прерывания: сначала скан код 0xf0 а потом сканкод отпущенной клавиши.
Исходя из этого я написал такой код на C для обратки клавиатуры
int f0_was = 0;
int pressed_button = 0;
void KEYBOARD_HANDLER(interrupt_block* block)
{
if(f0_was != 0)
{
f0_was = 0;
pressed_button = 0;
goto end;
}
int scan_code = 0;
asm(
"push %%eax\n"
"xor %%eax, %%eax\n"
"in $0x60, %%al\n" // принимаю сканкод
"movl %%eax, -12(%%ebp)\n"
"pop %%eax\n"
:
:
:
);
if(scan_code == 0xf0)
{
f0_was = 1; // "тут" я поставил брейкпоинт в надежде что когда отпущу любую клавишу попаду сюда
goto end;
}
if(pressed_button != scan_code)
{
pressed_button = scan_code;
SYMBOL_CONTROL(scan_code);
}
end:
}
Я до проверил набор сканкодов контроллера клавиатуры и получил от него 0x41 то есть 2 набор сканкодов. Но брейк коды видимо не приходят после отпускания.
Правильно ли я вообще понимаю как устроенны клавиатурные прерывания?
(Я не проводил каких либо настроек контроллера, может его стоит например перезапустить и заново задать набор?)