1 Отредактировано dk_spb (18-03-2022 12:19)

Тема: Формат дискет Агата 840

В сети есть достаточно подробное описание этого формата.

Но нет подробностей вот этого:
Desync: 0xA4, 2 ms zero level interval, 0xFF

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

- синхросбой в синхробите ПОСЛЕ 0xA4

- не очень понятно что есть "2 ms zero level interval". Читается один "лишний" нулевой бит (на фото слева от красной черты).
Всегда ли это так или "interval" может включать другое число "лишних" бит?
При этом без этого "лишнего" бита не будет синхросбоя (дальше идёт 0xFF, начинающийся с бита "1", поэтому синхробит перед ним будет правильным и синхросбоя не будет"

Есть какие-то мнения/комментарии?
Можно ли привязываться к сигнатуре 1000 1001 0010 0100 0 (на картинке слева от красной черты), чтобы после этой сигнатуры искать 0xFF и дальше пролог поля адреса/данных? Или возможны еще "лишние" нули перед 0xFF ?
Или вообще можно брать в качестве сигнатуры 0xA4 и 0xFF c лишним одним 0?

Post's attachments

Attachment icon agat__.jpg 118.34 kb, 76 downloads since 2022-03-18 

2 Отредактировано Voldemar0 (18-03-2022 17:59)

Re: Формат дискет Агата 840

> Всегда ли это так или "interval" может включать другое число "лишних" бит?

На практике в агате другие комбинации не использовались.

Добавить больше нулей можно попробовать, если FF заменить на 7F. Но что на это сделает контроллер - не знаю, может быть добавит ещё одну единицу.


> Есть какие-то мнения/комментарии?

Я бы не называл A4 байтом здесь. Контроллер работает с последовательностью бит и до распознавания синхросбоя он не знает, где начало байта (т.е. счётчик бит имеет произвольное значение). Только обнаружив синхросбой, контроллер сбрасывает счётчик бит и потом уже можно говорить о байтах.


> Можно ли привязываться к сигнатуре 1000 1001 0010 0100 0 (на картинке слева от красной черты), чтобы после этой сигнатуры искать 0xFF и дальше пролог поля адреса/данных?

Привязываться к этой сигнатуре - да, но искать за ней только одну единицу (ну или если предпочесть байты - любой байт с D7 = 1).

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

Если разбирать любые возможные агатовские диски и связанные с этим детали (вроде всяких защит) - я бы выбрал повторить работу реального автомата 840ки, а он не умел оперировать настолько длинной цепочкой. Т.е. он находит при чтении 10001 и либо декодирует как 101 либо рассматривает это как синхросбой. Дальнейшая цепочка (00100100) декодируется по всем правилам MFM, потом опять встречается 10001 и всё опять также (но тут уже синхросбой гарантирован).

Тут суть в том, чтобы правильно отработать ситуацию, например, когда синхросбой специально встроен в сектор (в защите mousegraph, например) и важно, чтобы байты до и после синхросбоя прочитались правильно (т.е. так же, как их выдавал контроллер 840ки). Я не исключаю, что при поиске полной сигнатуры всё то же будет правильно, но не уверен.
Также один из видов защит: подсчёт размера трека побайтово. Без учёта сихросбоев, но с точным подсчётом успешно прочитанных байт. Синхросбой, а тем более стык записи (там, где "запись" выключалась и какой-то байт мог быть даже не дописан) могут дать причудливые комбинации бит и это неплохо бы учитывать.


>  Или возможны еще "лишние" нули перед 0xFF ?

Количество нулей и так максимально для дисковода. Если их увеличить ещё на записи, то на чтении можно словить неопределённость.
Так что так не делалось. Не знаю, возможно ли агатовским контроллером синтезировать 4 нуля или больше.
Даже если не закидывать данные в регистр записи (как это делалось на 140ке), это не помешает MFM-кодеку писать кодированные нули (т.е. 01010101...).

3

Re: Формат дискет Агата 840

Вот какая мысль интересная:
В РС 0хA1 с синхросбой формируется путём изменения одного синхробита. То есть пишется всего 16 бит.

В Агат 840 0xA4 пишется нормально, а синхросбой получается записью дополнительного 0 после всех правильных 16 бит 0xA4. То есть пишется 17 бит.