8490288d79
Два бага одного пути завершения, оба видны только на железе.
1. ЗВУК ПРОДОЛЖАЛСЯ ПОСЛЕ ВЫХОДА. cbl_close() закрывает СЕССИЮ, но не
гасит железо: bit7 порта 0x004E держит gfx_wait_vsync ради бита луча,
поэтому порт оставался включённым ("немой" режим), и CBL крутил свои 256
слотов уже под шеллом — тихо ровно до первой чужой записи в порт данных,
а дальше она зацикливалась. Новый cbl_shutdown() гасит bit7 независимо
от держателей и центрует ЦАП обычного COVOX; pop_shutdown зовёт его
последним действием, а _cbl_open_raw регистрирует в atexit его, а не
cbl_close.
2. ЦЕПОЧКА atexit НЕ ВЫПОЛНЯЛАСЬ ПРИ ВОЗВРАТЕ ИЗ main. crt0 уходил прямо
в ESTEX EXIT, то есть нарушал контракт C (возврат из main = exit(status)).
Молча терялись не только гашение звука и снятие vsync-ссылки, но и
_fclosall: буферизованная запись в файлы пропадала, если программа не
звала exit() явно. Теперь crt0 после main дёргает _atexit_hook.
Косвенность обязательна: прямая ссылка crt0 на разматыватель притащила бы
его и стек хендлеров в КАЖДУЮ программу. Указатель живёт в отдельном
data-модуле (два байта _DATA, ни байта кода), ставит его сам atexit() при
первой регистрации — нет регистраций, нет и кода. Тот же приём, что у
_irq_cbl_hook.
Цена замерена: +14 Б всем программам (блок в crt0) и +64 Б тем
одиннадцати, что реально регистрируют хендлеры (CBL, файловые через
_fclosall, irqtest, gfx_dbuf, solidt) — у них раньше эти хендлеры были
мёртвым кодом. Эталоны обновлены (кроме atlas: его +434 Б не отсюда,
замерен тот же и без этих правок).
Проверено в MAME: старт и звук как были, выход по F10 возвращает в шелл
чисто (текстовый режим восстановлен, зависания нет), повторный запуск
работает. Пункт 1 проверяется только на железе.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4
942 B
942 B
| 1 | # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update | |
|---|---|---|
| 2 | accfill | 3797 |
| 3 | accop | 7067 |
| 4 | argv | 3445 |
| 5 | assrtest | 3861 |
| 6 | atlas | 9193 |
| 7 | attrprob | 4101 |
| 8 | banked | 1070 |
| 9 | bankedbg | 1081 |
| 10 | banklocl | 4697 |
| 11 | banktest | 3781 |
| 12 | bgi_img | 8691 |
| 13 | bgitest | 3762 |
| 14 | bios_text | 4475 |
| 15 | blitperf | 5860 |
| 16 | blitw | 4939 |
| 17 | cat | 927 |
| 18 | cblstream | 5944 |
| 19 | cbltest | 6090 |
| 20 | cblwav | 6183 |
| 21 | conio | 4619 |
| 22 | conio2 | 3943 |
| 23 | convbench | 3508 |
| 24 | dec_test | 874 |
| 25 | errno | 5980 |
| 26 | fbench | 8149 |
| 27 | fdmax | 6087 |
| 28 | filetest | 10611 |
| 29 | fpsdiv | 4870 |
| 30 | gets | 523 |
| 31 | gfx_dbuf | 5207 |
| 32 | gfx_demo | 4128 |
| 33 | gfxbanks | 6044 |
| 34 | hello | 4181 |
| 35 | hello2 | 4258 |
| 36 | irqtest | 6754 |
| 37 | kbdpoll | 1282 |
| 38 | kbdraw | 4911 |
| 39 | ls | 4849 |
| 40 | malloc | 4475 |
| 41 | mem_test | 4569 |
| 42 | mouse | 4396 |
| 43 | openenv | 6138 |
| 44 | pageflip | 6334 |
| 45 | palfile | 5406 |
| 46 | ptime | 5758 |
| 47 | rt_test | 5216 |
| 48 | scroll | 6744 |
| 49 | seek | 4202 |
| 50 | simple | 969 |
| 51 | solidt | 11595 |
| 52 | spranim | 9431 |
| 53 | spriteclip | 4119 |
| 54 | sprites | 6791 |
| 55 | stattest | 7563 |
| 56 | stdlib | 6657 |
| 57 | stest2 | 3658 |
| 58 | strtest | 1354 |
| 59 | text_palette | 5038 |
| 60 | timedir | 5468 |
| 61 | w0page | 8831 |
| 62 | w3bgfx | 5243 |
| 63 | w3big | 3673 |
| 64 | w3huge | 3700 |
| 65 | w3probe | 3556 |
| 66 | w3tiny | 3471 |
| 67 | winrest | 4473 |