libc+libbgi: raw-клавиатура (held-state) + column-major блит спрайтов
libc/kbd: kbd_raw_open/close/down — сырой PS/2-канал клавиатуры с held-state (битовая карта _kbdraw_down[512], EXT-клавиши +256). Пока raw открыт, кадровый IRQ-трамплин перехватывает байт SIO у DSS и декодирует make/break (0xF0/0xE0-префиксы) сам. FIFO вычерпывается В ЦИКЛЕ (приёмный буфер SIO 3 байта; пачка break-кодов при одновременном отпускании иначе теряется → залипание клавиши). Буфер W2-трамплина поднят 224→288 Б под выросший обработчик. libc/conio: kbd_mod_state() — live-состояние модификаторов (ESTEX CTRLKEY $33h), Shift/Ctrl/Alt/Lock прямо сейчас, KBD_MOD_* маска. libbgi: gfx_blit_cols(x,y,img,flip) + _bgi_blit_cols_raw — блит column-major спрайта вертикальным accel-проходом, бесплатный горизонтальный флип (sstride<0), клип по экрану. Для персонажей. libbgi/atlas_load: восстанавливать W3 ДО записи a->count (atlas_t в --bank памяти резолвится через W3; count оставался мусором). tests/kbdraw — тест raw-клавиатуры; size-baseline +kbdraw. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -163,6 +163,11 @@ libc отказывает сама (EMFILE, предохранитель _fd_gua
|
||||
|
||||
Клавиатура: `kbhit getch getche getkey` (+KEY_* коды позиций),
|
||||
`char *cgets(buf)`.
|
||||
`uint16_t kbd_mod_state(void)` — live-состояние модификаторов ПРЯМО
|
||||
СЕЙЧАС (ESTEX CTRLKEY $33h, не событие из буфера — держится, пока
|
||||
клавиша реально зажата); (mode<<8)|shift, расшифровка KBD_MOD_*.
|
||||
Покрывает только Shift/Ctrl/Alt/Rus-Lat/Lock — для обычных клавиш
|
||||
(стрелки и т.п.) live-state у ESTEX нет, см. `<kbd_raw.h>`.
|
||||
Вывод с атрибутом: `putch cputs cprintf` (~10× медленнее stdio-пути;
|
||||
'\n' НЕ транслируется — писать "\r\n").
|
||||
Атрибуты: `textcolor textbackground textattr`, `set/get_text_attr`,
|
||||
@@ -285,6 +290,57 @@ Cross-lib: libbgi всегда линкуется с libc; _cbl_port_ref/unref
|
||||
Handler'у нельзя: ESTEX/BIOS-вызовы, gfx_*/своп окон, акселератор,
|
||||
banked-функции; только volatile-глобалы и быстрая работа (<1 мс).
|
||||
|
||||
## <kbd_raw.h> — эксклюзивный raw-канал клавиатуры (вектор 0xFF, свой путь)
|
||||
|
||||
Мотивация — applications/PoP/docs/PORT_PLAN.md §2: ESTEX
|
||||
kbhit/getch/getkey/kbd_mod_state — событийные, без held-state для
|
||||
обычных (не модификаторных) клавиш. Decode make/break (PS/2 Scan Code
|
||||
Set 2: `0xF0` — префикс отпускания, `0xE0` — префикс расширенной
|
||||
клавиши) прямо в трамплине прерывания (libc/irq/_irq_tramp.c), по
|
||||
прецеденту приватного пути CBL (не чейнится к DSS, пока открыт).
|
||||
|
||||
| Сигнатура | Описание |
|
||||
|---|---|
|
||||
| `int kbd_raw_open(void)` | включить: с этого момента ВЕСЬ поток клавиатурных байт достаётся нам, DSS его не видит. 0 / -1+errno (EBUSY повтор) |
|
||||
| `void kbd_raw_close(void)` | выключить, вернуть клавиатуру DSS; идемпотентно; висит на atexit |
|
||||
| `uint8_t kbd_raw_down(uint16_t code)` | зажата ли code ПРЯМО СЕЙЧАС (0/1); code вне 0..511 — 0 |
|
||||
| `KBD_EXT` | ИЛИ-флаг кода: клавиша была расширенной (0xE0-префикс на проводе) |
|
||||
| `KBD_UP/DOWN/LEFT/RIGHT/SPACE/ENTER/ESC/LSHIFT/RSHIFT` | позиционные коды PS/2 Set 2 — LEFT/ESC/UP подтверждены (см. ниже); остальные — по стандарту, не перепроверены поштучно |
|
||||
|
||||
**ИСПРАВЛЕНО 2026-07-15 (был неверный вывод, ниже — то, что реально
|
||||
подтвердилось):** изначально скриншот-тестирование (снимок экрана
|
||||
после `press_key('up')`) не показывало видимого эффекта на
|
||||
UP/DOWN/RIGHT — из этого сделан ОШИБОЧНЫЙ вывод «скрипт не может их
|
||||
нажать». На самом деле причина была в неудачном таймінге снимков
|
||||
относительно дуги прыжка, а не в отсутствии сигнала. Подтверждено
|
||||
брейкпоинтом в отладчике MAME (adress уровня приложения на входе в
|
||||
код `jumping=1` в `applications/PoP/poc/poc.c`): `press_key('up')`
|
||||
ЧЕСТНО доходит до raw-декодера и триггерит код прыжка — брейкпоинт
|
||||
сработал ровно один раз за одно удержание клавиши (это же заодно
|
||||
подтвердило фикс двойного триггера через `up_prev` edge-detect в
|
||||
`poc.c`). Так что скриптовый `press_key` для UP/DOWN/RIGHT РАБОТАЕТ
|
||||
корректно так же, как для LEFT — предыдущая запись про «ограничение
|
||||
именно в скриптовом инжекте» была неверной, оставлена в истории
|
||||
git как урок: при повторных «нет эффекта» на скриншотах — проверять
|
||||
брейкпоинтом/watchpoint'ом на конкретный адрес кода, не полагаться
|
||||
только на визуальный снимок с произвольным таймингом.
|
||||
|
||||
**ГЛАВНОЕ СЛЕДСТВИЕ:** пока `kbd_raw_open()` активен, `kbhit/getch/getkey/
|
||||
kbd_mod_state` НЕ получают новых событий (в т.ч. CTRLKEY подряд отдаёт
|
||||
то же самое, что было на момент открытия — резидентный обработчик DSS,
|
||||
от которого зависит его live-state, во время raw не выполняется).
|
||||
ESC для выхода — через `kbd_raw_down(KBD_ESC)`, не через DSS.
|
||||
|
||||
Верификация (tests/kbdraw, MAME, 2026-07-15): `press_key` в мосте
|
||||
MAME дёргает ОБЕ клавиатуры (PC ms_naturl + ZX-матрица `IO_LINE`)
|
||||
одновременно — наблюдался паразитный незатухающий бит от ZX-пути
|
||||
(обычный код без EXT-префикса, застревал в DOWN) — не воспроизводится
|
||||
на реальном сценарии (только PC/AT-клавиатура, без матрицы, см.
|
||||
applications/PoP/docs/PORT_PLAN.md §2 — пользователь подтвердил, что
|
||||
матрица на Sprinter давно не используется). Для будущих MAME-тестов
|
||||
этой функции — бить только по `:kbd:ms_naturl:*`, не через
|
||||
удобный `press_key` (или перепроверить точную семантику полей моста).
|
||||
|
||||
## <cbl.h> — потоковый звук CBL/COVOX (вектор 0xFF, свой ISR)
|
||||
|
||||
Без собственного кольца (2026-07-07): у CBL уже есть аппаратный буфер
|
||||
|
||||
Reference in New Issue
Block a user