Files
snark13 b3bf2cca3d tests/w3bankgfx: пробник модели «huge + резидент W3 + банк W3 + графика»
Проверяет то, на чём стоит план раскладки PoP (layout_plan_v2.md §2):

R3  резидент/HOME -> __banked через трамплин работает;
R4  примитивы libbgi можно звать ИЗ БАНКА: _bgi_begin запоминает текущую
    страницу W3 (порт 0xE2), _bgi_end её возвращает — банк переживает
    рисование и продолжает исполняться;
    то же верно для функции W1/W2, вызванной из банка: она рисует, а в W3
    остаётся страница БАНКА, не резидента.

Результат в MAME: все пять полос на месте, вердикт ЗЕЛЁНЫЙ.  Замеры:
страница банка 0xF0 до рисования, после прямого блита и после возврата из
W1/W2-функции — та же 0xF0; резидент 0xF3; банк дожил до конца и вернул
корректное значение.

Два побочных вывода, важных для стражей:
1. Писучие статики __banked-модуля линкуются В СТРАНИЦУ БАНКА (адрес
   0x1C000+), снаружи их не прочитать — состояние банка держать в W1/W2.
2. Инлайновый `in a,(0xE2)` посреди тела функции затирает A, куда SDCC уже
   положил параметр (в первой версии пробника цвет заливки становился
   номером страницы, и «резидент не рисовал»).  Читать порт отдельной
   __naked-функцией.

Имя exe — 8.3 (w3bgfx.exe): DSS длинных имён не понимает.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-29 21:18:27 +03:00

25 lines
1.8 KiB
Makefile

# w3bankgfx — пробник модели «huge + резидент W3 + банк W3 + графика».
#
# Проверяем ровно то, на чём стоит план раскладки PoP (docs/layout_plan_v2.md):
# R2 из __banked-кода резидентная страница W3 недостижима (НЕ зовём);
# R3 резидент -> банк работает через трамплин;
# R4 примитивы libbgi можно звать ИЗ БАНКА: _bgi_begin запоминает текущую
# страницу W3 (порт 0xE2) и _bgi_end её возвращает — значит банк
# переживает рисование и продолжает исполняться.
#
# Раскладка huge: CODE 0x4100 (W1), DATA 0x8000 (W2), банк 0x1C000 (W3),
# резидент --w3 делит W3 с банком (crt0 запоминает резидентную страницу).
PROJ_ROOT := $(abspath $(CURDIR)/../..)
EXAMPLE := w3bgfx
MEMORY := huge
EXTRA_FLAGS := --gfx 256 --w3 res.c --bank 1=bank1.c
include $(PROJ_ROOT)/app.mk
# Ожидаемый результат (проверено 2026-07-29, MAME dev):
# пять полос сверху вниз: синяя (резидент), бирюзовая (банк рисует сам),
# жёлтая (W1/W2-функция, вызванная из банка), ЗЕЛЁНАЯ (все проверки ок),
# синяя (резидент жив после возврата). Красная вместо зелёной = модель
# не подтвердилась. Диагностика в переменных bank_page_*/home_page_seen/
# res_page_seen: банк 0xF0, резидент 0xF3, страница W3 внутри банка не
# менялась вокруг рисования.