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).
После этого обращение к любому жесткому диску не будет приводить к обязательному чтению его загрузочного сектора с целью получения нужной информации.