Программа читает диски через драйвер 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.
- Catalogue – показ каталога TR-DOS текущего образа.
- Catalogue From Track – показ каталога с указанного трека образа. Были коммандеры которые сохраняли копию каталога на 160 или 162 трек, можно их просмотреть по этой кнопке.
- ATM Catalogue – показ каталога ATM-Turbo текущего образа.
- 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 секторов) с диска и показ в отдельной форме. Данные не сохраняются, на имеющийся образ не влияют.
- Read ATM Catalogue – чтение каталога ATM-Turbo (2-й трек считая от нуля) с диска и показ в отдельной форме. Данные не сохраняются, на имеющийся образ не влияют.
- 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 - показ версии драйвера и типа контроллера.
Вкладка HT:
Предназначена максимальной автоматизации чтения большого числа дисков. Чтение диска, вместе с сохранением образа и некоторыми проверками, делается нажатием одной клавиши: вставляем диск, нажимаем кнопку New Disk (F4), диск читается и сохраняется в директорию.
Конкретно по кнопке New Disk происходит следующее:
- Создается новый образ размером Default Image Size треков.
- Определяется формат нулевого трека (TR-DOS, IS-DOS, CP/M).
- Если формат определился, то делается чтение диска (если стоит галка напротив соответствующего формата) в режиме вперед-назад Number of Reads раз. Например, если Number of Reads равен 3, то диск будет прочитан вперед, потом назад, потом снова вперед (всего, таким образом, будет пройден 3 раза).
- После первого чтения вперед, происходит автоопределение размера диска. Определяется формат треков и их соответствие целевому. Изучаются треки которые имеют номер больше чем Default Image Size и меньше чем Max Tracks. Параметр Max Tracks зависит от дисковода, максимально допустимое число - 172. Default Image Size я думаю имеет смысл ставить равным 160 треков. Функцию автоопределения размера диска можно отключить установив Max Tracks равным Default Image Size.
- После выполнения чтения вперед-назад включается случайное чтение (если стоит соответствующая галка). К нему задается таймаут и количество error подряд при чтении секторов - для остановки чтения. 00:00:00 - отсутствие таймаута. Нулевое значение параметра Stop On Nth Fail означает отсутствие ограничения по количеству ошибочных чтений.
- Потом производится автоматическое сохранение образа в указанную директорию (для каждого типа диска своя) по указанному шаблону файла (для каждого типа диска свой). Шаблон задается задается именем файла и непрерывной последовательностью звездочек, которые будут заменены на порядковый номер. Число звездочек обозначает длину числа как строки. Например "Disk ***" будет записываться как Disk 000, Disk 001, и так далее. Расширение будет добавлено соответствующее выбранному формату файла. Формат файла также задается (FDI, TRD, Modified TRD, и KDI для CP/M).
Кнопка Repeat Reading - Заново запустить цикл чтения, но без создания нового образа, автоопределения типа диска и его размера.
Save - Сохранение образа. (Хотя он сохраняется автоматически, но можно это сделать еще раз. Будет сохранен в тот же файл что было сделано ранее автоматом.)
Вкладка Custom Format сделана для чтения кастомных форматов. Форматы, у которых все сектора имеют уникальные номера, должны читаться без особых проблем. Сектора с дублирующимися номерами могут не прочитываться. Читаются только правильно оформленные сектора, т.е. такие которые которые может видеть контроллер. Функционал этой вкладки сделан не до конца.
Существует проблема чтения первого сектора у некоторых дисков. Проявляется она как не найденный первый сектор (обозначенный синим цветом на карте) на всех треках. Решается закрытием индексного отверстия на диске. Закрытие индекcного отверстия несколько затрудняет работу программы в некоторых случаях и это может быть заметно (замедленная работа, лишние движения головки дисковода), но в целом работоспособность сохраняется (программа изначально писалась для дисковода с неработающим индексным датчиком).
На карте образа правой кнопкой можно вызвать контекстное меню, где есть функции маркировки секторов как необработанных.
Использование
Настроить параметры чтения, после чего нажать 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 добавлен выбор дисковода. Сделано чтение кастомных форматов, но не полностью.
23.01.2026: В версии 1.0.0.17 добавлен показ каталога ATM-Turbo на вкладке TR-DOS.
Исходник (C#, Microsoft Visual Studio 2015): https://github.com/dalvx/SpectrumArchiveReader
Исполняемый файл: SpectrumArchiveReader 1.0.0.17.7z


Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

