/*
 * kbdraw — тест raw-канала клавиатуры (<kbd_raw.h>).  Держит на
 * экране 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 <conio.h>
#include <kbd_raw.h>
#include <stdio.h>
#include <unistd.h>

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;
}
