/* * kbd_raw_open — включить эксклюзивный raw-канал клавиатуры: с этого * момента байты SIO-A клавиатуры декодирует трамплин ПРЯМО в * прерывании (_kbdraw_down[], см. libc/irq/_irq_tramp.c), DSS их * больше не видит — kbhit/getch/getkey/kbd_mod_state перестают * получать новые события (applications/PoP/docs/PORT_PLAN.md §2). * * Захватывает IM2-таблицу тем же счётчиком ссылок, что * irq_chain_add/cbl_open (_irq_table_ref) — можно сочетать с кадровой * цепочкой и CBL одновременно, они независимы (разные условия ветвления * в трамплине). atexit подстрахует close. */ #include #include #include #include #include #include "_kbdraw.h" #include "../irq/_irq.h" int kbd_raw_open(void) { if (_kbdraw_active) { errno = EBUSY; return -1; } if (_irq_table_ref() != 0) return -1; memset(_kbdraw_down, 0, sizeof(_kbdraw_down)); _kbdraw_pending = 0; static uint8_t atexit_armed; if (!atexit_armed) { atexit_armed = 1; atexit(kbd_raw_close); } IRQ_DISABLE(); _kbdraw_active = 1; IRQ_ENABLE(); return 0; }