Как это ни странно, даже сейчас, спустя столько десятилетий, есть множество людей, которым интересен 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.
Поделиться с друзьями
-->

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


  1. SysCat
    13.06.2017 09:41
    +1

    Полезная разработка для любителей ZX Spectrum!


  1. zcasper
    13.06.2017 09:52
    +2

    В своё время взял штекер дин-5, и прицепил к нему два mini.jack (3.5), сцепляю хоть с чем воспроизводящим/пишущим звук, и всё ок


  1. VBKesha
    13.06.2017 10:26

    Спасибо за статью!
    Вот бы ещё кто сделал эмулятор сидирома для PS1.


    1. da-nie
      13.06.2017 10:36

      А он чем-то от обычного отличается? (У меня-то PS1 нет и никогда не было).


      1. VBKesha
        13.06.2017 10:41

        Отсутствием отдельного контроллера. Заменить в приставке можно только голову с лазером и мотором шпинделя. На первых моделях сидиром хотя бы управлялся отдельной микросхемой документацию на которую вполне можно было найти. В последних версиях её совместили со звуковым чипом.


  1. UA3MQJ
    13.06.2017 10:57

    Спасибо за проект! Как раз лет 5 валяется мега16, можно сюда и применить.


  1. Armleo
    13.06.2017 11:14
    +1

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


    1. UA3MQJ
      13.06.2017 12:55
      +1

      Ну, для проигрывателя надо сначала преобразовывать tap в wav. А тут сразу работает, и занимает меньше.


      1. da-nie
        13.06.2017 13:02

        Кстати, программа для такого преобразования есть в архиве. :) Как и для обратного. Ну и ещё там эмулятор ZX-Spectrum есть на базе файлов эмуляции Z80 из инета (уже не помню, где я их взял).


      1. Airrr
        13.06.2017 13:28
        +4

        Плагин in_tap.dll для winamp'a отлично всё проигрывает без конвертирований (особенно в wav??!!)


        1. da-nie
          13.06.2017 13:28

          Даже такое есть? :) Надо же.


  1. Skyroger2
    13.06.2017 13:44
    +1

    насколько я помню, там можно было скорость поднять процентов на 20 (путём увеличения частоты ноля и единицы). Стандартный драйвер магнитофона переваривал это.


    1. da-nie
      13.06.2017 14:16

      Да, у стандартной программы загрузки большие пределы по скорости.


  1. GarryC
    13.06.2017 13:45
    +1

    Режим зануды
    3500000/(855+855)=1,16 мсек/бит * 8 = 9,35 мсек/байт
    Точно нельзя читать с SD карты в таком темпе? Тогда ОЗУ не потребовалось бы.
    Или я чего то недопонимаю?


    1. da-nie
      13.06.2017 14:16

      Можно читать! Два буфера делаются и переставляются местами. Но вы 855 уменьшите, скажем, раз в 10-20 и вот тут уже atmega не успеет читать карту. А зачем уменьшать? Да просто чтобы как можно быстрее загружать.


      1. SGordon123
        13.06.2017 19:26

        А атмега до скольки гонится? Наверно до 24 любая?


        1. da-nie
          13.06.2017 19:27

          Она свыше штатной может работать нестабильно.


          1. SGordon123
            13.06.2017 20:58

            А еще подскажите, в железе спектрума не силен — если уж Вы свое ПЗУ зашиваете, то зачем вам частотная модуляция? На свободный порт, ( или наверно на тот же магнитофонный ) вход можно и обычный последовательный протокол пустить?


            1. da-nie
              13.06.2017 21:07

              Я не совсем своё ПЗУ прошиваю- я просто константы уменьшил в 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. FGV
        13.06.2017 19:26
        +1

        Два буфера делаются и переставляются местами.

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

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

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


        1. da-nie
          13.06.2017 19:29

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


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

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


          Так попробуйте! :) Я-то заложил на будущее возможность простого ускорения, но не стал так разгоняться.


  1. FSA
    13.06.2017 16:49
    +1

    Я как-то баловался со своим старым спектрумом. Просто подключал выход звуковой карты к нему и формировал на Delphi очень тупой WAV файл с импульсами. Ну а там просто запихивал его в плеер и воспроизводил.


  1. azesmbog
    13.06.2017 21:57
    +1

    Наверное хороший проект :)
    Но… для сравненийя
    http://arduitapemarkii.blogspot.ru/
    на ардуинке, минимуум проводов максимум форматов
    http://savepic.net/8773285.jpg
    Легким движением руки, то бишь паяльника, переделывается в FDD эмулятор.


    1. da-nie
      13.06.2017 22:05

      Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели). :) На тот момент вообще ещё ничего не было. Что касается ардуины — там то же самое, но без большого ОЗУ. Это можно сделать. Но вот в конкретно этом проекте есть внешнее ОЗУ по причинам, обозначенным в тексте статьи.
      А вот про FDD-эмулятор из ардуины я не очень понял — на картинках и в тексте я не увидел речи про FDD. Я знаю, что имеющиеся эмуляторы дисководов для ZX-Spectrum только одной atmega328 не обходятся.


      1. azesmbog
        19.06.2017 14:10

        Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели).

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

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


        1. da-nie
          19.06.2017 19:40

          Без внешнего ОЗУ как то проще собирать, не так ли?


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

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


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


  1. tronix286
    14.06.2017 09:08
    +1

    А у меня так:


    1. da-nie
      14.06.2017 18:46

      А вы в числе счастливчиков, которые успели это купить. :)


      1. tronix286
        14.06.2017 20:59

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


      1. zcasper
        20.06.2017 13:42

        без каких либо проблем пару недель назад купил себе пару штук на всем известном ресурсе…