libc: пока raw-клавиатура открыта, не звать обработчик DSS — он крал наши скан-коды
Корень двух багов SprPoP (KBD-STUCK-WAIT, частично GRAB-KBD-TIMING) нашёлся в исходниках DSS (docs/sources/Estex-DSS): обработчик прерывания DSS живёт в IM1 по 0x0038 и ПЕРВЫМ ДЕЛОМ делает `CALL KEYSCAN`, а тот вычерпывает FIFO SIO досуха. Наш трамплин проверял «есть ли клавиатурный байт» один раз, на входе в прерывание, а хвост кадрового пути уходил в DSS — значит скан-код, прилетевший позже, доставался DSS и уезжал в его буфер. Rx-overrun при этом НЕ взводится (байт не потерян железом, а прочитан не тем владельцем) — отсюда и загадка исходного диагноза: бит залип при `_kbdraw_overrun == 0`. Измерено в MAME (брейки + totalcycles): окно 738 тактов (~34 мкс) на каждом кадровом прерывании, из них 481 такт — пролог самого DSS. Поэтому проверка FIFO перед chain'ом снимает лишь треть и не годится (пробовали, кражи продолжались); кадровый путь при открытом raw теперь заканчивается приватным RETI, окно = 0. Цена: на это время у DSS замирает опрос мыши и мигание текстового курсора — зафиксировано в <kbd_raw.h>. Пойманный случай (старая сборка): DSS прочитал 0x74 (make стрелки «вправо») при _kbdraw_pending = EXT, то есть посылку E0 74 разорвало пополам между двумя владельцами канала. Проверка: брейк на входе KEYSCAN с условием «страница точно DSS + raw открыт» до правки срабатывал мгновенно (50/с), после — молчит; положительный контроль на нашем RETI срабатывает сразу. Трамплин 300 -> 310 Б (буфер W2-копии поднят 336 -> 384, запас 74 Б); размерный эталон обновлён: +10 Б у программ, линкующих IRQ. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,16 @@
|
||||
* cbl_open()/cbl_close() (<cbl.h>) — тот же приватный IM2-хук, не
|
||||
* чейнящийся к DSS.
|
||||
*
|
||||
* КАДРОВОЕ ОБСЛУЖИВАНИЕ DSS НА ЭТО ВРЕМЯ ОСТАНОВЛЕНО. Пока raw открыт,
|
||||
* трамплин НЕ вызывает обработчик прерывания DSS вообще: тот первым делом
|
||||
* зовёт свой KEYSCAN, который вычерпывает FIFO SIO и уводит наши байты
|
||||
* (потерянный make = несработавшее нажатие, потерянный break = залипшая
|
||||
* клавиша; поймано в MAME 2026-08-28). Вместе с KEYSCAN замирают и
|
||||
* остальные его кадровые дела — опрос мыши (Dss.Mouse.GetPackets) и
|
||||
* мигание текстового курсора. ЗНАЧИТ: приложению, которому нужна мышь
|
||||
* через DSS, raw-канал открывать нельзя (мышь встанет); клавиатурные
|
||||
* события всё равно берутся из kbd_raw_down().
|
||||
*
|
||||
* КОДЫ КЛАВИШ: значения ниже — общеизвестный стандарт AT/PS-2 Scan
|
||||
* Code Set 2 (не специфика Sprinter). TODO до использования в PoC:
|
||||
* подтвердить в MAME, что реальный поток байт с SIO-A клавиатуры
|
||||
|
||||
Reference in New Issue
Block a user