From 2f3e85485473be3e242e37fc9ae01cb7fc8d6675 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Thu, 30 Jul 2026 22:22:27 +0300 Subject: [PATCH] =?UTF-8?q?PoP=20roomtest:=20=D0=BE=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D1=81=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B0=20=E2=80=94=20=D0=B2=20=D1=81=D0=BE=D0=B1=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=B1=D0=B0=D0=BD=D0=BA?= =?UTF-8?q?=20(=D0=B1=D0=B0=D0=BD=D0=BA=202=20=D1=83=D0=BF=D1=91=D1=80?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B2=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Банк 2 (pop_bg + pop_gdraw) подошёл к границе страницы вплотную: 16 021 из 16 384, свободно 363 байта. А расти ему ещё есть куда — тайлы поздних уровней, чомперы, зеркало, анимации смерти стража. pop_gdraw.c уехал в банк 4 (n_banks 3 -> 4): банк 2 16 021 -> 13 792 (84.2 %, свободно 2 592) банк 4 2 236 (13.6 %, свободно 14 148) Цена: pop_fore_over_char стал кроссбанковым, поэтому помечен __banked — один трамплин (~654 такта) за кадр, других вызывающих у него нет. pop_fore_set_clip уже был __banked, так что там ничего не изменилось. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/Makefile | 2 +- applications/PoP/roomtest/pop_bg.c | 2 +- applications/PoP/roomtest/pop_bg.h | 5 ++++- applications/PoP/roomtest/roomtest.c | 9 +++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/applications/PoP/roomtest/Makefile b/applications/PoP/roomtest/Makefile index e55d788..79a45f5 100644 --- a/applications/PoP/roomtest/Makefile +++ b/applications/PoP/roomtest/Makefile @@ -14,7 +14,7 @@ MEMORY ?= huge # small-раскладка + банки кода в W # банк1→банк2→банк1 в MAME 2026-07-30). Теперь в банки можно уводить и # логику, которая рисует. См. docs/layout_plan_v2.md §2, memory # sdcc_banked_call_rules. -EXTRA_FLAGS ?= --gfx 256 --bank 2=pop_bg.c --bank 2=pop_gdraw.c --bank 3=pop_map.c --bank 1=guards.c $(PROF_FLAGS) +EXTRA_FLAGS ?= --gfx 256 --bank 2=pop_bg.c --bank 4=pop_gdraw.c --bank 3=pop_map.c --bank 1=guards.c $(PROF_FLAGS) # Профилирование полосами бордюра (см. PROF() в roomtest.c) — ВКЛЮЧЕНО по # умолчанию, пока идёт работа с производительностью; make PROF=0 выключает. # Каждая фаза кадра красит бордюр в свой цвет, высота полосы на скриншоте diff --git a/applications/PoP/roomtest/pop_bg.c b/applications/PoP/roomtest/pop_bg.c index 6db81b5..3b94a3a 100644 --- a/applications/PoP/roomtest/pop_bg.c +++ b/applications/PoP/roomtest/pop_bg.c @@ -1592,7 +1592,7 @@ void pop_fore_over_kid(int obj_x, int obj_y, uint16_t w, uint16_t h, * (seq_77..seq_84). Появятся падающие/висящие стражи — тогда и общий * порт redraw_at_char2, а не догадки сейчас. */ void pop_fore_over_char(int obj_x, int obj_y, uint16_t w, uint16_t h, - int8_t dir) + int8_t dir) __banked { int8_t r, c; fclip_on = 1; /* окно = прямоугольник спрайта */ diff --git a/applications/PoP/roomtest/pop_bg.h b/applications/PoP/roomtest/pop_bg.h index 87c73a2..05e72ca 100644 --- a/applications/PoP/roomtest/pop_bg.h +++ b/applications/PoP/roomtest/pop_bg.h @@ -82,8 +82,11 @@ void pop_fore_set_clip(int x, int y, int w, int h) __banked; /* То же для НЕ-Kid персонажа (страж): только слой fore + полоса потолка, * без оверлеев поз виса/полёта/подъёма. obj_x — ЛОГИЧЕСКАЯ координата * (до ×8/7), как у kid_fp_obj_x(). */ +/* __banked: отрисовка стража уехала в СВОЙ банк (pop_gdraw.c), поэтому + * вызов стал кроссбанковым и обязан идти через трамплин. Зовётся раз в + * кадр, других вызывающих нет — цена одного трамплина здесь не видна. */ void pop_fore_over_char(int obj_x, int obj_y, uint16_t w, uint16_t h, - int8_t dir); + int8_t dir) __banked; /* Восстановить фон там, где в прошлых кадрах рисовался ОВЕРЛЕЙ * (draw_other_overlay/floor_overlay/полоса потолка): он выходит за diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index 07bc737..ac3edbf 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -46,8 +46,13 @@ __sfr __at (0xFE) io_border; #define PROF(n) ((void)0) #endif -/* Сколько банков грузит crt0_banked (читает его стартовый код). */ -const uint8_t n_banks = 3; +/* Сколько банков грузит crt0_banked (читает его стартовый код). + * 1 = guards (ИИ/боёвка), 2 = pop_bg (фон, fore, loose), 3 = pop_map + * (коллизия/физика), 4 = pop_gdraw (отрисовка стража + полоса HP). + * Отрисовка стража вынесена из банка 2 отдельно: тот подошёл к 16 КБ + * вплотную (16 021 из 16 384), а расти ему ещё есть куда — тайлы поздних + * уровней, чомперы, зеркало. */ +const uint8_t n_banks = 4; /* Режим читов (pop_cheat.h): на время разработки включаем в main. */ uint8_t pop_cheats;