Программа читает диски через драйвер fdrawcmd.sys (https://simonowen.com/fdrawcmd/). Версию драйвера не проверяет, поэтому можно запускать с любым и смотреть что получится. На моём железе заработала с драйвером версии 1.0.0.19 (позже заработала и с 1.0.1.11).
Что может делать:
• Читать диски (5.25'' Double Density) форматов TR-DOS, IS-DOS, CP/M посекторно, до 172 треков.
• Дочитывать только непрочитанные сектора. Очень экономит время на плохо читающихся дисках.
• Читать только указанный диапазон треков на диске. Позволяет пропустить области диска которые заведомо нечитаемы и сразу сосредоточиться на указанном треке у которого есть потенциал прочитаться. Это также ускоряет чтение верхней стороны имеющей разные форматы в разных местах: можно указывать формат и нужные треки и сразу читать их, не тратя время на сбор ошибок на других треках.
• Читать диски в обратном направлении. Как ни странно, у меня это улучшало чтение.
• Сохраняет образы в TRD и FDI. Можно позже загрузить TRD/FDI-образ и снова попытаться прочитать только bad-сектора.
При сохранении образа в TRD его bad-сектора заполняются символом B (как это делает WinTRD). Необработанные сектора (у которых не было попытки чтения) заполняются символом N. При загрузке образа по этим меткам определяются плохие и еще не читавшиеся сектора.
• Может читать верхнюю сторону двумя способами: задавать верхнюю сторону равной 0 либо 1. Оказалось что на Спектруме было 2 вида форматирования верхней стороны. В одном случае в трек писалось что это сторона 1, в другом писалось что это сторона 0. TD-DOS читал оба таких формата без проблем. Драйвер fdrawcmd.sys имеет с этим сложности: он требует передачи ему информации о физической головке и о стороне указанной в разметке диска. Физическая головка говорит драйверу какую сторону диска прочитать. Но он еще делает сверку с разметкой на диске. Если сторона переданная драйверу не совпадает с тем что он видит на диске (что указано в заголовочной области сектора), то драйвер выдает ошибку 21 (the device is not ready). Поэтому драйверу нужно передавать нужную логическую сторону в зависимости от того как отформатирован диск.
• Может читать только одну сторону: верхнюю или нижнюю, либо обе стороны. Практика показала что иногда бывает быстрее прочитать диск по сторонам отдельно, потому что верхняя сторона может быть отформатирована разными способами и должна читаться с разными настройками. У меня были диски где формат менялся много раз. Так получалось потому что я мог форматировать диск много раз и делать это разными программами и каждый раз не до конца, т.е. прерывая форматирование, поэтому разные виды форматов могли таким образом наложиться. Этой программой можно прочитать отдельные области верхней стороны диска указывая формат для каждой области.
• Интерфейс имеет смесь русского и английского. Не стал это менять.
Терминология
Обработанный сектор – сектор у которого была попытка чтения. Это либо успешно прочитанный сектор, либо bad-сектор.
Необработанный сектор – сектор у которого не было попыток чтения. В образе такие заполнены символом N.
Bad-сектор – сектор у которого была попытка чтения, которая оказалась неуспешной. В образе такие заполнены символом B.
Good-сектор – успешно прочитанный сектор.
Нулевой сектор – Good-сектор содержащий одни нули.
Описание интерфейса
Track From – номер трека с которого будет производиться чтение.
Track To – номер трека до которого будет производиться чтение. Сам этот трек читаться не будет.
Параметры Track From и Track To отображаются черной полосой над картой образа. Их можно поменять сделав выделение мышью на карте образа. Двойной клик по этой полосе - установка с 0 по 180.
Read Side – читаемая сторона диска: верхняя, нижняя или обе. Влияет только на то какая сторона читается. Диск всегда считается двухсторонним.
Disk Format – формат верхней стороны диска. “Upper Side As 0” означает что верхняя дорожка отформатирована как нулевая сторона. В этом случае при чтении верхней стороны драйверу дается указание прочитать с верхней головки сторону с номером 0. “Upper Side As 1” означает что верхняя дорожка отформатирована как первая сторона: драйверу указывается прочитать с верхней головки трек имеющий сторону 1.
Track Read Attempts – количество попыток чтения трека как партии из 16 секторов.
Sector Read Attempts – количество попыток чтения сектора.
Кнопки:
- New – создание образа. При создании указывается размер образа в треках и его имя. Образ создается также автоматически при запуске приложения.
- Load – загрузка образа trd. При загрузке также указывается размер в треках. Можно указать 0 и тогда будет автоопределение.
- Save – сохранить образ в формате TRD. Образ сохраняется до последнего сектора, у которого была попытка чтения, включительно. Последние сектора, у которых не было попыток чтения, не сохраняются. Сохраняется минимум два трека – нулевой и первый, даже если первый трек не читался – это сделано чтобы файл мог быть прочитан в UnrealSpeccy, который выдает ошибку если TRD состоит только из нулевого трека.
- Set Size – изменить размер образа в треках. При уменьшении размера лишние данные теряются. При увеличении – нет.
- Merge – слияние образов TRD. Делал чтобы слить образы полученные разными чтениями WinTRD. Для этого сначала надо загрузить или создать один образ, потом нажать Merge и указать образ для слияния. В логе будет указано количество добавленных good-секторов. Можно делать слияние несколько раз. Плохие сектора в загружаемом образе определяются как полностью заполненные символом B.
- Show Catalogue – показ каталога образа.
- Show Cat From Track – показ каталога с указанного трека образа. Были коммандеры которые сохраняли копию каталога на 160 или 162 трек, можно их просмотреть по этой кнопке.
- Read Forward – чтение диска. Читаются только те сектора, которые не были до этого успешно прочитаны. Чтение идет от Track From до Track To (не включая его; при условии невыхода за пределы образа и при условии что Track To > Track From). Для каждого трека сначала делается попытка прочитать 16 секторов партией, количество попыток задается параметром Track Read Attempts. Если это не удалось, то включается чтение по отдельным секторам, количество попыток – Sector Read Attempts.
- Read Backward - Чтение диска в обратном направлении. В остальном аналогично Read Disk,
- Read Random Sectors – случайное чтение отдельных секторов. Читаются только сектора которые еще не читались или оказались битыми. Выбираются только в пределах Track From и Track To и только на указанной стороне (либо на обоих). На моём железе читаемость сектора по какой-то причине носит серийный характер, и если сектор не прочитался, то высока вероятность того что не прочитается и следующий, вне зависимости от того где он находится. Я эту функцию не особо много использовал, но в некоторых случаях она позволяла прочитать дополнительные сектора, которые находились после битых и которые по этой причине не позволял прочитать эффект серийности.
- Read Catalogue – чтение каталога (9 секторов) с диска и показ в отдельной форме. Данные не сохраняются, на имеющийся образ не влияют.
- Abort – прекращение чтения. Реакция происходит не сразу, а с некоторой задержкой, связанной с ожиданием завершения текущей операции драйвером.
- Build Disk Table – построение таблицы дисков (trd-образов), с указанием их размера, количества bad-секторов, файлов и поврежденных файлов, а также общая статистика – сколько секторов прочитано, сколько битых. Сохраняется в виде HTML.
- Build Maps – построение карт для указанных trd-образов, где отмечены хорошие, битые и нулевые сектора. Сохраняется как HTML.
- Build Sector Content Maps – построение карт содержимого секторов для указанных trd-образов. Определяет исходники TASM4.0 (иногда выдавая ложноположительный результат, но мне было качества достаточно), GENS, графику, текст, нулевые сектора и код. Я использовал эту функцию для поиска своих исходников на дисках.
- Build Duplicate Maps – построение карт секторов-дубликатов. У меня были случаи когда сектор прочитывался из другого места диска, например вместо сектора 0 читался сектор 1, из-за чего происходило искажение данных, и драйвер никак не регистрировал ошибки, выдавая данные как валидные. Не помню чтобы такое было на реальном Спектруме, но на двух PC-контроллерах у меня такое встречалось минимум 7 раз из 280 000 секторов. Чтобы находить такие случаи я написал эту функцию, но она далеко неидеальна, т.к. оказалось что дублирование секторов это часто встречающаяся вещь даже на валидных данных. Строит она сектора которые по содержимому полностью совпадают друг с другом, находятся в пределах 16 секторов друг от друга и не идентифицируются как графика (у графики очень высокий процент дублей сам по себе), сохраняется как HTML.
- Mark Sector Unprocessed – маркировать сектор в образе как необработанный. После этого при чтении диска программа будет пытаться его прочитать. Сделал чтобы снова перечитать сектора-дубли в некоторых дисках.
- Build File Table – построение таблиц файлов для указанных trd-образов. Поврежденные файлы отмечаются красным цветом, указывается количество bad-секторов у них. Сохраняется как HTML.
- Driver Version - показ версии драйвера и типа контроллера.
Использование
Настроить параметры чтения, после чего нажать Read Forward. Перед этим можно загрузить образ из TRD.
UPD: Есть пример когда программа не может прочитать один из секторов трека, при том что ZX Disk Studio читала диск успешно.
Проблема чтения первых секторов решается закрытием индексного отверстия на диске.
Программа написана на C# и требует .NET Framework 2.0.
UPD
В версии 1.0.0.10 добавлено автоопределение параметра Head верхней стороны и чтение дисков CP/M.
17.07.2020: В версии 1.0.0.11 добавлено чтение формата IS-DOS.
21.07.2020: Добавлен формат FDI.
14.01.2021: В версии 1.0.0.15 добавлен выбор дисковода. Сделано чтение кастомных форматов, но не полностью.
Исходник (C#, Microsoft Visual Studio 2015): https://github.com/dalvx/SpectrumArchiveReader