Наконец-то подключил дисковод так чтобы можно было читать диски. Это было такое шаманство, которого наверное не было еще никогда у меня в жизни.
На всякий случай напишу здесь как это мне удалось, может когда-нибудь опять мне это понадобится и может кому-то будет интересно. Потому что многие кому удается подключить не пишут как это у них получается, и я тоже не написал в своё время. И то, что я не описал, как это было сделано, я считаю ошибкой, которая наверняка привела к потере времени в этот раз.
Что я имею:
- Мат. плата 2010 года Gigabyte GA-X58A-UD5. Есть разъем для подключения FDD. Плата поддерживает только один дисковод, о чём даже написано в мануале и видно из BIOS по невозможности настраивать драйвы отличные от A.
- Дисковод Электроника МС 5313 1992 года. Контакт 34 заклеен изолентой. Перемычка замкнута так чтобы он был первый (B).
- Windows 7 SP1 x64.
Дисковод я подключил после скрутки на кабеле - так у него запустился двигатель. Подключение до скрутки приводило к тому что мотор не работал. В остальном никаких особенностей физического подключения нет (кроме заклеенного 34 контакта и положения перемычки).
Загрузка Винды делается по F8 с выбором пункта Disable Driver Signature Enforcement, чтобы Винда не отключала драйвер, т.к. он не подписан. В WinXP в этом не было необходимости, а в Win7 есть.
Что я только не пробовал:
- Программу ZX Disk Studio с новым драйвером fdrawcmd.sys (версии 1.0.1.11). Ей удавалось прочитать только каталог (нулевой трек). При сканировании дорожек она обнаруживала только по 9 секторов на дорожке и видела только чётные треки, т.е. только нижнюю (нулевую) сторону. Прочитать ей удавалось всего несколько треков, после чего она выдавала ошибку 21 и отказывалась читать дальше. После замены шлейфа она почему-то стала видеть по 16 секторов на дорожке, но по-прежнему только чётные дорожки, причем читая например трек 6 могла реально прочитать трек 2 (я читал ею диск, прочитанный мной еще в 2007 году полностью, и это давало мне возможность по содержимому треков определить какие реально треки она прочитала, и оказалось что заявленные ею треки не соответствовали реально прочитанным).
- Утилиту MAKETRD (она же WINTRD) на новом драйвере (1.0.1.11), на котором она то работала (точнее, пыталась, выдавая сообщения об ошибках на диске, т.к. не могла ничего прочитать), то отказывалась работать вообще.
- Эту же утилиту MAKETRD на старом драйвере (1.0.0.19) - диски не читала, всё время disk error.
- MAKETRD со старым драйвером (1.0.0.19) на WinXP (установил на отдельный винт для этого) - диск не могла прочитать, всё время ошибки. В 2007 году я читал диски именно с помощью MAKETRD в WinXP, но сейчас это не заработало.
Сам факт успешного прочтения каталога программой ZX Disk Studio натолкнул меня на мысль, что контроллер и дисковод работают нормально, а невозможность прочитать остальные треки проистекает из софта. Поэтому я решил написать свою программу чтения используя всё тот же драйвер. Но у неё оказалась та же проблема: читает только нулевой трек, а остальные драйвер читать отказывался выдавая различные ошибки, впечатление было что они случайные и смысла не несут (21 - The device is not ready, 23 - Data error (cyclic redundancy check), 27 - The drive cannot find the sector requested, 1122 - No ID address mark was found on the floppy disk). 21-я была самой абсурдной из них (позже оказалось что такая ошибка возникает скорее всего когда драйвер не может увидеть формат на диске, т.е. видит его как неформатированный). Я решил что причиной является проблема в драйвере и что придется писать драйвер самому, уже даже стал читать документацию по контроллерам.
Пару дней назад я склонялся к тому что вся моя идея по подключению не удалась и собирался всё бросить. Удалил новый драйвер, поставил старый (версии 1.0.0.19), и решил проверить как моя программа будет читать с ним. И вдруг оказалось что она прочитала первый трек (16 секторов, точнее; все треки я читал посекторно). Потом она прочитала трек на ненулевом цилиндре, по-моему на пятом или десятом, - то, что раньше не получалось сделать. Поняв что я теперь могу прочитать весь диск, я по-быстрому, на всякий случай не перезагружая Винду, написал цикл чтения всего диска и наконец-то это всё стало работать: старый драйвер на моей плате оказался способен прочитать диск. Новый - нет. Он имеет явно другое поведение, это видно даже по характеру позиционирования. Я уже потом устанавливал его снова и проверял как работает на нём уже протестированный код, и оказалось что лишь изредка ему удается прочитывать сектора вне нулевого трека, мне на глаза попалось только 2 таких случая.
По поводу долбления головки в нулевой трек. С какого-то момента головка стала долбиться не всегда, иногда она доезжает до нулевого трека и корректно останавливается. Поэтому сигнал TR00 там есть и контроллер его видит. Почему иногда TR00 виден, а чаще всего нет, так и осталось загадкой. Головка у меня по-прежнему долбится в нулевой трек, за редкими исключениями. Но диски читаются. В драйвере не оказалось функции шага назад и шага вперед, с которыми можно было бы избавиться от большей части долбления даже при отсутствии сигнала TR00, поэтому приходится это всё терпеть. Вообще, драйвер оказался не таким низкоуровневым как хотелось бы. Он даже принудительно гонит головку на нулевой трек при попытке обычного чтения сектора, хотя его никто об этом не просит (он так делает если предыдущее чтение дало определенную ошибку). В большинстве случаев он после этого не позиционирует головку на нужный трек, после чего пытается прочитать например десятый трек в нулевом положении головки. Это у меня превратило чтение плохо читающихся дисков в ад.
Итого, мои выводы о причинах когда что-то не работает:
- Проблема может быть в драйвере. Он может не соответствовать контроллеру FDD на мат.плате. Если что-то не работает, то вероятно драйвер не подходит и работает с контроллером неправильно. Можно конечно обвинять железо в том что оно не подходит драйверу, но драйвер редактируется гораздо проще железа.
- Проблема может быть в программе читающей диск через драйвер. Даже с драйвером который в принципе может прочитать диск на имеющемся железе, некоторые программы не могут это сделать почему-то, т.е. не могут использовать возможности драйвера. Хотя на другом железе и операционной системе эти же программы могут нормально работать через тот же драйвер.
Несмотря на то что в других темах есть много обвинений в адрес железа и операционной системы, я проблем конкретно с этим не увидел, а видел что причина почти наверняка в софте: драйвере и программе чтения. В моём случае она в софте и оказалась, причем сразу в обоих этих местах.
Еще надо отметить важность чистоты головок. У меня много дисков оказались пыльными и головки загрязняются быстро и настолько, что один отлично читающийся диск перестает читаться полностью пока не промыть их. Когда у меня перестал читаться каталог я думал что я сделал что-то не так с настройками, пока не промыл головки и не увидел что всё снова стало читаться. Засоряются наглухо, так что создается впечатление что нарушилось подключение дисковода. По крайней мере с моими дисками, условия хранения которых были довольно мрачными.
То, что заработало:
- Драйвер версии 1.0.0.19. Подошел к моей плате. Версия 1.0.1.11 не подходит, он может прочитать только нулевой трек, а в остальных местах диска чтение удается крайне редко, непонятно по какой причине.
- Мой код чтения диска. Использует обычные функции драйвера, которые описаны в его документации и взяты прямо из примеров копи-пастом. То есть ничего особенного. Конкретно используется функция чтения сектора.
- Скорость передачи данных 250кбит/сек, метод MFM.
- В BIOS дисковод установлен как 3.5" 720K. Но это ничего не меняло у меня. Всё хорошо работало при любом типе дисковода, по крайней мере в моей программе (а вот у ZX Disk Studio была разница, поэтому в принципе этот параметр может оказывать влияние).
UPD (22.04.2020):
Драйвер версии 1.0.1.11 мне всё-таки удалось запустить. То что я подумал что он работает плохо могло быть вызвано плохо читающимися дисками. Хотя я отдельно, и, как мне казалось, хорошо проверял это, но похоже недостаточно хорошо.