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 последний ролик готовил, искал там старые проги.