Катсцены шли ~8,2 fps вместо десяти. Делитель тут ни при чём: у оригинала cutscene_frame_time = 6 тиков по 1/60 с (reset_cutscene, seg001:527; его зовёт load_intro прямо перед сценой) = 100 мс, у нас 5 кадров луча по 50 Гц = те же 100 мс. Причина в том, ГДЕ отсчитывался интервал: сначала рисовали кадр целиком, и только потом ждали vsync и ещё четыре — то есть отрисовка ПРИБАВЛЯЛАСЬ к делителю. Полноэкранная gfx_copy_page стоит ~547 000 тактов = 1,27 кадра, отсюда 6+ кадров вместо 5 (замер PV-RENDER-BOUND: 49 тиков/с вместо 60). Теперь отрисовка разложена на блоки, каждый из которых заведомо влезает в кадровый интервал, и после каждого честно ждём vsync: фон верхняя половина -> vsync | фон нижняя половина -> vsync | актёры и декорации -> vsync (+ флип) | служебный блок (звук, подкачка трека) и добор до CUT_FRAME_VSYNC. Фон восстанавливаем только по картинке (200 строк с POP_YOFF), а не по всем 256: сверху и снизу чёрная рамка. Общий хелпер pv_restore_bg на все три цикла — cut_run (сцены 8/9/12 и финал), pre_room_animated (2_6/4/12 и time_expired) и intro_pv_draw_frame (сцена с Джафаром); последний теперь возвращает 3 кадра вместо 1 (13 вместо 11 со вспышкой), вызывающий их и так учитывал. Сверка делителей с SDLPoP: у всех сцен 6 тиков = 5 наших кадров; плавает только pv_scene (6 -> 8 -> 7, seg001:434/455) — это уже сделано кумулятивно через pv_seq_period + POP_T60, и минимальный бюджет (5 кадров) больше трёх съедаемых блоками. Замер в MAME пока НЕ сделан: до финальной сцены на отладочном старте LEVEL=14 не добраться (решётка перед комнатой 5 закрывается по таймеру, а Ctrl-комбинации через MCP-мост до игры не доходят). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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
Что где
src/ рукописный C: главный цикл sprpop.c + движок pop_*.c
gen/ генерируемые заголовки — руками не править
assets/orig/ оригинальные данные игры (вне репозитория, см. там README)
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 resources |
перегенерировать ресурсы из assets/orig/ |
make music-mp3 |
музыка из другого набора записей: music-flac (умолчание), music-mp3, music-ogg, music-mt32 |
make -C tests/host |
модульные тесты движка (секунды, без эмулятора) |
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.
Происхождение
Выделен из applications/PoP/roomtest 2026-08-26; та папка заморожена и
служит архивом закрытых задач, багов и исполненных планов. Референсные
реализации (Apple II 6502, Princed Resources, mininim) остались в
applications/PoP/.