Несколько слов о MS-DOS.
Немало времени прошло с тех пор когда я
написал свой MSCOM v0.0 . Вообще задумка
была неплохая, но как известно, первый
блин комом. Вообще главной отличительной
чертой моего MSCOM'а было то, что она,
согласно идее, должна была учитывать все
особенности MSDOS, и в частности сегмен-
тацию файлов. (Этим кстати и об'ьясняет-
ся тормознутость дисковых операций как в
IS-DOS'е так и в MSCOM'е.) И по сей день
ни одна программа конвертящая с писюка,
кроме этих двух, не поддерживает сегмен-
тацию файлов. Поскольку я еще не скоро
возьмусь за переписывание MSCOM'а, то я
решил выдать информацию по MSDOS, дабы
если найдется молодец который захочет
написать очередной конвертор,я хочу что-
бы он пр принял все к сведению и не сот-
ворил очередной лейм. Да, кстати, все
пишу по памяти, и по этому 100%-ю точ-
ность не гарантирую.
1.1 Общая информация.
Оговорюсь сразу: Вся информация приведе-
на для формата MSDOS диска на 720, как
единственно пригодного для чтения на
спектруме.
Итак: формат MSDOS диска имеет следую-
щую структуру:
1. Размер сектора: ....... 512 байт.
2. Кол-во секторов в треке: 9
3. Кол-во треков: ........ 80 (160)
Так же стоит заметить, что если вы ре-
шили вдруг написать MSDOS форматтер, то
первый синхропробел делайте побольше,
иначе вы обречены на нечтение первого
сектора на PC.
1.2 Системный сектор.
Нулевой сектор на нулевом треке явля-
ется системным. В нем записана важная
информация о структуре диска в целом,
фаиловой и физической структуре оного.
Эта информация называется Block
Parametrs of BIOS (BPB). Вот ее вид:
+12 SectSiz : Word;
Количество байт в секторе. Всегда со-
держит 512.
+14 ClustSize : Byte;
Количество секторов в кластере (см.ни-
же). Для формата 720 всегда содержит 2.
+15 ResSect : Word;
Кол-во секторов перед FAT. (см. ниже)
+17 FatCnt : Byte;
Кол-во копий FAT. обычно 2 для диска.
+18 RootSiz : Word;
Кол-во элементов корневого каталога.
+20 TopSecs : Word;
Кол-во секторов на диске.
+22 Media : Byte;
Дескриптор носителя.
+23 FatSize : Word;
Размер FAT в секторах.
Поле Media определяет тип носителя ин-
формации:
╔════╤═════════════════════════════╗
║ Бит│ Признак ║
╟────┼─────────────────────────────╢
║ 0 │ Двух/односторонний носитель.║
╟────┼─────────────────────────────╢
║ 1 │ 8/не 8 секторов на треке. ║
╟────┼─────────────────────────────╢
║ 2 │ Винчетер/Дисковод ║
║ │ ║
╚════╧═════════════════════════════╝
Сразу за BPB содержится следующая ин-
формация:
+25 TrkSecs : Word;
Кол-во секторов на дорожке;
+27 HeadCnt : Word;
Кол-во головок устройства;
+29 HidnSecs : Word;
Кол-во спрятанных секторов.
Дальнейшая структура относится к вин-
честеру, и здесь описывать ее не имеет
смысла.
1.3 FAT - структура.
За загрузочным сектором располагается
так называемая FAT-структура. Начало ее
можно узнать, отступив от начала диска
количество секторов, которое содержится
в поле ResSecs (из BPB).
FAT (File Allocation Table) - важнейшая
структура на диске. Как следует из наз-
вания, FAT содержит информацию о распо-
ложении файлов.
Теперь позвольте мне сделать лирическое
отступление. Весь диск в формате MS-DOS
делится на так называемые кластеры.
Кластер представляет собой группу смеж-
ных секторов (1 или более, в нашем слу-
чае, при формате на 720, - 2). Кластер -
это элементарная единица в системе
MS-DOS, т.е. это меньшее что вы сможете
считать с диска. Кластер определяется
его абсолютным номером и при формате на
720 этот номер задается 12-и битным чис-
лом.
Вернемся к FAT. Итак, из всего вышеска-
занного следует что FAT определяет при-
надлежность кластеров к своим файлам, и
вот как это устроено: FAT-структура со-
держит цепочки ссылок: где-то в описате-
ле файла содержится номер его первого
кластера, программа берет этот номер,
считывает в память соответствующий ему
кластер, и дальше заглядывает в ячейку
FAT с этим же номером, а в этой ячейке
содержится номер следующего кластера,
одновременно являющийся ссылкой далее.
Так программа потихоньку считывает файл
пока вместо номера очередного кластера
не достанет из FAT управляющий код конца
чтения.
┌───────┬┬───┬┬┬┬┬┬┬┬┬───┬───┬──┬─────┐
│ Myfile txt │tim│dat│02│Длина│
└───────┴┴───┴┴┴┴┴┴┴┴┴───┴───┴╫─┴─────┘
╔══════════════════════╝
┌──┬──┬──┬──┬──┬──┬──┬─────┐
│ID│FF│03>04>05>08│1E│09>FF│
└──┴──┴──┴──┴──┴─║┴──┴ ^ ──┘
╚═════╝
В структуре FAT используются следующие
управляющие коды:
от #FFO до #FFб - Кластер зарезервиро-
ван.
#FF7 - Сбойный кластер.
от #FF8 до #FFF конец файла.
Напоминаю что элементы FAT 12-и битные,
и в три байта помещается ровно два эле-
мента. Ну вот, пожалуй с самым сложным
разобрались. В заключении этой главы хо-
чу лишь добавить, что на диске обычно
бывает несколько копий FAT, что обеспе-
чивает надежность сохранности информа-
ции.
1.4 Структура каталогов.
Сразу за последней копией FAT располо-
гается корневой каталог, содержащий опи-
сатели зарегестрированных в нем подката-
логов и файлов. Каждый элемент каталога
описываетя 32-х байтной структурой дан-
ных:
╔═══╤═══════╤═════╤════════════════════╗
║См.│ Поле │Длина│ Смысл ║
╟───┼───────┼─────┼────────────────────╢
║+00│ Name │ 8 │ Имя файла. ║
╟───┼───────┼─────┼────────────────────╢
║+08│ Ext │ 3 │ Расширение. ║
╟───┼───────┼─────┼────────────────────╢
║+11│ Fattr │Byte │ Атрибуты файла. ║
╟───┼───────┼─────┼────────────────────╢
║+12│Reserv │ 10 │ 10 байт Бреда. ║
╟───┼───────┼─────┼────────────────────╢
║+22│ Time │Word │ Время создания. ║
╟───┼───────┼─────┼────────────────────╢
║+24│ Date │Word │ Дата создания. ║
╟───┼───────┼─────┼────────────────────╢
║+26│FistC │Word │Номер 1-го кластера.║
╟───┼───────┼─────┼────────────────────╢
║+28│Size │4 │Разм. файла в байтах║
║ │ │ │ ║
╚═══╧═══════╧═════╧════════════════════╝
Следующая таблица отражает значение по-
ля Fattr.
╔════╤════════════════════════╗
║бит │ Смысл ║
╟────┼────────────────────────╢
║ 0 │ Защита от изменений. ║
║ 1 │ Скрытый файл. ║
║ 2 │ Системный файл. ║
║ 3 │ Идентификатор тома ??? ║
║ 4 │ Подкаталог ║
║ 5 │ Признак архивации ║
║ │ ║
╚════╧════════════════════════╝
Поле FirstC содержит номер первого
кластера файла или каталога. Подкаталоги
имеют ту же структуру что и корневой ка-
талог. Байт #00 в начале описателя файла
указывает на конец каталога, а #120 на
то что этот файл стерт. Для каждого под-
каталога элемент с именем "." содержит
ссылку в корневой каталог, а ".." - на
предыдущий уровень.
1.5 Заключение.
Вот пожалуй и все что необходимо знать
синклеристу о системе MSDOS. Еще не могу
не сказать о пришедшей ко мне недавно в
голову идее, относительно ускоения опе-
раций с MSDOS диском. Очень часто клас-
тера файла лежат друг за другом и поэто-
му, чтобы не читать кластеры по одному
(а это и есть главный тормоз), можно
посмотреть FAT таблицу, вычленить группы
смежно лежащих кластеров и считывать эти
группы как пачки секторов. По моей при-
кидке скорость должна возрости в 3-4 ра-
за, так как диск не будет делать левые
обороты там где не надо.
Вобщем, я думаю, информации достаточно
чтобы написать грамотный конвертер. Если
необходима дополнительная информация или
какие либо исходники обращайтесь ко мне
(KotSoft'у). Засим расшаркаюсь...
При написании статьи использовались
справочные материалы из книги В.В. Фара-
онова. "Turbo Pascal 7.0 - Практикум
программирования"
(C) KotSoft 31.08.00
Other articles: