В соседнем треде была презентация моей мини-разработки.
Тут - отдельная тема, с продолжением самостоятельной жизни.
Arduino Floppy DUMP utility - консольное приложение, написанное на python, предназначено для дампования флопиков (главным образом 5.25", но и 3.5" даже PC-шные HD диски по идее должен без проблем захватываться), и для сохранения образов в разных форматах. Работает в связке с микроконтроллером ATMega328(16MHz).
Ссылка на предка - http://amiga.robsmithdev.co.uk/instructions
Вводные данные:
При MFM кодировании один байт информации конвертируется в 4-8 импульсов. Импульс генерируется при развороте направления намагниченности.
В MFM всего возможно 3 разных длительности (4, 6, 8мкс для DD и 2, 3, 4мкс для HD дисков).
Скорость вращения диска - 300об/мин, или 5об/с (бывает 360об/мин, но это не наш случай). Таким образом длительность трека - 200мс, или 200000мкс. То есть для DD диска один трек вмещает 25000-50000 импульсов, а HD диска - 50000-100000 импульсов.
При загрузке данных из Arduino одна длительность кодируется 2 битами (используются комбинации b01 b10 и b11, а b00 - служебный, завершение потока - 0x00). Таким образом мы имеем в одном переданном байте 4 MFM длительности (импульса). То есть каждый байт исходной информации - это 1-2 байта, переданных из устройства.
То есть, длина дорожки при загрузке данных из устройства - это от 6250 до 12500 байт для DD диска. Для HD диска, соответственно, от 12500 до 25000 байт.
DD диски (основная масса 5.25" включая ZX, а также старые 3.5") имеют длину дорожки в исходных данных 6250 байт, HD диски - 12500 байт.
За одну секунду трек загружается 5 раз (поскольку совершается 5 оборотов). Таким образом, плотность информации, загружаемой с устройства в MFM формате - это до 62500 байт в секунду (cps) для DD диска, и до 125000 cps для HD диска.
То есть минимально возможная скорость, при которой HD дорожка будет успевать передаваться через USB-Serial - это 125000*(8+2) = 1250000Кбит/с. Для DD дисков, соответственно, 625000 Кбит/с.
Таким образом для работы с HD дисками скорость работы UART должна быть 2Мбита/с, а для DD дисков достаточно 1Мбита/с. Это необходимо учитывать.
Что нужно:
1. Arduino (варианты)
- а) Устройство на ATMega328 (16mhz), типа того как на рисунке (Arduino Pro Mini) + USB-Uart контроллер - FTDI-совместимый (т.к. без труда 2Мбита прокачивает). CP2102 не подходит (макс 1Мбит).
- б) Вероятно будут работать и Arduino Uno (на AtMega328-16), и другие платы с интегрированными USB-Uart адаптерами на FTDI/FT232RL, обеспечивающие скорость 2Мбит/с. Это надо проверять.
- в) Дешевый Arduino Nano, со встроенным CH340 (без кристаллов) - фирмварь прошивается в режиме Old bootloader. На скорости 2МБита работает с ошибками (~0.02% ошибок), на 1Мбита - ошибок нет, т.е. пойдёт только для DD дисков.
2. Обвязка ардуины
- бредборд (монтажная доска).
- соединительные провода (возможно и без бредборды, если цеплять к самим ножкам ардуины).
- 1кОм сопротивление (для подтягивания линии данных до 5в).
- блок питания и шлейф для FDD.
3. На хостовом ПК
- Windows>=7, вроде и Linux и MacOS (но это не проверялось).
- python>=v3.6. Библиотека pySerial
- Arduino SDK.
Запись дисков не предусмотрена (и, вероятно, не будет), поэтому ардуиновые ножки A0/A1/A2, и 3 не задействованы. Кроме того, поменяны местами ножки 4 и 8 (это все в сравнении с проектом Роба Смита).
Если используется Arduino с UART, не дающим безглючные 2Мбита, то HD диски читать не получится. Однако, с DD дисками возможно будет работать. Для этого необходимо сообразно поправить скетч (.ino файл строка вначале "#define BAUDRATE 2000000"), и сам .py файл (строка "ser.baudrate=2000000"), на, соответственно 1000000.
Схема:
Мой сетап:
Питание для дисковода отдельное. Шлейф - родной спектрумовский. Ножки 10-12-14-16 разъема соединены между собой на монтажной платке (чтобы было пофигу - перевернут кабель или нет). Шлейф насажен на обычные недорогие контактные штырьки (причём впаяно не всей гребенкой, а по-отдельности штырьки, а для земли всего 1 линия) - покупкой 34-пинового разъема не заморачивался. Шлейф воткнут с обратной стороны (на фото не видно).
--------
Зачем вообще? Материнки перестали делать с FDD контроллерами, raw driver никак не подцепишь. Да даже если подцепишь — этот raw driver весьма ограничен в своих возможностях «подкрутить» параметры чтения, что мешает нормально читать некоторые не очень качественные диски.
Ардуино — дёшево, и сердито (это попытка выжать максимум из 8мибитного 16мгц микроконтроллера с 2кб ОЗУ), прекрасно работает с 5в устройствами, и есть почти в каждой российской семье. Люди относятся к Ардуине, как платформы для захвата, весьма скептически. Вот и посмотрим.
Альтернативы:
- greaseweazle - неплохой проект, работает на недорогой STM32 "blue pill", захватывает поток по таймингам не хуже kryoflux, но плохо дружит с 5.25" дисководами (вроде этот аспект недавно поправили - дребезг оптического датчика индекса теперь _вроде_ фильтруется). Но хостовая часть пока мало что позволяет. Плюс он появился позднее, чем я начал свой проект, так что пусть.
- Arduino floppy disk reader/writer - проект-предок сабжа. Умеет даже писать, но не всеядный - ориентирован на Амиги, и вообще, достаточно плохо оптимизирован с точки зрения firmware, не умеет HD диски, тайминги захардкодены. То есть очень узкозаточенный.
- FluxEngine - неплохой вариант. Построен на достаточно экзотичной плате CY8CKIT-059, которая дороже Arduino раз в 10 (но с учетом необходимого FTDI - всего раз в 5), умеет писать некоторые форматы, но спектрумских вообще не знает.
- всякие дорогие устройства (сами знаете).
--------
Текущая версия скрипт + фирмварь:
0.01b http://volutar.eu5.org/afd001b.7z
--------
История изменений:
2020-08-07 v0.01b - подстройка под тайминги для каждой дороги, дорожки за 80й обрезаются (если пустые), вывод красивой статистики
2020-08-05 v0.01a - первый релиз, сохраняет UDI, настроена на стандартные тайминги DD дисков 32/48/64 (4/6/8мкс)