Статус-строка: LEVEL N и лейбл QS/QL до дисковой операции

* pop_status_level() — порт show_level (seg008:25A8): «LEVEL N» на старте
  уровня.  Демо-уровень 0 и номера от 14 молчат, тринадцатый показывается
  двенадцатым, бесшовный переход 12->13 пропускается и гасит флаг за собой.
  Первое сообщение с ПАРАМЕТРОМ: строка собирается вручную (dec2, без
  printf и без деления), номер хранится снимком st_arg — иначе вторая
  страница дабл-буфера нарисовала бы другое число.
* pop_status_show_now() — печать немедленно, в ВИДИМУЮ страницу.
  QuickSave/QuickLoad заявляют лейбл ПЕРВЫМ действием, до mem_alloc/ESTEX:
  запись снимка занимает доли секунды, и раньше игрок видел сначала
  необъяснённый фриз, а надпись — уже после него.  Отказ переписывает
  строку на NO QUICKSAVE/NO QUICKLOAD обычной заявкой.
  Расхождение с оригиналом (он печатает по результату) — impl_diff.md.

Проверено в MAME: watchpoint ловит заявку внутри pop_status_show_now,
step_out возвращает в pop_qsave_process — и QUICKSAVE уже на экране, диск
ещё не тронут.  Бюджет прежний: _CODE 23981, куча 266 Б.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-25 14:13:48 +03:00
parent 47a4b084c4
commit 5756101d29
6 changed files with 130 additions and 19 deletions
+11 -9
View File
@@ -225,6 +225,11 @@ int8_t pop_qsave_process(void) __banked
int8_t rc=-1;
pop_qsave_request = 0;
if (!request) return 0;
/* Лейбл — ДО дисковой работы: она длится доли секунды, игра на это
* время замирает, и строка обязана объяснить фриз, а не подводить под
* ним итог. Не удалось — ниже перепишем на NO QUICKSAVE/QUICKLOAD. */
pop_status_show_now((uint8_t)(request == QS_SAVE ? POP_MSG_QUICKSAVE
: POP_MSG_QUICKLOAD));
blk=mem_alloc_pages(1);
if (!blk) return -1;
page=mem_get_page(blk,0);
@@ -238,14 +243,11 @@ int8_t pop_qsave_process(void) __banked
}
pop_sfx_start();
mem_free_block(blk);
/* Сообщение заявляем ЗДЕСЬ, а не у вызывающего: только тут известно,
* что именно делали (F6/F9 и оба пункта меню приходят одним запросом).
* Порт seg000:497/514 — те же четыре строки, что и в оригинале. */
if (request == QS_SAVE)
pop_status_msg = (uint8_t)(rc > 0 ? POP_MSG_QUICKSAVE
: POP_MSG_NO_QUICKSAVE);
else
pop_status_msg = (uint8_t)(rc > 0 ? POP_MSG_QUICKLOAD
: POP_MSG_NO_QUICKLOAD);
/* Успех ничего не меняет: нужная строка висит с начала операции.
* Отказ переписывает её на NO QUICKSAVE/NO QUICKLOAD — обычной
* заявкой, кадр её подхватит (порт seg000:497/514). */
if (rc <= 0)
pop_status_msg = (uint8_t)(request == QS_SAVE ? POP_MSG_NO_QUICKSAVE
: POP_MSG_NO_QUICKLOAD);
return rc;
}