126 Отредактировано Voldemar0 (05-03-2023 10:04)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Месяц была пауза, занимался kraftway, иногда возился со всякими мелочами, допиливал, подправлял, немного тестировал, всё офлайн. Т.е. плата моста в кладовке уже давно, вообще её не включаю - не трогаю. Почти не трогаю.
Тут были примеры дискет с Радио-РК86/Микроша, их немного посмотрел, также наснимал разных дисков для тестов. Снимал в eim3, просто по одному обороту на трек. Этот формат ещё не установился, нахожу проблемы, буду подправлять ещё.

Основное: отладка цепочки декодеров.
Сами декодеры были закончены где-то в январе ещё, сейчас только микрошу туда добавил.
Но вся сложность в обвесе декодеров.
У некоторых есть настройки - поправка на скорость дисковода, 300/360 rpm, интервальные окна, формат дорожки, максимальное число секторов....
Т.е. если формат известен, то всё просто: просто с одного декодера передаём в другой и на выходе получаем подробный отчёт.

Такая утилита у меня уже есть.
На входе читает старые файлы flux или eim3, для заданного формата записи перебирает всё, что можно настроить в декодерах и добивается корректного раскодирования полей данных. Может записать dsk, но лучше разрешать ей сохранять старый eim-формат, а потом уже его прогонять через rawedit и с него получать dsk.

{
У агата слабая контрольная сумма полей данных: иногда бывает так, что данные битые, а контролька совпала. Rawedit140 имет несколько буферов для каждого сектора + счётчик попыток. По итогу он проверяет, сколько раз встретился тот или иной вариант сектора и выбирает тот, который встречался явно чаще, чем другой. У цепочки декодеров моста3 и у Rawedit840 такого фичи нет. Они только фиксируют факт успешного декодирования двух разных вариантов сектора и считают это ошибкой.

Заметно чаще эта проблема вылезала на 140ке. Возможно, из-за большего числа перечтений во время игр с положением головки. Возможно из-за того, что 840ка, помимо контроля по CRC, также контролирует сектор на наличие сбоев MFM-синхронизации.
}

Но эта утилита не умеет определять формат и rpm.
{ rpm можно сохранять в eim3, но, например, во flux-формате rpm вроде бы не сохраняется... }
И это вызывало у меня некоторую прокастанацию.

В последнем декодере (level 4) есть выходной флаг, которым он отмечает - похожа ли дорога на заданный ему формат или нет. Т.е. чтобы определить формат, нужно просто вызвать все декодеры l4 и посмотреть, кто из них выставит этот флаг.

Но декодер выставит флаг только если действительно опознает формат.
Он может не опознать его если:
- сильное отклонение в скорости записи (300/360 rpm)
- 140ка воткнута в 840ку и на B-стороне имеет 140-формат (нужно реверсировать поток данных)
- и т.д.

=======

В итоге я всё таки сделал для начала массив цепочек декодирования:
цепочка: это полный список настроек для декодирования дорожки.

// Все настройки параметров и цепочки декодеров, с которыми можно что-то раскодировать
struct DECS_CHAIN {
  enum ARCH_TYPE        arch;  // агат840, агат140, pc.... etc
  enum RPM            rpm;  // 300/360
  double            adjust, t_time; // тонкая подстройка скорости, время таймслота
  struct DECODER_L2_CONF    dec_l2_conf;    // pll_table, итоговый bitrate and e.t.c.
  int                reverse; // дорожка крутится в обратную сторону
} decs_chains[3000];

Да, чуть меньше 3000 комбинаций.
Но массив заполняется не тупым перебором, он строится таким образом, чтобы в первые элементы попали наиболее вероятные комбинации.
Он синтезируется примерно так:

static void add_suite_L1(const double adjust, enum RPM rpm, const enum PLL_SET pll_set) {
  add_suite_L2_agat140(adjust, rpm, pll_set);
  add_suite_L2_agat840(adjust, rpm, pll_set);
  add_suite_L2_PC(adjust, rpm, pll_set);
  add_suite_L2_micro(adjust, rpm, pll_set);
}

static void add_suite_L0(const unsigned int drive_type, const double adjust, const enum PLL_SET pll_set) {
  add_suite_L1(adjust, rpm_300, pll_set);
  if (drive_type == DC_DT_D840) add_suite_L1(adjust, rpm_360, pll_set);
}

static void decoders_suites_synthesis(const unsigned int drive_type) {
  add_suite_L0(drive_type, 1.00, one_PLL);
  add_suite_L0(drive_type, 0.97, one_PLL);
  add_suite_L0(drive_type, 1.03, one_PLL);

  const double adjust[] = { 1.00, 0.97, 0.98, 0.96, 1.03, 1.02, 1.04, 1.06, 1.05, 1.07, 1.09, 1.08, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35 };

  for (unsigned int i = 0; i < sizeof(adjust) / sizeof(adjust[0]); i++)
    add_suite_L0(drive_type, adjust[i], all_PLL);
}

decoders_suites_synthesis() - от этой процедуры начинается работа.
В первых трёх строка синтезируются элементы самые вероятные, с минимальным подстройками.
Дальше добавляются возможности более широкой подстройки корректора скорости
(бывает полезно, если скорость диска была нестабильна при записи).

В процедуре void add_suite_L0 добавляется вероятность того, что привод 840ка может иметь
скорость 360. В _L1 добавляются различные форматы записи. В L2 формат PC делится на Standart и High density.  В L3 добавляются разные таблицы автоподстройки фазы (разные для разных форматов записи), L4 добавляет возможность реверса записи и т.д.

Итого: получили массив вариантов настроек, отсортированный по снижению вероятности успеха.

=======

Теперь нужно правильно выбрать стратегию чтения.
Сперва я пытался найти универсальный подход для уже снятых образов и для физических дискет.
Потом понял, что это будет неверно:

==

1) Когда у нас есть много уже снятых данных (eim3, flux...), нет причин не прошерстить всё, что уже есть.
Скорость значения не имеет. Обычно это не один, а много образов, так что загрузить любую современную многоядерную машину нет проблем: зарядил на каждый образ по анализатору и все ядра проца по уши заняты. А я ушел ужинать. Или спать. Специальная утилитка, следящая за загрузкой ЦП, выключит комп, когда всё будет закончено (старый трюк).

В этом случае создаётся один большой пул результатов декодирования на каждую дорожку, затем из образа дёргаем отдельные блоки, смотрим номер физического трека, с которого сняты данные, прогоняем через декодеры и наблюдаем, как накапливаются результаты.
Заодно проверяем и те самые сектора с совпавшими CRC и не совпавшим содержимым.

Прога декодирования даёт развёрнутый отчёт (до нескольких десятков Мб), в котором есть и спектры, и причины неуспешности декодирования данных и ещё статистику эффективности различных настроек декодеров. По ней я понемногу уточняю синтезатор цепочек декодирования (!! сейчас этот синтезатор пока ещё не используется в проге !! Используется более простая версия перебора основных параметров (вложенными циклами)).

Проге можно сказать, чтобы она только добивалась успеха декодирования коротким путём или же прокрутила все возможные комбинации декодеров (полезно для сбора статистики на некоторых интересных дисках).

Прога хороша, но я бы хотел пересадить её на синтезатор цепочек и добиться полностью автоматического декодирования.

{
Игорь заполучил несколько новых коллекций, так что подопытные кошки и кролики имеются.
}

==

2) С дискетами всё по другому. Заранее неизвестен ни формат дискеты, ни записано ли на ней хоть что-то.
- Нежелательно крутить флопик, если мы долго крутим математику.
- Неуверенное чтение лучше сперва починить перечтением дорожки и только потом натравливать долгую математику. Если не получилось, тогда ретрейс головки и снова быстрая математика.

