Я довольно быстро задумался, как сделать восстановление дискеты действительно работающим. Обычный сценарий программы Greaseweazle сводится к повторному чтению носителя. Для всего диска заранее задаётся одинаковое число оборотов, хотя исправной и почти погибшей дорожке нужна разная степень внимания.
Мне хотелось, чтобы программа сама оценивала результат после каждого прохода. Хорошие секторы нужно было запоминать сразу, а к плохим возвращаться с другой тактикой. Поэтому я решил построить собственную схему чтения и собирать итоговый образ из лучшего, что удалось найти в разных попытках.
Первый проход должен быть быстрым
Кнопка «Восстановить весь диск» начинает с одного оборота по всей поверхности. Первый проход не пытается получить идеальный образ. Он определяет формат, находит исправные дорожки и показывает области, где чтение разваливается.
Если программа не смогла подтвердить больше четверти дорожек, она ещё раз проходит весь диск. Автомат постепенно увеличивает число оборотов до 2, затем до 4 и 8. Каждое чтение добавляет новые наблюдения в общий набор, но не стирает предыдущие результаты.
Хороший сектор остаётся хорошим
Повреждённая дискета редко читается одинаково дважды. Слабый магнитный переход иногда пересекает порог компаратора, а иногда пропадает. Головка при новом запуске встаёт немного иначе, и небольшое изменение скорости тоже меняет результат.
Revival поэтому декодирует каждую попытку отдельно, а потом объединяет секторы с правильной контрольной суммой CRC. Если сектор однажды прочитался без ошибки, следующее плохое чтение уже не сможет его вытеснить. Новый проход либо улучшает образ, либо оставляет его прежним.
Программа сохраняет и сами исходные наблюдения. Сейчас она может накопить до 32 оборотов на физическую дорожку. Когда место заканчивается, Revival не выбрасывает единственное чтение, которое подтверждает уже найденный сектор.
Плохим дорожкам достаётся больше времени
После общих проходов автомат возвращается только к оставшимся дорожкам. Если несколько попыток не приносят результата, программа увеличивает число оборотов по последовательности 3, 5, 8 и 13. Исправная часть дискеты больше не тратит время впустую.
Каждый новый вызов программы Greaseweazle заново выбирает привод, запускает мотор и устанавливает головку. Эта небольшая механическая разница полезна, потому что очередная попытка часто ошибается уже в других местах. Автомат использует эту вариативность вместо простого повторения одного и того же чтения.
Когда целого сектора нет ни в одной попытке
Иногда ни одно чтение не даёт правильный сектор целиком, но ошибки попадают в разные байты. Тогда Revival сравнивает накопленные варианты, выбирает наиболее убедительное значение каждого байта и проверяет собранный сектор по CRC, записанной на самой дискете.
Если контрольная сумма совпала, программа помечает сектор как Reconstructed. Автомат уже может прекратить чтение этой дорожки, но не выдаёт реконструкцию за обычный достоверный результат. В отчёте сохраняется разница между сектором, который хотя бы раз прочитался целиком, и сектором, который пришлось собрать из нескольких попыток.
Сейчас автомат ещё не меняет параметры фазовой автоподстройки, тайминги, скорость шпинделя и положение головки. Он также не объединяет чтения с разных приводов без участия человека. Однако основа уже работает: Revival сам распределяет усилия и не забывает ни одного хорошего сектора, который однажды удалось прочитать.