toolchain: предупреждать, когда ISR-стаб W0-страниц остался в W1
Правка пользователя, разобранная по диффу и закоммиченная как есть. Программа может временно маппить свою EMM-страницу в окно 0 (атласы спрайтов, gfx_w0_map). Пока страница там, любое прерывание уходит на #0038 ЭТОЙ страницы, поэтому gfx_w0_page_prepare прошивает туда переход на _gfx_w0_isr. Сам стаб живёт в _CODE, а в режимах small и huge _CODE начинается с 0x4100 — то есть попадает в W1, окно, которое DSS перемаплет на время СВОИХ вызовов. Прерывание в этот момент уходит по адресу, которого сейчас нет: W1 читается как #FF. Ловится тяжело: собирается молча, проявляется недетерминированно — зависанием примерно на каждом третьем холодном старте. Поймано вживую 2026-09-01. check_w0_isr.py берёт адрес __gfx_w0_isr из .map: символа нет — W0-путь не слинкован, молчим; адрес >= 0x8000 — он в W2, всё хорошо; иначе WARNING. Сборку не валит намеренно: свои страницы в W0 кладут не все. Вызов добавлен в app.mk рядом с check_bank_calls. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4
This commit is contained in:
@@ -92,11 +92,19 @@ RUNTIME_DEPS := $(wildcard $(PROJ_ROOT)/runtime/*.s)
|
||||
# bankN_*.asm; обычным небанковым программам ничего не стоит.
|
||||
BANK_CHECK := $(PROJ_ROOT)/toolchain/check_bank_calls.py
|
||||
|
||||
# ПРОВЕРКА ISR-СТАБА W0-СТРАНИЦ — там же, по свежей карте. Ловит стаб
|
||||
# _gfx_w0_isr, оставшийся в W1: программа, кладущая свои страницы в W0
|
||||
# (атласы спрайтов, gfx_w0_map), получает недетерминированные зависания,
|
||||
# когда прерывание приходит во время вызова DSS и W1 перемаплен. Только
|
||||
# предупреждение: страницы в W0 кладут не все. Разбор — в шапке скрипта.
|
||||
W0ISR_CHECK := $(PROJ_ROOT)/toolchain/check_w0_isr.py
|
||||
|
||||
$(EXE): $(SOURCES) $(MKEXE) $(LIB) $(RUNTIME_DEPS)
|
||||
$(if $(strip $(BUILD_DIR)),@mkdir -p $(dir $@))
|
||||
$(SPRINTER_CC) $(CC_FLAGS) -o $@ $(SOURCES)
|
||||
@d=$(dir $@).sprinter-cc-$(EXAMPLE); \
|
||||
if ls $$d/bank*_*.asm >/dev/null 2>&1; then python3 $(BANK_CHECK) $$d; fi
|
||||
if ls $$d/bank*_*.asm >/dev/null 2>&1; then python3 $(BANK_CHECK) $$d; fi; \
|
||||
if ls $$d/*.map >/dev/null 2>&1; then python3 $(W0ISR_CHECK) $$d; fi
|
||||
|
||||
$(MKEXE):
|
||||
$(MAKE) -C $(PROJ_ROOT)/toolchain/mkexe
|
||||
|
||||
Reference in New Issue
Block a user