diff --git a/applications/PoP/docs/layout_plan_v2.md b/applications/PoP/docs/layout_plan_v2.md index 1e4bbe9..3d10647 100644 --- a/applications/PoP/docs/layout_plan_v2.md +++ b/applications/PoP/docs/layout_plan_v2.md @@ -11,6 +11,51 @@ --- +## СТАТУС ВЫПОЛНЕНИЯ (обновлено 2026-07-29, коммит ecf5ecf) + +| Шаг | Статус | Факт | +|-----|--------|------| +| 1. `kid_data.h` → EMM-страница + `load_frame`/`cur_frame` | **сделан** | `_CODE` −3 247 Б; попутно найден и обойдён баг кодогенерации SDCC (см. ниже) | +| 2. `pop_geom.c` (дедуп геометрии + PRNG) | **сделан** | −41 Б `_CODE`, −11 Б W3; ценность — не байты, а bank-safe слой | +| 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` | +| 7. Дедуп семейства `draw_tile` | отложен по решению пользователя | «мороки много, выгода не так велика» | + +**Замер сейчас против замера §1:** `_CODE` 24 881 → 24 421, куча W2 2 076 → 2 592 Б, +W3-резидент 14 376 → 11 632 (свободно 2 008 → 4 752 Б). Сумма кода упала +на ~3.2 КБ (данные Kid уехали в EMM), остальное — перераспределение. + +### Что сделано вместо §5.3 (вынос loose в W3) + +Вместо переноса кода между окнами выбран (по обсуждению с пользователем) +**порт архитектуры оригинала**: логика ставит пометку, отрисовка идёт +отдельным проходом — `set_redraw_*` (seg007) + `redraw_needed` (seg008:0178). +Появился `pop_redraw.c/.h`; `pop_trob` и `pop_map` больше не рисуют тайлы. +Наши самодельные счётчики (`spike_rest`, `button_rest`, `ldoor_rest`, +`loose_bake`, `loose_rest`, `ceil_rest`, `ceil_bake`, `land_bake`) удалены — +их роль (вторая страница дабл-буфера) взял счётчик страниц в пометке. + +**Два исключения остались** (обе — функции ТОЛЬКО главного цикла, звать из +банка нельзя): +- `pop_process_trobs` — пламя факела и пузырёк зелья (покадровый оверлей); +- `pop_loose_tick` — падающий кусок (mob): spawn/tick/pos. В оригинале это + отдельная подсистема (`mobs` + `draw_moving`), разделение на логику и + отрисовку — задел следующей фазы. + +### Найденная по дороге ловушка компилятора + +`(const T *)КОНСТАНТА + var*K` SDCC 4.5 может собрать неверно: умножение +делает в 16 битах, а потом берёт только младший байт (`ld c,l` / `inc b`). +Кадры Kid с индексом ≥ 52 читались из чужой строки таблицы, у бега/шага +пропадал `FRAME_NEEDS_FLOOR` и персонаж проваливался сквозь пол. Лечение — +считать адрес в `uint16_t` и кастовать один раз. Тот же паттерн в +`pop_level.c` компилируется ПРАВИЛЬНО, т.е. полагаться на «у соседа +работает» нельзя. Подробности: memory `sdcc_z80_const_ptr_index_bug`. + +--- + ## 0. Что уже сделано из v1 (не повторять) - `--opt-code-size` и `--max-allocs 100000` **уже включены по умолчанию** в