Описываемый эмулятор собирается на базе микроконтроллера 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)
zcasper
13.06.2017 09:52+2В своё время взял штекер дин-5, и прицепил к нему два mini.jack (3.5), сцепляю хоть с чем воспроизводящим/пишущим звук, и всё ок
VBKesha
13.06.2017 10:26Спасибо за статью!
Вот бы ещё кто сделал эмулятор сидирома для PS1.da-nie
13.06.2017 10:36А он чем-то от обычного отличается? (У меня-то PS1 нет и никогда не было).
VBKesha
13.06.2017 10:41Отсутствием отдельного контроллера. Заменить в приставке можно только голову с лазером и мотором шпинделя. На первых моделях сидиром хотя бы управлялся отдельной микросхемой документацию на которую вполне можно было найти. В последних версиях её совместили со звуковым чипом.
Armleo
13.06.2017 11:14+1"А почему бы не использовать простой проигрыватель?" ©
На самом деле крутая статья. Коротко, ясно.UA3MQJ
13.06.2017 12:55+1Ну, для проигрывателя надо сначала преобразовывать tap в wav. А тут сразу работает, и занимает меньше.
da-nie
13.06.2017 13:02Кстати, программа для такого преобразования есть в архиве. :) Как и для обратного. Ну и ещё там эмулятор ZX-Spectrum есть на базе файлов эмуляции Z80 из инета (уже не помню, где я их взял).
GarryC
13.06.2017 13:45+1Режим зануды
3500000/(855+855)=1,16 мсек/бит * 8 = 9,35 мсек/байт
Точно нельзя читать с SD карты в таком темпе? Тогда ОЗУ не потребовалось бы.
Или я чего то недопонимаю?da-nie
13.06.2017 14:16Можно читать! Два буфера делаются и переставляются местами. Но вы 855 уменьшите, скажем, раз в 10-20 и вот тут уже atmega не успеет читать карту. А зачем уменьшать? Да просто чтобы как можно быстрее загружать.
SGordon123
13.06.2017 19:26А атмега до скольки гонится? Наверно до 24 любая?
da-nie
13.06.2017 19:27Она свыше штатной может работать нестабильно.
SGordon123
13.06.2017 20:58А еще подскажите, в железе спектрума не силен — если уж Вы свое ПЗУ зашиваете, то зачем вам частотная модуляция? На свободный порт, ( или наверно на тот же магнитофонный ) вход можно и обычный последовательный протокол пустить?
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
А так — можно любой протокол прикрутить, конечно. :) Но я такое не делал.
FGV
13.06.2017 19:26+1Два буфера делаются и переставляются местами.
зачем так сложно? можно организовать кольцевой буфер.
Но вы 855 уменьшите, скажем, раз в 10-20 и вот тут уже atmega не успеет читать карту.
SPI можно тактировать до 1/2 от тактовой амеги, т.е. до 8МГц, или 1Мбайт/с. Чую все можно успеть, даже на скорости х20, да и ОЗУ тут не смотрится — лишнее.da-nie
13.06.2017 19:29зачем так сложно? можно организовать кольцевой буфер.
А это и есть кольцевой буфер фактически, только голова и хвост не бегают синхронно. :) А, ещё вот что — на FAT16 может требоваться перечитать положения секторов — они не обязаны последовательно идти. А ОЗУ 1 кб у atmega16.
Чую все можно успеть, даже на скорости х20, да и ОЗУ тут не смотрится — лишнее.
Так попробуйте! :) Я-то заложил на будущее возможность простого ускорения, но не стал так разгоняться.
FSA
13.06.2017 16:49+1Я как-то баловался со своим старым спектрумом. Просто подключал выход звуковой карты к нему и формировал на Delphi очень тупой WAV файл с импульсами. Ну а там просто запихивал его в плеер и воспроизводил.
azesmbog
13.06.2017 21:57+1Наверное хороший проект :)
Но… для сравненийя
http://arduitapemarkii.blogspot.ru/
на ардуинке, минимуум проводов максимум форматов
http://savepic.net/8773285.jpg
Легким движением руки, то бишь паяльника, переделывается в FDD эмулятор.da-nie
13.06.2017 22:05Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели). :) На тот момент вообще ещё ничего не было. Что касается ардуины — там то же самое, но без большого ОЗУ. Это можно сделать. Но вот в конкретно этом проекте есть внешнее ОЗУ по причинам, обозначенным в тексте статьи.
А вот про FDD-эмулятор из ардуины я не очень понял — на картинках и в тексте я не увидел речи про FDD. Я знаю, что имеющиеся эмуляторы дисководов для ZX-Spectrum только одной atmega328 не обходятся.azesmbog
19.06.2017 14:10Есть одно «но». Этому проекту — четыре года (и его давно все желающие видели).
значит мне не повезло 4 года назад)
Без внешнего ОЗУ как то проще собирать, не так ли?
. Я знаю, что имеющиеся эмуляторы дисководов для ZX-Spectrum только одной atmega328 не обходятся.
обходятся, еще как, хоть одной 328-й, хоть одной ардуин-кой. Я к чему, схемы включения у них очень похожи, и из одного эмулятора легко получается другой только перепрошивкой. Осталось совместить два-в-одном.
Чтобы два раза не вставать (с)da-nie
19.06.2017 19:40Без внешнего ОЗУ как то проще собирать, не так ли?
Кому как. У меня таких ОЗУ навалом.
обходятся, еще как, хоть одной 328-й, хоть одной ардуин-кой. Я к чему, схемы включения у них очень похожи, и из одного эмулятора легко получается другой только перепрошивкой.
Только у FDD контактов довольно много и тайминги дисководов довольно маленькие. Нет, если спектрум будет ждать дисковод — пожалуйста. Но это нестандартный режим работы. Вот Amiga, например, не ждёт и сразу пошлёт такой эмулятор подальше.
SysCat
Полезная разработка для любителей ZX Spectrum!