Эмулятор магнитофона для ZX-Spectrum

    Как это ни странно, даже сейчас, спустя столько десятилетий, есть множество людей, которым интересен ZX-Spectrum. И дело не ограничивается программными эмуляторами, нет. У этих людей есть вполне себе настоящие, “железные” спектрумы. Подавляющее большинство этих компьютеров оснащено дисководами, но есть и экземпляры только с магнитофонным входом. Такой компьютер можно загрузить, например, с аудиоплейера. Но при таком способе загрузки неудобно переходить между блоками данных внутри аудиофайла, например, если игра требует загрузки уровней. Да и места аудиофайлы занимают порядочно… Есть, конечно, ещё разные программы для смартфонов, воспроизводящие форматы файлов данных для спектрума tap и tzx. Но можно для этих же целей собрать аппаратный эмулятор магнитофона, описанный в этой статье.

    Описываемый эмулятор собирается на базе микроконтроллера atmega16 и способен воспроизводить tap-файлы, лежащие на SD-карте. Записывать на SD-карту файлы он не умеет (да мне это и не требовалось).


    Внешний вид эмулятора магнитофона в моём исполнении.

    Схема эмулятора представлена на рисунке ниже.


    Схема эмулятора магнитофона.

    В схеме использован дисплей 1602, микроконтроллер atmega16 и динамическое ОЗУ MB81C4256. Зачем нужно ОЗУ в таком эмуляторе, ведь можно последовательно считывать два блока (один читаем, другой выводим) с карты памяти? Да, можно. Но применение большого ОЗУ упрощает программу – все выводимые данные целиком находятся в ОЗУ, и достаточно просто последовательно их читать и выводить. Кроме того, наличие ОЗУ позволяет разогнать скорость вывода сигнала практически до максимальной для ZX-Spectrum. Это, правда, потребует существенной модификации программы загрузки в ПЗУ спектрума. В данном эмуляторе максимальная скорость вывода данных в четыре раза больше, чем стандартная скорость загрузки спектрума. То есть, требуется модифицированное ПЗУ. Прошивки такого модифицированного ПЗУ представлены в архиве.

    Формат tap-файла очень прост: 2 байта – размер блока, за которыми следуют данные блока. И так до исчерпания всех блоков.

    Магнитофонный сигнал с ZX-Spectrum представляет собой частотно-модулированный сигнал, при этом самой высокой частотой закодированы ноль и синхросигнал (частота синхросигнала чуть выше, чем у ноля). Частотой в 2 раза ниже частоты ноля закодирована единица. Частотой в 2.5 раза ниже частоты ноля закодирован пилот-тон (звуки пи-и-и-и-и в начале загрузки). На рисунке показан формат сигнала в тактах процессора Z80 (частота в ZX-Spectrum 3.5 МГц, если кто забыл). Сначала идёт длительный (несколько секунд) пилот-тон, затем следует синхросигнал, а после него уже выдаются данные.


    Формат магнитофонного сигнала ZX-Spectrum.

    Собственно, ничего сложного тут вовсе нет. Если такой сигнал выдать с микроконтроллера, то спектрум его с радостью примет и загрузится. Для генерации сигнала в программе использован обычный таймер, переключающий выход магнитофона через заданные промежутки времени.

    Вот видео работы эмулятора магнитофона:



    А вот работа на скорости 4x:



    В архиве прошивка, исходники прошивок, печатная плата, схема, прошивка ПЗУ ZX-Spectrum для скоростей 4x и 2x, программа конвертации TAP в WAV и программа обратной конвертации из WAV в TAP.

    Update:
    Программа и печатная плата на github.

    Комментарии 30

      +1
      Полезная разработка для любителей ZX Spectrum!
        +2
        В своё время взял штекер дин-5, и прицепил к нему два mini.jack (3.5), сцепляю хоть с чем воспроизводящим/пишущим звук, и всё ок
          0
          Спасибо за статью!
          Вот бы ещё кто сделал эмулятор сидирома для PS1.
            0
            А он чем-то от обычного отличается? (У меня-то PS1 нет и никогда не было).
              0
              Отсутствием отдельного контроллера. Заменить в приставке можно только голову с лазером и мотором шпинделя. На первых моделях сидиром хотя бы управлялся отдельной микросхемой документацию на которую вполне можно было найти. В последних версиях её совместили со звуковым чипом.
            0
            Спасибо за проект! Как раз лет 5 валяется мега16, можно сюда и применить.
              +1

              "А почему бы не использовать простой проигрыватель?" ©
              На самом деле крутая статья. Коротко, ясно.

                +1
                Ну, для проигрывателя надо сначала преобразовывать tap в wav. А тут сразу работает, и занимает меньше.
                  0
                  Кстати, программа для такого преобразования есть в архиве. :) Как и для обратного. Ну и ещё там эмулятор ZX-Spectrum есть на базе файлов эмуляции Z80 из инета (уже не помню, где я их взял).
                    +4
                    Плагин in_tap.dll для winamp'a отлично всё проигрывает без конвертирований (особенно в wav??!!)
                      0
                      Даже такое есть? :) Надо же.
                  +1
                  насколько я помню, там можно было скорость поднять процентов на 20 (путём увеличения частоты ноля и единицы). Стандартный драйвер магнитофона переваривал это.
                    0
                    Да, у стандартной программы загрузки большие пределы по скорости.
                    +1
                    Режим зануды
                    3500000/(855+855)=1,16 мсек/бит * 8 = 9,35 мсек/байт
                    Точно нельзя читать с SD карты в таком темпе? Тогда ОЗУ не потребовалось бы.
                    Или я чего то недопонимаю?
                      0
                      Можно читать! Два буфера делаются и переставляются местами. Но вы 855 уменьшите, скажем, раз в 10-20 и вот тут уже atmega не успеет читать карту. А зачем уменьшать? Да просто чтобы как можно быстрее загружать.
                        0
                        А атмега до скольки гонится? Наверно до 24 любая?
                          0
                          Она свыше штатной может работать нестабильно.
                            0
                            А еще подскажите, в железе спектрума не силен — если уж Вы свое ПЗУ зашиваете, то зачем вам частотная модуляция? На свободный порт, ( или наверно на тот же магнитофонный ) вход можно и обычный последовательный протокол пустить?
                              0
                              Я не совсем своё ПЗУ прошиваю- я просто константы уменьшил в 4 раза.

                              Нужно заменить в штатном ПЗУ-48 следующие байты.

                              Для скорости в 2 раза больше:

                              Адрес:1409 Записать:206 Было: 156
                              Адрес:1416 Записать:227 Было: 198
                              Адрес:1424 Записать:228 Было: 201
                              Адрес:1432 Записать:236 Было: 212
                              Адрес:1446 Записать:216 Было: 176
                              Адрес:1479 Записать:217 Было: 178
                              Адрес:1487 Записать:229 Было: 203
                              Адрес:1492 Записать:215 Было: 176
                              Адрес:1512 Записать:5 Было: 22

                              После этого можно загружать с двухкратной скоростью. На запись это не распространяется.

                              Для скорости в 4 раза большей цифры другие:

                              Адрес:1409 Записать:231 Было: 156
                              Адрес:1416 Записать:241 Было: 198
                              Адрес:1424 Записать:242 Было: 201
                              Адрес:1432 Записать:245 Было: 212
                              Адрес:1446 Записать:236 Было: 176
                              Адрес:1479 Записать:237 Было: 178
                              Адрес:1487 Записать:243 Было: 203
                              Адрес:1492 Записать:236 Было: 176
                              Адрес:1512 Записать:1 Было: 22


                              А так — можно любой протокол прикрутить, конечно. :) Но я такое не делал.
                          +1
                          Два буфера делаются и переставляются местами.

                          зачем так сложно? можно организовать кольцевой буфер.

                          Но вы 855 уменьшите, скажем, раз в 10-20 и вот тут уже atmega не успеет читать карту.

                          SPI можно тактировать до 1/2 от тактовой амеги, т.е. до 8МГц, или 1Мбайт/с. Чую все можно успеть, даже на скорости х20, да и ОЗУ тут не смотрится — лишнее.
                            0
                            зачем так сложно? можно организовать кольцевой буфер.


                            А это и есть кольцевой буфер фактически, только голова и хвост не бегают синхронно. :) А, ещё вот что — на FAT16 может требоваться перечитать положения секторов — они не обязаны последовательно идти. А ОЗУ 1 кб у atmega16.

                            Чую все можно успеть, даже на скорости х20, да и ОЗУ тут не смотрится — лишнее.


                            Так попробуйте! :) Я-то заложил на будущее возможность простого ускорения, но не стал так разгоняться.
                        +1
                        Я как-то баловался со своим старым спектрумом. Просто подключал выход звуковой карты к нему и формировал на Delphi очень тупой WAV файл с импульсами. Ну а там просто запихивал его в плеер и воспроизводил.
                          +1
                          Наверное хороший проект :)
                          Но… для сравненийя
                          http://arduitapemarkii.blogspot.ru/
                          на ардуинке, минимуум проводов максимум форматов
                          http://savepic.net/8773285.jpg
                          Легким движением руки, то бишь паяльника, переделывается в FDD эмулятор.
                            0
                            Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели). :) На тот момент вообще ещё ничего не было. Что касается ардуины — там то же самое, но без большого ОЗУ. Это можно сделать. Но вот в конкретно этом проекте есть внешнее ОЗУ по причинам, обозначенным в тексте статьи.
                            А вот про FDD-эмулятор из ардуины я не очень понял — на картинках и в тексте я не увидел речи про FDD. Я знаю, что имеющиеся эмуляторы дисководов для ZX-Spectrum только одной atmega328 не обходятся.
                              0
                              Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели).

                              значит мне не повезло 4 года назад)
                              Без внешнего ОЗУ как то проще собирать, не так ли?
                              . Я знаю, что имеющиеся эмуляторы дисководов для ZX-Spectrum только одной atmega328 не обходятся.

                              обходятся, еще как, хоть одной 328-й, хоть одной ардуин-кой. Я к чему, схемы включения у них очень похожи, и из одного эмулятора легко получается другой только перепрошивкой. Осталось совместить два-в-одном.
                              Чтобы два раза не вставать (с)
                                0
                                Без внешнего ОЗУ как то проще собирать, не так ли?


                                Кому как. У меня таких ОЗУ навалом.

                                обходятся, еще как, хоть одной 328-й, хоть одной ардуин-кой. Я к чему, схемы включения у них очень похожи, и из одного эмулятора легко получается другой только перепрошивкой.


                                Только у FDD контактов довольно много и тайминги дисководов довольно маленькие. Нет, если спектрум будет ждать дисковод — пожалуйста. Но это нестандартный режим работы. Вот Amiga, например, не ждёт и сразу пошлёт такой эмулятор подальше.
                            +1
                            А у меня так:

                              0
                              А вы в числе счастливчиков, которые успели это купить. :)
                                0
                                Да купить то не такая проблема была. Я уже спустя пару дней после анонса на хабре, лениво пошел на какую-то заправку и взял два. Гораздо больше фортануло, когда я списался «от балды» с китайцами из Ingenic и спросил про сорцы MiniOs, а они возьми — да и дай их. Ну то есть взяли и дали сорцы никому — ни перекупу, не бренду — а, так, какому то чуваку с почтой в домене .ru. Вот этого я не ожидал вообще никак и никогда. Поэтому до сих пор пребываю в легком шоке. Успехов им и процветания, искренне.
                                  0
                                  без каких либо проблем пару недель назад купил себе пару штук на всем известном ресурсе…

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое