From b3e754a66b953afcabcbf4bcb27a39449593ef51 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 19 Aug 2026 17:42:51 +0300 Subject: [PATCH] =?UTF-8?q?Revert=20"P4:=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=20=D0=B0=D1=82=D0=BB=D0=B0=D1=81=D0=B0=20=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20W0,?= =?UTF-8?q?=20=D0=B0=20=D0=BD=D0=B5=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BF=20W3=20=E2=80=94=20=D0=BC=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D1=81=20408"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 06fb4235f0c15a0429bac785c2e29073918106cb. --- applications/PoP/roomtest/pop_tile.c | 5 +---- libbgi/common/atlas_image_w0.c | 25 ------------------------- libbgi/include/sprite.h | 8 +------- 3 files changed, 2 insertions(+), 36 deletions(-) delete mode 100644 libbgi/common/atlas_image_w0.c diff --git a/applications/PoP/roomtest/pop_tile.c b/applications/PoP/roomtest/pop_tile.c index 52e2c5a..9f15b7b 100644 --- a/applications/PoP/roomtest/pop_tile.c +++ b/applications/PoP/roomtest/pop_tile.c @@ -582,11 +582,8 @@ void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom) pb_yb + POP_YOFF + 1 <= pop_t_fclip_ly0 || pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1)) return; - /* Страницу мапим ПЕРВОЙ, а каталог читаем уже из W0 (atlas_image_w0): - * обычный atlas_image ради тех же двух байт переключает W3 туда и - * обратно, и это 672 такта на КАЖДЫЙ блит (замер 2026-08-19). */ + pb_img = (const uint8_t *)atlas_image(pb_a, pb_idx); gfx_w0_map(pb_a->page); - pb_img = (const uint8_t *)atlas_image_w0(pb_a, pb_idx); /* Габарит читаем БАЙТАМИ. С `uint16_t pb_w = pb_img[0] | (pb_img[1] << 8)` SDCC * разворачивал каждую такую строку в два десятка IX-относительных * пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком diff --git a/libbgi/common/atlas_image_w0.c b/libbgi/common/atlas_image_w0.c deleted file mode 100644 index 14f2a0e..0000000 --- a/libbgi/common/atlas_image_w0.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * atlas_image_w0 — адрес ленты idx для страницы, УЖЕ ПОДКЛЮЧЁННОЙ В W0. - * - * Отличие от atlas_image: тот читает каталог через временный мап страницы - * в W3 и потому платит двумя переключениями окна. А вызывающий, который - * собирается блитить, страницу в W0 мапит всё равно — и каталог там уже - * лежит по тому же смещению. Значит переключать W3 незачем. - * - * КОНТРАКТ: страница a->page обязана быть подключена в W0 (gfx_w0_map) - * ДО вызова и оставаться подключённой, пока используется результат. - * Возвращает W0-адрес ленты (как atlas_image). - * - * Замер PoP 2026-08-19: atlas_image в горячем пути блита фона стоил 672 - * такта на КАЖДЫЙ блит, а блитов в кадре до двенадцати. - */ -#include -#include -#include "../_bgi.h" - -const void *atlas_image_w0(const atlas_t *a, uint8_t idx) -{ - const uint8_t *e = (const uint8_t *)(_ATL_DIR_OFF + (uint16_t)idx * 8); - (void)a; /* страница уже в W0 — сам атлас не нужен */ - return (const void *)(e[0] | (uint16_t)(e[1] << 8)); -} diff --git a/libbgi/include/sprite.h b/libbgi/include/sprite.h index a187e9e..c5a2dbc 100644 --- a/libbgi/include/sprite.h +++ b/libbgi/include/sprite.h @@ -297,9 +297,6 @@ void atlas_free(atlas_t *a); /* Указатель-лента idx (W0-адрес, см. ВАЖНО выше) — для gfx_blit_part * и ручных вызовов; кадр (i,j) ленты: sx = i*fw, sy = j*fh. */ const void *atlas_image(const atlas_t *a, uint8_t idx); -/* То же для страницы, УЖЕ подключённой в W0: каталог читается прямо оттуда, - * без переключения W3. Контракт и мотивация — в теле (atlas_image_w0.c). */ -const void *atlas_image_w0(const atlas_t *a, uint8_t idx); /* Инициализировать спрайт лентой idx атласа: img/w/h (размер КАДРА из * каталога) /page; невидим, кадр (0,0). Аналог sprite_init для W0. */ @@ -319,10 +316,7 @@ typedef struct { /* Скролл региона area из НЕактивной страницы в активную со сдвигом на * dx/dy (0 = чистая копия/heal, >0 = в сторону увеличения координат, * <0 = уменьшения). Открывшуюся полосу |d| НЕ заполняют — возвращают - * в *dirty (может быть NULL). В safe-библиотеке область клипится по экрану; - * при |d| >= размеру области копирования нет, вся область возвращается dirty. - * Fast-библиотека ожидает валидные area и |d| < размер соответствующей оси. - * Банк 0x50: копия = скролл + heal цели. */ + * в *dirty (может быть NULL). Банк 0x50: копия = скролл + heal цели. */ void gfx_scroll_h(const gfx_rect_t *area, int16_t dx, gfx_rect_t *dirty); void gfx_scroll_v(const gfx_rect_t *area, int16_t dy, gfx_rect_t *dirty);