runtime: фикс banked-режимов — _bank_pages переезжает из _DATA в _CODE

Регрессия от 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 <noreply@anthropic.com>
This commit is contained in:
2026-07-06 21:06:20 +03:00
parent 7187752b29
commit 8531b25e75
3 changed files with 17 additions and 8 deletions
+6 -1
View File
@@ -51,7 +51,12 @@ CC_FLAGS += $(EXTRA_FLAGS)
all: $(EXAMPLE).exe 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) $(SPRINTER_CC) $(CC_FLAGS) -o $@ $(SOURCES)
$(MKEXE): $(MKEXE):
+5 -5
View File
@@ -2,10 +2,10 @@
argv 3431 argv 3431
assrtest 3847 assrtest 3847
attrprob 4091 attrprob 4091
banked 1040 banked 1056
bankedbg 1051 bankedbg 1067
banklocl 4816 banklocl 4832
banktest 3751 banktest 3767
bios_text 4470 bios_text 4470
cat 915 cat 915
conio 4634 conio 4634
@@ -29,7 +29,7 @@ mdview 19122
mdview2 27029 mdview2 27029
mem_test 4558 mem_test 4558
mouse 4394 mouse 4394
openenv 6111 openenv 6127
ptime 5896 ptime 5896
rt_test 4103 rt_test 4103
seek 4177 seek 4177
1 # Эталон размеров _CODE (байт); обновление: python3 toolchain/size_check.py --update
2 argv
3 assrtest
4 attrprob
5 banked
6 bankedbg
7 banklocl
8 banktest
9 bios_text
10 cat
11 conio
29 mdview2
30 mem_test
31 mouse
32 openenv
33 ptime
34 rt_test
35 seek
+6 -2
View File
@@ -64,7 +64,11 @@ ___sdcc_bjump_ehl::
jp (hl) ; tail-jump to callee jp (hl) ; tail-jump to callee
;; Per-bank physical page table. Index = bank id (1-based; [0] is unused). ;; Per-bank physical page table. Index = bank id (1-based; [0] is unused).
;; Filled at startup by crt0_banked.s. ;; Filled at startup by crt0_banked.s ДО gsinit, а gsinit зануляет
.area _DATA ;; _DATA (с 2026-07-04) — поэтому таблица живёт в _CODE (RAM на
;; Sprinter, всегда замаплен: это же нужно и трамплину выше).
;; Регрессия «bank_pages[]=0 → трамплин прыгает в мусор» была именно
;; из-за .area _DATA здесь.
.area _CODE
_bank_pages:: _bank_pages::
.ds 16 .ds 16