Работа с диском на физическом уровне__________ ____ 77
AX — код ошибки (если CF=1).
Для дисков большой емкости (больше 32 Мбайт) регистр DX не используется, регистр СХ должен содержать $FFFF (признак обращения к большому диску), а регистры DS:BX содержат адрес такой структуры данных:
type
TLargeDisk = record
StartSec: Longint; {Номер сектора} Nsecs : Word; {Количество секторов) AdrBuf : Pointer; {Адрес буфера}
end;
При реализации доступа к прерываниям $25 и $26 следует учесть, что в процессе их обработки ДОС помещает в вершину стека «лишнее» слово (состояние регистра флагов). По этой причине обращение к прерываниям с помощью стандартной процедуры INTR невозможно, т.к. не обеспечивается правильный выход из процедуры. Кроме того, изменяется содержимое регистров DS и ВР, которые, следовательно, нужно где — то (обычно в стеке) сохранить перед вызовом прерывания, чтобы после завершения обработки прерывания восстановить сохраненные значения. Вот почему доступ к прерываниям $25 и $26 можно программировать только с помощью ассемблера (см., например, процедуру ReadWriteSector в модуле FJDisk).
Среди многочисленных функций ДОС есть несколько весьма полезных при работе с диском. Это прежде всего функция $32. Стандартная документация по MS-DOS не содержит никаких сведений об этой функции. Говорят, что эта функция недокументирована. В отличие от остальных функций недокументированные функции могут не работать в других версиях ДОС (например, в более поздних версиях или в альтернативных разработках конкурирующих фирм). Функция $32 работает в версии 5.0, а также в версиях 4.х, З.х и 2.х MS-DOS. Она возвращает информацию о диске, которую, в принципе, можно получить и из других источников, например из ВРВ или с помощью функции 8 прерывания $13. Достоинством функции $32 является то, что информация о диске собирается воедино в структуру данных следующего типа:
type
PDrvInfo_Type ^DrvInfc^Type;
DrvInfo_Type = record
Drv Byte; {Номер диска: 0-A, 1-В и т.д.}
SubDrv Byte; {Номер устройства внутри драйвера}
SecSize Word; {Размер сектора в байтах}
SecClus Byte; {Количество секторов в кластере минус 1}
ExpClus Byte; {Сдвиг номера кластера}
Boots Word; {Количество загрузочных и резервных секторов}
FatCnt Byte; {Количество копий FAT}
RootSiz Word; {Количество элементов корневого каталога}