From 892f005ca5842ce4faeeada3df0717f1aa10d7e9 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 19 Aug 2026 17:52:43 +0300 Subject: [PATCH] =?UTF-8?q?pop=5Fblit=5Fb:=20=D0=B3=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=B2=D1=83=D0=BC=D1=8F=20=D0=B1=D0=B5=D0=B7=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D0=BA=D0=BE=D0=B2=D1=8B=D0=BC=D0=B8=20=D1=81=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8=20=D0=B2=D0=BC?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=20=D1=87=D0=B5=D1=82=D1=8B=D1=80=D1=91?= =?UTF-8?q?=D1=85=20=D0=B7=D0=BD=D0=B0=D0=BA=D0=BE=D0=B2=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверка «спрайт целиком на экране» стояла как pb_x >= 0 && pb_top >= 0 && pb_x + pb_w <= 320 && pb_top + pb_h <= 256 — четыре знаковых 16-битных сравнения, а знаковое у SDCC z80 разворачивается в пару sbc плюс jp PO / xor 0x80 / jp P (видно в листинге). Беззнаковая форма делает то же двумя: отрицательная координата в беззнаковом виде становится очень большой и проваливает условие так же, как проверка >= 0, а верхняя граница переносится в правую часть вместе со сложением. Границы неотрицательны по построению: pb_w и pb_h не больше 255, значит 320-pb_w >= 65 и 256-pb_h >= 1. Работа кадра 438 978 -> 438 600. Немного, но идиома стандартная и код не усложняется. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/pop_tile.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/applications/PoP/roomtest/pop_tile.c b/applications/PoP/roomtest/pop_tile.c index 9f15b7b..3985050 100644 --- a/applications/PoP/roomtest/pop_tile.c +++ b/applications/PoP/roomtest/pop_tile.c @@ -622,8 +622,18 @@ void pop_blit_b(atlas_t *a, uint8_t idx, int x, int ybottom) return; } /* pb_w<256 && pb_h<256 больше не проверяем — гарантировано типом. */ - if (pb_x >= 0 && pb_top >= 0 && - pb_x + (int)pb_w <= 320 && pb_top + (int)pb_h <= 256) { + /* «Целиком на экране?» — ДВУМЯ беззнаковыми сравнениями вместо + * четырёх знаковых. Отрицательная координата в беззнаковом виде + * становится очень большой и проваливает то же условие, что + * проверка `>= 0`, а верхняя граница переносится в правую часть, + * так что сложение уходит вместе с ней. Знаковое сравнение у + * SDCC z80 стоит дорого: пара `sbc` плюс `jp PO / xor 0x80 / jp P` + * на каждое (видно в листинге). + * + * Границы правой части неотрицательны по построению: pb_w и pb_h + * не больше 255, значит 320-pb_w >= 65 и 256-pb_h >= 1. */ + if ((unsigned int)pb_x <= (unsigned int)(320 - (int)pb_w) && + (unsigned int)pb_top <= (unsigned int)(256 - (int)pb_h)) { if (pop_upside) gfx_blit_noclip_vflip(pb_x, pb_top, pb_img); else gfx_blit_noclip(pb_x, pb_top, pb_img); } else {