Files
Sprinter-SDCC/libbgi/common/movesprite.c
T
snark13 ee1ca00c6f libbgi: funcptr-диспетч clip/noclip спрайтовых ядер + снятие src[0]-фикса
Диспетчеризация clip/noclip через указатели _gfx_blit_fn/_gfx_heal_fn
(common/_gfx_sprite_fns.c, дефолт clip): gfx_sprite_clip() — теперь
модуль, переключает указатели один раз; sprite_update/putsprite/
movesprite зовут через указатель — ветка if(clip) из горячего цикла
убрана (съедала половину выигрыша noclip). Программа без вызова
gfx_sprite_clip() noclip-ядра не линкует.

Замер dev-MAME (16 шаров, uncapped): clip 50 → noclip 60-61 fps
(+20-22%). Регресс tests/sprites (A/B PASS), size-check OK
(balls −237 Б, sprites −3177 Б — отвязались лишние ядра).

Фикс CPU-байта write-триггера (preread + EX AF,AF') снят: точная
dev-MAME эмулирует ПЛМ, подавляющую CPU-байт при активном burst'е —
подтверждено по байтам VRAM (tests/blitw col0 = GREEN через
read_vram MCP-моста). Для heal фикс был избыточен всегда (банк 0x50
перезаписывает dst[0]). Строки фикса оставлены закомментированными
в трёх leaf'ах на случай отличий реального железа; шапки и §9а/§9б
дизайна обновлены. НА ЖЕЛЕЗЕ ПЕРЕПРОВЕРИТЬ.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 11:37:54 +03:00

31 lines
1.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* movesprite — переместить спрайт (кадр ≤ 64×64): восстановить фон под
* старой позицией (heal по размерам img из заголовка) и вывести спрайт в
* новой (putsprite). Порядок heal→draw делает перекрытие старой и новой
* позиций безопасным: heal читает фон из ОЗУ-копии, которую спрайт
* (банк 0x5C) никогда не трогал.
*
* Идёт через лин-ядро _gfx_heal_sprite (без split'а, 8-бит w/h) — банк
* на время heal форсится 0x50 (иначе heal бессмыслен), затем putsprite.
* Спрайтовая программа не тянет общие *_full.
*
* Канонический цикл анимации — docs/sprite-api-design.md §6:
* putsprite(x, y, hero); ...
* gfx_wait_vsync(); movesprite(x, y, nx, ny, hero);
*/
#include "../_bgi.h"
void movesprite(int oldx, int oldy, int x, int y, const void *img)
{
const uint8_t *p = (const uint8_t *)img;
uint8_t saved = gfx_get_bank();
gfx_set_bank(GFX_BANK_NORMAL);
_bgi_begin();
(*_gfx_heal_fn)(oldx, oldy, p[0], p[2]);
_bgi_end();
gfx_set_bank(saved);
putsprite(x, y, img);
}