/*
 * _gfx_blit_sprite_noclip — блит спрайта БЕЗ клипа по экрану.  Как
 * _gfx_blit_sprite, но клип-математики нет ВООБЩЕ (не скип проверки —
 * кода нет физически): приложение ГАРАНТИРУЕТ, что спрайт целиком на
 * экране (флаг gfx_sprite_clip(0)).  Отдельная функция, а не ветка в
 * _gfx_blit_sprite: без клип-кода SDCC тесней раскладывает регистры
 * (меньше спиллов) — отсюда полный выигрыш ~+19% на анимации (замер
 * A/B на examples/balls 2026-07-12), а не только скип сравнений.
 *
 * ВНИМАНИЕ: запись за край экрана портит соседнюю память (Port_Y за 256
 * заворачивается наверх, x за 320 — в соседнюю строку/страницу; см.
 * tests/spriteclip).  Вызывать только когда спрайт заведомо в пределах.
 *
 * src — ГОТОВЫЙ адрес первого пикселя кадра, stride — шаг строки
 * источника (полная ширина img); считает вызывающий один раз (кэш
 * sprite_t.src/stride ведут sprite_frame и тикер; putsprite — из
 * заголовка).  До 2026-07-14 здесь были img+sx/sy с пересчётом адреса
 * на КАЖДЫЙ блит (цикл O(sy), потом __mulint) — профиль rpgwalk снёс
 * весь пересчёт в редкие точки смены кадра.
 *
 * БЕЗ _bgi_begin/_bgi_end и смены банка (держит вызывающий).
 */
#include "../_bgi.h"

void _gfx_blit_sprite_noclip(int x, int y, const uint8_t *src,
                             uint16_t stride, uint8_t w, uint8_t h)
{
    _bgi_blit_rows_raw(src, (uint8_t *)(_gfx_addr_base + x),
                       w, h, (int)stride, (uint8_t)y);
}
