1 Отредактировано sintech (20-12-2017 14:05)

Тема: Использование эмулятора дисковода для сдампливания дисков

В один прекрасный день мне пришла идея: если эмулятор это полностью программно определяемое устройство, то почему бы не заставить его работать в обратном направлении?

Все управляющие сигналы с дисковода подведены к отдельным ножкам teensy, т.е. можно программно поменять входы с выходами и подключить к 34 контактному разъему вместо платы контроллера, сам дисковод стандартным PC кабелем.
Далее можно написать прошивку для контроллера, которая будет проходить по всем дорожкам и считывать данные, путем замера длинны паузы между импульсами нулевого уровня на выходе READ дисковода. Эти данные достаточно легко преобразовать в битовый поток, примерно как я описывал в https://github.com/sintech/AGAT/blob/ma … nalysis.md
Остается вопрос, где хранить сырые mfm данные? Можно конечно сохранять их на SD карте, но довольно неудобно управлять процессом тремя кнопками эмулятора.
Поэтому было решено передавать сырые данные каждой прочитанной дорожки по USB через RAWHid устройство, которым может притворяться Teensy.

В качестве основы для PC клиента я выбрал python, который имеет кроссплатформенные Hid библиотеки.
Данные через RAWHid можно передавать только блоками по 64 байта, поэтому на стороне Teensy прочитанные данные разбиваются на блоки со свом заголовком и метаданными (дорожка, номер блока и т.д.) и затем передаются на PC, где вновь объединяются и передаются в функцию анализатор.
Анализатор согласно формату находит все desync последовательности и проходя по ним, считывает следующие два (четыре MFM) байта, если это поле адреса, то в словарь (python dict) сохраняется номер дорожки и сектора. Если недалеко от от поля адреса располагается поле данных, то производится его декодирование из MFM в обычный список байт и расчет контрольной суммы. Если КС совпадает с тем что считалось с диска, то поле данных также сохраняется в словарь.
Для надежности было решено считывать данные в течении трех оборотов дискеты, поэтому при анализе если блок данных совпадает с уже записанным в словарь, то счетчик успешных чтений инкрементируется, таким образом мы можем узнать качество прочитанного для каждого сектора в отдельности, или даже попробовать еще раз перечитать дорожку если у одного из секторов нет успешно прочитанных данных.
После того как все дорожки прочитаны, можно сохранить все поля данных в файл получив на выходе DSK образ дискеты. Но т.к. на вход программы передается сырой битовый поток, а также есть возможность сохранить информацию о начале и конце импульса индексного отверстия, то на выходе можно получить AIM, MFM или любой другой формат.
Управляет процессом чтения та же python программа, посылая в сторону эмулятора команды: включить двигатель, на какую дорожку передвинуть головку, выключить двигатель и т.д.

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

Уже готова альфа версия в виде отдельной прошивки для Teensy в составе эмулятора дисковода 140+840, требуются минимальные изменения схемы (соединить три контакта 34 разъема). В дальнейшем планируется выпустить новую прошивку с возможностью переключения режимов путем, например зажатия кнопки при включении питания эмулятора.

Скоро будет демо, и видео работы ;)

Жду советов и предложений.

2

Re: Использование эмулятора дисковода для сдампливания дисков

Круто! Буду собирать себе эту штуку как только закончите с прошивкой.

3

Re: Использование эмулятора дисковода для сдампливания дисков

Отличная идея!

sintech пишет:

Анализатор согласно формату находит все desync последовательности

Как он их находит? Расскажи, плиз.

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

4

Re: Использование эмулятора дисковода для сдампливания дисков

LeoN пишет:

Отличная идея!

sintech пишет:

Анализатор согласно формату находит все desync последовательности

Как он их находит? Расскажи, плиз.

Я определил для себя "магическую" последовательность 0x89245555 (0100010010010010 0 0101010101010101), которая представляет из себя ни что иное как закодированные в MFM байты A4 FF разделенные 2мс промежутком. 2мс промежуток считывается как дополнительный 0 между единицами.
Алгоритм считывания простой:

     if (zero_len < 450) {
        oneword = oneword << 2 | B10;
      }
      else if (zero_len > 450 && zero_len < 650) {
        oneword = oneword << 3 | B100;
      }
      else if (zero_len > 650) {
        oneword = oneword << 4 | B1000;
      }

zero_len это кол-во тиков процессора между единицами.

По итогам работы над этим проектом я понял, что время чтения дискеты, передачи на PC, преобразования и сохранения в DSK образ слишком большое, порядка 4-5 минут. Его можно сократить примерно в 2 раза, убрав трехкратное перечитывание дорожки для более надежного декодирования. Но все равно получается слишком медленно и не очень удобно.
Поэтому в финальной версии буду все-таки делать управление с кнопок в пакетном режиме: каждое нажатие кнопки будет считывать данные и сохранять в сыром формате на SD карту с именем IMAGE_XXX.NIB для последующего декодирования на PC.
Знания, полученные в ходе экспериментов, будут использованы для создания поддержки записи в текущей версии эмулятора. Тем не менее, запись будет работать только в тех программах, которые пишут посекторно, через RWTS. Программы, пишущие больше одной дорожки подряд, будут думать, что у них ничего не записалось.