84 Глава 3

Поле FAT16 определяет тип FAT: если это поле содержит значение TRUE, FAT состоит из 16—битных элементов, в противном случае — из 12-битных. Для контроля типа FAT в модуле используется рекомендуемая в MS-DOS проверка: если общее количество кластеров на диске превышает емкость 12-разрядного двоичного числа, т.е. больше 4096, значит FAT использует 16—разрядные элементы, в противном случае — 12-разрядные.

Значение поля RootLock вычисляется по формуле:

RootLock = FATLock + FATCi-it"" FAT Size а поля DataLock — по формуле

DataLock = (RootLock + RootSize*32) div 16+2

При обращениям ко всем процедурам и функциям модуля номер диска соответствует принятому в IOCTL порядку нумерации: 0 — диск А:, 1 — диск В:, 2 — диск С: и т.д. Исключением является вызов процедур GetAbs5ector и SetAbsSector, в которых номер диска соответствует обращению к прерыванию $13: 0 — диск А:, 1 — диск В:, $80 — 1—й ЖД, $81 - 2-й ЖД.

Процедура GetListDisk. Формирует связанный список дисковых описателей. Заголовок:

Procedure GetListDisk(var List: PListDisk);

Список определяется такой структурой:

type

{Список описателей диска}

PListDisk'= •^TListDisk;

TListDisk = record

Disklnfo: TDisk; (Описатель диска} NextDisk: PListDisk {Ссылка на следующий}

end;

Поскольку параметры ГД могут меняться от дискеты к дискете, информация о них не заносится в список. В модуле предусмотрена следующая глобальная переменная:

const

Disks: PListDisk = NIL.

Полезно перед самым первым обращением к подпрограммам модуля F_Disk сформировать список таким образом:

GetListDisk(Disks).

После этого обращение к любому жесткому диску не будет приводить к обязательному чтению его загрузочного сектора с целью получения нужной информации.