Revert "P4: каталог атласа читается из W0, а не через мап W3 — минус 408"

This reverts commit 06fb4235f0.
This commit is contained in:
2026-08-19 17:42:51 +03:00
parent a993cb3b62
commit b3e754a66b
3 changed files with 2 additions and 36 deletions
+1 -4
View File
@@ -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 + 1 <= pop_t_fclip_ly0 ||
pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1)) pb_yb + POP_YOFF - 64 >= pop_t_fclip_ly1))
return; return;
/* Страницу мапим ПЕРВОЙ, а каталог читаем уже из W0 (atlas_image_w0): pb_img = (const uint8_t *)atlas_image(pb_a, pb_idx);
* обычный atlas_image ради тех же двух байт переключает W3 туда и
* обратно, и это 672 такта на КАЖДЫЙ блит (замер 2026-08-19). */
gfx_w0_map(pb_a->page); 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 /* Габарит читаем БАЙТАМИ. С `uint16_t pb_w = pb_img[0] | (pb_img[1] << 8)` SDCC
* разворачивал каждую такую строку в два десятка IX-относительных * разворачивал каждую такую строку в два десятка IX-относительных
* пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком * пересылок: 16-битные pb_w/pb_h не влезали в регистры, и функция целиком
-25
View File
@@ -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 <sprinter.h>
#include <sprite.h>
#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));
}
+1 -7
View File
@@ -297,9 +297,6 @@ void atlas_free(atlas_t *a);
/* Указатель-лента idx (W0-адрес, см. ВАЖНО выше) — для gfx_blit_part /* Указатель-лента idx (W0-адрес, см. ВАЖНО выше) — для gfx_blit_part
* и ручных вызовов; кадр (i,j) ленты: sx = i*fw, sy = j*fh. */ * и ручных вызовов; кадр (i,j) ленты: sx = i*fw, sy = j*fh. */
const void *atlas_image(const atlas_t *a, uint8_t idx); 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 (размер КАДРА из /* Инициализировать спрайт лентой idx атласа: img/w/h (размер КАДРА из
* каталога) /page; невидим, кадр (0,0). Аналог sprite_init для W0. */ * каталога) /page; невидим, кадр (0,0). Аналог sprite_init для W0. */
@@ -319,10 +316,7 @@ typedef struct {
/* Скролл региона area из НЕактивной страницы в активную со сдвигом на /* Скролл региона area из НЕактивной страницы в активную со сдвигом на
* dx/dy (0 = чистая копия/heal, >0 = в сторону увеличения координат, * dx/dy (0 = чистая копия/heal, >0 = в сторону увеличения координат,
* <0 = уменьшения). Открывшуюся полосу |d| НЕ заполняют — возвращают * <0 = уменьшения). Открывшуюся полосу |d| НЕ заполняют — возвращают
* в *dirty (может быть NULL). В safe-библиотеке область клипится по экрану; * в *dirty (может быть NULL). Банк 0x50: копия = скролл + heal цели. */
* при |d| >= размеру области копирования нет, вся область возвращается dirty.
* Fast-библиотека ожидает валидные area и |d| < размер соответствующей оси.
* Банк 0x50: копия = скролл + heal цели. */
void gfx_scroll_h(const gfx_rect_t *area, int16_t dx, gfx_rect_t *dirty); 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); void gfx_scroll_v(const gfx_rect_t *area, int16_t dy, gfx_rect_t *dirty);