Miracle #03
16 июля 1999

Кто там кодит? - Работаем с MS-DOS: Ms-Dos дискеты - описание структуры Ms-Dos диска.

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




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Тусовка - Birthday List v0.1
Ликбез - полное описание + полный дизассемблер ПЗУ (часть 5).
Разное - Проблемы рынка ПО: когда загнется Спектрум. Во всем ли виноваты Хакеры?

В этот день...   16 ноября