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

    У многих сохранились дома компьютеры 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 мы считываем следующий выдаваемый байт данных. И так далее. Таким образом выдаётся весь образ дискеты.

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

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


    Архив с печатными платами, прошивками, схемами и программами.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 46

      +1
      Крутотень!
        0
        Настоящая крутотень у tnt23. :) У него всё на одном контроллере — мне такое недостижимо (шаг ножек у таких контроллеров мал, нужно у китайцев платы заказывать, но я до этого ещё не дошёл).
          +1
          А если на STM32?
          Можно даже немного упростить себе жизнь, сделав из неё Arduino (проект stm32duino).
          По цене не шибко дороже получится.
            0
            Можно и на STM32. Главное, продумать, как. Дисковод только кажется простой и медленной игрушкой, но по факту тайминги там очень маленькие и для их отработки в машинах использовались чисто аппаратные средства.
        +2
        Как я понял, память используется для хранения всех данных дискеты. Не совсем понятно, зачем это сделано. В дисководах же применяется механика, а значит есть приличные задержки при переходах между дорожками, и можно подгружать данные напрямую с карты в эти моменты.
          0
          Да вот есть и такие устройства. Непонятно, только, как работающие:

          1) SD-карта пишет и читает блоками по 512 байт. После выдачи ей 512 байт на запись происходит пауза, пока контроллер карты запишет данные и ответит.
          2) Импульсы перемагничивания имеют длительность 0.1-1.1 мкс. На частоте 40 МГц это будет от 4 до 40 тактов. Внешнее прерывание такое отловит, но всё равно, время мало…
          3) Между импульсами перемагничивания 2 мкс.

          Выходит следующее. Запускаем SD-карту на выдачу блока 512 байт, считываем его побайтно и выдаём данные. Одновременно ловим прерывание перемагничивание и заполняем буфер на 512 байт. По окончании (если была запись) забрасываем этот блок на SD-карту. При этом нужно постоянно анализировать смену дорожек и поверхности диска (если смена будет когда SD-карта ещё не дочитала блок, нам придётся завершать чтение и дозаписывать карту). Запись блока на SD-карту займёт 512 байт*8 бит в байте/20 000 000 бит в секунду по spi *1000000 микросекунд в секунде= 205 мкс без учёта задержки на ответ контроллера. Это значит, что мы гарантированно пропустим импульс перемагничивания на стыках блоков.
            0
            Я конечно уже нефига не помню, но не для этих-ли целей была 34 нога, что бы её поднимать на это время?
              0
              Да, есть такая штука — Disk Change. Но Amiga всё равно недовольна. :)
          +1
          А если взять такой алгоритм:
          при команде считать сектор по определенной дорожке — считывать всю дорожку в определенное место в DRAM.
          при следующей комманде считывания сектора другой дорожки — аналогично

          так постепенно весь диск будет в памяти и минимальные задержки, только необходимые.

          Как мнение, не нужно сразу выплевывать данные при команде чтения сектора, в реальности же головка пока синхрометку найдет, пока спозиционируется->счет на миллисекунды. Поэтому можно не весь образ в память загонять, а только необходимую часть.
            +1
            >> комманде считывания сектора
            AFAIR с флопа Amiga читает дорожку целиком и декодирует MFM «ручками».
              0
              У меня была первая версия, где я считывал и хранил одну дорожку во внешнем ОЗУ. Но не успевает atmega на 16 МГц такой фокус проделать — при всей механике дисковода, он всё-таки довольно быстр. Amiga не хотела долго ждать, и периодически выбрасывала ошибку чтения. Поэтому от этого варианта я ушёл. Тут нужен контроллер побыстрее.
              +3
              Atmega… ребята, 21 век на дворе! Платка в Китае на STM32103C8T6(гуглить по маркировке) стоит меньше 2-х баксов! Гонится до 128Mhz(вместо штатных 72-х) легко! Прошиваются все 128Kb ROM(вместо гарантированных 64Kb), RAM 20Kb. Дисплей можно взять на ILI9341 и подключить по SPI. При желании можно взять с тачскрином и подключить все на один SPI. Всего их два, так что и на SD-шку хватит. А уж про DMA даже не говорю — запихал в буфер, скомандовал "Шли!" и сам делаешь что хочешь.
              Ну а если без внешней памяти уж совсем никак — смотреть в сторону Nucleo с большими чипами с кучей выводов и Flexible Memory Controller.
                0
                Ну, это понятно. Только не было у меня STM32 на момент разработки этого эмулятора. А был ЛУТ и микросхемы в dip и soic.
                  0
                  Ну и ещё atmega очень простая в программировании и очень предсказуемая по работе (дёрнуть ножку порта — 2 такта и так будет всегда) — почти как мой любимый Z80. У stm32 всё-таки повозиться придётся много с настройками регистров. Вот к примеру, я не уверен, может ли DMA дёргать ножками с длительностью 0.5 мкс и периодом 2 мкс и выдавать развёртку байта последовательно? Тут, наверное, spi надо к DMA подключать — он как раз последовательно биты выбрасывает. А подключается он так? Не знаю. Надо смотреть документацию.
                  Вот, если лень поборю, напишу следующую статью про копирование RFID-меток стандарта em-marin. Там тоже у меня atmega8 использована, как очень простая и удобная. А плату с stm32 я приберегу для подключения по USB тепловизора Flir One. Правда, я ещё не читал, умеет ли режим хоста stm32.
                    +1

                    Режима хоста в stm32f103c8t6 нету. В старших даже Ethernet и SDRAM есть.

                      +1

                      Дергать ножками (модифицируя все 16 значений ножек) частота 72/4=18 MHz через dma.
                      Время редактирования истекло :(

                        0
                        Не, я заказал STM32F103VET6 для модуля Lepton, но решил сам модуль из тепловизора не вытаскивать, а подключить по USB. Но пока не смотрел, что там на борту кроме большого ОЗУ.

                        Дергать ножками (модифицируя все 16 значений ножек) частота 72/4=18 MHz через dma.


                        Побитно? Просто выдавать надо побитно. Иначе 12800 байт дорожки превратятся в 102400 байта (12800*8).
                          +1

                          Ножками можно дергать процессором. Все остальное через DMA (screen, sd). Я себе FPGA купил. Его ресурсов хватит на такую задачу. FMC (fmc != fsmc прочитайте разницу в гугле) можно для доступа к памяти.

                            +1

                            В вашей плате есть: SDIO, LCD Controller, fsmc (контроллер статической памяти (sram, nand, nor)). А как вы смотрите на FPGA для таких задач?

                              0
                              Ножками может и не получится. А FPGA штука замечательная. :)
                      +3

                      AMiGA RULEZZ FOREVER!!!!

                        +1
                        Вы, случайно, не тот Byteman с zx.pk.ru? :)
                          +1
                          тот :)
                            +4
                            Как думаете, стоит сюда разместить статью про эмулятор магнитофона для спектрума? Ему, конечно, много лет и все его давно видели, но вдруг кто-то не видел? Этот эмулятор, конечно, не такой навороченный, как у Trol73, но главное там ведь не сам эмулятор, а разбор кодирования сигнала для тех, кто не знает формат сигнала спектрума.
                              +2
                              Однозначно стоит!
                                0
                                А чего у меня спрашиваете то? :) Конечно стоит!
                                  0
                                  Да есть подозрение, что здесь эта тема почти никому не будет интересна. По крайней мере, статей по работе со столь старыми компьютерами тут мало.
                                    0
                                    Вот про эмулятор магнитофона. Особо, правда, там нечего и писать. Но вдруг кому интересно будет.
                            +1
                            Две линейки SIMM общим объёмом 2 мегабайта? Довольно странный выбор в наше время. Не проще было поставить одну статическую озушку? Например, вот такую: IS61WV20488BLL.
                              0
                              Это, конечно, гораздо удобнее было бы. Но в ЧиД, например, такие микросхемы строго под заказ и стоят 1890 р. штука и то BGA-корпус. Ну и корпус TSOP у неё с маленьким шагом между ножками.
                                +1
                                Ну на алиэкспрессе такую озуху в TSOP-корпусе можно было бы раза в два дешевле найти — в районе 12-15 баксов вместе с доставкой. У TSOP шаг — 0.8 мм. Если печатку вручную рисовать, то конечно будет трудновато. Если же воспользоваться лазерно-утюжным методом, то нормально.
                                  +2
                                  Хозяйке на заметку — на али полно плат-переходников с soic/tssop/tqfp на пины 2.54. Очень удобно, например, распаять ОУ в SO8 и воткнуть в макетку.
                                    0
                                    Так можно всё что угодно сделать! :) Главное — фантазия. Я для того и привёл формат дискеты, чтобы нашлись энтузиасты и сделали что-то офигенное. :)
                              +1
                              Статья супер!
                              Однако хотелось бы увеличивающуюся схему по клику.
                                +1
                                Спасибо.
                                Да я бы с радостью, но не знаю, как.
                                  0
                                  Всё, сделал. :)
                                  +1
                                  1. Если уж память (DRAM) с параллельной шиной — то мог оказаться более приемлемым ATmega162 с полноценной внешней шиной (PortA/PortC). Не учерен, правда, насчёт достаточного совпадения с временной диаграммой EDO-памяти — с ней давно не сталкивался и никогда не использовал сам. Но, например, NAND-Flash прицепилась на внешнюю шину (ATmega162 и AT90USB128x) как родная.
                                  2. Какое-то странное согласование уровней между D2 (5 В) и SD-картой (3.3 В). Высокое свободно лупит с выходов контроллера в карту. Или что это такое, на VD1-VD6? (Смотрю по схеме в шапке статьи).
                                    0
                                    1. О, я такой вариант не смотрел. :) Я с 162 дел просто не имел, поэтому не знаю, что она умеет.
                                    2. На диодах падает разница между 5 и 3.3 В.
                                      0
                                      2. На диодах падает разница между 5 и 3.3 В.

                                      Тогда их надо взять штуки три-четыре последовательно. На одном — 0.7 Вольта (1N4148, КД522 и т.п.).
                                        0
                                        Так а не нужно больше двух. Там около 3.5 В получается, и это в пределах допустимого.
                                          0
                                          Да, про 3..4 погорячился. rounddown([5-3.3]/0.7) ~ 2.
                                          «Там» — это на входе карты? Это значит, скорее всего, что уже приоткрывается защитный/паразитный диод в карте и сливает излишки входного тока в цепь 3.3 В.
                                            0
                                            Да, на входе карты. Конечно, защита гасит оставшиеся 0.2 В. Но карта тянет, насколько я помню, до 3.6 В, так что никаких проблем с ней не возникает. Можно, кстати, сделать её питание 3.6 В, заменив стабилизатор.
                                    0
                                    Можно, кстати, сделать её питание 3.6 В, заменив стабилизатор.

                                    Нельзя. Тогда напряжение на входах ещё подрастёт.
                                      0
                                      Почему? Оно наоборот будет в полном балансе с напряжением после диодов.
                                        0
                                        Отнюдь. Вот картинка.
                                        image
                                        В любом случае — напряжение на линии ввода-вывода карты превысит её напряжение питания (насколько — зависит от кремниевой технологии, как правило — плюс 0.6-0.7 В).
                                        И учитывайте, что стабилизатор питания карты может только выдавать ток на свой выход. Если через диод в карте будет натекать ток больше тока потребления карты, то стабилизатор её питания закроется и напряжение на её выводе питания станет расти.
                                          0
                                          Так ведь это другая ситуация. Тут же будет вот что: если карту запитать от 3.6 В, то на входах напряжение 3.6 В останется (оно задаётся двумя диодами и резистором подтяжки).) Следовательно, это никак не скажется на повышении уровня до 4.2 В (на 0.6 В) на входах карты.

                                          Сейчас же сделано именно так, как у вас на рисунке. Карта питается 3.3 В. Следовательно, чтобы полностью открыть защитный диод нужно 4 В. А подаётся на вход 3.6, которое растекается дальше по внутренним входным элементам схемы карты. Кстати, там входе наверняка полевик стоит какой-нибудь и ему особо пофиг эти 0.3 лишних вольта.

                                    Only users with full accounts can post comments. Log in, please.