Files
Sprinter-SDCC/docs/size_baseline.tsv
T
snark13 8490288d79 libc/crt0: возврат из main завершает программу по-настоящему
Два бага одного пути завершения, оба видны только на железе.

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
2026-09-02 14:15:48 +03:00

942 B

1# Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
2accfill3797
3accop7067
4argv3445
5assrtest3861
6atlas9193
7attrprob4101
8banked1070
9bankedbg1081
10banklocl4697
11banktest3781
12bgi_img8691
13bgitest3762
14bios_text4475
15blitperf5860
16blitw4939
17cat927
18cblstream5944
19cbltest6090
20cblwav6183
21conio4619
22conio23943
23convbench3508
24dec_test874
25errno5980
26fbench8149
27fdmax6087
28filetest10611
29fpsdiv4870
30gets523
31gfx_dbuf5207
32gfx_demo4128
33gfxbanks6044
34hello4181
35hello24258
36irqtest6754
37kbdpoll1282
38kbdraw4911
39ls4849
40malloc4475
41mem_test4569
42mouse4396
43openenv6138
44pageflip6334
45palfile5406
46ptime5758
47rt_test5216
48scroll6744
49seek4202
50simple969
51solidt11595
52spranim9431
53spriteclip4119
54sprites6791
55stattest7563
56stdlib6657
57stest23658
58strtest1354
59text_palette5038
60timedir5468
61w0page8831
62w3bgfx5243
63w3big3673
64w3huge3700
65w3probe3556
66w3tiny3471
67winrest4473