В итоге удалось пока только синтезировать наброски алгоритма чтения диска:

   Здесь важно то, что нам нужно сделать минимальное количество чтений, по возможности сгруппированных по времени
   чтобы между обработкой можно было выключать привод:
   1) Сперва читаем весь диск быстро, без ретрейсов, за 1-2 оборота и останавливаем привод.
      Можно сделать редкие ретрейсы, например, каждые 10 цилиндров.
   2) Анализируем результат: для каждой дорожки пытаемся применять все быстрые цепочки [0.97 < adjust < 1.03].
      Если о предыдущей дорожке нет информации (читаем дорожку 0) - используем все цепочки.
      Если о предыдущей дорожке есть информация - используем её цепочку.
      Если удалось прочитать хотя бы один сектор - пробуем все цепочки, соответствующие найденным arch, rpm, t_time и reverse.
      Если не удалось прочитать текущую дорожку совсем
      (нет ни одного успешного сектора) - пробуем все цепочки (Опционально, потребует много времени. Вероятно, настраивается пользователем).
   4) Принимаем решение о формате диска: смешанный (pc360 поверх агат840, агат840 поверх агат140 и т.д, а также всевозможные недоформатированные диски (полдиска подряд - один формат, потом - другой)), агат140, PC, agat840.
      Формат, имеющий большинство дорог агат140 объявляется именно агат140,
      а не смешанный (так как дороги за 35й могут остаться от другого формата).
   5) Если найден формат PC, пытаемся определить число секторов:
      оцениваем максимальный номер сектора отдельно для большинства чётных и нечётных _цилиндров_.
      (Например для случая: 1.2mb переписан сверзу 360kb).
   7) Дочитываем все дорожки, на которых были ошибки чтения, независимо от формата записи. В зависимости от типа диска (шаг 4):
      - Смешанный формат: читаем все дорожки, но не долго (используем только быстрые цепочки для контроля). Обычно от агатовских данных на таких дисках уже мало что осталось.
      - PC: читаем все дороги, но не докапываемся (используем только быстрые цепочки для контроля).
      - Агат140: дороги 69-79 и нечётные дороги читаем только 1 оборот без контроля,
        остальные - как мост2, для обработки используем полные цепочки;
      - Агат840: читаем как мост2, для обработки используем полные цепочки;
   9) Сопоставляем найденные форматы с используемым дисководом и включаем моргалку, если дисковод не тот.

   Имеет смысл сперва сделать 3-5 попыток перечтения с короткими цепочками.
   Пусть после второй попытки будет сделан ретрейс головы.
   И только затем долбать по всем попытка длинную цепочку декодирования.
   Если пользы не было, попробуем ещё раз, с передёргиванием головы для 140ки между фазами.
   И опять анализируем результат только короткими цепочками.
   Если не получилось - пофигу, дальше тяжёлую математику по последним попыткам будем делать уже офлайн.

   Имеет смысл вовсе игнорировать дорожку при сильно размазанном спектре. Неформатированные диски
встречаются нередко, а любая вышеописанная логика именно на них будет мучиться особенно долго.

==

И ещё: плата почти собрана, осталось допаять преобразователь +12 -> -12 вольт и пару разъёмов.
Если источник заработает и нормально заработает с ним привод Alpins, то можно будет плотно посидеть над чертежами платы и заказать исправленную версию. Сейчас полный список изменений включает около 12 пунктов.

127

Re: Мост # 3 - специализированный компьютер для чтения дискет

Voldemar0 пишет:

Сперва читаем весь диск быстро, без ретрейсов, за 1-2 оборота и останавливаем привод

Было бы хорошо прочитать каждый трек три раза и посмотреть: там примерно одно и то же читается или каждый раз разное?

Причем, с разбивкой на области, например в 1/16 трека. И после этого уже пытаться определять форматы только на тех областях, которые дают наиболее стабильное (повторяющееся) чтение.

Вот только непонятно, как сравнивать между собой две версии сырых данных трека. Из-за нестабильности вращения диска все будет плавать, не говоря уже про ошибки чтения. И "зацепиться" за какие-то данные нельзя, так как формат еще не определен.

Интересно, у платы ресурсов хватает, чтобы в реальном времени гистограммы строить?

Можно было бы для каждой области построить по гистограмме и сравнивать уже гистограммы между собой.

128

Re: Мост # 3 - специализированный компьютер для чтения дискет

Возможно еще имеет смысл делать чтение при движении головки в одну сторону и потом при движении в обратном направлении.

129 Отредактировано Voldemar0 (06-03-2023 08:36)

Re: Мост # 3 - специализированный компьютер для чтения дискет

> И после этого уже пытаться определять форматы только на тех областях, которые дают наиболее стабильное (повторяющееся) чтение.

Бит " формат распознан " возникает при успешном чтении адресного поля.
Успешность, в зависимости от формата, может быть в совпадении CRC, но также проверяется и байт(ы)
эпилога (если есть) и разумность цифр (диапазон номера сектора, например).
Достаточно найти адресное поле любого сектора.

Т.е. тут вероятность ложного срабатывания довольно низкая. Разве что дорожка будет записана корявым форматтером и не полностью очистится от старой записи.
Так что я не вижу смысла проверять стабильность чтения.

> которые дают наиболее стабильное (повторяющееся) чтение.

А они нередко стабильно читаются. Стабильно правильно или стабильно с одинаковыми ошибками :)
Так что тут надо уточнять, что такое стабильность.


-

Я вчера набросал общий алгоритм разборки образа для полностью автоматической обработки и сделал как раз кусок, который определяет формат отдельных дорожек. Стал тестировать, и на одном образе 840ки, снятом на 360 rpm, алгоритм распознал несколько дорожек как 840к / 300rpm с жесткой стабилизацией фазы.

Это выявило сразу пару проблем: сюиты с 300/360 должны чередоваться на более высоком уровне (чаще), чтобы алгоритм не лез так далеко (он пытался под 300 rpm найти хоть какой -то вариант остальных параметров, а надо было поиграть сперва именно с rpm). Кроме того, надо будет после анализа всех дорог проверять совпадение rpm. Как бы снимаем-то мы обычно на одной скорости весь диск
{
хотя eim позволяет дописывать с нескольких приводов разные проходы, и если rpm известен, он записывается к каждому снятому блоку. Если такой хинт есть, то анализатор формата должен его учитывать. В будущем...
}
Когда алгоритм срабатывает правильно для обычных дисков, это занимает примерно 0.1 секунды на обработку всех снятых треков (160 буферов). Но это на Ryzen 3 ;)
Проверка всех 3000 цепочек на каком-то частично форматированном диске заняла до 40 секунд.
Но это было явно не, что нужно для определения формата - буду исправлять.


> Интересно, у платы ресурсов хватает, чтобы в реальном времени гистограммы строить?

Полноценного реального времени там нет, потому что в реальном времени работает только семплер. Он захватывает дорожку и только после этого проц может что угодно делать с ней. Но гистограмма строится очень быстро. Т.е. время не сопоставимо с временем получения данных в основное ОЗУ.

Вроде в прошлом ролике было видео захвата и вывода гистограм по ходу чтения диска.


> Было бы хорошо прочитать каждый трек три раза и посмотреть: там примерно одно и то же читается или каждый раз разное?

Мост 2 так и работал. Он делал два прохода по диску и в обоих проходах добивался чтения всех секторов.
Потом rawedit сопоставлял всё, что прочитано.
Все eim- форматы предполагают хранение нескольких экземпляров считанной дорожки.
Если дорожка читается хорошо - будет две копии, если плохо - то больше.

Тут как раз и наблюдалась статистика, показывающая весьма выскую стабильность:
долбаем флопик ради одного сектора, но сохраняется -то вся дорожка.
Соответственно, потом в rawedit смотришь: каждый сектор встретился 10-20-30 раз,
20 секторов в 99.9 % случаев раскодированы успешно, данные совпали, а один сектор прочилася успешно всего 1 раз.
Один стабильно не читается, остальные - стабильно читаются.
Даже если бошку двигать.
Если движение бошки помогает, такого количества копий не будет набрано: логика ретрейсов и повторов примерно такая:

tries = 0
do {
читаем трек
if не удалось вытащить ещё какие-то сектора (по сравнению с предыдущущим чтением) тогда tries++;
if tries == 2 тогда ретрейс головки (едем на 0 трек, потом обратно),
} while tries < 5;

> И "зацепиться" за какие-то данные нельзя, так как формат еще не определен.

Очень абстрактно можно сказать так: чем дальше по цепочке декодирования, там более важно определение формата. Т.е. если сравнивать просто массив интервалов между импульсами, то формат как бы и не очень важен.
Известно, что интервалы между импульсами будут 2,4,6,8,10,12 мкс и других всё равно нет.
Если дискета и дисковод хорошие - этого достаточно, чтобы с некоторой точностью сравнить кусок дорожки.

-

Вообще, задача поиска куска дорожки уже была у меня: когда сталкивался с защищёнными дисками и всякими нестандартными форматами, вроде одного сектора в несколько кб на дорожку, там как раз был вопрос о том, как же
это склеить для AIM-формата. Т.е. там единственное gap-поле и, само собой, маловероятно, что захват начнётся именно с него. Ещё одна сложность: синхрополей там тоже 1-2 на весь трек.

Я тогда написал прогу, которая могла просмотреть дорожку и найти точку, в которой можно склеить массив. Я не помню точный алгоритм, вероятно, она искала первый синхросбой (?!), от него запоминала байт 20 и потом искала их от конца файла. И почти всегда находила успешно. Если не находила, то нужно было просто взять другой блок из eim.
Поскольку формат нестандартный, мост перечитывал его много раз, было копий 10, не меньше.

