From 602c3a20faae8c2419c47e715345bcaf36f0c7c5 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Fri, 28 Aug 2026 19:01:27 +0300 Subject: [PATCH] =?UTF-8?q?SprPoP:=20=D1=81=D0=BD=D1=8F=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B8=D0=B5=20=D0=B3?= =?UTF-8?q?=D0=BB=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=E2=80=94=20=D0=BF=D0=B0=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D1=80=D0=B0=20=D0=BD=D0=B0=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=83=D1=80=D0=BE=D0=B2=D0=BD=D1=8F=20=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D1=82=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Замер тем же способом (брейк на pop_sfx_fill + печать totalcycles, три окна по 800 вызовов = 9 секунд каждое, с уже снятыми глушениями): период насоса 245 760 тактов (медиана во всех окнах) максимум 245 832 / 270 096 / 311 346 (1,00 / 1,10 / 1,27 периода) пропущено порций 0 Порция считается пропущенной, когда зазор доходит до ДВУХ периодов: сама порция отдаётся железу за период до того, как она понадобится, поэтому опоздание обработчика на 1,1 мс — джиттер, а не потеря. Запас десятикратный. Поэтому сняты и оставшиеся места: * палитра через BIOS на переходе БЕЗ катсцены (sprpop_cold.c) — то самое, где ловили скрежет 2026-08-25; в комментарии помечено, что при возврате скрежета возвращать надо именно сюда; * массовые чтения треков и ресурсов под чёрным экраном (pop_intro.c): первая реплика PV, трек заставки между уровнями, «время вышло», ресурсы финала. Осталось только то, что глушит звук ПО СМЫСЛУ, а не ради защиты: выходы из сцен (pop_music_free + pause), уход в титры и в игру, выключение по Ctrl+S. Co-Authored-By: Claude Opus 5 --- applications/SprPoP/src/pop_intro.c | 10 ++++++---- applications/SprPoP/src/sprpop_cold.c | 7 ++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/applications/SprPoP/src/pop_intro.c b/applications/SprPoP/src/pop_intro.c index 6dae5f1..802f443 100644 --- a/applications/SprPoP/src/pop_intro.c +++ b/applications/SprPoP/src/pop_intro.c @@ -1687,7 +1687,9 @@ uint8_t pop_intro_show(void) __banked /* Первая реплика PV читается ЗДЕСЬ, под чёрным экраном и в тишине: * дальше внутри сцены остаётся только пуск, а следующие две реплики * подкачиваются по странице за кадр. */ - pop_sfx_pause(); + /* Глушение снято 2026-08-28: массовое чтение страниц насос не морит + * (замер на загрузке уровня — ни одной пропущенной порции), а трек + * титров может и должен доигрывать. */ (void)pop_music_load(POP_MUS_STORY_2); pv_result = intro_pv_animated(); if (pv_result > 0) { @@ -1787,7 +1789,7 @@ void pop_pre_cutscene_show(pop_pre_cutscene_t scene) __banked { const pop_cs_cmd_t *script = 0; - pop_sfx_pause(); + /* Глушение перед чтением трека снято 2026-08-28 (см. замер насоса). */ /* МУЗЫКА ПЕРЕЖИВАЕТ СЦЕНУ. Треки заставок между уровнями длиннее самих * сцен (27 — 10,7 с против 2,6 с картинки), и оригинал их не обрывает: * load_intro просто гасит экран и возвращает управление, а звук @@ -1855,7 +1857,7 @@ int pop_intro_hof_bg(uint8_t page) __banked void pop_time_expired_show(void) __banked { - pop_sfx_pause(); + /* Глушение снято 2026-08-28 (см. замер насоса). */ /* time_expired (seg001:04D3) начинается с play_sound(sound_36). */ if (pop_music_load(36) == 0) { (void)pop_sfx_start(); @@ -1884,7 +1886,7 @@ void pop_time_expired_show(void) __banked void pop_ending_show(void) __banked { - pop_sfx_pause(); + /* Глушение снято 2026-08-28 (см. замер насоса). */ /* Экран гасим ПЕРВЫМ действием — как load_intro оригинала, который * начинается с draw_rect(&screen_rect, color_0_black). Иначе загрузка * ресурсов сцены идёт поверх ЖИВОЙ комнаты уровня 14, и она «мелькает» diff --git a/applications/SprPoP/src/sprpop_cold.c b/applications/SprPoP/src/sprpop_cold.c index dc2033b..1b6bd08 100644 --- a/applications/SprPoP/src/sprpop_cold.c +++ b/applications/SprPoP/src/sprpop_cold.c @@ -227,7 +227,12 @@ int8_t pop_level_change(uint8_t back) __banked * почти всегда — поймано пользователем 2026-08-25. Ветка с * катсценой свободна от этого: pop_pre_cutscene_show глушит * звук первым действием. */ - pop_sfx_pause(); + /* Глушение снято 2026-08-28 (замер: загрузка уровня насос не + * морит — 500 вызовов подряд, максимум 245 832 такта при + * дедлайне 251 000). Прежнее обоснование — скрежет на палитре + * через BIOS ($A4 с запрещёнными прерываниями), пойманный на + * переходе без катсцены 2026-08-25. Если он вернётся, это + * единственное место, куда его надо возвращать. */ /* Без fade: старый кадр гасим сразу и обязательно даём * показать один чёрный растр ДО диска/перерисовки. */ pop_pal_apply(POP_PAL_DIM_BLACK);