SprPoP: сняты остальные глушения насоса — появление/закрытие меню, настройки, quicksave

Продолжение предыдущего коммита: заплатка стояла не в одном месте.

* открытие меню (snapshot палитры + затемнение фона + первая полная
  перерисовка) и закрытие (menu_erase — те же две полностраничные копии) —
  DI у копира бандами по 16 строк (~1,6 мс против дедлайна 11,7 мс), а
  палитровое затемнение идёт и в титрах с катсценами, где музыку не рвёт;
* сохранение POP.CFG и проба quickload — это десятки байт и open/close;
  прежняя осторожность «ESTEX уходит в диск надолго» относилась к загрузке
  НАБОРА страниц.  Подтверждение с поля: HOF пишется под звучащий «won»;
* quicksave/quickload (pop_qsave.c) — единственное снятое место, где по
  диску реально едут 16 КБ (~три периода насоса).  Помечено в комментарии:
  если на F6/F9 появится скрежет, вернуть pop_sfx_pause/start точечно сюда.

Дисковых глушений в живом звуке больше не осталось; те, что стоят на
загрузке уровня и наборов страниц, не трогали — там они по делу.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 17:36:20 +03:00
parent ea07a8d7b0
commit 89e9663753
2 changed files with 19 additions and 10 deletions
+15 -8
View File
@@ -556,10 +556,12 @@ static uint8_t settings_finish(uint8_t changed)
int8_t rc;
if (!changed) return 0;
pop_settings_apply(1);
/* ESTEX может уйти в диск на много CBL-периодов. */
pop_sfx_pause();
/* Звук не глушим: POP.CFG — десятки байт, а на практике HOF пишется
* под звучащий «won» и насос это переживает (проверка пользователя
* 2026-08-28). Прежняя осторожность «ESTEX может уйти в диск на много
* CBL-периодов» относилась к загрузке НАБОРА страниц, а не к записи
* одного мелкого файла. */
rc = pop_cfg_save();
(void)pop_sfx_start();
ui_notice(rc > 0 ? "SETTINGS SAVED" : "SAVE ERROR");
return 1;
}
@@ -650,10 +652,9 @@ static uint8_t settings_process(void)
static int8_t menu_quickload(void)
{
uint8_t slots;
/* probe делает open/close на D:, поэтому насос в это время выключен. */
pop_sfx_pause();
/* probe — это только open/close на D:, данных не читает; глушить насос
* ради него незачем (см. settings_finish). */
slots = pop_qsave_probe();
(void)pop_sfx_start();
if (slots & POP_QS_SLOT_SAVE) return POP_MENU_QUICKLOAD;
if ((slots & POP_QS_SLOT_BACKUP) && ui_confirm("LOAD BACKUP?"))
return POP_MENU_QUICKLOAD_BACKUP;
@@ -719,7 +720,12 @@ int8_t pop_menu_process(void) __banked
saved_page = gfx_get_draw_page();
saved_bank = gfx_get_bank();
getfillsettings(&saved_fill);
pop_sfx_pause(); /* snapshot/dim + первый full redraw */
/* Звук НЕ глушим (снято 2026-08-28, вторая половина той же заплатки —
* см. ui_begin). Здесь под ней были снимок палитры, затемнение фона и
* первая полная перерисовка: копия режет DI бандами по 16 строк, а
* палитровое затемнение идёт и в титрах с катсценами, где музыку оно не
* рвёт. Цена глушения была слышна как пауза в мелодии ровно на
* появление меню. */
pop_pal_snapshot();
/* 50 % яркости; диапазон UI остаётся ярким. Долю берём от шкалы, а не
* числом: ступеней стало 32 вместо четырёх, и прежняя «2» означала бы
@@ -780,7 +786,8 @@ int8_t pop_menu_process(void) __banked
pop_pace_end(pop_pace_n(0)); /* игра стоит — обычный темп */
}
pop_sfx_pause(); /* две full-page копии menu_erase */
/* И на закрытии не глушим: menu_erase — те же две полностраничные
* копии, что и в ui_begin, с DI бандами по 16 строк. */
menu_erase(entry_page);
/* menu_erase вернул обе страницы из тени, снятой ДО меню: всё, что
* статус-полосы нарисовали за это время (или сообщение, дотикавшее в
+4 -2
View File
@@ -234,14 +234,16 @@ int8_t pop_qsave_process(void) __banked
if (!blk) return -1;
page=mem_get_page(blk,0);
gfx_w0_page_prepare(page);
pop_sfx_pause();
/* Звук не глушим (2026-08-28). Единственное место из снятых, где по
* диску реально едут 16 КБ (~33 мс, три периода насоса): если на F6/F9
* появится скрежет — вернуть сюда pop_sfx_pause/pop_sfx_start, это
* лечится точечно и только здесь. */
if (request == QS_SAVE) rc = qs_save(page);
else if (request == QS_LOAD_BACKUP) rc = qs_load_one("POP.BAK", page);
else {
rc = qs_load_one("POP.SAV",page);
if (rc < 0) rc = qs_load_one("POP.BAK",page);
}
pop_sfx_start();
mem_free_block(blk);
/* Успех ничего не меняет: нужная строка висит с начала операции.
* Отказ переписывает её на NO QUICKSAVE/NO QUICKLOAD — обычной