/* * kbdraw — тест raw-канала клавиатуры (). Держит на * экране live-состояние нескольких клавиш плюс список ВСЕХ кодов, * которые движок сейчас считает зажатыми (для калибровки KBD_* — * см. PORT_PLAN.md §2: значения там взяты по общеизвестному стандарту * PS/2 Set 2, не подтверждены на этом железе/MAME до этого теста). * Заодно проверяет, что kbd_mod_state() (CTRLKEY, зависит от * резидентного обработчика DSS) не обновляется, пока raw открыт — * ожидаемое следствие §2 ("DSS не видит клавиатуру, пока raw * активен"). * * Выход — ESC через raw-канал (kbd_raw_down(KBD_ESC)), НЕ через DSS. */ #include #include #include #include static void show(uint8_t row, const char *name, uint8_t down) { gotoxy(0, row); printf("%-8s %s ", name, down ? "DOWN" : "up "); } int main(void) { uint16_t c; clrscr(); puts("kbdraw test: hold arrows/space/shift; ESC to quit"); if (kbd_raw_open() != 0) { puts("kbd_raw_open failed"); return 1; } for (;;) { show(2, "LEFT", kbd_raw_down(KBD_LEFT)); show(3, "RIGHT", kbd_raw_down(KBD_RIGHT)); show(4, "UP", kbd_raw_down(KBD_UP)); show(5, "DOWN", kbd_raw_down(KBD_DOWN)); show(6, "SPACE", kbd_raw_down(KBD_SPACE)); show(7, "LSHIFT", kbd_raw_down(KBD_LSHIFT)); show(8, "RSHIFT", kbd_raw_down(KBD_RSHIFT)); show(9, "ESC", kbd_raw_down(KBD_ESC)); gotoxy(0, 11); printf("mod=%04X (expected frozen while raw is open) ", kbd_mod_state()); gotoxy(0, 13); printf("active codes: "); gotoxy(14, 13); for (c = 0; c < 512; c++) if (kbd_raw_down(c)) printf("%03X ", c); if (kbd_raw_down(KBD_ESC)) break; delayms(60); } kbd_raw_close(); clrscr(); puts("raw closed, DSS keyboard restored"); return 0; }