Проблема синхронизации тоже как-то решалась: видимо, после того как контроллер находил первый синхросбой, он дальше уже оказывался синхронизован и уже сколько не снимай копий трека (пока головой не шевелишь), с какой точки не начни забирать байты у контроллера - все байты будут правильными.


> Можно было бы для каждой области построить по гистограмме и сравнивать уже гистограммы между собой.

Можно, делалось такое. Для выявления всяких интересных моментов. Трек делил на 45 градусов и каждую анализировал отдельно. На треке был странный сектор, который почему-то отличался от остальных настройками декодеров для успешного чтения. Оказалось, что на этом участке спектра гистограмка заметно дёргалась. Т.е. какое-то заедание или рывок двигателя был во время записи. Причем это была 840ка, т.е. прямой привод шпинделя.

Для моста3 пока нет софта для гистограм сегмента. Но вроде бы это не так уж сложно сделать, если будет нужно.


> Возможно еще имеет смысл делать чтение при движении головки в одну сторону и потом при движении в обратном направлении.

Для 140ки это само собой - там игры с фазами приводят как раз к тому, что она по разному раскачивается в стороны.

Для 840ки можно попробовать это сделать.
Хотя, из практики, люфты в дисководах - не особо частая вещь, а направление движения головы будет иметь значение только при большом люфте.
Чаще проблемы бывают, например, с неточной юстировкой. Бывает, голову к центру диска чуть прижмешь и сразу всё без ошибок начинает читаться.
Но мысль интересная, попробую не забыть :)

130 Отредактировано Voldemar0 (20-03-2023 14:55)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Немного странно, но вот этот кусок: распознавание форматов и выбор стратегии чтения, оказался довольно крепким орешком.
Потому что когда каждый трек даёт разные результаты - совсем не очевидно как построить алгоритм выбора.
Когда я проектирую код, то всегда пытаюсь точно описать как бы я сам решал (или решаю) ту задачу, которую нужно поручить компьютеру.

И тут сразу возникает понимание, что когда мне попадается какой-то неясный диск, я смотрю его сперва в целом.

Но вот это "в целом" для компьютера выглядит довольно размыто. Два наиболее часто используемых алгоритма, сводящих "в целом" к какому-то решению - это либо поиск максимума либо некое усреднение (поиск наиболее вероятного значения - наиболее часто возникающего - но это значит подсчёт всех вариантов и потом - опять - поиск максимума).
Но это - арифметика. А следовательно, нужно каким-то образом свести всё к цифрам и желательно - к одной цифре. Из 100 сделать 10, потом из десяти - одну.

Например, формат PC, помимо того, как он описан в цепочках декодеров, плюс к тому будет ещё различаться числом секторов на дорожку, а может и размером секторов. Всё это как-то нужно объединить в одну структуру, чтобы потом можно было сказать, что именно такой формат занимает, например, половину диска. А вторая половина - обломки от агат-840ки. Или PC, но с другим числом секторов. И/или с другим размером сектора.
И потом найти - что же превалирует (потому что на этом же диске будет ещё три трека в начале от неудавшейся попытки форматнуть диск в агат140).

Когда это будет сделано, нужно будет как-то обобщить эти данные, чтобы решить, какой же формат нужно вытянуть в dsk или в старые eim.

В итоге, пришел к следующему:
Все треки делятся на 4 чередующихся зоны: чётные/нечётные треки (если 96 TPI) и треки с верхней головы и треки с нижней головы.
Т.е. зона 0 - треки 0, 4, 8...
Зона 1 - треки 1, 5, 9.., зона 2 - треки 2, 6, 10.. и зона 3 - 3, 7, 11...

Находим какой формат (без уточнений на подстройки декодеров!) чаще встречается в каждой из зон.
Формат тут: эффективный rpm (тот, с которым удалось распознать тип архитектуры), тип архитектуры (агат140, агат840, PCSD, PCHD, Микроша), бит reverse (в какую сторону дорожка записана), число секторов на трек.

До сюда я уже всё сделал и оно, вроде бы работает. И довольно быстро работает.

Дальше нужно будет применять какие-то шаблоны по очереди :
1) известный формат, занимающей меньше места, чем другие форматы (т.е. он наверняка будет чередоваться с чем-то ещё): это 140, это PC/360...
2) известный формат, перекрывающий почти всё (PC/1.2, agat840, Микроша)....
3) микс из форматов, не сводящихся к первым двум.

Какой из шаблонов первым подойдёт - по тому дальше генерируем старый eim и/или dsk или по нему принимаем решение о дочитывании не прочитавшихся успешно секторов.

--

В процессе отладки удалось трижды сократить таблицу цепочек декодирования (первые два пункта видны в сообщении 126):
1) adjust дважды повторяется для значений 1.00, 0.97 и 1.03.
2) drive_type не имеет смысла, потому что получалось, что для дисковода 140 формировались все цепочки только с rpm300,
а потом для 840 все с rpm300 и rpm360, т.е. случай rpm300 попросту дублировался.
На самом деле массив цепочек строится для всех случаев, а уж если точно известна скорость дисковода, то это просто войдёт
в подсказки для исключения отдельных цепочек при распознавании формата. Это ещё дало мощное сокращение массива.
3) стал сохранять для таблицы ФАПЧ признак её обязательности (для агат140/Микроша обязательна только таблица с жёстким регулированием, а для MFM/840/PC хорошо работает более мягкое регулирование). Это не уменьшает набор, зато даёт возможность исключить часть цепочек для распознавателя формата.

Итого полный массив теперь около 1600 цепочек, но для декодера формата используется всего 100 из них, если неизвестен rpm,
или 50 - для известного rpm. Полный массив нужен только для выдёргивания проблемных секторов.
И, наверное, набор для декодера можно будет даже ещё подсократить. Но уже после экспериментов на реальном железе.

--

Плюс к тому пару мелких достижений:

1) Сделал управление выводом логов. Ключ комстроки состоит из двух полей: символ подсистемы (т.е. каждый модуль имеет какую-то букву или цифру) и уровень логов (0 - тишина, кроме критических ошибок, 2 - только важные предупреждения (о том, чего обычно не случается, но может возникнуть), 4 - информирование обо всех шагах, 6 - чат: много подробностей).

2) Немного переделал заголовки у eim3, вроде сейчас стало похоже что это может даже оказаться финальной версией.

--

Ещё интересное:
1) 140ка без проблем опознаёт 840ку. Вероятно часто будет и наоборот.
2) Если указать rpm неверно, распознавалки срабатывают не всегда. Но иногда срабатывают.
3) Попытка прочитать на 140ке 840ку даёт примерно 4-5 секторов от каждой дорожки.
4) Заметно, что 840ка хорошо видит запись 140ки именно на чётных цилиндрах.
Из 3 и 4 следует интересное: получается, что центр широкой головы 48tpi висит где-то по центру узкой головы 96tpi.
Как-то вроде из старых книжек получалось, что широкая голова висит где-то по центру между дорожками узкой головы, т.е. всегда накрывает собой две узких дорожки, но, похоже, для агатовского привода это не так.

Есть интересная ненулевая вероятность, что у флопиков с 48tpi приводом и 48tpi головами подвес головки юстировался не так, как у агатовского ес5088, который, фактически, имеет привод 96tpi, а голову 48tpi. Из этого в дальнейшем может следовать, что агатовские 140ки будут лучше читаться именно 5088 или PC-совместимыми с 96tpi-приводом (и головами), но не PC-совместимыми с 48tpi приводом.
Надо будет ещё погонять в этих тестах Alpins.

5) Нулевой трек любого формата читается без проблем любым приводом. Видимо потому, что хотя бы с одного боку тишина.

--

Игорь прислал несколько интересных дисков: формат PC, но самый короткий таймслот не 2.00 или 4.00 мкс, а 2.38 мкс. Дисковод съёма крутил 300 rpm. Что за формат или как он был получен ? Флюкса, хотя и с ошибками, но частично его разбирает.
У меня есть предположение, но интересны чужие мнения.

--

Интересно, а какая плотность дорожек у 3.25'' ?

--

А кроме того, всё никак не закончу с kraftway'ем. Попробовал туда вкатывать разные операционки, кой что интересное вылазит. Много там необычного. Работа с CF вместо HDD, которая как-то ограниченно поддерживает DMA, звук. Возможно, надо будет ещё один ролик по ней сделать.

131

Re: Мост # 3 - специализированный компьютер для чтения дискет

Voldemar0 пишет:

Игорь прислал несколько интересных дисков: формат PC, но самый короткий таймслот не 2.00 или 4.00 мкс, а 2.38 мкс. Дисковод съёма крутил 300 rpm. Что за формат или как он был получен ? Флюкса, хотя и с ошибками, но частично его разбирает.

