Files
Sprinter-SDCC/applications/SprPoP
snark13 7377bf6a2c SprPoP: заставка и музыка сразу после запуска, а не через несколько секунд
От запуска до проявления титула проходило ~3 с чёрного экрана в тишине:
pop_boot читал ВСЕ ресурсы игры до первого пикселя, а pop_title_show перед
fade_in вычитывал целиком трек заставки (248 КБ).

Старт разбит на три фазы (sprpop_cold.c):
- pop_boot() — настройки, POP.CFG, графика, чёрный экран, FONT.ATL;
- pop_boot_sound() — snd.idx + ОДНА страница snd.arc, индекс музыки, CBL;
- pop_boot_rest() — остальные страницы звука, kid.ani, Тень, атласы Кида;
  идемпотентно, между кусками доливает трек.

pop_title_show теперь: fade_in -> pop_boot_sound -> pop_music_stream(54) ->
pop_boot_rest под стоящим титулом.  Порядок «сначала fade_in, потом тема»
сохранён как у show_title (seg000.c:1981).  Первый такт заставки укорочен
на фактически потраченное время (часы насоса 85,4 Гц -> кадры луча
сдвигами), иначе сцена уехала бы относительно музыки.  title_wait доливает
трек по полстраницы за кадр.

Музыка играет с ПЕРВОЙ страницы: pop_music_stream уже был (игровые
джинглы), кольцо won не понадобилось — m54 это 16 страниц из 20 доступных.

Звук поднимается в два приёма (pop_sfx_init_begin/finish): насосу для
тишины нужен ровно один блок, и упаковщик обязан класть его первым блоком
страницы 0 (tools/pop_idx.py) — значит для открытия CBL хватает ОДНОЙ
страницы (33 мс вместо 440).  Пока набор неполон, pop_sfx_play пропускает
эффекты; заявки на музыку проходят.

Четыре загрузки из boot УБРАНЫ, а не отложены: атлас фона, страж, уровень 1
и pop_pal_game_load — их и так делает pop_level_switch на входе в любой
уровень (а pop_new_game_load ещё и палитру перед ним), и оба маршрута в
игру, LEVEL_LOAD и DEMO, упираются в него.  Это ~0,77 с на ровном месте.
Так же устроен оригинал: init_game_main до заставки читает только меч,
пламя, звуки и палитры, а chtab_5/6/7 грузит load_lev_spr на старте уровня.
Страховка на случай пропуска заставки в первую секунду — идемпотентный
pop_boot_rest() в начале pop_new_game_load и pop_level_switch.

FONT.ATL остаётся в минимальной фазе, и это не про шрифт: снимок палитры
физически лежит в хвосте его страницы (pop_ui.c), а вся машинерия яркости
начинается с `if (!font_ready) return`.  С отложенным шрифтом заставка
возникала разом на полной яркости — поймано пользователем.

Проверено в MAME: титул виден сразу и проявляется полосами, pop_mus_left
убывает (трек стримится), pop_snd_pages=10 (набор дочитался), цепочка
титул -> интро -> пропуск -> уровень 1 работает.  Банк 8: 95,5 % (732 Б).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DSYUpuaQpKr48kBav2iiV4
2026-09-02 11:30:53 +03:00
..

SprPoP — Prince of Persia на Sprinter Sp2000

Порт оригинального Prince of Persia (1989) на компьютер Sprinter Sp2000: режим 320×256×256, дабл-буфер, звук через CBL, код разложен по одиннадцати 16-килобайтным банкам.

Приложение автономно — код, оригинальные данные, конверторы ресурсов и сборка лежат внутри этой папки. Наружу нужен только компилятор:

export SPRINTER_ROOT=/путь/к/C-Compiler   # не нужен, если папка лежит внутри его дерева
make                                       # build/sprpop.exe + ресурсы в build/
make hdd                                   # + образ build/hdd/sprpop.chd

Чужих данных в репозитории нет — есть адреса, откуда их взять. Чтобы перегенерировать ресурсы (или получить эталон механики), сначала:

make fetch          # SDLPoP + записи саундтрека DOS-версии в assets/orig/

Что где

src/            рукописный C: главный цикл sprpop.c + движок pop_*.c
gen/            генерируемые заголовки — руками не править
assets/orig/    оригинальные данные игры (вне репозитория, качает `make fetch`)
assets/packed/  то, что ложится на диск игры, в раскладке диска
tools/          конверторы ресурсов; все пути — в tools/paths.py
docs/           планы, доски задач и багов, справочники (начинать с docs/README.md)
tests/host/     модульные тесты движка под ucsim_z80
build/          выход: sprpop.exe, каталоги ресурсов, hdd/, промежуточные atl/

Цели сборки

Команда Что делает
make собрать build/sprpop.exe и разложить ресурсы в build/
make hdd + образ жёсткого диска build/hdd/sprpop.chd
make mame-link однократно подставить образ в MAME (символьная ссылка на IMG/test_hdd.chd)
make fetch скачать внешние исходные данные в assets/orig/: fetch-sdlpop, fetch-music, fetch-check, fetch-list
make resources перегенерировать ресурсы из assets/orig/
make music-mp3 музыка из другого набора записей: music-flac (умолчание), music-mp3, music-ogg, music-mt32
make SND_SRC=msdos оцифровка эффектов из дистрибутива DOS вместо SDLPoP (нужен свой assets/orig/MSDOS/)
make -C tests/host модульные тесты движка (секунды, без эмулятора)
make test-tools тесты упаковщиков на хосте: форматы файлов, которые читает Z80
make clean снести build/ (ассеты не трогает)
make distclean clean + снести упакованные ассеты assets/packed/

Отладочные ключи: make LEVEL=9 — стартовый уровень, make ROOM=15 POS=2 — стартовая комната и тайл (row*10+col), make PROF=1 — профиль фаз кадра полосами бордюра, make ALLOCS=100000 — плотная упаковка регистров для замеров размера.

Сборка из чистого клона

Работает без assets/orig/: упакованные ресурсы (assets/packed/) и генерируемые заголовки (gen/) лежат в репозитории. Исключение — assets/packed/LEVELS/: файлы уровней ложатся на диск прямо из оригинала, без конвертации, поэтому они, как и assets/orig/, вне репозитория. Что и откуда положить — assets/orig/README.md.

assets/orig/ нужен только чтобы ресурсы перегенерировать (make resources) и как эталон механики: любая правка поведения сверяется с assets/orig/SDLPoP/src/ до кодинга, см. CLAUDE.md. Заполняется он одной командой make fetch — качается SDLPoP (ресурсы + исходники-эталон) и записи саундтрека; адрес архива музыки скрипт берёт из самого SDLPoP.

Оригинальный дистрибутив DOS (assets/orig/MSDOS/) не нужен: и уровни, и оцифровка звука берутся из SDLPoP. Он даёт ровно одно — более полный набор эффектов (в SDLPoP пуст звук spiked, 48); у кого дистрибутив есть, включает его явно: make SND_SRC=msdos. Подробности — assets/orig/README.md.

Происхождение

Выделен из applications/PoP/roomtest 2026-08-26; та папка заморожена и служит архивом закрытых задач, багов и исполненных планов. Референсные реализации (Apple II 6502, Princed Resources, mininim) остались в applications/PoP/.