docs(PoP): план v2 — статус выполнения шагов 1..4 и найденная ловушка SDCC
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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` **уже включены по умолчанию** в
|
||||
|
||||
Reference in New Issue
Block a user