Так, наверно, это PC-шный HD. Там минимальный интервал 2 мкс, а скорость вращения 360 rpm. При съеме на 300 rpm время растягивается в 1.2 раза и интервал делается 2.4 мкс.

Voldemar0 пишет:

Интересно, а какая плотность дорожек у 3.25'' ?

3.25'' - это 3.5"? Тогда 135tpi.

132

Re: Мост # 3 - специализированный компьютер для чтения дискет

> Так, наверно, это PC-шный HD. Там минимальный интервал 2 мкс, а скорость вращения 360 rpm. При съеме на 300 rpm время растягивается в 1.2 раза и интервал делается 2.4 мкс.

Так вот вопрос в том, а на какой скорости писались 1.2 стандартно ?
Я тут слегка подзапутался уже: 3.5 всегда крутят 300, у них 360 нет.
А с 5.25 не ясно:
1) Высокая плотность (> 1 Мбайта) и режим 360 появились одновременно ?
2) Если привод может 360 rpm, он всегда крутится в PC на 360 (при стандартном управлении и форматах записи) или зависит от плотности записи ?

133

Re: Мост # 3 - специализированный компьютер для чтения дискет

Voldemar0 пишет:

1) Высокая плотность (> 1 Мбайта) и режим 360 появились одновременно ?

Да. На пятидюймовках формат HD = скорость 360 rpm. На самом деле, формат HD - это не развитие SD и DD форматов, это  перенос на пятидюймовки формата восьмидюймовых дисков. И там все было свое - и скорость передачи данных и скорость вращения. http://www.3480-3590-data-conversion.co … disks.html

Voldemar0 пишет:

2) Если привод может 360 rpm, он всегда крутится в PC на 360 (при стандартном управлении и форматах записи) или зависит от плотности записи ?

Это зависит от модели дисковода. Там три ситуации могут быть.
1) Некоторые приводы допускают работу в двух стандартах и при подаче сигнала выбора плотности меняют скорость.
2) Некоторые приводы допускают работу в двух стандартах, могут менять скорость, но ни на какие внешние сигналы не реагируют. Им надо переключать скорость замыканием контактов на плате регулятора скорости шпинделя.
3) Есть строго HD приводы, там никакими перемычками ничего не добьешься.

134 Отредактировано Voldemar0 (23-03-2023 20:28)

Re: Мост # 3 - специализированный компьютер для чтения дискет

> 3) Есть строго HD приводы, там никакими перемычками ничего не добьешься.

Т.е. они 720 кб не прочитают или будут читать её на 360 rpm ?

--

Я из описания проги FDA надёргал следующую инфу:

Контроллер поддерживает скорости 250,  300, 500 Кбит/с.
Дисковод поддерживает скорости 5 и 6 об/с.
Итого 5 комбинаций, так как 250/5 и 300/6 совпадают.

Low     250/6 - не поддерживается BIOS
Double  250/5, 300/6                    250 - 4мкс (1, 1.5, 2T)
Medium  300/5 - не поддерживается BIOS
High    500/6
Quad    500/5                           500 - 2мкс (1, 1.5, 2T)

Получается, что high - это формат 1.2 Mb (5.25'') (быстрее, но меньше объём)
и quad - это 1.44 Mb (3.5 '') (медленнее, но больше)

У меня в мыслях такая нестыковка: если HD-привод читает 1.2 диск, он крутит 360.
Но если ему надо прочитать 360 Кб, то что тогда ?
Либо драйвер должен управлять скоростью привода, но до начала чтения он не знает, какой диск вставлен.
Или он будет читать 720/360 Кб на 360 rpm. Но тогда получается, что сигнал Lo/Hi density всегда константа для привода.
Однако мои эксперименты показывают, что привод при воздействии на эту линию явно меняет характеристики канала чтения.
Значит, вроде бы, драйвер должен управлять этой линией ?

135

Re: Мост # 3 - специализированный компьютер для чтения дискет

Voldemar0 пишет:

Т.е. они 720 кб не прочитают или будут читать её на 360 rpm ?

Будут читать на 360 rpm. Можно тут почитать http://www.retrotechnology.com/herbs_st … html#12meg. Если в двух словах, то IBM решила, что проще крутить диск всегда на 360 rpm, а переключать только скорость передачи данных (300 Кбит/с или 500 Кбит/с).
Двухскоростные флопы самой IBM использовались очень короткий промежуток времени и рассматривались как переходный вариант.

Voldemar0 пишет:

Но если ему надо прочитать 360 Кб, то что тогда ?

Также, как и 720 кб, на 360 rpm.

Voldemar0 пишет:

Но тогда получается, что сигнал Lo/Hi density всегда константа для привода.

Нет. Там получается две скорости передачи данных: 300 Кбит/с и 500 Кбит/с. Тракт чтения конечно должен подстраиваться под эту скорость, иначе он будет или давить фильтрами часть сигнала или пропускать лишние шумы.

136 Отредактировано Voldemar0 (24-03-2023 09:35)

Re: Мост # 3 - специализированный компьютер для чтения дискет

> Нет. Там получается две скорости передачи данных: 300 Кбит/с и 500 Кбит/с. Тракт чтения конечно должен подстраиваться под эту скорость, иначе он будет или давить фильтрами часть сигнала или пропускать лишние шумы.

Тракт чтения дисковода или тракт чтения контроллера-декодера ?

Если дисковод не получает каких либо сообщений от контроллера, откуда он будет знать какая скорость передачи данных ? Анализировать спектр сигнала с поверхности до дифференцирования?

----

У меня тут цель этих вопросов практическая: мне нужно понять, как рекомендовать настраивать дисковод для работы с Мостом3.
Эксперименты с флюксой довольно явно показали, что 360/300 rpm практически не влияют на чтение агатовских дисков.
Но у Моста3 есть линия управления Density, сейчас её можно переключать непосредственно во время работы программы-спектроанализатора. И я вижу, что на пустых дискетах смена напряжения на этой линии, как правило, влияет на спектр. Причем это не всегда сопровождается сменой скорости. Т.е. ясно, что если я выберу неправильное значение этой линии, то получу либо больше помех при чтении агатовских форматов либо не прочитаю формат 1.2 Mb.
И хорошо, если дело будет только в этой линии: в крайнем случае я могу её чередовать при чтении дорожек и использовать тот вариант, который быстрее или надёжнее читает данные.

Но если есть ещё какие-то неявные причины, по которым дисковод будет неправильно читать что-то - это надо как-то изучить и попытаться найти решение.

137

Re: Мост # 3 - специализированный компьютер для чтения дискет

Voldemar0 пишет:

Тракт чтения дисковода или тракт чтения контроллера-декодера ?

Если дисковод не получает каких либо сообщений от контроллера, откуда он будет знать какая скорость передачи данных ? Анализировать спектр сигнала с поверхности до дифференцирования?

Не, ну было бы странно, если бы дисковод разбирался, какой формат он читает. Он ведь даже не знает, в каком компьютере стоит. Вдруг в Амиге какой-нибудь? А если бы у него хватало возможностей, чтобы разбираться в формате, то нафига бы ему тогда вообще контроллер понадобился :)

Конечно контроллер управляет переключением между 300 Кбит/с и 500 Кбит/с. И подстроиться должны оба: и дисковод и контроллер.
Только я не знаю, как он первоначально определяет тип диска.
Возможно, методом тыка (почитали с настройкой 500 Кбит/с - не получилось, включаем 300 Кбит/с).
А возможно, нулевой трек всегда записан с плотностью DD. У IBM на восьмидюймовках был именно такой подход. Читаем нулевой трек в DD и из служебных полей определяем формат записи остального диска.

Voldemar0 пишет:

мне нужно понять, как рекомендовать настраивать дисковод для работы с Мостом3

Мне кажется, для HD приводов лучше выбирать скорость 360 rpm. Потому что у них тракт чтения рассчитан именно под скорости 300 Кбит/с и 500 Кбит/с. Если дисководу принудительно поставить скорость вращения 300 rpm, то получится неродная для его тракта чтения скорость 250 Кбит/с, и, скорее всего, чтение будет немного хуже. Кроме того, чем быстрее крутится диск, тем выше уровень сигнала с головки.

В режиме 500 Кбит/с агатовские диски если и будут читаться, то плохо, потому что фильтры зарежут нижние частоты. Интервал 8 мкс либо вообще не пройдет, либо будет очень "размазан".


Вообще, тут главное понять, что именно настраивать: привод или мост.
Мне кажется, линию выбора плотности всегда надо ставить в положение DD. А вот дальше есть варианты:
1) дисковод поменяет скорость вращения и будет выдавать данные на скорости 250 Кбит/с. Тогда мост должен настраиваться именно под такую скорость.
2) дисковод скорость не поменяет и будет выдавать данные на скорости 300 Кбит/с. Параметры тракта чтения у него будут правильные, но мост должен принимать данные на скорости 300.

