драйвер виртуального диска
я пишу драйвер виртуального диска, который физически находится в файле на винте. Мне соответственно надо обрабатывать запросы на чтение и запись данных; когда же я пытаюсь обратиться к своему файлу с помощью ф-ций 3f,40 или 7305h int 21h или int 25/26h - оно, даже при попытке просто зайти на диск намертво виснет. Причем я пробовал читать просто произволный сектор винта, результат тот же. Неужели надо использовать только int 13h ? Если да, нет ли у кого примера конвертации абсолютного номера сектора в c/s/h ?
INT 13H: дисковый ввод-вывод
Этот сервис предоставляет прямой доступ а адаптерам дискеты и твердого диска. Рекомендуется там, где это возможно, использовать INT 25H и INT 26H , чтобы предоставить драйверам устройств DOS выполнять всю низкоуровневую обработку. Разумеется, для таких операций, как форматирование диска или установка защиты от копирования, прерывание INT 13H может оказаться единственной альтернативой.
подфункции: 00H сброс контроллера 08H дать парам диска 10H проверить готовность
01H дать статус 09H иниц табл парам 11H рекалибрация
02H читать секторы 0aH длинное чтение 14H диагностика
03H писать секторы 0bH длинная запись 15H дать тип диска
04H верификация 0cH искать цилиндр 16H изменить статус
05H форматир дорожку 0dH альтерн сброс 17H уст тип диска
AH сервис
--- ----------------------------------------------------------------------------
00H Сброс устройства. вызывает рекалибрацию контроллера.
если DL равен 80H или 81H, выполнен сброс контр тверд диска, иначе FDC.
--- ----------------------------------------------------------------------------
01H дать статус ошибки последней операции.
вход: DL = диск. DL < 80H = дискета; DL > 7FH = твердый диск
выход: AL содержит код ошибки диска (то же, что значение по адресу 0:0441)
--- ----------------------------------------------------------------------------
02H читать секторы
вход: DL = номер диска (0=диск A...; 80H=тв.диск 0; 81H=тв.диск 1)
DH = номер головки чтения/записи
CH = номер дорожки (цилиндра)(0-n) =¬
CL = номер сектора (1-n) ===========¦== См. замечание ниже.
AL = число секторов (в сумме не больше чем один цилиндр)
ES:BX => адрес буфера вызывающей программы
0:0078 => таблица параметров дискеты (для гибких дисков)
0:0104 => таблица параметров тв.диска (для твердых дисков)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX буфер содержит данные, прочитанные с диска
замечание: на сектор и цилиндр отводится соответственно 6 и 10 бит:
1 1 1 1 1 1
+5-4-3-2-1-0-9-8-7-6-5-4-3-2-1-0+
CX: ¦c c c c c c c c C c S s s s s s¦
+-+-+-+-+-+-+-+-¦-+-+-+-+-+-+-+-+
+======> исп. как старшие биты номера цилиндра
--- ----------------------------------------------------------------------------
03H писать секторы
вход: (аналогично подфункции 02H)
ES:BX => данные, записываемые на диск.
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
04H проверить секторы. проверяет CRC для указанных секторов на ошибки.
вход: (аналогично подф. 02H. ES:BX лучше также предоставить)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
05H форматировать дорожку. данные на дорожке, если есть, разрушаются.
вход: DL,DH,CH = диск,головка,дорожка (см. подф. 02H)
ES:BX => дескрипторы секторов (требуется 512-байтовый буфер)
дискета: 1 4-байтовый 'CHNS' (цилиндр,Головка,Nсектора,размер)
для каждого сектора на дорожке (т.е. 36 байт для 9-сек-
торных дорожек); номера секторов д.б. упорядочены.
'Z' - код размера сектора: 0=128; 1=256; 2=512; 3=1024
¦AT¦ Тв. диск: 1 2-байтовый 'FN' (флаг,Nсектора) для каждого сектора на
дорожке. последовательность полей 'N' определяет "коэффи-
циент прослаивания" ("interleave factor").
¦XT¦ Тв. диск: ES:BX не используется. Вместо этого AL содержит значение
"прослаивания" между 1 и 16 (10H).
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
(тв. диск: 'F'-поля установлены в 80H, чтобы пометить плохие секторы)
--- ----------------------------------------------------------------------------
08H ¦AT¦ ¦XT¦ дать параметры диска. возвращает информацию об устройстве.
вход: DL = диск
выход: DL = число тв. дисков на первом контроллере
DH = максимальный номер головки
CH = максимальный номер цилиндра (младшие 8 бит)
CL = максим. номер сектора (и старшие биты макс. номера цилиндра)
--- ----------------------------------------------------------------------------
09H ¦AT¦ инициализировать параметры диска. Сообщает BIOS о любом динамическом
изменении таблиц параметров устройства.
вход: векторы для INT 41H и INT 46H адресуют Табл. параметров тв. диска
соответственно для устройств 0 и 1.
замечание: ¦XT¦ должен указывать обе таблицы через вектор INT 40H.
--- ----------------------------------------------------------------------------
0aH ¦AT¦ ¦XT¦ чтение длинное: 512 байт + 4-байтоый ECC (код коррекции ошибок).
вход: (как для подф. 02H)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX => в буфере (данные сектора + 4 байта) * число секторов (из AL)
--- ----------------------------------------------------------------------------
0bH ¦AT¦ ¦XT¦ запись длинная. Пишет 512 байт + 4-байтовый ECC.
вход: (как для подф. 02H)
ES:BX => буфер содержит данные сектора + 4 байта на каждый сектор
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
0cH ¦AT¦ ¦XT¦ Искать цилиндр. перемещает головку к нужной дорожке.
вход: DL,DH,CH = диск,головка,дорожка (см. подф. 02H)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
0dH ¦AT¦ ¦XT¦ Альтернативный сброс устройства
вход: DL = диск
--- ----------------------------------------------------------------------------
0eH ¦AT¦ читать буфер секторов
вход: (как для подф. 02H)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
0fH ¦AT¦ писать буфер секторов
вход: (как для подф. 02H)
выход: Carry-флаг=1 при ошибке и код ошибки диска в AH.
--- ----------------------------------------------------------------------------
10H ¦AT¦ ¦XT¦ проверить готовность устройства
вход: DL = диск
выход: код ошибки диска (статус) в AH.
--- ----------------------------------------------------------------------------
11H ¦AT¦ ¦XT¦ Рекалибровать устройство
вход: DL = диск
выход: код ошибки диска (статус) в AH.
--- ----------------------------------------------------------------------------
12H ¦AT¦ Диагностика RAM контроллера
выход: код ошибки диска (статус) в AH.
--- ----------------------------------------------------------------------------
13H ¦AT¦ Диагностика устройства
выход: код ошибки диска (статус) в AH.
--- ----------------------------------------------------------------------------
14H ¦AT¦ ¦XT¦ Внутренняя диагностика контроллера
выход: код ошибки диска (статус) в AH.
--- ----------------------------------------------------------------------------
15H ¦AT¦ читать тип диска (недоступна в XT BIOS)
вход: DL = диск
выход: AH = код устройства:
0 = устройство DL отсутствует
1 = дискета; логика замены диска отсутствует
2 = дискета; логика замены диска доступна (большинство случаев)
3 = твердый диск
--- ----------------------------------------------------------------------------
16H ¦AT¦ читать статус замены диска
выход: AH = код статуса:
0 = диск не был заменен
6 = замена активна (открыта дисковая дверь);
DL = номер заменяемого диска
--- ----------------------------------------------------------------------------
17H ¦AT¦ установить тип дискеты (используется перед операцией форматирования)
вход: DL = номер устройства диска (0 или 1)
AL = тип носителя диска:
0 = не используется
1 = 360K дискета в 360K устройстве
2 = 360K дискета в 1.2M устройстве
3 = 1.2M дискета в 1.2M устройстве
:D
;LBA->CHS
calc proc ;input ax!
push cx dx ax
mov cl,18
div cl ;ah=остаток,al=частное
cmp ah,0
je ah0
push ax
mov ah,0
mov cl,2
div cl
cmp ah,0
je chet
mov fs:[FDD_head],1
mov fs:[FDD_track],al
pop ax
mov fs:[FDD_sector],ah
jmp end9
chet:
mov fs:[FDD_head],0
mov fs:[FDD_track],al
pop ax
mov fs:[FDD_sector],ah
jmp end9
ah0:
mov ah,0
mov cl,2
div cl
cmp ah,0
je chet1
mov fs:[FDD_head],0
mov fs:[FDD_track],al
mov fs:[FDD_sector],18
jmp end9
chet1:
mov fs:[FDD_head],1
dec al
mov fs:[FDD_track],al
mov fs:[FDD_sector],18
end9:
pop ax dx cx
retn
calc endp