diff --git a/applications/PoP/docs/layout_plan_v2.md b/applications/PoP/docs/layout_plan_v2.md index 3d10647..4ff82cf 100644 --- a/applications/PoP/docs/layout_plan_v2.md +++ b/applications/PoP/docs/layout_plan_v2.md @@ -20,7 +20,7 @@ | 3. `pop_map` без вызовов графики | **сделан** (фазы 1a/1b) | через пометки перерисовки, см. ниже | | 4. Разгрузка/перебалансировка W3 | **сделан** | в резиденте остался ТОЛЬКО `pop_bg`; W3 14 376 → 11 632 (свободно 4 752 Б) | | 5. Данные (`room_modif`, `dl1/dl2`, `_kbdraw_down`) | не начат | потенциал ~1.5 КБ | -| 6. Контракт банка стражей + пробник | **в работе** | пробник `tests/w3bankgfx` | +| 6. Контракт банка стражей + пробник | **пробник сделан** | `tests/w3bankgfx` — модель подтверждена в MAME, см. ниже | | 7. Дедуп семейства `draw_tile` | отложен по решению пользователя | «мороки много, выгода не так велика» | **Замер сейчас против замера §1:** `_CODE` 24 881 → 24 421, куча W2 2 076 → 2 592 Б, @@ -44,6 +44,28 @@ W3-резидент 14 376 → 11 632 (свободно 2 008 → 4 752 Б). С отдельная подсистема (`mobs` + `draw_moving`), разделение на логику и отрисовку — задел следующей фазы. +### Пробник банка (2026-07-29): модель ПОДТВЕРЖДЕНА + +`tests/w3bankgfx` (huge + `--w3 res.c` + `--bank 1=bank1.c`, графика 256): + +- банк рисует примитивом libbgi НАПРЯМУЮ — работает; страница W3 внутри + банка до блита, после блита и после возврата из вызванной им W1/W2-функции + одна и та же (0xF0), резидент — 0xF3. То есть `_bgi_begin`/`_bgi_end` + корректно возвращают ИМЕННО банковую страницу (правило R4); +- вызов W1/W2-функции из банка работает, и она тоже может рисовать; +- резидент W3 жив и вызывается после возврата из банка (R3). + +**Дополнительно выяснено (важно для стражей):** писучие статики +`__banked`-модуля линкуются В СТРАНИЦУ БАНКА (0x1C000+) — снаружи их не +прочитать, из W1/W2 по 0xC000 видна резидентная страница. Значит всё +состояние банкованного кода (позиции стражей, таймеры боя) обязано жить в +W1/W2 как обычные глобалы, а банк — только код. + +Ещё одна мина, найденная там же: инлайновый `in a,(#0xE2)` посреди тела +функции затирает A, куда SDCC уже положил параметр (у нас из-за этого цвет +заливки стал номером страницы, и «резидент не рисовал»). Читать порт +отдельной `__naked`-функцией. + ### Найденная по дороге ловушка компилятора `(const T *)КОНСТАНТА + var*K` SDCC 4.5 может собрать неверно: умножение