Может быть, стоит выставить линию в нужное значение, померять скорость вращения по сигналу индекса, а уже дальше принимать решение, как это читать.

138 Отредактировано Voldemar0 (26-03-2023 18:13)

Re: Мост # 3 - специализированный компьютер для чтения дискет

> А возможно, нулевой трек всегда записан с плотностью DD.

Как тогда впихнуть туда все 18 секторов ?

---

Я поэкспериментировал с HD-флопиком, который когда-то долго стоял у меня на PC.

Оказалось всё просто:
2 пин переключает характеристики тракта дисковода в любом случае.
А вот скорость - только если джампер "2s/ls" поставить в положение "2s".
В PC дисковод используется без джампера, скорость всегда 360 rpm. Использует ли PC пин 2 для переключения полосы - не знаю.
Если джампер перекинуть в положение "ls" привод крутит 300 rpm безусловно. Так он неплохо работает с агатовскими дисками с агатовским же контроллером.

Интересно, что если пин 2 выставить в LO, джампер в положении "2ls", скорость будет 360 rpm, то формат HD читает нормально,
но если переткнуть пин 2 в HI, то скорость падает до 300 rpm, а на выходе тракта чтения получается такой вот чудесная гистограмма:


 
  Track 26 [24627 byte(s)], spectrum maximum on point  3.62 mks [index = 29, value = 6217]:
 3108/ 6217 -                              *        *
 1554/ 6217 -                             **        *                            *                    
  777/ 6217 -                             **        *                            *        **          
  388/ 6217 -                             **        **                           *        **        * 
  194/ 6217 -                    *        ***      ***                           **       **        * 
   97/ 6217 -                 *****       ***      ***                          ***       **       ***
   48/ 6217 -                ******       ***      ****                         ***       ***      ***
   24/ 6217 -                ******       ***      ******                       ***       ***      ***
   12/ 6217 -                ******       *****    ******                       ***       *****    ***
    6/ 6217 -                ******       ******   ******                       *** *     *****    ***
    3/ 6217 -                ******       ******   ******                       ******   ******    ***
    1/ 6217 -                *******      ******   ******      *                ******   *******   ***
    0/ 6217 -                *******    * **************** *   *      *  * ** ********   *******   ***
_____/_____ - 00 mks  01 mks  02 mks  03 mks  04 mks  05 mks  06 mks  07 mks  08 mks  09 mks  10 mks  
    
  Track 27 [23027 byte(s)], spectrum maximum on point  3.62 mks [index = 29, value = 6594]:
 3297/ 6594 -                              *                                                          
 1648/ 6594 -                              *        *                            *                    
  824/ 6594 -                             **        *                            *        **          
  412/ 6594 -                             **        **                           *        **        * 
  206/ 6594 -                             **        **                          **        **        * 
  103/ 6594 -                             ***      ***                          **        **        **
   51/ 6594 -                             ***      ***                          ***       **       ***
   25/ 6594 -                             ***      ***                          ***       **       ***
   12/ 6594 -                             ***      ***                          ***       ***      ***
    6/ 6594 -                             ***      ***                          ***       ***      ***
    3/ 6594 -                             ***      ***                          ***       ***      ***
    1/ 6594 -                      *      ***      **** *                       ***       ***      ***
    0/ 6594 -                 *    **     ***    * **** *   ** *     *   *    * ***      ****      ***
_____/_____ - 00 mks  01 mks  02 mks  03 mks  04 mks  05 mks  06 mks  07 mks  08 mks  09 mks  10 mks  
    
{Тут по ширине не получается воткнуть всю картинку, но она продолжается до 15 мкс , а может и дальше}

Похоже, тракт флопика считает интервалы меньше 2 мкс сбоями и суммирует их до получения чего-то более похожего на DD-формат.
Такой поток уже ничем не раскодируется.
Причем DD запись будет читаться нормально, такой лес из столбиков возникает только на HD записи.

---

И ещё интересная наблюдашка:

мс5311 неплохо опознаёт диски агат140 (вероятно потому, что адресные поля кодируются там в FM), но читать их не хотел,
я про это рассказывал когда-то в теме флюксы и scp. Так вот сейчас обнаружил, что - где-то трека после 40 - он сперва начинает нормально читать одну сторону 140ки, а потом и вторую. Граница очень чёткая, как будто у него переключается что-то в тракте чтения.

Прочитать HD-формат этот привод не может. Но, как ни странно, распознать удаётся довольно надёжно.
Гистограмка заметно сливается:

      Track 0 [76735 byte(s)], spectrum maximum on point  2.38 mks [index = 19, value = 23079]:
11539/23079 -                    **                                                            
 5769/23079 -                    ***     *                                                     
 2884/23079 -                   *****    ***                                                   
 1442/23079 -                   *****   ****     *                                             
  721/23079 -                   ******  ****     ****                                          
  360/23079 -                   ****** ******    *****                                         
  180/23079 -                   ****** ******   ******                                         
   90/23079 -                   ****** ******   ******                                         
   45/23079 -                   **************  ******                                         
   22/23079 -                  *************** ********                                        
   11/23079 -                  *************** ********                                        
    5/23079 -                  *************** *********                                       
    2/23079 -                  *************************      *    **                          
    1/23079 -                  **************************   * *    *** *                       
    0/23079 -    *            ***************************   * **** *** *      * *              
_____/_____ - 00 mks  01 mks  02 mks  03 mks  04 mks  05 mks  06 mks  07 mks  08 mks  09 mks  

Тут ещё неплохо, но к концу диска первые два пика совсем сливаются.

---

У Teac fd-55gfr переключатель скорости работает так:
II - всегда 360 rpm, I и IS - скорость переключается пином 2.
В чём отличие I и IS - не понял.
Интересно, что если на 2 приходит низкий уровень, а скорость выставлена в II (всегда 360), то ломается чтение HD дисков.
Но если выбрать I и IS, то HD вполне читаются на 300 RPM.
Если же на 2 приходит высокий уровень, то скорость 360 и HD читается независимо от переключателя скорости (будет всегда 360).

Из последних двух заметок следует, что неизвестный привод может распознать разные форматы,
но не всегда способен их читать (процент успешно прочитанных секторов падает с 80-100% до 0-2 секторов из трека). Иногда для этого нужно поменять уровень Density, иногда переключить джампера, иногда всё будет нормально при любом уровне Density. Иногда нужен другой дисковод :) (две головки, 96 TPI)
И это тоже надо будет диагностировать и давать рекомендации пользователю.

--

Единственный привод, на котором вообще не удалось распознать формат PC-HD - ес5088. Он рисует "лесную" диаграмму и ни одного адресного поля не даёт увидеть. Разве что визуально по диаграмме и можно понять, что запись всё таки есть.

139 Отредактировано Voldemar0 (02-04-2023 11:21)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Написал полную версию проги с автоматом определения формата и последующим декодированием.
Прогоняю через неё контрольные образы разные, сравниваю с результатами, которые были получены на более старых прогах.
Ещё ошибки в цепочках декодирования нашел.

Чем прога умнее, тем результаты внезапнее.

Один вариант (старая прога) перебирает параметры в одном порядке, другой (новая прога) - в другом. В итоге один вариант внезапно сталкивается с несколькими вариантами одно сектора. С совпадающими CRC.
И это даже не на агатовском формате, а на PC ! А другой вариант пошел по другому пути и вытащил все данные, не столкнувшись с комбинацией, когда вылезает этот сектор в другой версии.
Кто из двоих не прав ? :) Это же всё от конкретного случая зависит.

Что делать, если автомат изучил образ и обнаружил на нечётных фазах флопика 140ки тоже что-то похожее на 140 формат ? :))
Ну там же реально есть чуть-чуть данных, немного попадающие с чётных фаз.
Автомат считает, что это - второй формат, оставшийся после записи основного.
Вводим правило, что агат140 не может встречаться на нечётных фазах (а PC или agat840 вполне может там быть).

Нашелся какой-то интересный образ, PC-HD, там почему-то по верхней стороне в среднем прочиталось только 17 секторов (голова плохо прижата или грязная), а на нижней - в среднем 18. Нулевой трек пустой - похоже, что привод был ещё не готов, а флюкса уже захватила нулевой трек и решила, что ждать не надо. Так что я сам не могу подсмотреть, что там было. Автомат тоже не знает, что делать: он понимает, что у PC не должно быть разного количества секторов в зависимости от головки. Ок, он сохраняет отдельно нижнюю сторону как 80 треков / 1 сторона / 18 секторов, верхнюю как 80/1/17 с отметкой Secondary - т.е. сами разбирайтесь, че это обломки остатков.

