6dabe9b4b1
Корень двух багов 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>
68 lines
942 B
Plaintext
68 lines
942 B
Plaintext
# Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
|
|
accfill 3783
|
|
accop 7067
|
|
argv 3431
|
|
assrtest 3847
|
|
atlas 9193
|
|
attrprob 4087
|
|
banked 1056
|
|
bankedbg 1067
|
|
banklocl 4683
|
|
banktest 3767
|
|
bgi_img 8677
|
|
bgitest 3748
|
|
bios_text 4461
|
|
blitperf 5860
|
|
blitw 4939
|
|
cat 913
|
|
cblstream 5860
|
|
cbltest 6006
|
|
cblwav 6099
|
|
conio 4605
|
|
conio2 3929
|
|
convbench 3508
|
|
dec_test 860
|
|
errno 5966
|
|
fbench 8085
|
|
fdmax 6023
|
|
filetest 10547
|
|
fpsdiv 4870
|
|
gets 509
|
|
gfx_dbuf 5131
|
|
gfx_demo 4114
|
|
gfxbanks 6044
|
|
hello 4167
|
|
hello2 4244
|
|
irqtest 6690
|
|
kbdpoll 1282
|
|
kbdraw 4911
|
|
ls 4835
|
|
malloc 4461
|
|
mem_test 4555
|
|
mouse 4382
|
|
openenv 6124
|
|
pageflip 6334
|
|
palfile 5406
|
|
ptime 5744
|
|
rt_test 5197
|
|
scroll 6744
|
|
seek 4188
|
|
simple 955
|
|
solidt 11531
|
|
spranim 9431
|
|
spriteclip 4119
|
|
sprites 6791
|
|
stattest 7549
|
|
stdlib 6643
|
|
stest2 3644
|
|
strtest 1340
|
|
text_palette 5024
|
|
timedir 5454
|
|
w0page 8831
|
|
w3bgfx 5243
|
|
w3big 3673
|
|
w3huge 3700
|
|
w3probe 3556
|
|
w3tiny 3471
|
|
winrest 4459
|