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 {