Дрессирую, короче :)

Ещё нашел у себя пару сныканых эпловских дисков с красивыми этикетками, с форматом dos 3.2.
Интересно, что один из них читается очень чисто (пока только по диаграмме), а второй - довольно замыленно. И это по всем трекам. Надо будет этот декодер тоже внедрить.

И надо уже ролик пилить. И так от графика почти на месяц отстал :(

140

Re: Мост # 3 - специализированный компьютер для чтения дискет

https://youtu.be/PjaMUQoPZ2g

141

Re: Мост # 3 - специализированный компьютер для чтения дискет

https://youtu.be/1jEmXhntwbA

142

Re: Мост # 3 - специализированный компьютер для чтения дискет

Май, Июнь, Июль, Август.

Куча всякого накопилась, мелкого и крупного, нужно было сделать. И в отпуск попасть - мы не встречались почти год.

Кроме прочего в ремонт попался планшет на Intel Atom, win10 на борту, 2 гига ОЗУ. Поигрался с ним, но так и не понял, в чём тут польза ? Клавиатуры нет, единственный USB-порт, разрешение экрана высоченное (1900x..), размер экрана примерно как Юность-404. Пальцем тыкать не получается: разрешения пальца не хватает. Элементы управления мелкие. Даже не WinCE - там хоть всё было под мелкие экраны и тачскрин, а тут вообще не так. Пытался как автонавигатор приспособить - так у него и приёмник навигации едва шевелится, в операционке его ещё запустить нужно (разрешения дать), так и не ясно - поймал он спутники или нет? Win пускает только на свой location API, через COM-порт напрямую приёмник недоступен (хотя подключен на внутренний UART....). Аккума вроде надолго хватает, но если нормально работать - то мышь внешняя нужна. И клавиатура тоже не помешает. Если смотреть фильмы - нужна подставка. Как ни крути - обратно ноутбук получится. Linux не ставится: BIOS UEFI, но только i386, не x64. Не нашел сборки, которая бы работала с таким сочетанием.

--

Вернулся к мосту.

Быстро набросал прогу для измерения скорости 140кб флопика. Всё работает, но скорость постоянную показывает. Вспомнил, что надо подумать. Потом дошло: я определяю скорость, умножая число бит, прочитанных за один оборот (от одного адресного поля, до него же на следующем обороте), на время одного бита. И что получается ? Скорость вращения диска во время записи. Epic fail :((

Мне же декодеры уже биты возвращают, а точное время их "воспроизведения" с диска теряется в декодерах.

Надо будет всё таки специально под эту прогу написать отдельный простой декодер 140-ки с сохранением времени. Но это - потом.

--

А пока самое ответственное: прога для чтения дисков. Именно та, которая налету опознаёт формат и пытается его вытащить с физического диска. В марте дело было успешно закончено на проге, которая может выдёргивать всё в офлайне - из образа. Теперь нужно, чтобы можно было дёргать прямо с диска.

В чём ключевая разница: при работе с образом мы из каждого сохранённого блока вытягиваем максимум информации, разбираясь, какому треку он соответствует, какой там формат, какой формат должен получится в итоге. Но других данных у нас нет. Если же работать с физическим диском, то, в случае ошибок декодирования первого прохода (обзорного), можно же попробовать прочитать дорожку ещё раз.
И даже не один раз. А ещё подёргать голову (если 140ка), попробовать соседние фазы (на ней же) или просто отправить головку в рекалибровку. А на 840ке/PC ещё и попереключать пин 2. Тоже может помочь.

Прогу до места, где она опознаёт формат, я уже дописал, а вот там, где она должна дочитать то, что не удалось считать с первого раза, вот там ещё предстоит обдумать архитектурные и алгоритмические вопросы. Что вперёд: прогнать всю тяжёлую математику или перечитать ещё раз ? Или сперва прогнать лёгкую математику, если не получилось - перечитать, ещё раз лёгкую, потом переключить пин 2, или ретрейс головки или ....

Пока тестирую на 140ке.

--

Сегодня разбирал новые съёмы, которые прислал Игорь (пока с флюксы, но тут две пользы: и диски читаем новые и заодно тестируем офлайновый декодер Моста3), прога распознала интересное:
диск был 840, затем его с двух сторон форматнули в 140. Так прога вытянула 140 с первой стороны, потом нашла 140 на второй стороне, а потом ещё обнаружила, что на нечётных цилиндрах второй стороны почти по всему диску сохранились дорожки 840ки. Не все сектора, но больше половины.
Т.е. где-то между треками 140ки остаётся небольшая полоска, которую не затрагивают стирающие головки. Что-то там осталось достаточное для частичного декодирования 840ки.

--

Так интересно: в 90-е, когда CD-ROM появились, обещали, что хороший диск будет жить минимум 25 лет.
Про флопики такого никто не загадывал даже. А ведь мы сейчас дёргаем флопики, которым уже больше 30 лет без перезаписи. Впрочем, у меня есть CD-RO из 90-х, которые читаются без проблем и сейчас.
Когда про Krafway последний ролик готовил, искал там старые проги.

143 Отредактировано Voldemar0 (13-10-2023 21:03)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Торжественный день: сегодня мост 3 впервые без ошибок отработал процедуру чтения "повреждённой" 140ки (я шторку при чтении дёргал, эмулируя проблемы с диском).

root@Bridge3:/var/volatile/tmp/dg# get_disk.arm 140
Bridge3: get floppy image
Package version 0.97 (Trollholmsund)
DRIVE CONTROL: 2.147 ms for move the head to the zero track
Open /dev/spidev0.0 device
SPI mode 0x0, 32 bits per word, 20000000 Hz max
Control keys: 's' - skip track (only after review the floppy), 'q' - quit.
All data saved to /tmp/dg//checkme.XXX
First capture pass (EDGE ==> CENTER):
Capture track 41 / 35 (internal number 164)   - тут бегущие цифры во время первого прохода
First capture pass (EDGE <== CENTER):
Capture track 0 / 35 (internal number 0)    
E0 is elected: 0 tro, 28/42 occured, 16 sec2trk, 1 trk mul, 140 / 300 RPM / Lo density signal / 96 TPI / 1 head(s),
        agat140, 300 RPM, adjust 1.00, t_time 3.92 mks,   hard pll (one pll)

Not elected: 1 tro

Not elected: 2 tro

Not elected: 3 tro

Zerotrack format: none
Main format: agat140
TOP DECODER: all saved to /tmp/dg//checkme.140.sideA.XXX
Second capture pass (primary image)
Second capture pass: track 34 / 35 (internal number 136), torture  0    - эта строка пробегает все непрочитавшиеся треки
Fixed sector size = 256
Sectors with errors:
No error.
Saved t35 x s16 x b256 = 143360

FIN

Сообщите, pls, если тут будут ошибки в использовании английского (меня особо смущает слово "elected" - здесь имеется ввиду, что для группы треков определён доминирующий формат).
Это пока консоль, когда всё заработает, на web-интерфейсе будет интерфейс на русском.

First capture pass - первый проход. На этом проходе мост быстро вытаскивает все треки, сперва от края к центру и потом обратно.
Затем выполняет анализ того, что удалось вытащить, опеределяет формат, декодирует сектора.
Если формат был опредён, но что-то не прочиталось - делается
Second capture pass - это дочитывание того, что не удалось вытащить на первом проходе. Здесь уже должны применяться рекалибровки головы и вся прочая магия, доступная 140ке.

Дальше будет много тестов на 140ке и потом перейду к 840ке.

144 Отредактировано avivanov76 (15-10-2023 01:14)

Re: Мост # 3 - специализированный компьютер для чтения дискет

К английскому такие замечания:
1) У elected - есть значения "избранный" (большим количеством народа) и "решил" (I elected to go to the bathhouse = Я решил пойти в баню). Оба варианта смотрятся странно. Я бы написал selected. Еще можно chosen.
2) torture - значит "пытка". Вообще не понимаю, как тут это слово оказалось :) Видимо, речь шла про попытку (attempt или try).
3) Вот это непонятно: 0 tro, 28/42 occured. Occured значит "произошло". И что там такое произошло? И кто такой tro?
4) all saved тоже криво. all - это количество чего-то, после него должно существительное стоять. Например all data saved.

145 Отредактировано Voldemar0 (15-10-2023 11:23)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Спасибо, поправил!

