L9-INVERT: зеркальный слой фона + вход в комнату в банк 8

II.3: pop_upside проведён в единственную точку тайлового слоя (pop_blit_b /
blit_b_clip): позиция через FLIP_TOP, блит — vflip-двойник.  Этим зеркалятся
полная отрисовка комнаты, точечные редрои, trob-анимации, fore-слой и кладка.
В клипованном пути обрезка сверху экрана съедает нижние строки источника,
поэтому кусок пересчитывается как sy' = h - sy - dh.

MEM-COLD2 п.1: enter_room_side/enter_room — в банк 8 (куча 450 -> 1231 Б).
Рабочие массивы комнаты остались в _DATA, в банк уехал только код.

Проверено в MAME (уровень 9, чит U): комната перевёрнута целиком, пол
вверху, дверь и кладка вверх ногами.  tests-host 6/6, size-check OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 17:43:22 +03:00
parent 5c015739fa
commit 7c1ded340c
5 changed files with 228 additions and 161 deletions
+23 -1
View File
@@ -243,7 +243,29 @@ void gfx_copy_rect(uint8_t src_page, int sx, int sy,
вероятный класс багов здесь). Решение: зеркалит ВЫЗЫВАЮЩИЙ, у примитивов
семантика не меняется.
## II.3 Фон
## II.3 Фон — СДЕЛАНО 2026-08-12
Флаг проведён в ЕДИНСТВЕННУЮ точку — `pop_blit_b`/`blit_b_clip`
(`pop_tile.c`): позиция пересчитывается макросом `FLIP_TOP` (он один на весь
слой — дублировать нельзя, иначе двойной переворот), а блит выбирает
vflip-двойник. Тем самым зеркалятся и полная отрисовка комнаты, и точечные
редрои, и анимации trob, и fore-слой, и кладка — все они ходят через эту
функцию.
Тонкость клипованного пути: при зеркале обрезка СВЕРХУ экрана съедает
НИЖНИЕ строки источника, поэтому кусок пересчитывается как
`sy' = h - sy - dh`.
Проверено в MAME (уровень 9, чит U): комната перевёрнута целиком — пол
вверху, дверь уровня и кладка вверх ногами. Персонажи пока обычные (II.4).
Цена: три функции libbgi ушли в резидент, куча 1574 → 450 Б, поэтому тем же
заходом сделан **MEM-COLD2 п.1**`enter_room_side`/`enter_room` уехали в
банк 8 (куча вернулась к **1231 Б**, банк занят на 14.6%). Рабочие массивы
комнаты остались в `_DATA` и видны обеим половинам; `enter_room` обязана быть
`__banked` — её зовёт главный цикл.
### Контракт (исходное описание)
Одна точка: `pop_tile.c` (блит куска атласа) выбирает vflip-двойник по
`pop_upside` и пересчитывает `y`. Тогда автоматически попадают: