(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'ы и если они не равны, то выдают неприятные сообщения в ваш адрес и отказываются работать с дискетой...