Тема: Использование эмулятора дисковода для сдампливания дисков
В один прекрасный день мне пришла идея: если эмулятор это полностью программно определяемое устройство, то почему бы не заставить его работать в обратном направлении?
Все управляющие сигналы с дисковода подведены к отдельным ножкам 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 разъема). В дальнейшем планируется выпустить новую прошивку с возможностью переключения режимов путем, например зажатия кнопки при включении питания эмулятора.
Скоро будет демо, и видео работы ;)
Жду советов и предложений.