>  torture
Сам не понял :((  Наверное, пока набирал слово, страница переводчика перезагрузилась и первые две буквы очистились....

Самое сложное начинается от 'tro' ('track offset' - неудачное название).
Сокращать приходится, чтобы минимально заполнять экран повторяющимися словами и фразами.

Все треки делятся на 4 группы. У каждого трека есть некий список свойств ("комбинация свойств").
По каждой группе составляется список уникальных "комбинаций свойств".
Затем для группы "выбирается" (elect) та "комбинация свойств", который встречается ("occured") чаще.

"28/42 occured" - есть 4 группы по 42 трека в каждой. В группе номер 0 было найдено ("occured") 28 треков с одинаковыми свойствами. В результате именно эта комбинация свойств назначается ("elected") как преобладающая в группе.
Если формат большинства треков группы определить не удалось, сообщается, что для неё ничего не выбрано: "Not elected: 3 tro".

Сейчас переделал так:
Group %d: variant of the format isn't chosen
Group %d: variant of the format %d chosen: %2d/%2d occured, %2d sec2trk, %d trk mul, %s,\n%s

146 Отредактировано avivanov76 (15-10-2023 20:23)

Re: Мост # 3 - специализированный компьютер для чтения дискет

По-моему, вместо "variant of the format %d" можно написать просто "format %d".
И если "occured" - это число совпадающих треков, то тогда есть хорошее слово "match".
Тогда строку
    Group %d: variant of the format %d chosen: %2d/%2d occured, %2d sec2trk, %d trk mul, %s,\n%s
можно переделать так:
    Group %d: format %d is chosen: %2d/%2d tracks match, %2d sec/trk, %d trk mul, %s,\n%s

147 Отредактировано Voldemar0 (04-11-2023 12:53)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Продолжил тесты, на хороших дисках всё красиво, хотя и не наглядно: идёт обзорное чтение, почти без ретрейсов, потом полминуты магии - софт распознает формат, а потом он вдруг говорит: всё ок, больше ничего не требуется, всё успешно декодировано. Даже удивительно, при том, что это всё на запиленной 140ке, у которой последние 4 трека почти никогда не читались полностью хорошо.

Потом попался странный диск: мой собственный, со старыми играми, но который не читался почти совсем никак. И именно с ним выявилась архитектурная проблема:

Софт чтения данных с физического диска прогоняет данные по всем уровням декодирования, чтобы понять - нужно ли что нибудь перечитывать или нет ? Чтобы усилия не пропадали, он пишет сразу и образ eim3 - битовый поток и - как результат декодирования - старый eim-формат моста2 и, в конце, результирующий dsk.

Но в мосту-2 один оборот диска соответствовал одному сохраняемому блоку (копии трека).
А здесь на один оборот может получиться куча копий-версий в зависимости от настроек низкоуровневых декодеров. В итоге в старом eim забивается оглавление (там статическое распределение пространства). Да и смысла такое количество копий всё равно не имеет, они похожи.

Долго думал, как бы так отфильтровать нужное от не очень нужного.
В итоге нашел 4 критерия, по которым очередной вариант блока может быть сохранён и 5-й критерий: свободный объём оглавления (условная цифра, так как ограничено только общее число блоков, а не число блоков на конкретный трек). В сочетании это подсказывает софту, что стоит сохранения, а что - нет:

1) Коэффициент коррекции скорости = 1.00. Такой блок будет сохранён, если оглавление свободно на 90 %. Другие условия не требуются. Это нужно на случай, если формат не будет опознан. Т.е., в целом, мы знаем, что это, например, 840к-агат, но вот на этом треке не 21 сектор, а 1 сектор на трек, с размером в 4 кб (встречалось такое в игротеках).

2) Успешно декодирована хотя бы несколько секторов на данном треке. Такой блок будет сохранён если оглавление свободно на 70%.

3) Изменилась карта успешно декодированных секторов для данном треке (т.е. возможно, в этом блоке какой-то из секторов перестал читаться или начал читаться). Даже если оглавление свободно на 30%, это будет сохранено. Исчезновение какого -то сектора с карты указывает на нестабильность данных, возможно, что какой-то другой сектор, упешно читавшийся ранее, окажется в нескольких версиях (успешный тест CRC, но данные разные). В общем-то, по каждому сектору полезно иметь хотя бы 2-3 копии, чтобы оценить стабильность чтения и, следовательно, достоверность данных.

3) Удалось декодировать новые сектора, которые не были декодированы успешно в предыдущих блоках. Безусловное сохранение.

Старый eim-формат является удобным промежуточным инструментом для проверки работы Моста3, к тому же он позволяет изучать и синтезировать в AIM-формат всякий агатовский нестандарт: защиты, сбои чтения и прочее.

Отлично, этот блок работы завершен.

Тесты расширились, теперь также тестирую код с 840кой.

--

Что дальше:
- Нужно прикрутить к проге пользовательский интерфейс. Сейчас это чистый неуправляемый command-line. А надо чтобы можно было хотя бы плавно завершить работу. Надо, чтобы прога выводила на все дисплеи и в web- своё состояние. Надо чтобы она хотя бы имя файла могла брать из web-интерфейса. Сейчас оно просто hardcoded.

- Надо разобрать результаты тестов на 840ке. Есть ситуации глюков, примерно 2 на 20 дисков.

- Надо поизучать диски с примерами других форматов и понять, как быть с ними ?
Полностью поддерживать всё возможное в мире меня не хватит, но могут быть форматы очень близкие к уже имеющим поддержку или можно попробовать сделать какой-то простой идентификатор форматов.

--

Надо доделывать плату (остался только преобразователь +12 -> -12 вольт, тестить работу с ним и делать чистовик. Примерно 10 мелких правок, заказ новой печатки и сборка.

148 Отредактировано Voldemar0 (06-11-2023 10:16)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Прогнал около 50 дискет, пытался читать разными дисководами, пытался читать мостом2 некоторые для сравнения, штук 8.
Формат: в основном агатовкие 840-ки и PC-шные 800к. Попалась одна 140ка.

Интересные наблюдения:
1) 140ку вытянули немного лучше японские HD-приводы. 5088 слегка проиграл, хотя голова широкая.
Но один диск - так себе статистика.

2) Мост2 на одном диске вдруг дал результаты заметно лучше по части треков. Но только на одном. В остальных - не сильно проигрывал, но и не выигрывал.

3) Но самое интересное:
Мост2 читает и потом перечитывает неудачные треки. Это помогает.
Мост3 читает обзор сперва, потом останавливает дисковод и долго думает (чем хуже запись - тем дольше: от 20-30 секунд до десятка минут). Потом пытается дочитать то, что не получилось раскодировать. Пользы - ноль целых, ноль десятых, может быть одна сотая.  Т.е. от дочитывания пользы почти нет.


Возможно, те флуктуации, которые возникают при повторных попытках Моста2 и, в какой-то момент позволяют сложить пазл, в Мосту3 возникают благодаря перебору настроек...


Мост2 хороший диск читает быстре - с первого раза. Мост3 читает чуть медленее, да потом ещё должен обдумать.

Но если диск читается похуже, Мост2 будет елозить по некоторым дорожкам, а Мост3 обзор делает всегда за одно время. Только обдумывание подольше будет. Но это уже с остановленным дисководом. При этом он может выдернуть диск всё таки успешно, даже не перечитывая ничего.

Если диск совсем плох, то проще уже работать с Мостом2. По времени - много быстрее. Мост3, скорее всего, провозится долго с обдумыванием, потом ещё и будет неспеша вычитывать каждую дорожку, в итоге времени уйма. А результат, скорее всего, всё равно не впечатлит.

Отсюда две мысли:

1) Уже ввёл возможность остановить процесс или пропустить любой из этапов. Как бы то ни было, если сохранена обзорка - дальше можно уже офлайново с ней работать и решить, что делать дальше, нужно ли тратить время ?

2) Нужно предусмотреть режим неполного снятия диска: А) Возможность явно указать формат и максимально быстро сдёрнуть (a'la мост2). Б) Возможность к тому же задать диапазон треков для съёма.

Типичная ситуация: на почти каждом треке диска 1-2 сектора не прочитались (такая "полоска" от центра к краю). В т.ч. не прочитался сектор 17/2 (начало каталога). Его можно попробовать восстановить по имеющимся ТСЛ, но если бы была возможность быстро дёрнуть именно 17 трек на других дисководах - было бы полезно.

--

Ловлю ошибки, кой что дорабатываю понемногу. В эти выходные процесс идёт хорошо.
Снег вывалился основательно, за вполне сухую осень наездились по уши (по лесам погонял (несколько сот км, на двух колёсах), тур по Алтаю (2500 км, на 4 колёсах), в Омск слетали (2000 км за рулём и ещё каждый день пешком по городу км 15 ежедневно)), теперь можно прижать хвост и сидеть дома :)

149 Отредактировано Voldemar0 (15-11-2023 22:37)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Вдруг вспомнил важную штуку: регистрацию сигнала индекса во время захвата трека.
Так-то вроде всё просто, сигнал не часто нужный, присутствует только на "тонком" дисководе,
используется только некоторыми защитами от копирования.

