Статус-строка: 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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user