Статус-строка: 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
+12
View File
@@ -26,6 +26,7 @@ enum {
POP_MSG_NO_QUICKLOAD, /* F9 нечего грузить / битый слот */
POP_MSG_SOUND_ON, /* Ctrl+S */
POP_MSG_SOUND_OFF,
POP_MSG_LEVEL, /* «LEVEL N» — строка собирается с номером */
POP_MSG_N
};
@@ -34,6 +35,17 @@ enum {
* только если строка уже погасла (как у оригинала: он тоже сравнивает). */
extern uint8_t pop_status_msg;
/* Показать сообщение НЕМЕДЛЕННО, до конца кадра: строка выкладывается в
* видимую страницу прямо сейчас. Нужна там, где сразу за вызовом идёт
* длинная операция (QuickSave/QuickLoad): обычная заявка напечаталась бы
* уже ПОСЛЕ фриза, когда объяснять его поздно. */
void pop_status_show_now(uint8_t msg) __banked;
/* Порт show_level (seg008:25A8): заявить «LEVEL N» на старте уровня.
* Сама решает, показывать ли (демо-уровень и финальные номера молчат) —
* вызывающему условий знать не нужно. */
void pop_status_level(void) __banked;
/* Сколько логических кадров сообщение ещё висит; 0 — не висит. Читает
* pop_hp_draw (банк 4), чтобы не затирать чужой текст своим фоном. */
extern uint8_t pop_status_ticks;