(c) Steelzer/Triumph
---------------------
Структура MS-DOS дискет
На SPECTRUM'е можно спо-
койно читать диски следующих
форматов:
------------------------------------------------------------
имя сек. стороны идент.байт емкость дорожек сек.
в кластере на дорожке
------------------------------------------------------------
D-8 22 #FF 320K 408
S-8 11 #FE 160K 408
D-9 22 #FD 360K 409
S-9 11 #FC 180K 409
QD-9 22 #F9 720K 809
------------------------------------------------------------
Теперь поясняю: имя-услов-
ное обозначение, где буква S-
- single, D-double (стороны),
цифры 8 или 9-количество сeк-
торов на дорожке, а Q-quality
(повышенная плотность записи,
имеется в виду 80 дорожек).
Можно добавить, что существуют
еще и форматы D-10 и S-10, но
они так редко встречаются, что
писать о их структуре нет
смысла; секторов в кластере -
- если на SPECTRUM'е единица -
- сектор, то на писюке клас-
тер; размер кластера зависит
от количества сторон дискеты
- если диск двусторонний, то
размер кластера 2 сектора;
идентификационный байт-1ая за-
пись в FAT'е, по которой можно
определить с каким диском мы
имеем дело.
Так-как при работе с
MS-DOS дискетой, при переносе
различных файлов выгодна боль-
шая емкость дискеты, то далее
речь пойдет только о двух фор-
матах:D-9 и QD-9. Забыл упомя-
нуть и о формате QD-15, но это
уже нечитаемая плотность на
обычном дисководе.
Структура 0-ой дорожки
Если мы говорим, что на
диске формата D9-9 секторов,
то мы должны подразумевать под
этим, что TR-DOS понимает их
как сектора 0..8, а как там их
понимает iBM - это нас должно
интересовать в последнюю оче-
редь. И вот еще что надо
знать: сектора iBM - по 512
байт, следовательно читать их
нужно только по !1! Т.е. если
нам нужно прочитать 0-ую
дорожку, то делать вот так не
следует ни в коей-мере:
LD HL,BUFFER
LD DE,0
LD BC,#0905
CALL #3D13
Необходимо читать и записывать
только ПОСЕКТОРНО!!! Т.к.
только этим способом можно
записывать или/и считывать
сектора нестандартной длины. 0
сектор содержит загрузочную
запись, но интерес представля-
ет следующая информация, при-
веденная в таблице:
------------------------------------------------------------
смещение длина описание
------------------------------------------------------------
03 8 байт идентификатор системы (слово)
11 1 слово размер сектора (512 байт)
13 1 байт размер кластера
14 1 слово количество резервированных секторов
16 1 байт количество копий FAT (D9-2, QD9-3)
17 1 слово количество файлов в каталоге
19 1 слово общее количество, сек. на диске (D9-720)
21 1 байт код формата (см.далее)
22 1 слово количество копий FAT (QD9-3)
24 1 слово количество секторов на дорожке
26 1 слово количество сторон дискеты
28 1 слово количество спец. секторов (???)
------------------------------------------------------------
1-3 сектора (1 и 2 для D9) FAT.
4-6 сектора (3 и 4 для D9) копия FAT'a.
7-8 сектора (5-8 для D9) каталог.
1 дорожка:
0-4 сектора (0-2 для D9) продолжение каталога.
5-8 сектора (3-8 для D9) начало данных.
------------------------------------------------------------
Каталог.
Каждая запись в каталоге имеет 32-х байтную длину.
------------------------------------------------------------
Смещение ОписаниеРазмер(байт) Формат записи
------------------------------------------------------------
00 Имя файла 8 байт Символы ASCII
08 Имя типа файла 3 байта Символы ASCII
11 Атрибуты файла 1 байт Биты (см.ниже)
12 Служебное поле 10 байт Не используется
22 Время создания 2 байта Слово (см.ниже)
24 Дата создания2 баыта Слово (см.ниже)
26 Начальный кластер 2 байта Слово (см.ниже)
28 Размер файла (байт) 4 байта Слово (целое).
------------------------------------------------------------
1.Имя файла.
Неиспользуемые элементы
каталога имеют начальный байт
00. Нужно отметить,что DOS
прекращает вывод каталога при
встрече 00. Если первый байт
записи равен #Е5, то это
означает, что файл стерт. Это
значит, что все кластеры,
относившиеся к данному файлу
помечаются как свободные, и
если DOS'у понадобится новый
элемент каталога, то он
перезапишет все сведения о
стертом файле, и тогда его
восстановление станет практи-
чески невозможным.
А если в качестве первого
байта выступает код #2Е (.),
то значит перед нами
подкаталог. Но если и второй
байт #2Е, то данный элемент
соответствует каталогу-родите-
лю текущего, а номер начально-
го кластера указывает располо-
жение каталога родителя.
2.Атрибуты файла.
------------------------------------------------------------
РазрядЗначение Примечание
------------------------------------------------------------
0 Разрешено только чтение
1 Невидимый
2 Системный
3 Метка тома
4 Подкаталог Идентифицирует подкаталог
5 Архив Для дискет бесполезен
6-7 Не изпользуются
------------------------------------------------------------
3.Время создания или последней модифи-
кации.
Время само по себе рас-
сматривается, как беззнаковое
целое, составленное из часов,
минут и секунд по следующей
формуле:
Часы*2048+Минуты*32+Секунды+2
Часы базируются на основе 24-х
часового цикла и могут изме-
няться от 0 до 23. Т.к. двух-
байтовое поле, используемое
для записи времени на один
разряд короче, чем необходимо
для хранения полного значения
числа секунд в сутки, то время
хранится в единицах, равным
двум секундам, и число таких
единиц изменяется от 0 до 29.
4.Дата создания или последней модифи-
кации.
Сами по себе эти 2 байта
могут рассматриваться, как
беззнаковое целое слово,
составленное из года, месяца и
дня с использованием следующей
формулы:
(Год-1980)*512+Месяц*32+День
Хотя эта система может
работать до 2108 года,
максимальный год, поддерживае-
мый DOS'ом равняется 2099.
5.Номер начального кластера.
Это 2 байта, которые дают
номер начального кластера. Он
действует как точка входа в
цепочку занятого пространства
файла, находящуюся в FAT'е.
Для файлов, не занимающих
области данных номер начально-
го кластера равен 0.
6.Размер файла.
Это 4 байта дающие нам
длину файла в байтах. После
прочтения этой информации все
вроде бы должно быть понятно
даже непродвинутому усеру, и
единственное, что еще не было
описано, так это FAT. И так,
что же это такое, и с чем его
едят?
FAT (File Allocated Table).
Все файлы и подкаталоги
(которые во многом подобны
файлам данных) хранятся в
самой последней и самой
большой части любого диска.
Файлам дается столько места,
сколько им нужно, по одному
кластеру за раз. Во многих
случаях файл занимает непре-
рывный блок пространства дис-
ка. Однако файл может быть
разбросан по всему диску, и
необязательно, что конец ваше-
го к примеру текстового файла
находится после начала. Такая
ситуация проявляется в тех
случаях, когда информация
добавляется к существующему
файлу, или когда создается
файл на месте, оставшемся
после удаления другого файла.
Такое разбиение, конечно, нес-
колько замедляет доступ к фай-
лу, но только в том случае,
когда файлы фрагментированы.
Для контроля за расположе-
нием файла, на диске есть спе-
циальная область данных, назы-
ваемая FAT'ом. FAT бывает 12ти
и 16ти битный. Далее речь пой-
дет только о 12-ти битном фор-
мате, т.к. 16 битный использу-
ется только на дисках, где
количичество кластеров превы-
шает 4095 (#FFF). FAT органи-
зован как таблица, которая мо-
жет содержать до 4096 чисел в
диапазоне 0 до 4095, которые
являются записями для каждого
кластера пространства данных.
Число в каждой записи указыва-
ет на состояние и использова-
ние кластера, соответствующего
данной записи FAT. Диапазон
чисел в записи не может превы-
шать три HEX цифры. Если за-
пись содержит 0, то это озна-
чает, что кластер свободен и
его можно использовать. Если
запись содержит #FF7 (4087) и
не является частью какой либо
цепочки распределения файла,
то данный кластер маркируется
как неиспользуемый из-за ошиб-
ки при форматировании.
Кластеры последовательно
нумеруются от 2 до числа на
единицу большее, чем общее
количество кластеров на диске.
Записи FAT'а содержат число от
2 до 4080 (#FF0), указывающие
на то, что соответствующий
кластер используется файлом.
Значение #FFF означает, что
данный кластер содержит
последнюю часть файла. Для той
же цели могут использоваться
числа от #FF8 до #FFE.
Запись для файла в катало-
ге содержит номер начального
кластера, а записи FAT'а
указывают на последующие
используемые файлом кластеры.
Когда файл стирают, то все
записи в FAT'е относившееся к
файлу маркируют 0, т.е. как
свободные, однако действитель-
ные данные файла в области
данных не изменяются, также
остается без изменений большая
часть информации о файле в
каталоге.
Хотя и кажется, что
FAT-простая таблица чисел,
хранится она в довольно хитром
виде. Одна запись требует 12
битов или 1,5 байта; т.е. для
двух записей используются 3
байта, когда как в 16-битном
FAT'е-4 байта. Первый байт в
FAT'е является кодом формата
(см.ниже таблицу), следующие 2
байта равны #FF и не
используются. Далее идут пары
по 3 байта. Если вы
собираетесь перекодировать FAT
по парам записей, то лучше это
делать по следующей формуле:
читаем AB CD EF >>> перекодируем в DAB и EFC
Но если вы не хотите
перекодировать FAT в 16-битный
более удобный формат, а
предпочитаете читать отдельные
записи прямо из FAT'а, то вот
алгоритм: задав любой номер
кластера, мы можем найти зна-
чение FAT, умножив номер клас-
тера на 3, затем поделить по-
лученный результат на 2, и
использовать это число как
смещение внутри FAT'а. Взяв по
полученному адресу слово, мы
имеем 3 HEX цифры записи FAT и
еще одну ненужную HEX цифру.
Теперь отбрасываем старшую
цифру если номер кластера
четный, и младшую, если номер
нечетный. В результате всех
этих операций мы имеем номер
следующего кластера файла, за
исключением значения #FFF,
которое означает, что этот
кластер содержит последнюю
часть файла.
В общем если нам нужно
прочитать файл, мы смотрим в
поле записи каталога номер
начального кластера для этого
файла, читаем этот кластер,
далее смотрим по таблице FAT'а
номер следующего кластера
файла, опять читаем его и так
повторяем эту процедуру до тех
пор пока не всетретим в FAT'е
#FFF-следовательно этот клас-
тер последний для данного FAT.
Для наглядности показываю пример:
Вначале читаем к примеру
только первый сектор FAT'а:
LD BC,#0105
LD HL,BUFFER
LD DE,#0101
CALL #3D13
...
Далее смотрим дамп памяти с
адреса BUFFER:
FD FF FF 03 40 00 05 60 00 07 80 00 09 A0 00 FF FF FF
______/ ______/ ______/ ______/ ______/ ______/
ненужный кластеры ... ... ... .....
заголовок 2-3 4-5 6-7 8-9 10-11
Теперь смотрим в заголовок
файла (перед этим мы должны
прочитать его): к примеру файл
начинается со 2-го кластера;
берем 3 байта, где находится
info о 2 кластере и перекоди-
руем его по известной ранее
формуле:
AB CD EF=DAB EFC:03 40 00=003 004
из этого следует, что следую-
щий кластер файла 003, читаем
2 кластер, далее читаем 3-ий
и смотрим в FAT...
Таблица идентификационных байт:
------------------------------------------------------------
Идентификационный байт: Формат:
------------------------------------------------------------
#FF D-8
#FE S-8
#FD D-9
#FC S-9
#F9 QD-9
------------------------------------------------------------
К сожалению у меня на
данный момент нет необходимой
информации по форматам S-10,
D-10, QD-10; но если кого-ни-
будь это заинтересует пишите
на адрес MIRACLE с пометкой
'FOR STEELZER', я вам отвечу и
вышлю всю имеющуюся у себя до-
кументацию с примерами рабочих
процедур...
------------------------------------------------------------
Примечание: как ранее было
сказано, дискета MS-DOS содер-
жит 2 копии FAT'а, но следует
знать, что если вы изменили
каталог (записали файл или
стерли) следует изменить также
и копию FAT'а, т.к. некоторые
проги на писюках сверяют FAT'ы
и если они не равны, то выдают
неприятные сообщения в ваш
адрес и отказываются работать
с дискетой...