From 8531b25e75ff079f107c86f5cbffbd8a6f057610 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 6 Jul 2026 21:06:20 +0300 Subject: [PATCH] =?UTF-8?q?runtime:=20=D1=84=D0=B8=D0=BA=D1=81=20banked-?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=BE=D0=B2=20=E2=80=94=20=5Fban?= =?UTF-8?q?k=5Fpages=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B5=D0=B7=D0=B6=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B8=D0=B7=20=5FDATA=20=D0=B2=20=5FCODE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Регрессия от 961cfb7 (gsinit зануляет _DATA, 2026-07-04): crt0_banked заполняет таблицу физических страниц _bank_pages ДО gsinit, а тот её стирал — трамплины banked-вызовов читали нули и прыгали в незамапленную страницу. Висли ВСЕ banked-программы (banked/bankedbg/banklocl/ banktest); найдено MAME-смоуком. Тот коммит перенёс crt0-приватные _estex_* в _CODE, но _bank_pages в runtime/bank.s пропустил. - runtime/bank.s: _bank_pages → .area _CODE (RAM, всегда замаплен — это же условие нужно и трамплину); +16 Б _CODE у программ с bank.s - app.mk: exe теперь зависит от runtime/*.s — правка crt0/bank.s перелинковывает тесты без make clean (фикс иначе не подхватывался) - эталон размеров обновлён (+16 Б у banked/bankedbg/banklocl/ banktest/openenv — size-check поймал ровно их) Co-Authored-By: Claude Fable 5 --- app.mk | 7 ++++++- docs/size_baseline.tsv | 10 +++++----- runtime/bank.s | 8 ++++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app.mk b/app.mk index 3a2472d..3b59957 100644 --- a/app.mk +++ b/app.mk @@ -51,7 +51,12 @@ CC_FLAGS += $(EXTRA_FLAGS) all: $(EXAMPLE).exe -$(EXAMPLE).exe: $(SOURCES) $(MKEXE) $(LIB) +# runtime/*.s (crt0-семейство, bank.s, heap.s) собираются per-build +# внутри sprinter-cc — без этой зависимости их правка не перелинкует +# уже собранный exe (кусало: фикс bank.s не подхватился). +RUNTIME_DEPS := $(wildcard $(PROJ_ROOT)/runtime/*.s) + +$(EXAMPLE).exe: $(SOURCES) $(MKEXE) $(LIB) $(RUNTIME_DEPS) $(SPRINTER_CC) $(CC_FLAGS) -o $@ $(SOURCES) $(MKEXE): diff --git a/docs/size_baseline.tsv b/docs/size_baseline.tsv index cbb9018..f7fb61a 100644 --- a/docs/size_baseline.tsv +++ b/docs/size_baseline.tsv @@ -2,10 +2,10 @@ argv 3431 assrtest 3847 attrprob 4091 -banked 1040 -bankedbg 1051 -banklocl 4816 -banktest 3751 +banked 1056 +bankedbg 1067 +banklocl 4832 +banktest 3767 bios_text 4470 cat 915 conio 4634 @@ -29,7 +29,7 @@ mdview 19122 mdview2 27029 mem_test 4558 mouse 4394 -openenv 6111 +openenv 6127 ptime 5896 rt_test 4103 seek 4177 diff --git a/runtime/bank.s b/runtime/bank.s index 1aa1d5e..c94bebe 100644 --- a/runtime/bank.s +++ b/runtime/bank.s @@ -64,7 +64,11 @@ ___sdcc_bjump_ehl:: jp (hl) ; tail-jump to callee ;; Per-bank physical page table. Index = bank id (1-based; [0] is unused). -;; Filled at startup by crt0_banked.s. - .area _DATA +;; Filled at startup by crt0_banked.s ДО gsinit, а gsinit зануляет +;; _DATA (с 2026-07-04) — поэтому таблица живёт в _CODE (RAM на +;; Sprinter, всегда замаплен: это же нужно и трамплину выше). +;; Регрессия «bank_pages[]=0 → трамплин прыгает в мусор» была именно +;; из-за .area _DATA здесь. + .area _CODE _bank_pages:: .ds 16