0280b05933
Разгрузка W1/W2 под будущий ИИ стражей: _kbdraw_down был БАЙТОМ на
скан-код (512 Б в _DATA при 32-килобайтной раскладке). Теперь бит на
код: код>>3 = байт, код&7 = бит, расширенные (префикс 0xE0) — смещение
+32 байта вместо +256.
Трамплин прерывания строит маску СДВИГОМ, а не таблицей: таблица
потребовала бы `ld hl,#метка` внутри трамплина, а он копируется в W2
побайтно и обязан быть без абсолютных само-ссылок (см. его шапку).
Маска строится в BC, поэтому в клавиатурной ветке добавлен push/pop bc.
Трамплин вырос 244 -> 267 Б, буфер копии поднят 320 -> 336 (запас 69 Б).
Проверено в MAME на roomtest, все три класса клавиш:
- обычные: '=' (обход комнат) и 'K' (чит-убийство стража — читал
guardhp_curr/delta: 3/0 -> 0/-3);
- расширенные (E0): стрелка вправо — Kid добежал до края комнаты;
- модификаторы: удержание Shift ставит бит 2 байта 2 карты
(скан-код 0x12), отпускание снимает.
Скорость: кадр 334 716 -> 338 508 тактов (+1.1 %) на битовой арифметике
в kbd_raw_down (~15 вызовов за кадр); при бюджете 430 000 это 0.79
периода вместо 0.78 — регрессии нет.
Итог по roomtest: данные 4422 -> 4022 Б, куча W2 996 -> 1294 Б.
Эталон размеров принят заново (make size-baseline): _CODE десяти
программ вырос на 14-23 Б — это код битовой арифметики в трамплине и
kbd_raw_down, обмен на -448 Б данных, которые size_check не считает.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
35 lines
2.0 KiB
C
35 lines
2.0 KiB
C
/*
|
|
* _kbdraw.h — внутренности raw-канала клавиатуры (НЕ публичный
|
|
* заголовок; публичный интерфейс — <kbd_raw.h>).
|
|
*
|
|
* Всё состояние — плоские глобалы (живут в W2/_DATA во ВСЕХ memory-
|
|
* режимах, см. sprinter_memory_modes) — трамплин прерывания
|
|
* (libc/irq/_irq_tramp.c) обращается к ним БЕЗ W1-remap и без call,
|
|
* поэтому раскладка памяти приложения тут ни при чём.
|
|
*/
|
|
#ifndef _KBDRAW_INTERNAL_H
|
|
#define _KBDRAW_INTERNAL_H
|
|
|
|
#include <stdint.h>
|
|
|
|
/* Биты _kbdraw_pending — накопленные префиксы PS/2 Scan Code Set 2,
|
|
* ждущие завершающего байта кода (см. _irq_tramp.c). */
|
|
#define _KBDRAW_PEND_BREAK 0x01
|
|
#define _KBDRAW_PEND_EXT 0x02
|
|
|
|
extern uint8_t _kbdraw_active; /* 0 = raw выключен (дефолт, трамплин
|
|
* ведёт себя как раньше — прямо к DSS) */
|
|
extern uint8_t _kbdraw_pending; /* FSM декодера make/break, см. выше */
|
|
extern uint8_t _kbdraw_overrun; /* 1 = ISR поймал Rx-overrun SIO (потерян
|
|
* байт → возможно потерян break); снимает
|
|
* kbd_raw_sync (чистит _kbdraw_down) */
|
|
/* Held-состояние: БИТ на скан-код, код>>3 = байт, код&7 = номер бита;
|
|
* коды 0..255 обычные, 256..511 — расширенные (префикс 0xE0), т.е.
|
|
* смещение +32 байта. Упаковка вместо байта на код: 64 Б вместо 512 —
|
|
* заметная доля _DATA на 32-килобайтной раскладке (замер PoP roomtest
|
|
* 2026-07-30). Ведёт трамплин прерывания (libc/irq/_irq_tramp.c),
|
|
* читает kbd_raw_down(). */
|
|
extern uint8_t _kbdraw_down[64];
|
|
|
|
#endif
|