ec3cca5e1e
tile_at_kid (guards.c) считала колонку честным / и %, хотя резидентная POP_TILE_DIV — это и есть tile_div_tbl оригинала, и остальной порт давно на неё переведён. У SDCC z80 пара / и % над int это __divsint плюс __modsint, который внутри снова зовёт __divsint — ~5 400 тактов на вызов. Зовут её в ЦИКЛЕ по колонкам между стражем и Кидом (check_can_guard_see_kid, seg003:761). Когда Кид у шва, его curr_col = −1, луч тянется через всю комнату: замер дал ВОСЕМЬ пар делений за кадр, около 43 000 тактов = 10 % растрового кадра, в фазе логики. После фикса таких вызовов не остаётся. Как ловилось: брейкпоинт на __divsint с печатью адреса возврата дал ret=C033 восемь раз за кадр; остановка на нём с dasm при замапленном банке показала HL−65 / ld de,#14 / call __divsint по смещению 0x24 банка 1. Снята и ложная тревога из прошлого коммита: пролог pop_char_fore на шве НЕ разбухает до 134 730 — это была ошибка зонда (адрес fore_tile в банке совпадает с кодом других банков, в интервал попадали чужие срабатывания). Чистый замер: пролог 16 950, как и в середине комнаты. Урок записан в «Как мерить» в docs/perf_backlog.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>