SprPoP: сняты последние глушения насоса — палитра на смене уровня и загрузки треков
Замер тем же способом (брейк на 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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, и она «мелькает»
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user