Pull to refresh

Самодельный эмулятор дисковода для Amiga

Reading time8 min
Views11K
У многих сохранились дома компьютеры Amiga. Но вот дискеты к ним сохранились не у всех. Эту проблему можно решить, собрав эмулятор дисковода. О том, как сделать самому такой эмулятор дисковода для Amiga я и расскажу в этой статье.

Я долго думал, где разместить эту статью — здесь или на geektimes. С одной стороны, она касается разработки для микроконтроллеров, а с другой речь пойдёт о разработке устройства для очень старого компьютера, тема о которых находится на geektimes. Однако, на geektimes описываются сами устройства и программирование для них на их API, а здесь всё-таки, устройство собрано на почти современной элементной базе.

У некоторых дома сохранились компьютеры Amiga, кому-то такой компьютер могли просто отдать (как мне), а кто-то специально себе его купил. И иногда бывает так, что компьютер есть, но на нём нет винчестера (например, у меня на Amiga 500 его нет), а запустить что-то на нём хочется. Возиться с дискетами (которые можно записать на PC только с помощью специальных устройств) не вариант. Вот и выбирают люди эмуляторы дисководов. Сейчас их предлагается довольно много, но вот несколько лет назад таких устройств ещё почти не было. Насколько мне известно, первым эмулятор дисковода для Amiga сделал tnt23. Можно было, конечно, купить у него эмулятор, но хотелось всё-таки попробовать свои силы в создании собственного, тем более, что в попытке запустить этот компьютер я на тот момент уже создал простое устройство для записи дискет, и в целом формат дискеты проблемы не представлял. Описываемая статья была когда-то написана для журнала Dogma, но не попала в выпуск этого журнала потому, что про неё просто забыли. Однако, я знаю, здесь есть амижники и, думаю, им будет интересно прочесть, как можно сделать свой собственный эмулятор дисковода. Быть может, эта информация подтолкнёт кого-то к созданию своего устройства, гораздо более совершенного. Итак, начнём.

Описанный ниже эмулятор дисковода достаточно несложен сборке и не содержит дефицитных деталей. Проблема может возникнуть лишь с поиском 30 контактных модулей SIMM ёмкостью 1 МБ. Однако, такие модули были широко распространены и, скорее всего, их можно найти на радиорынках. На Юноне в СПб они точно были.

Список деталей для сборки:

Марка применяемых конденсаторов, диодов, резисторов, дросселя, кнопок и держателя SD-карты значения не имеет. Диоды требуются обязательно с падением напряжения на переходе не менее 0.5 В. Дисплей может быть с другими буквенными индексами.

Эмулятор подключается в разъём внешнего дисковода и позволяет воспроизводить выбранный образ дискеты. Образы дискет хранятся в корневом каталоге на SD-карте с файловой системой FAT16. Файлы создаются специальной программой-конвертером файлов ADF и представляют собой побайтные данные стандартной 80 дорожечной дискеты, закодированные с помощью MFM кодирования. Никаких заголовков такие файлы не содержат. Ввиду упрощения схемотехники эмулятор не имеет аппаратной возможности переводить линии дисковода в Z-состояние в зависимости от того выбран ли дисковод A или B. Это значит, что все дисководы Amiga требуется аппаратно отключить во время работы с эмулятором. Однако, возможность распознавать адрес дисковода теоретически предусмотрена программно – для этого требуется чтобы микроконтроллер опознавал адрес и переводил выходы в Z-состояние, если адрес не соответствует нужному. Линии для чтения адреса дисковода на схеме предусмотрены, но программно такая возможность не реализована.

Схема эмулятора (в архиве она есть в полном качестве).


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

Схемотехнически эмулятор состоит из двух частей. Каждая из частей основана на микроконтроллере Atmega16. Микроконтроллер первой части занимается выводом информации на дисплей, обработкой кнопок, чтением информации с SD-карты с использованием аппаратного SPI, формированием части линий дисковода. Микроконтроллер второй части занимается регенерацией динамической памяти и формирует остальные сигналы линий дисковода. Обе части обмениваются информацией по шине SPI. Для контроллера D2 шина SPI для связи с D3 программная, а в D3 задействован аппаратный SPI.