Но если состояние линии чтения захватывает семплер, то INDEX он не смотрит вообще никак.
Идея витала примерно такая: запускаем семплер, время отсчитываем пустым вызовом select().
Это для тестов, для начала. Ну а потом, когда нибудь, в select() добавим наблюдением за линией INDEX.
Когда линия изменит состояние, зарегистрируем относительное время этого события и потом,
уже когда вытянем из сэмплера захваченные данные, туда же впишем время смены сигнала INDEX.

Но это всё не так просто, поэтому откладывал, пока вообще не забыл.

1) Когда линия меняет своё значение, ядро ОС регистрирует время. Но время относительное, относительно любых других изменений других линий. Как это сопоставить с началом захвата дорожки - инет молчит. Альтернатива есть всегда - изучать исходники ядра ОС. Но намеки на форумах показали, что в данном вопросе этот путь близок к тупиковому.

2) Попытка явно запомнить текущее время до начала захвата и потом снова запросить текущее время (когда линия сменится). Вроде бы всё очевидно, но иногда возникали заметные ошибки, едва ли не на порядок превышающие время всей дорожки. CLOCK_MONOTONIC_RAW. Наверное, я сам где-то ошибся.

3) Тогда идём не совсем стандартным путём (это возможно только в LINUX, но недоступно во FreeBSD, например): если вызову select() передаётся время, в течение которого он может ожидать событий, то при возникновении события он вернёт оставшееся (неизрасходованное) время. Именно этот механизм сработал почти идеально. После события можно вызвать select() снова с тем же значением времени, которое он вернул, тогда мы получим общее время ожидания примерно предсказуемым, а заодно узнаем время возникновения INDEX.

Поскольку тут много раз используется слово "примерно" (это связано с гранулярностью измерения времени в операционке), то будет интересно сравнить результаты с Мостом2 (который сразу возвращает на PC поток с чередующимися байтами данных с дорожки и отметками INDEX (можно считать, что его точность не хуже времени записи одного декодированного байта).

Так вот практика показала интересное (по результату оценок примерно 5 треков одной дискеты): по спаду (открывается отверстие на диске) ошибка составляет около 5 байт. А по фронту - байт 15. Видимо, тут играет роль порог срабатывания буфера, получающего сигнал от дисковода.

НО ! Разброс между двумя дисководами (съём с обеих мостом2) составил десятки байт !
Например, одно проверенное отверстие:
на дисководе Y, мост2 - 106 байт, мост3 - 94 байта,
на дисководе V, мост2 - 50 байт.

Т.е. тут всё гораздо больше зависит от конкретного флопика, чем от мостов.

В целом, такая точность вполне приемлима.
Типичный код, использовавший сигнал INDEX, выглядел примерно так:

1) Ждём сигнал индекса;
2) Читаем адресное поле очередного сектора;
3) Если не нашли за какой-то небольшой интервал, считаем, что возникла ошибка;
4) Если нашли - читаем поле данных и берём из него данные, без которых прога жить не может.

Если диск скопирован, то после индекса окажется случайный сектор, что с вероятностью 20/21 даст сбой в работе скопированной проги. Но вероятность ещё повышали, обрабатывая таким образом несколько треков.

150 Отредактировано Voldemar0 (19-11-2023 11:32)

Re: Мост # 3 - специализированный компьютер для чтения дискет

Вроде понемногу разгрёб крупные выявленные проблемы, код понемногу вылизывается. В самых сложных местах он, конечно, не образец для подражания, но это работает.

Вот, например, долго думал над архитектурной проблемой:
RPM может являться как параметром работы декодеров так и результатом их работы.
Первый случай имеет место, если мы сейчас снимаем данные с поверхности и по сигналу INDEX измерили реальную скорость.
Второй же случай может быть, если мы декодируем чужой образ и у нас нет информации о скорости вращения читающего дисковода (ну, вот так случилось...).

Архитектурная проблема была в том, что изначально RPM входил в список параметров для второго прохода декодеров: на первом мы опознаём формат, быстро анализируя все треки (меняя только тип кодирования, скорость (300/360) и реверс), а на втором - уже зная какой формат нужно ожидать (тип кодирования, количество секторов на дорожке, количество байт в секторе) - неспеша перебираем кучу вариантов параметров подстройки (adjust скорости, типы ФАПЧ, ...).

И вот тут вылезла проблема: выявленная или измеренная RPM передаётся от декодеров первого прохода декодерам второго прохода. Это хорошо работает, если все треки сняты с одной скоростью. Но у нас архивное чтение, поэтому как при первоначальном съёме так и при досъёме непрочитавшихся дорожек мы играем с сигналом Denisty (пин 2), который, кроме прочего, может менять и RPM. Низкоуровые библиотеки, управляющие дисководом, это знают и после смены Denisity заново измеряют скорость. Но декодерам второго прохода явно задавалась та RPM, которая уже выявляена как _наиболее_часто_встречающаяся_ скорость (т.е. более вероятная).

Сперва прога сыпалась на самоконтроле (у неё получалось, что одна и та же дорожка имеет разный формат при разных проходах). Убрал проверку на совпадение RPM. Тогда вылезла другая проблема: прога начала мощно тормозить. Оказалось, что RPM попадает на декодеры второго прохода неправильная и они долго пытались что нибудь вытянуть из трека в таких условиях.

В итоге, для этого параметра пришлось делать исключение: он передаётся от первой цепочке второй только если неизвестно, какая скорость была при съёме. Если известено - используется то значение RPM, которое было известно при съёме _для_конкретного_трека_. Но исключения - это всегда немного усложнение кода.

--

Zerotrack format: это когда формат нулевой дорожки не соответствует формату треков группы 0.
Например, треки группы 0 (0, 4, 8, 12...) не определён, а трек 0 имеет формат agat140 или agat840.
Типичный диск с тестом ОЗУ.

Так вот декодер этого формата ложно срабатывает на недоформатированные диски:
диск был записан на PC, потом его начали форматировать под агат840, треке на 20-м запись сорвалась.
Декодер видит кучу треков под PC и его считаем главным форматом. Дорожку 0 он видит как агат840 и считает её как Zerotrack format (и тоже синтезирует соответствующий DSK).
Но она не является для нас Zerotrack'ом, потому что тут есть и каталог (он же на 17 треке) и могут быть какие-то файлы. С другой стороны - PC формат без нулевой дорожки - наверняка это был FAT - он тоже бессмысленный.

В итоге, такой образ проще обработать вручную, явно указав, что нужно вытягивать именно агат840.

Возможно, надо будет как-то дорабатывать Zerotrack-декодер.

--

Диск 1.2 Мб, форматированный, скорее всего, или на драйве, который не поддерживает High Density или был направильно сконфигурирован. Или диск не соответствующий.

В результате дорожки примерно до 20 вытянуть ещё можно, дальше ошибки множаться и уже за треком 100 вообще ничего не читается никак (даже адресные поля битые).

Мост правильно показывает группы, но уже в них видно, что 15 секторов на трек есть только на чётных группах (т.е. на нижней голове). На верхней в среднем только 5 секторов. В результате, софт считает, что main-формат ему совсем неизвестен (число секторов на дорожках для одного и того же формата должно совпадать либо оно может несовпадать для чётных и нечётных цилиндров, если главный формат имеет 40 цилиндров, но был создан на дисководе с 96 TPI) и пытается вытянуть группы в 4 отдельных DSK :).

Это казус конечно (на диске ничего кроме, boot record, и не было), но всё равно требует обдумывания и решения - лечить или нет ?

Вручную такой диск собрать можно обратно в 1.2, проги есть для офлайн сборки.

Но всё попахивает тем, в съёмщике нужен режим явного задания формата.
Для дочитывания действительно стоящих дисков.

--

Иногда, читая очень старые диски (которые давно не были в дисководе), сталкиваюсь с тем, что дочитывание сильно улучшает результат. Не часто, но бывает. Такое ощущение, что, может быть, головка на первом проходе скидывает какой-то мусор или окисел и потом читает нормально.

--

Сейчас снимаю старые образцовые диски, возник в вопрос про ДВК (вроде обсуждали уже где-то или нет?):
MY - это вг93 -совместимый формат.
Но вроде бы MX не должен был быть совместимым ? У меня они читаются как PC, но без 1 сектора на всех дорожках.

Электроника МС 0585 - это 96 TPI но одна голова ?!

Commodore 64: такое впечатление, что это немного по другому сделанный GCR (отличается от Disk][), но плюс к тому он ещё и имеет разный битрейт на разных дорожках.
Нет ли ссылки на подробное описание этого формата?