Вложений: 7
Загрузка с магнитофона на БК-0011(М)
Если у вас есть БК0011 или БК0011М, но нет дисковода или винчестера, эта программа для вас. Она позволяет загружать с любого источника звука (магнитофона, мобильного телефона) старые игры, написанные для БК0010. Для этого программа помещает в память БК0011(М) копию ПЗУ БК0010 и запускает её надлежащим образом.
http://thesands.ru/bk0010/bk-iphone.jpg
Для подключения мобильного телефона к БК вам понадобится стандартный шнур-переходник с 3,5 мм джека на круглый 5-штырьковый разъём DIN 5. Достаточно всего двух контактов: №2 - земля, №3 - левый канал.
Вложение 68645 Вложение 68653 Вложение 68654
Если после включения БК0011(М) запустился Бейсик, наберите "MO" и нажмите клавишу Ввод. Вы попадёте в режим, называемый Монитором. Об этом свидетельствует значок-приглашение "@" на экране.
В Мониторе нажмите "L" (Load - загрузка программы с магнитофона). На вопрос об имени наберите "BK0010" (для компьютера БК0011М) или "B:BK0010" (для компьютера БК0011) и нажмите клавишу Ввод. Можно даже не набирать «BK0010» – тогда загрузится первый встреченный файл. После этого включите на воспроизведение с вашего источника звука BK0010.wav. Загрузка длится 19 секунд. После окончания снова появится приглашение "@". Нажмите «G» (Go - запуск).
Вложение 68646
Теперь ваша БК0011(М) работает в режиме БК-0010. Символ приглашения здесь "?". Наберите "M" и нажмите клавишу Ввод (M - Magnetic tape, магнитофон). На вопрос об имени наберите название игры (например, "DIVERSANT") и нажмите клавишу Ввод. После этого включите на воспроизведение с вашего источника звука файл с игрой (например, diversant.flac).
Вложение 68647
Если игра снабжена автозапуском, после загрузки она сразу запустится. В противном случае вы снова увидите приглашение "?". Наберите "S" и нажмите клавишу Ввод (Start - запуск).
После выхода в Монитор из корректно написанной игры можно загружать другую игру. При необходимости инициализировать параметры Монитора воспользуйтесь командой "S100274". Если выйти из игры не получается, выключите БК0011(М), подождите несколько секунд, после включения заново загрузите программу "BK0010", а затем уже другую игру.
Конвертировать файлы из bin в wav можно онлайн конвертером или утилитой из командной строки или инструментом из эмулятора gid.
Вложение 68655
Архив с программой (wav, bin, исходник): Вложение 74685
Формат записи на магнитофон
Итак, конвертер в WAV дописан, пришло время поделиться подробностями.
Ковыряние в ПЗУ позволило понять формат записи на магнитофон.
Вначале идёт настроечный тон, который ещё называют "пилотным тоном". В уютном Телеграм-чатике его окрестили футуристичным словом "пилотон". Я тоже буду использовать термин Pilotone™
Про длину волны я расскажу позже, а пока общий вид: оранжевым цветом на графиках отображены служебные сигналы, синим - собственно данные. Звук во времени отображается слева направо.
Запись на магнитрой ленте или в WAV-файле начинается так: 4096 периодов пилотона, затем один импульс с длиной волны в 4 раза больше, затем один период с длиной волны вдвое больше пилотона и один короткий (на самом деле так кодируется единица).
http://thesands.ru/bk0010/wav-converter/wav1.png
Дальше записаны данные: адрес файла, длина файла, 16 байт имени файла. Если имя короче, остаток добивается пробелами.
Данные кодируются так:
http://thesands.ru/bk0010/wav-converter/wav2.png
0 кодируется импульсом такой же длины волны, как настроечный тон.
1 кодируется импульсом с вдвое большей длиной волны.
Во время чтения настроечного тона программа в ПЗУ вычисляет длину волны, а затем увеличивает в полтора раза и сохраняет. С этим значением будут сравниваться поступающие на вход сигналы - если сигнал короче, то это 0, если длиннее - 1.
Как вы заметили, служебные сигналы чуть тише основных. Мы сделали так в своём конвертере для удобства отладки: открываешь WAV-файл и сразу видишь где служебные сигналы, а где кодируемые данные. Для БК громкость этих сигналов выглядит одинаковой.
Клеточки надо понимать следующим образом: одна клетка - одна запись в WAV-файле. Для формата "8 бит моно" это означает 1 байт. Для формата "16 бит стерео" это два слова (то есть 4 байта). Одну такую запись ещё называют "отсчётом". Если вы видите горизонтальную линию длиной 4 клетки, значит ей соответствует 4 отсчёта в WAV-файле.
Синхроимпульс должен совпадать с настроечным тоном. Однако, оказалось, что программу в ПЗУ можно обмануть и сократить синхроимпульс. Получилось так:
http://thesands.ru/bk0010/wav-converter/wav3.png
Ускорение на 11% по сравнению со стандартным вариантом. Современные источники звука типа смартфона и музыкального плеера дают достаточное качество, чтобы такая оптимизация не помешала устойчивому чтению.
После записи 20-ти байтного заголовка (адреса, длины и имени) снова следует настроечная последовательность. На этот раз короткая, у пилотона всего 8 периодов:
http://thesands.ru/bk0010/wav-converter/wav4.png
Следом за второй настроечной последовательностью идут собственно данные файла. Бит за битом, начиная с младшего.
Оканчивается всё 16-разрядным словом с контрольной суммой и небольшим хвостиком пилотона.
Контрольная сумма считается так (R5 - адрес, R4 - длина):
Код:
CLR R0
1: CLR R2
BISB (R5)+,R2
ADD R2,R0
ADC R0
SOB R4,1
RET
Теперь самое интересное: какая частота дискретизации должна быть у WAV-файла? Экспериментально мы определили максимально возможную частоту 25000 Гц для БК0011 (частота процессора 4 МГц) и 21428 Гц для БК0010 (частота процессора 3 МГц). Причём, БК0011 читает и запись, сделанную для БК0010.
Откуда взялись такие частоты? В прошлом сообщении я писал, что цикл чтения входных данных кратен 80-ти тактам процессора. Цикл прокручивается целое число раз, прежде чем обнаруживает смену уровня на магнитофонном входе. Для уверенного чтения это число (назовём его N) не должно быть слишком маленьким. Самое неприятное, что после считывания сигнала программа в ПЗУ тратит много времени на дополнительные действия. Например, на БК0011М она переключает страницы памяти после каждого (!) считанного бита (!!!). Из-за таких действий программа пропускает заметную часть следующего синхроимпульса (высокий уровень сигнала).
Таким образом, частота дискретизации WAV-файла рассчитывалась по формуле (CPU / ( 80 * N ) ) * 4.
CPU - это 3 или 4 МГц, в зависимости от модели БК.
80 * N - продолжительность цикла, отслеживающего смену уровня. Измеряется в тактах процессора.
4 - длина волны настроечного тона. Измеряется в отсчётах WAV-файла.
Эксперименты показали: для БК0011 максимальное значение N = 8, для БК0010 N = 7.
Ещё раз подчеркну, что N должно быть целое. Если проиграть WAV с произвольной частотой, получится такое:
http://thesands.ru/bk0010/wav-converter/wrong_freq.png
Ну а если частота правильная, то получаем загрузку в 2.6 раза быстрей стандартной. И даже быстрей, чем максимальная скорость копировщика CF50. Вот такая красота: https://www.instagram.com/p/BwAfRFXjKJK/
Немного об авторах. Нас можно найти в Telegram:
@lzakirov написал конвертер на JavaScript.
@Manwe_SandS трассировал ПЗУ БК, разбирал формат и тестировал результат на реальном железе.
@Lesha_Speedy прислал для тестов БК0010.