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:
2026-07-30 00:50:37 +03:00
parent f2093e0d89
commit 0280b05933
8 changed files with 71 additions and 25 deletions
+17 -10
View File
@@ -1,5 +1,5 @@
# Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
accfill 3772
accfill 3786
argv 3431
assrtest 3847
atlas 9193
@@ -9,15 +9,15 @@ banked 1056
bankedbg 1067
banklocl 4683
banktest 3767
bgi_img 7057
bgitest 3737
bgi_img 7200
bgitest 3751
bios_text 4461
blitperf 5860
blitw 4939
cat 913
cblstream 6217
cbltest 6366
cblwav 6434
cblstream 6431
cbltest 6580
cblwav 6648
conio 4605
conio2 3929
dec_test 860
@@ -27,12 +27,12 @@ fdmax 6023
filetest 10547
fpsdiv 4870
gets 509
gfx_dbuf 5032
gfx_demo 4103
gfx_dbuf 5112
gfx_demo 4117
gfxbanks 6044
hello 4167
hello2 4244
irqtest 6527
irqtest 6647
kbdraw 4911
ls 4835
malloc 4461
@@ -45,7 +45,8 @@ palfile 5406
ptime 5744
rpgprof 12082
rpgwalk 10309
rt_test 4892
rt_test 5154
scroll 2974
seek 4188
simple 955
solidt 11531
@@ -60,4 +61,10 @@ strtest 1340
text_palette 5024
timedir 5454
w0page 8831
w3bankgfx 5240
w3bgfx 5246
w3big 3673
w3huge 3700
w3probe 3556
w3tiny 3471
winrest 4459
1 # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
2 accfill
3 argv
4 assrtest
5 atlas
9 bankedbg
10 banklocl
11 banktest
12 bgi_img
13 bgitest
14 bios_text
15 blitperf
16 blitw
17 cat
18 cblstream
19 cbltest
20 cblwav
21 conio
22 conio2
23 dec_test
27 filetest
28 fpsdiv
29 gets
30 gfx_dbuf
31 gfx_demo
32 gfxbanks
33 hello
34 hello2
35 irqtest
36 kbdraw
37 ls
38 malloc
45 ptime
46 rpgprof
47 rpgwalk
48 rt_test
49 scroll
50 seek
51 simple
52 solidt
61 text_palette
62 timedir
63 w0page
64 w3bankgfx
65 w3bgfx
66 w3big
67 w3huge
68 w3probe
69 w3tiny
70 winrest