SprPoP: звуковые эффекты без перелинковки — раскладка уехала на диск
Часть II плана music_runtime_index_plan.md (SI0..SI4). gen/pop_sound_tbl.h БОЛЬШЕ НЕ ГЕНЕРИРУЕТСЯ: раскладка набора читается из SND/snd.idx (формат PSI1, писатель и разборщик — tools/pop_idx.py, 22 теста в make test-tools). Один и тот же sprpop.exe работает с набором SDLPoP (9 страниц) и MSDOS (10) — sha256 бинарника при смене набора не меняется. Заодно умолчание источника эффектов переведено на SDLPoP (SND_SRC=sdlpop): сборка обязана работать без оригинального дистрибутива DOS. У кого он есть, включает лучший набор явно — make SND_SRC=msdos (там полнее оцифровка: в SDLPoP звук 48 spiked пустой). Устройство: pop_snd_tbl/pop_snd_page/pop_snd_pages — резидентные данные (pop_snd_data.c), тип и инварианты — рукописный pop_snd_tbl.h. Записи читаются ОДНИМ read прямо в таблицу, поэтому sizeof(pop_snd_ent_t) == 5 стало частью дискового контракта: проверяется статически и полем размера записи в заголовке. POP_SND_PAGES как compile-time размер набора исчез — вместо него POP_SND_MAX_PAGES (вместимость, 16) и runtime pop_snd_pages. Цена: таблица переехала из _CODE в _DATA, суммарный резидент почти не изменился (куча 239 -> 229 Б); банк 8 +601 Б на чтение и валидацию. Валидация не доверяет файлу: заголовок целиком плюс каждая запись (страница, смещение, кратность блоку, непересечение с блоком тишины, выход за последнюю страницу). Последнее считается В БЛОКАХ — байтовый адрес конца не влезает в uint16, а 32-битная арифметика на Z80 дорога. НЕТ ИНДЕКСА — ЭФФЕКТОВ НЕТ, НО МУЗЫКА ИГРАЕТ. Первая версия просто возвращала ошибку, и игра становилась непроходимой: тишину льёт первый блок набора, без набора CBL не открывался, а с ним вставала музыка (её блоки считает тот же насос) — заставка ждала конца трека вечно. Теперь поднимается пустой набор с блоком тишины. Заливается ровно 128 байт и под DI: gfx_w0_page_prepare ставит в страницу IRQ-стабы, и заливка всей страницы затирала их — первое же прерывание давало чёрный экран. Грабли сборки: смена SND_SRC тихо давала неверный результат (sdlpop -> msdos -> sdlpop оставлял чужой набор в assets/packed). Причина не в логике, а в секундной гранулярности mtime. Лечение убирает время из решения: смена варианта сносит stamp'ы своего семейства, а упаковка, сборка архива и копия индекса делаются одним рецептом. То же получила и музыка (MUSIC_FMT). Проверено в MAME: таблица в памяти совпадает с файлом из образа побайтово; один EXE поднимает оба набора; отладочный --order reverse (30 из 31 записей отличаются от штатных) звучит правильно; битый индекс выключает эффекты, не роняя игру; без индекса PV-сцена проходит с музыкой; Ctrl+S работает в обоих режимах. Разбор — docs/sound_plan.md §10. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011MsUsEFAQfsjjQpJ7RtKVY
This commit is contained in:
@@ -13,12 +13,19 @@ make # build/sprpop.exe + ресурсы
|
||||
make hdd # + образ build/hdd/sprpop.chd
|
||||
```
|
||||
|
||||
Чужих данных в репозитории нет — есть адреса, откуда их взять. Чтобы
|
||||
перегенерировать ресурсы (или получить эталон механики), сначала:
|
||||
|
||||
```sh
|
||||
make fetch # SDLPoP + записи саундтрека DOS-версии в assets/orig/
|
||||
```
|
||||
|
||||
## Что где
|
||||
|
||||
```
|
||||
src/ рукописный C: главный цикл sprpop.c + движок pop_*.c
|
||||
gen/ генерируемые заголовки — руками не править
|
||||
assets/orig/ оригинальные данные игры (вне репозитория, см. там README)
|
||||
assets/orig/ оригинальные данные игры (вне репозитория, качает `make fetch`)
|
||||
assets/packed/ то, что ложится на диск игры, в раскладке диска
|
||||
tools/ конверторы ресурсов; все пути — в tools/paths.py
|
||||
docs/ планы, доски задач и багов, справочники (начинать с docs/README.md)
|
||||
@@ -33,9 +40,12 @@ build/ выход: sprpop.exe, каталоги ресурсов, hdd/,
|
||||
| `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/` |
|
||||
|
||||
@@ -54,7 +64,14 @@ build/ выход: sprpop.exe, каталоги ресурсов, hdd/,
|
||||
|
||||
`assets/orig/` нужен только чтобы ресурсы **перегенерировать** (`make
|
||||
resources`) и как **эталон механики**: любая правка поведения сверяется с
|
||||
`assets/orig/SDLPoP/src/` до кодинга, см. `CLAUDE.md`.
|
||||
`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`.
|
||||
|
||||
## Происхождение
|
||||
|
||||
|
||||
Reference in New Issue
Block a user