BUG-KBD-5: зажатый Shift снимался автоповтором стрелки
Симптом: Shift работал в одиночку и НЕ работал вместе со стрелками — прыжок с зацепом не выходил (BUG-GRAB-1), а осторожный шаг срывался в бег. Декодеры делали из «fake shift» два вывода, и второй был неверен: обёртка E0 F0 12 / E0 12 есть -> Shift зажат -> взвести бит — верно; расширенный make БЕЗ обёртки -> Shift отпущен -> снять бит — НЕТ. Замер потока байт (MAME, breakpoint на выходе из in a,($18)): клавиатура pc_kbd ms_naturl обёртку не шлёт вовсе — при зажатом Shift поток на ↑ ровно `E0 75 E0 75 …`, ни одного F0/12. А typematic-повторы идут непрерывно, пока стрелка зажата, значит каждый повтор снимал реально зажатый Shift. Короткий тап это маскировал: после отпускания стрелки Shift снова становился последней клавишей, и его собственный автоповтор `12` взводил бит обратно за ~30 мс. Фикс: обратный вывод убран, расширенная клавиша о Shift не судит. Состояние Shift ведут его собственные make/break 12 / F0 12 — они приходят всегда. Прямой вывод оставлен (дёшев и верен там, где обёртка есть). Ушла ставшая ненужной _kbdraw_fakesh; трамплин короче на 36 Б (0x150→0x12C), что важно — его клавиатурный блок упирается в диапазон jr. Плата: потерянный при overrun break Shift снять нечем, модификатор может залипнуть до перенажатия (BUG-KBD-3). Размен решён как и раньше в kbd_raw_sync: лучше залипание, чем отвал — сорванный посреди игры Shift в PoP стоит жизни. Проверено в MAME чтением _kbdraw_down: Shift+↑+→ зажаты 5 с (автоповтор идёт) -> LSh остаётся 04; отпускание Shift -> 00. Зацеп в игре подтверждён пользователем. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -63,9 +63,9 @@ void kbd_raw_sync(void);
|
||||
*
|
||||
* Зачем: на каждый принятый байт запрос прерывания живёт единицы
|
||||
* микросекунд, и пропущенный импульс не «догоняется» — байт лежит в
|
||||
* 3-байтовом FIFO до следующего прерывания. Пачки в 5 байт (тап стрелки;
|
||||
* при зажатом Shift — ещё и «fake shift» вокруг расширенного кода) при
|
||||
* этом переполняют FIFO: теряется make («нажатие не сработало») или break
|
||||
* 3-байтовом FIFO до следующего прерывания. Пачки (тап стрелки — 5 байт;
|
||||
* одновременное отпускание нескольких клавиш — больше) при этом
|
||||
* переполняют FIFO: теряется make («нажатие не сработало») или break
|
||||
* (залипание).
|
||||
*
|
||||
* КАК ЕЁ ЗВАТЬ (замеры 2026-08-01, PoP roomtest — см.
|
||||
|
||||
Reference in New Issue
Block a user