libc/kbd: held-карта клавиш в биты (512 -> 64 Б); эталон размеров принят
Разгрузка 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>
This commit is contained in:
+31
-5
@@ -10,7 +10,8 @@
|
||||
* (порт данных 0x18 читается один раз, деструктивно — либо мы,
|
||||
* либо DSS, не оба), декодируется make/break (PS/2 Scan Code
|
||||
* Set 2: 0xF0 — префикс отпускания, 0xE0 — префикс расширенной
|
||||
* клавиши) в битовую карту `_kbdraw_down[]`, и к DSS НЕ идём
|
||||
* клавиши) в битовую карту `_kbdraw_down[]` (бит на код, 64 Б),
|
||||
* и к DSS НЕ идём
|
||||
* (private RETI — тот же паттерн, что и у CBL ниже). Пока raw
|
||||
* открыт, DSS клавиатуру не видит вообще (см. <kbd_raw.h>).
|
||||
* - CBL (бит 7 порта 0xFE) — только при зарегистрированном хуке
|
||||
@@ -61,6 +62,7 @@ void _irq_tramp(void) __naked
|
||||
;; break-кода = клавиша «залипает» навсегда (найдено 2026-07-16).
|
||||
push hl
|
||||
push de
|
||||
push bc ; маска бита строится в BC (см. ниже)
|
||||
tr_kbd_drain:
|
||||
in a, (#_IRQ_SIO_DATA) ; читаем — тем самым дренируем байт
|
||||
cp #0xF0
|
||||
@@ -68,7 +70,27 @@ void _irq_tramp(void) __naked
|
||||
cp #0xE0
|
||||
jr Z, tr_kbd_setext
|
||||
|
||||
;; --- обычный байт кода: индекс в _kbdraw_down[код(+256 EXT)] ---
|
||||
;; --- обычный байт кода: БИТ code&7 в байте _kbdraw_down[code>>3]
|
||||
;; (карта упакована по битам: 64 Б вместо 512, см. _kbdraw.h).
|
||||
;; Маску строим сдвигом, а НЕ таблицей: таблица потребовала бы
|
||||
;; `ld hl,#метка` внутри трамплина, а он копируется в W2 побайтно
|
||||
;; и обязан быть без абсолютных само-ссылок (см. шапку). ---
|
||||
ld e, a ; E = код
|
||||
and #7
|
||||
ld b, a
|
||||
inc b ; B = (код&7)+1 для djnz
|
||||
ld a, #1
|
||||
jr tr_kbd_mskdec
|
||||
tr_kbd_mskloop:
|
||||
add a, a
|
||||
tr_kbd_mskdec:
|
||||
djnz tr_kbd_mskloop ; A = 1 << (код&7)
|
||||
ld c, a ; C = маска бита
|
||||
ld a, e
|
||||
rrca
|
||||
rrca
|
||||
rrca
|
||||
and #0x1F ; A = код>>3 (код <= 255)
|
||||
ld hl, #__kbdraw_down
|
||||
ld d, #0
|
||||
ld e, a
|
||||
@@ -76,16 +98,19 @@ void _irq_tramp(void) __naked
|
||||
ld a, (__kbdraw_pending)
|
||||
bit 1, a ; _KBDRAW_PEND_EXT?
|
||||
jr Z, tr_kbd_noext
|
||||
ld de, #256
|
||||
ld de, #32 ; +256 кодов = +32 байта карты
|
||||
add hl, de
|
||||
tr_kbd_noext:
|
||||
ld a, (__kbdraw_pending)
|
||||
bit 0, a ; _KBDRAW_PEND_BREAK?
|
||||
jr Z, tr_kbd_mkdown
|
||||
xor a, a ; break → снять (0)
|
||||
ld a, c
|
||||
cpl ; break → сбросить бит
|
||||
and a, (hl)
|
||||
jr tr_kbd_wr
|
||||
tr_kbd_mkdown:
|
||||
ld a, #1 ; make → взвести (1)
|
||||
ld a, c ; make → взвести бит
|
||||
or a, (hl)
|
||||
tr_kbd_wr:
|
||||
ld (hl), a
|
||||
xor a, a
|
||||
@@ -120,6 +145,7 @@ void _irq_tramp(void) __naked
|
||||
ld a, #1
|
||||
ld (__kbdraw_overrun), a
|
||||
tr_kbd_noovr:
|
||||
pop bc
|
||||
pop de
|
||||
pop hl
|
||||
pop af
|
||||
|
||||
Reference in New Issue
Block a user