/* pop_sound_tbl.h — раскладка оцифрованных эффектов PoP. * СГЕНЕРЕНО tools/pop_pack_sound.py — НЕ править вручную. * * Данные: 8 бит беззнаковые, МОНО, 10937.5 Гц (CBL_FREQ_10K9) — формат * CBL один в один, конвертировать в рантайме нечего. * * Начало каждого звука кратно 128 — размеру блока запроса CBL, а * страница (16384) кратна ему же. Поэтому НИ ОДИН блок не пересекает * границу страницы. Больше того: с 2026-08-25 каждый звук лежит * ЦЕЛИКОМ в одной странице — не влезает в остаток, значит начинаем * новую (страницы EMM у нас с запасом). Единственное исключение — * эффект, который сам ДЛИННЕЕ страницы: для него насос переключает * страницу на ходу, и эта ветка в pop_sfx_fill остаётся ради него. * * Смещение хранится РАЗОБРАННЫМ на страницу и адрес в окне: на Z80 * 32-битная арифметика дорога, а так всё влезает в 8/16 бит. * Длина округлена вверх до блока — неполных блоков не бывает. */ #ifndef POP_SOUND_TBL_H #define POP_SOUND_TBL_H #include #define POP_SND_PAGES 10 #define POP_SND_COUNT 57 #define POP_SND_BLOCK 128 /* Первый блок страницы 0 — тишина для насоса (см. упаковщик). */ #define POP_SND_SILENCE_PAGE 0 #define POP_SND_SILENCE_OFF 0x0000 /* Полная таблица нужна только горячей половине звука. */ #ifdef POP_SND_TABLE typedef struct { uint8_t page; uint16_t off; uint16_t len; } pop_snd_ent_t; /* len == 0 — у звука нет оцифровки (это музыка, см. sound_plan.md). */ static const pop_snd_ent_t pop_snd_tbl[POP_SND_COUNT] = { { 0, 0x0080, 1664 }, /* 0 */ { 0, 0x0700, 12032 }, /* 1 */ { 1, 0x0000, 6272 }, /* 2 */ { 1, 0x1880, 1280 }, /* 3 */ { 1, 0x1D80, 1152 }, /* 4 */ { 1, 0x2200, 1408 }, /* 5 */ { 1, 0x2780, 5504 }, /* 6 */ { 2, 0x0000, 896 }, /* 7 */ { 2, 0x0380, 1664 }, /* 8 */ { 2, 0x0A00, 2816 }, /* 9 */ { 2, 0x1500, 4992 }, /* 10 */ { 2, 0x2880, 1280 }, /* 11 */ { 2, 0x2D80, 1280 }, /* 12 */ { 3, 0x0000, 3840 }, /* 13 */ { 3, 0x0F00, 7552 }, /* 14 */ { 4, 0x0000, 17664 }, /* 15 */ { 5, 0x0500, 4736 }, /* 16 */ { 5, 0x1780, 4224 }, /* 17 */ { 6, 0x0000, 6912 }, /* 18 */ { 6, 0x1B00, 2816 }, /* 19 */ { 6, 0x2600, 1408 }, /* 20 */ { 6, 0x2B80, 1152 }, /* 21 */ { 6, 0x3000, 1280 }, /* 22 */ { 6, 0x3500, 1408 }, /* 23 */ { 0, 0x0000, 0 }, /* 24 */ { 0, 0x0000, 0 }, /* 25 */ { 0, 0x0000, 0 }, /* 26 */ { 0, 0x0000, 0 }, /* 27 */ { 0, 0x0000, 0 }, /* 28 */ { 0, 0x0000, 0 }, /* 29 */ { 0, 0x0000, 0 }, /* 30 */ { 0, 0x0000, 0 }, /* 31 */ { 0, 0x0000, 0 }, /* 32 */ { 0, 0x0000, 0 }, /* 33 */ { 0, 0x0000, 0 }, /* 34 */ { 0, 0x0000, 0 }, /* 35 */ { 0, 0x0000, 0 }, /* 36 */ { 0, 0x0000, 0 }, /* 37 */ { 0, 0x0000, 0 }, /* 38 */ { 0, 0x0000, 0 }, /* 39 */ { 0, 0x0000, 0 }, /* 40 */ { 0, 0x0000, 0 }, /* 41 */ { 0, 0x0000, 0 }, /* 42 */ { 0, 0x0000, 0 }, /* 43 */ { 7, 0x0000, 2688 }, /* 44 */ { 7, 0x0A80, 4224 }, /* 45 */ { 7, 0x1B00, 4608 }, /* 46 */ { 8, 0x0000, 5120 }, /* 47 */ { 8, 0x1400, 5120 }, /* 48 */ { 8, 0x2800, 4480 }, /* 49 */ { 0, 0x0000, 0 }, /* 50 */ { 9, 0x0000, 4864 }, /* 51 */ { 0, 0x0000, 0 }, /* 52 */ { 0, 0x0000, 0 }, /* 53 */ { 0, 0x0000, 0 }, /* 54 */ { 0, 0x0000, 0 }, /* 55 */ { 0, 0x0000, 0 }, /* 56 */ }; #endif /* POP_SND_TABLE */ #endif