/* * _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); }