Финальная тема won: кольцевой стриминг с диска
Последний неозвученный кусок игры. 115 секунд и 1,2 МБ в память не влезают никак, поэтому тема играется кольцом из шести страниц (96 КБ = 9 с): насос идёт по кругу, а pop_music_service дочитывает файл в те страницы, которые насос уже прошёл. Страница звучит 1,5 с и читается 33 мс — запас сорокакратный; дистанция считается без отдельных счётчиков, потому что страница это ровно 128 блоков насоса. Три вещи, всплывшие при живой проверке: - кольцо обязано сниматься при любом обычном запуске трека, иначе следующая тема играет по кругу первых шести страниц (поймано на титрах сразу после победы); - живые сцены комнаты принцессы теперь открывают CBL сами (cut_begin): pop_ending_show глушит звук первым действием, и «arrived to princess» не звучал вовсе; - тема дослушивается до конца с возможностью прервать клавишей — как seg001:637. У оригинала там стоит ввод имени в таблицу рекордов; когда он появится, ожидание переедет за него (задача HOF-ENTRY). Проверено в MAME на сборке LEVEL=14: после встречи с принцессой звучит тема победы (id 56, кольцо 6), курсор уходит далеко за размер кольца — подкачка успевает. Host-тесты: 15 наборов. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -55,6 +55,10 @@ uint8_t pop_mus_id;
|
||||
/* Тик насоса: +1 на каждый отданный CBL блок, то есть 85,4 Гц. */
|
||||
volatile uint8_t pop_snd_tick;
|
||||
|
||||
/* Размер КОЛЬЦА страниц для потоковой музыки, 0 — обычный трек целиком в
|
||||
* памяти. Читает насос, ставит загрузчик (pop_music.c). */
|
||||
uint8_t pop_mus_ring;
|
||||
|
||||
/* Заявка на музыкальный трек: номер в нумерации оригинала, 0 — нет заявки
|
||||
* (нулевого трека не бывает). Ставит pop_sfx_play, снимает главный цикл. */
|
||||
uint8_t pop_mus_req;
|
||||
@@ -141,8 +145,18 @@ int pop_sfx_fill(uint16_t n)
|
||||
pop_mus_ptr += n;
|
||||
if (pop_mus_ptr >= 0x4000) {
|
||||
pop_mus_ptr = 0;
|
||||
if ((uint8_t)(pop_mus_pg + 1) < POP_MUS_PAGES) pop_mus_pg++;
|
||||
else pop_mus_left = 0;
|
||||
/* КОЛЬЦО. Финальная тема — 1,2 МБ, в память целиком не влезает
|
||||
* никак, поэтому она играется из нескольких страниц по кругу, а
|
||||
* загрузчик дочитывает в те, что мы уже прошли (pop_music.c).
|
||||
* Конец трека определяет left, а не номер страницы. */
|
||||
if (pop_mus_ring) {
|
||||
if ((uint8_t)(pop_mus_pg + 1) < pop_mus_ring) pop_mus_pg++;
|
||||
else pop_mus_pg = 0;
|
||||
} else if ((uint8_t)(pop_mus_pg + 1) < POP_MUS_PAGES) {
|
||||
pop_mus_pg++;
|
||||
} else {
|
||||
pop_mus_left = 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user