Рассмотрим подробнее назначение элементов. Микросхема D1 обеспечивает питание SD-карты напряжением 3.3 В. Диоды VD1-VD6 понижают напряжение линий SPI c 5 до 3.3 В. Резисторы R1-R6 и R8-R9 притягивают линии к земле. RC-цепочки R7-C3 и R11-C5 формируют сигнал начального сброса микроконтроллеров. Элементы Z1, C1 и C2 обеспечивают генерацию 16 МГц на первом микроконтроллере (D2). Второй микроконтроллер (D3) работает в режиме внешней синхронизации от тактового генератора первого микроконтроллера. Резистор R10 управляет контрастностью изображения на дисплее. Элементы L1 и C4 обеспечивают фильтрацию напряжения источника питания.

Аппаратная часть эмулятора дисковода собирается на плате размерами 220x125 мм. Печать односторонняя, выполняется любым доступным методом, например, ЛУТ. На противоположной печати стороне платы необходимо поставить ряд перемычек проводом (отображены синими дорожками в прилагающемся файле печатной платы в формате Sprint Layout 4.0).

Программная часть эмулятора состоит из двух программ для микроконтроллеров. Программа для микроконтроллера D2 находится в папке MK1, а для микроконтроллера D3, соответственно, в папке MK2. После прошивки микроконтроллеров соответствующим HEX-файлом любым доступным способом (в том числе, для прошивки можно использовать схему “пять проводков в LPT-порт компьютера” совместно с программой программатора Uniprof), необходимо выставить FUSE-биты конфигурации контроллеров. С помощью этих битов необходимо в обоих контроллерах отключить JTAG, переключить D2 на тактирование от внешнего кварцевого резонатора 16 МГц, включить для D2 увеличенную амплитуду сигнала с осциллятора на выходе (бит CKOPT), а D3 переключить на тактирование от внешнего источника. Если ваш программатор не имеет собственного тактового генератора, контроллеры после этой операции будут недоступны для программирования. Чтобы они снова стали программируемыми потребуется подключить к XTAL1 контроллеров любой внешний генератор с частотой несколько сотен килогерц. Обязательно перед модификацией FUSE-битов считайте их с контроллера. Обратите внимание, что разные программаторы по-разному трактуют включенный и выключенный бит.

Эмулятор не требует наладки после сборки. Однако, возможно, не все модули SIMM 30 PIN будут корректно работать с ним. Для этой цели в меню эмулятора есть пункт “ТЕСТИРОВАНИЕ ПАМЯТИ”.

Для облегчения понимания работы программного обеспечения эмулятора необходимо знать следующее. На стандартной дискете Amiga хранит записанные данные по 80 дорожек с двух сторон. Каждая дорожка состоит из 11 секторов по 512 байт. Следовательно, полный объём данных дискеты 901120 байт. Именно такой объём имеют ADF-файлы образов дискет. Такой файл не содержит заголовков, а данные внутри просто перечисляются следующим образом: (дорожка 0, сторона 0), (дорожка 0, сторона 1), (дорожка 1, сторона 0), (дорожка 1, сторона 1)… (дорожка 79, сторона 0), (дорожка 79, сторона 1). Каждая дорожка — это запись 11 секторов по 512 байт начиная с 0 сектора. Для эмуляции дискеты такой файл в чистом виде не подходит. Дело в том, что ADF файл хранит только полезные данные безо всякой служебной информации и без модуляции. Рассмотрим, как осуществляется модуляция сигнала в компьютере Amiga.

Любой дисковод представляет из себя не более, чем аналог магнитофона. Он никак не кодирует записанные данные. Вы выбираете дорожку и модулируете ток (а, следовательно, и напряженность магнитного поля) через головку дисковода для записи информации. При воспроизведении в местах, где напряженность магнитного поля изменялась, дисковод считывает короткий импульс. Amiga использует при записи на дискеты модифицированную частотную модуляцию, так называемую MFM (Modified Frequency Modulation). При таком способе модуляции изменение тока через катушку зависит не только от значения записываемого бита, но и от значения предшествующих бит, как показано в таблице ниже. В графе “кодируется” R означает смену намагниченности (подачу импульса дисководу), а N — намагниченность не изменяется. В дальнейшем для записи MFM файла в бинарном формате примем R равным 1, а N равным 0. В MFM файл записываются уже на один бит данных два бита смены намагниченности. Таким образом, размер данных MFM файла по сравнению с ADF файлом будет удвоенный. Но просто преобразовать ADF в MFM нельзя. Amiga использует свой собственный формат записи на дискеты, который потребуется учесть.



