1f16e8fa70
Клавиатура PS/2 обёртывает КАЖДЫЙ расширенный код парой E0 F0 12 / E0 12,
пока реально зажат Shift (замер на железе/MAME: правый шифт обёртывается
своим кодом 0x59). Это прямое и непрерывное свидетельство состояния
Shift — единственное доступное, потому что опросить PS/2 нельзя, а
typematic повторяет последнюю нажатую клавишу, то есть стрелку.
Оба декодера (_irq_tramp.c, kbd_raw_poll.c) читают обёртку в обе стороны:
обёртка есть -> Shift взвести; расширенный make без обёртки -> Shift
снять. Бит взводит общий писатель — достаточно обнулить префиксы, и код
уходит в plain-половину карты как make.
Это снимает размен, между крайностями которого мы метались:
- исключать модификаторы из сброса по overrun -> Shift залипал навсегда
(BUG-KBD-3);
- сбрасывать всю карту, как DSS -> Shift сносился каждым overrun'ом, а
при зажатом Shift тап стрелки это 10 байт в 3-байтовый FIFO, то есть
overrun почти гарантирован (BUG-KBD-4).
Теперь kbd_raw_sync снова не трогает модификаторы, и это безопасно:
залипание снимается первым же нажатием стрелки.
Раскладка трамплина: клавиатурный блок перевалил за 127 байт, а jp внутри
запрещён (копия в W2). Префиксные обработчики переехали вплотную к своим
cp, посередине тела стоят ретрансляторы tr_kbd_hub/tr_hub_notkbd/
tr_hub_dss. В kbd_raw_poll такого ограничения нет — там три jp.
Проверено в MAME: Shift переживает пять тапов подряд; штатное отпускание
снимает; искусственно залипший бит снимается первым тапом.
make size-check — роста нет.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
16 lines
862 B
C
16 lines
862 B
C
/*
|
|
* _kbdraw_state.c — состояние raw-канала клавиатуры (см. _kbdraw.h).
|
|
* Не инициализировать явно = 0 — crt0 зануляет _DATA/_BSS
|
|
* (memory/sdcc_static_storage_gotcha).
|
|
*/
|
|
#include "_kbdraw.h"
|
|
|
|
uint8_t _kbdraw_active;
|
|
uint8_t _kbdraw_pending;
|
|
uint8_t _kbdraw_overrun; /* ISR взвёл при Rx-overrun SIO (потерян
|
|
* break) — kbd_raw_sync снимет залипшее */
|
|
uint8_t _kbdraw_fakesh; /* декодирована break-форма fake shift —
|
|
* ждём расширенный код, который она
|
|
* обёртывает (см. _kbdraw.h) */
|
|
uint8_t _kbdraw_down[64]; /* БИТ на скан-код (см. _kbdraw.h) */
|