Формат RSF занимает меньше места, чем PSG, содержит текстовую информацию о файле и его достаточно просто транслировать в эмулятор на Atmega 8 в виде потока и т.д.
RSF (расшифровывается как Registers Stream Flow/поток регистров)
Заголовок версии 1
Описание формата:
Заголовок:
Смещение | Размер | Тип и/или описание ---------+--------+--------------------------------------------------------- 00 | 3 | Сигнатура "RSF" (текст) 03 | 1 | Версия (текущая 1) 04 | 1 | Частота смены кадров (частота прерываний) обычно 50(Hz) 05 | 4 | UInt32, frameCount (общее число кадров в мелодии) 09 | 4 | UInt32, loopFrame (номер кадра для зацикливания) 13 | X | Строка завершающаяся нулем содержащая название мелодии XX | X | Строка завершающаяся нулем содержащая имя автора XX | X | Строка завершающаяся нулем содержащая комментарий
Заголовок версии 2
Описание формата:
Заголовок:
Смещение | Размер | Тип и/или описание ---------+--------+--------------------------------------------------------- 00 | 3 | Сигнатура "RSF" (текст) 03 | 1 | Версия (текущая 2) 04 | 2 | UInt16, Частота смены кадров (частота прерываний) обычно 50(Hz) 06 | 4 | UInt32, frameCount (общее число кадров в мелодии) 10 | 4 | UInt32, loopFrame (номер кадра для зацикливания) 14 | 4 | UInt32, chipFrequency (частота чипа AY) 18 | X | Строка завершающаяся нулем содержащая название мелодии XX | X | Строка завершающаяся нулем содержащая имя автора XX | X | Строка завершающаяся нулем содержащая комментарий
Заголовок версии 3
Описание формата:
Заголовок:
Смещение | Размер | Тип и/или описание ---------+--------+--------------------------------------------------------- 00 | 3 | Сигнатура "RSF" (текст) 03 | 1 | Версия (текущая 3) 04 | 2 | UInt16, Частота смены кадров (частота прерываний) обычно 50(Hz) 06 | 2 | UInt16, Смещение до начала данных мелодии 08 | 4 | UInt32, frameCount (общее число кадров в мелодии) 12 | 4 | UInt32, loopFrame (номер кадра для зацикливания) 16 | 4 | UInt32, chipFrequency (частота чипа AY) 20 | X | Строка завершающаяся нулем содержащая название мелодии XX | X | Строка завершающаяся нулем содержащая имя автора XX | X | Строка завершающаяся нулем содержащая комментарий
ДАННЫЕ МЕЛОДИИ:
(версии 1, 2)————————————-
в начале (при чтении байта) проверьте 3 специальных значения
0xFF — прерывание, ничего не отправлять в эмулятор (просто проигнорируйте одно прерывание)
0xFE,XX — кол-во игнорируемых прерываний XX * 16 без изменения регистров (пропустите XX*16 прерываний)
0xFD,XX — кол-во игнорируемых прерываний XX * 2 без изменения регистров (пропустите XX*2 прерываний)
(версия 3)————————————-
в начале (при чтении байта) проверьте 2 специальных значения
0xFF — прерывание, ничего не отправлять в эмулятор (просто проигнорируйте одно прерывание)
0xFE,XX — кол-во игнорируемых прерываний XX без изменения регистров (пропустите XX прерываний)
—————————————————
если не встретились эти значения получаем данные регистров:
значения регистров 0-13 (регистры 14,15 в данном формате игнорируются) которые изменились с предыдущего прерывания
XX1, XX2,REG0,REG5,REG7 (зависит от регистровой маски)
Регистровая маска
XX1 — старшее значение регистровой маски
XX2 — младшее значение регистровой маски
если бит регистровой маски содержит 1, то значение регистра должно следовать за маской
Примеры
0x00,0x03,REG0,REG1 (XX1=00000000 XX2=00000011)
0x03,0x02,REG1,REG8,REG9 (XX1=00000011 XX2=00000010)
REG0, REG1 и т.д. — значения регистров 0, 1, и т.д.
ВНИМАНИЕ! в файлах версий 1, 2 генерируемых проигрывателем могут встречаться значения 255 в 13 регистре! Версия 3 формата поддерживается проигрывателем начиная с версии 11.3
[ad name=»HTML»]
Почему нельзя в следующей, 4-й версии формата, сделать служебными значения не только 0xFF и 0xFE, а целый диапазон [0x40:0xFF]? Тем самым можно одним байтом кодировать количество пропускаемых прерываний в подавляющем большинстве ситуаций. Байт 0xFF — это ‘-1’ (пропуск одного прерывания), 0xFE — ‘-2’ (пропуск двух), … 0x40 — ‘-192’ (пропуск 192-х прерываний!). На мой взгляд и этого более чем достаточно. Но можно предусмотреть 0x40 в качестве спецбайта, когда следующий байт будет дополняющим положительным. Например, 0x40 0x10 говорит о пропуске 0x00 — 0x40 + 0x10 = 0xD0 (208) байт.
*Пропуск 208 прерываний конечно, а не байт.