Условимся номером трека называть номер дорожки на одной из сторон диска (т.е. номер трека изменяется от 0 до 79), а номером дорожки ((2*номер трека)+номер стороны диска). Номер дорожки изменяется от 0 до159, номер стороны диска изменяется от 0 до 1, номер сектора изменяется от 0 до 11.

В формате Amiga каждая дорожка содержит:

  1. Начальный зазор (128 байт MFM кода 0x00).
  2. Данные 11 секторов по 544 байта на сектор.
  3. Конечный зазор (704 байта MFM кода 0x00)

Каждый сектор содержит:

  1. Маркер начала сектора.
  2. Идентификатор сектора (4 байта: 0xFF, номер дорожки, номер сектора, смещение сектора. Смещение сектора вычисляется как 11 минус номер сектора на дорожке.)
  3. Метка сектора (16 байт 0x00).
  4. Контрольная сумма заголовка (4 байта).
  5. Контрольная сумма данных (4 байта).
  6. Данные сектора (512 байт).

Идентификатор и данные секторов закодированы перестановкой битов. Для идентификатора берутся 4 байта и переставляются биты. Сначала идут нечётные биты (нумерация битов, как обычно, с 0) – это составит 2 байта. Затем идут чётные биты – так же 2 байта. Таблица иллюстрирует вышесказанное. Верхняя строка – стандартный порядок битов (номера в ячейках), нижняя – результат перестановки.



Данные секторов группируются по 2 байта, и перестановка происходит внутри этой пары аналогичным образом:


Контрольная сумма представляет собой операцию исключающее ИЛИ (XOR) всех байт данных сектора или заголовка (с учётом перестановки битов!), сгруппированных по 2 байта. Сама контрольная сумма не подвергается перестановке битов. Хотя поле для контрольной суммы 4 байтное, сама контрольная сумма получится двухбайтная.

Помимо 544 байт данных, закодированных с помощью MFM кодирования, каждый сектор содержит специальный маркер начала данных. Маркер представляет собой комбинацию нулей и единиц, которую невозможно получить MFM-кодированием. Такой комбинацией является комбинация 01000100100010010100010010001001 перед записью которой записываются 4 байта с комбинацией 10101010. Первый байт комбинации 10101010 зависит от предыдущего выданного с помощью MFM кодирования бита. Если последний выданный бит сектора был 1, то этот байт будет равен 01000100, а если там был 0, то 10101010.

Учитывая всё вышеизложенное, дорожка дискеты в формате MFM выглядит так:

  1. Начальный зазор: 128 байт 00000000.
  2. Маркер начала данных сектора:

    10101010 (этот байт зависит от последнего записанного бита и может быть 01000100)
    10101010
    10101010
    10101010

    01000100
    10001001
    01000100
    10001001
  3. Данные сектора без маркера: 1080 байт на сектор.
  4. Повторить с шага 2 для всех 11 секторов.
  5. Конечный зазор: 704 байт 00000000.

Итого, каждая дорожка в MFM-кодировании занимает (1080+8)*11+128+704=12800 байт кода. Если теперь этот код выдать на линию данных с дисковода учитывая временную развёртку дорожки, то Amiga сможет прочесть данные этой дорожки.

Проблема состоит в том, что длительность импульсов данных составляет от 0.15 до 0.8 мкс. В данном эмуляторе выбрана длительность импульсов 0.5 мкс. Это означает, что на частоте работы контроллера 16 МГц у нас будет 32 такта на бит MFM кода. За эти 32 такта микроконтроллер D3 должен производить регенерацию динамической памяти, считывание байта MFM-кода, выдачу бита смены намагниченности на линии дисковода. Чтобы уложиться в 32 такта, эта часть программы написана на ассемблере и строго выровнена по тактам. Операции чтения байта и регенерации памяти разнесены во времени. Это значит, что пока выдаётся побитно байт MFM кодирования, на каждый бит имеется 32 такта и для каждого выдаваемого бита строго определено, какие именно операции мы в эти 32 такта выполняем. Например, при выдаче бита 0 мы можем установить строку динамической памяти (сигнал RAS). При выдаче бита 1 мы можем установить столбец динамической памяти (сигнал CAS). При выдаче бита 2 мы считываем следующий выдаваемый байт данных. И так далее. Таким образом выдаётся весь образ дискеты.

Собственно, вот и получился простейший эмулятор дисковода.

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


Архив с печатными платами, прошивками, схемами и программами.
Tags:
Hubs:
+33
Comments47

Articles