====== Формат файла .MFM ======
Контроллер [[megadrive | Мегадрайв]] хранит образы флоппи-дисков
в виде файлов с расширением .MFM. Файл имеет размер 2048000 байт
и состоит из 160-ти дорожек: сперва цилиндр 0 (сторона 0, потом сторона 1),
затем цилиндр 1 (сторона 0, потом 1) и так далее. Байты выдаются старшим битом вперёд.
Каждая дорожка содержит 6400 байт информации, закодированной
в формате MFM и занимающей в файле объем 12800 байт.
Кодирование MFM:
^ Исходный бит ^ На магнитной дорожке ^ Условие ^
| 1 | 01 | --- |
| 0 | 10 | если в предыдущем бите был ноль |
| 0 | 00 | если в предыдущем бите была единица |
Информация с текущей дорожки поступает в компьютер со скоростью 250 кбит/сек,
что соответствует скорости вращения флоппи-диска, равной 250000/6400/8*60 = 293
об/мин. Это примерно на 2% меньше номинальной скорости 300 об/мин.
Ниже описываются форматы записи дискет Double Density для IBM PC и Amiga.
===== Дискеты IBM PC =====
Структура дорожки:
^ Маркер индекса | 96 байтов: 80 байтов 4E, 12 байтов 00, 3 байта C2, 1 байт FC |
^ Зазор индекса | 42 (примерно) байта 4E |
^ Первый сектор | 574 байта |
^ Зазор сектора | 80 или 46 байтов 4E |
^ ... ... ... | ... ... ... |
^ Последний сектор | 574 байта |
^ Зазор сектора | 80 или 46 байтов 4E |
^ Зазор дорожки | несколько сот байтов 4E |
На каждой дорожке размещается несколько секторов. Их количество
и зазоры определяются параметрами, задаваемыми при форматировании
дискеты. В процессе работы с дискетой межсекторный зазор может изменяться,
поскольку записываемые данные ложатся на место старых с непредсказуемым
смещением.
Маркер индекса не является обязательным и для некоторых типов
контроллеров дисководов может отсутствовать. Размер зазоров может отличаться для разных форматов диска.
^ Формат ^ К-во секторов ^ Зазор сектора ^
|720 кбайт | 9 | 80 |
|800 кбайт | 10 | 46 |
Каждый сектор содержит 574 байта:
^ Маркер идентификатора | 16 байтов: 12 байтов 00, 3 байта A1, 1 байт FE |
^ Идентификатор адреса | 4 байта: адрес дорожки, сторона дискеты, номер сектора, длина сектора |
^ Контрольная сумма идентификатора | 2 байта полинома x16+x12+x5+1 (CCITT) |
^ Зазор идентификатора | 22 байта 4E |
^ Маркер данных | 16 байтов: 12 байтов 00, 3 байта A1, 1 байт FB (данные верны) или F8 (данные стёрты) |
^ Поле данных | 512 байтов данных |
^ Контрольная сумма данных | 2 байта полинома x16+x12+x5+1 (CCITT) |
Контрольная сумма включает байты маркера A1-A1-A1-Fx. Начальное значение FFFF.
При записи маркеров байты C2 и A1 кодируются специальным образом, с нарушением обычных правил MFM:
^ ^ C ^ 2 ^ A ^ 1 ^
^ Биты | _1 _1 _0 _0 | _0 _0 _1 _0 | _1 _0 _1 _0 | _0 _0 _0 _1 |
^ MFM с нарушением | 01 01 00 10 | 10 **00** 01 00 | 01 00 01 00 | 10 **00** 10 01 |
===== Дискеты Amiga =====
Структура дорожки:
| Начальный зазор | 150 байтов 00 |
| Первый сектор | 544 байта |
| ... ... ... | ... ... ... |
| Последний сектор | 544 байта |
| Конечный зазор | 266 байтов 00 |
На каждой дорожке размещается 11 секторов.
Общая ёмкость дискеты равна 880 кбайт.
Каждый сектор содержит 544 байта:
| Маркер | 4 байта: 00 00 A1 A1 |
| Идентификатор | 4 байта: FF, номер дорожки, номер сектора, смещение сектора |
| Метка сектора | 16 байтов: все нули |
| Контрольная сумма заголовка | 4 байта |
| Контрольная сумма данных | 4 байта |
| Поле данных | 512 байтов: сначала 128 полуслов нечётных битов, затем 128 полуслов чётных битов |
Поля идентификатора и метки закодированы в виде
32-битных слов с перегруппировкой чётных и нечётных битов.
Если перенумеровать биты слова:
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
то на дискету они будут записаны в следующем порядке (слева направо):
|31|29|27|25|23|21|19|17|15|13|11|9|7|5|3|1|30|28|26|24|22|20|18|16|14|12|10|8|6|4|2|0|
Контрольная сумма представляет собой XOR (исключающее или) всех 16-битных
полуслов соответствующих данных.
===== Утилита mfmdisk =====
Утилита mfmdisk:
* извлекает из файла MFM бинарный образ диска
* создаёт MFM-файл по бинарному образу диска
* анализирует и выдаёт подробную информацию об MFM-файле
* работает с дисками форматов IBM PC 720k и 800k, БК-0010 800k, Amiga 880k
Скачать исходный текст [[https://github.com/sergev/mfmdisk/wiki | можно здесь]].
===== Ссылки =====
* [[ftp://download.intel.com/design/archives/periphrl/docs/29047403.pdf | Intel 82078 floppy disk controller]]
* {{floppy-ug.pdf | The floppy user guide}}
* [[http://lclevy.free.fr/adflib/adf_info.html | Amiga disk FAQ]]
* [[http://www.hansotten.com/msxwd1793.html | Western Digital FD1793]] - контроллер флоппи-диска для MSX.
* "Дисковая подсистема IBM-совместимых персональных компьютеров", Л. В. Букчин, Ю. Л. Безрукий. М., 1993
===== Файлы для экспериментов =====
Дискеты 800k IBM PC:
* {{ff.bkd}} --- 800 килобайт байтов FF
* {{ff-pc.mfm}} --- образ MFM в формате IBM PC, созданный командой "mfmdisk -c -s10 ff-pc.mfm ff.bkd"
* {{ff-bk.mfm}} --- образ MFM в формате БК-0010/0011, созданный командой "mfmdisk -c -b ff-bk.mfm ff.bkd"
* {{fmt-linux.mfm}} --- MFM-образ дискеты, отформатированной под Линуксом командой "fdformat /dev/fd0u800"
* {{fmt-andos.mfm}} --- MFM-образ дискеты, отформатированной на БК-0011 под ANDOS 3.30
* {{fmt-bkunix.mfm}} --- MFM-образ дискеты, отформатированной на БК-0011 под BKUNIX
* {{andos330.bkd}} --- ANDOS 3.30 для БК-0010/0011
* {{andos330.mfm}} --- образ MFM, созданный из andos330.bkd с помощью megadrive версии 1.05i (на БК не читается)
* {{bkunix10.bkd}} --- юникс для БК-0010
* {{bkunix10.mfm}} --- образ MFM, созданный командой "mfmdisk -c -b bkunix10.mfm bkunix10.bkd"
* {{bkunix11.bkd}} --- юникс для БК-0011М
* {{bkunix11.mfm}} --- образ MFM, созданный командой "mfmdisk -c -b bkunix11.mfm bkunix11.bkd"
Дискета в формате Amiga:
* {{amiga.mfm}} --- образ MFM
* {{amiga.img}} --- данные, восстановленные утилитой mfmdisk (880 кбайт)