команды, если драйвер загружен под управлением новой версии
MS-DOS.
- 6-26 -
Таблица 6-2
Команды для драйверов устройств
ДДДДДДДДВДДДДДДДВДДДДДДДДДВДДДДДДДДДВДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДД
Команда ¦ Версия¦ Блоковые¦ Симв-ные¦ Атрибут ¦ Название команды
¦ DOS ¦ устр-ва¦ устр-ва¦ ¦
ДДДДДДДД†ДДДДДДД†ДДДДДДДДД†ДДДДДДДДД†ДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДД
0: ¦ 2.0 ¦ + ¦ + ¦ ¦ INIT
1: ¦ 2.0 ¦ + ¦ - ¦ ¦ MEDIA CHECK
2: ¦ 2.0 ¦ + ¦ - ¦ ¦ BUILD BPB
3: ¦ 2.0 ¦ + ¦ + ¦ 14:IOCTL¦ INPUT IOCTL
4: ¦ 2.0 ¦ + ¦ + ¦ ¦ INPUT
5: ¦ 2.0 ¦ - ¦ + ¦ ¦ Nondestructive INPUT
6: ¦ 2.0 ¦ - ¦ + ¦ ¦ INPUT STATUS
7: ¦ 2.0 ¦ - ¦ + ¦ ¦ INPUT FLUSH
8: ¦ 2.0 ¦ + ¦ + ¦ ¦ OUTPUT
9: ¦ 2.0 ¦ + ¦ + ¦ ¦ OUTPUT with VERIFY
10: ¦ 2.0 ¦ - ¦ + ¦ ¦ OUTPUT STATUS
11: ¦ 2.0 ¦ - ¦ + ¦ ¦ OUTPUT FLUSH
12: ¦ 2.0 ¦ + ¦ + ¦ 14:IOCTL¦ OUTPUT IOCTL
13: ¦ 3.0 ¦ + ¦ + ¦ 11:OCRM ¦ DEVICE OPEN
14: ¦ 3.0 ¦ + ¦ + ¦ 11:OCRM ¦ DEVICE CLOSE
15: ¦ 3.0 ¦ + ¦ - ¦ 11:OCRM ¦ REMOVABLE MEDIA
16: ¦ 3.1 ¦ - ¦ + ¦ 13:OTB ¦ OUTPUT until busy
19: ¦ 3.2 ¦ + ¦ + ¦ 6:GIOCTL¦ Generic IOCTL Request
23: ¦ 3.2 ¦ + ¦ - ¦ 6:GIOCTL¦ Get Logical Device
24: ¦ 3.2 ¦ + ¦ - ¦ 6:GIOCTL¦ Set Logical Device
ДДДДДДДБДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДД
Примечание 1. В колонке "Версия DOS" указана самая ранняя версия
MS-DOS, начиная с которой поддерживается эта команда.
Примечание 2. В колонке "Атрибут" указаны бит слова атрибутов
драйвера, разрешающий использование данной команды.
ННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН
Последняя задача программы ПРЕРЫВАНИЙ после обработки требуе-
мой команды заключается в установке статуса возврата в блоке зап-
роса. В листинге 6-3 ожидается, что обработчик каждой команды
возвращает статус завершения в регистре AX. После возврата управ-
ления от обработчика, программа ПРЕРЫВАНИЙ записывает статус в
поле слова состояния заголовка запроса (поле request.status). За-
тем программа ПРЕРЫВАНИЙ устанавливает бит DONE ("выполнено") в
слове состояния и возвращает управление MS-DOS. Так как возврат
управления должен быть выполнен командой RETF, программа ПРЕРЫВА-
НИЙ определяется как процедура типа FAR.
Листинг 6-3. Пример программы ПРЕРЫВАНИЙ.
-----------------------------------------------------------------
;
; Определение битов слова состояния драйвера устройства
;
ST_ERROR equ 1000000000000000b ; была ошибка
ST_BUSY equ 0000001000000000b ; устройство занято
ST_DONE equ 0000000100000000b ; команда выполнена
;
; Определение кодов ошибки при обработке команд
;
WRITE_PROTECT equ 0 ; защита от записи
UNKNOWN_UNIT equ 1 ; неопознано устройство
NOT_READY equ 2 ; устройство не готово
- 6-27 -
UNKNOWN_COMMAND equ 3 ; команда не опознана
.
.
;
;********** Точка входа в программу ПРЕРЫВАНИЙ ************************
;
INTERRUPT proc far
pusha ; сохраним все рабочие
push ds ; регистры
push es
push cs ; установим локальный
pop ds ; сегмент данных
les di,[req_ptr] ; получим адрес блока
mov bl,es:[di.command] ; запроса и код
; команды
;
; Установим заранее флаг ошибки (на случай, если команда будет
; неопознана)
;
mov ax,(ST_ERROR or UNKNOWN_COMMAND)
cmp bl,[max_cmd] ; эта команда
ja exit ; поддерживается ?
;
; Передадим управление соответствующему обработчику. На входе каждый
; обработчик получает регистры CS и DS установленными на сегмент
; DRIVER и регистры ES:DI указывающими на блок запроса. Свой статус
; обработчик должен вернуть в регистре AX.
;
xor bh,bh ; превратим команду
shl bx,1 ; в индекс
call word ptr cs:jumptab[bx] ; обработаем команду
;
; Запишем статус в слово состояния блока запроса
;
exit: push cs
pop ds
les di,[req_ptr] ; получим адрес блока
or ax,ST_DONE ; запроса, установим
mov es:[di.status],ax ; бит DONE и сохраним
pop es ; статус
pop ds ; восстановим контекст
popa
ret ; RETF
INTERRUPT endp
.
.
.
;
;********** Таблица переходов на обработку команд *******************
;
JUMPTAB label word
dw offset INIT ; 0 - Инициализация
dw offset MEDIA_CHECK ; 1 - Проверка носителя
dw offset BUILD_BPB ; 2 - Построить BPB
.
.
.
- 6-28 -
dw offset NO_COMMAND ; 16
dw offset GET_LOGICAL ; 17 - Получить имя ЛУ
dw offset SET_LOGICAL ; 18 - Установить ЛУ
.
.
.
---------------------------------------------------------------------
Слово состояния, показанное на рис.6-5, используется для инди-
кации ошибок, случившихся при выполнении какой-либо команды (бит
ERROR -- ошибка) и для отображения состояния устройства по коман-
дам опроса статуса и проверки смены носителя (бит BUSY -- заня-
то).
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДД·
¦ E ¦ ¦ ¦ ¦ ¦ ¦ B ¦ D ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ є
¦ R ¦ ¦ ¦ ¦ ¦ ¦ U ¦ O ¦ ¦ ¦ КОД ОШИБКИ ¦ ¦ є
¦ R ¦ ЗАРЕЗЕРВИРОВАНО ¦ S ¦ N ¦ ¦ ЕСЛИ БИТ 15 РАВЕН 1 ¦ є
¦ O ¦ ¦ ¦ ¦ ¦ ¦ Y ¦ E ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ є
¦ R ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ є
ФНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННПНННј
Значение битов :
ERROR = 1 : При обработке команды случилась ошибка.
Код ошибки находится в битах с 0 по 7.
BUSY = 1 : Устанавливается командами опроса состояния
и проверки смены носителя.
DONE = 1 : Команда выполнена. Устанавливается на выходе.
Рисунок 6-5. Слово состояния драйвера устройства
Бит ERROR устанавливается, если возникла ошибка при выполнении
какой-либо команды или если команда является недопустимой для
данного драйвера. При установленном бите ошибки драйвер обязан
поместить соответствующий код ошибки в биты с 0 по 7 слова состо-
яния. Возможные ошибки и их коды перечислены в таблице 6-3. Бит
DONE должен всегда устанавливаться драйвером перед возвратом уп-
равления к MS-DOS.
Таблица 6-3
Коды ошибок драйверов устройств
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Код Ошибка ¦Код Ошибка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДД
0 Запись на устройство запрещена ¦ 8 Сектор не обнаружен
1 Неопознанное устройство ¦ 9 Нет бумаги в принтере
2 Устройство не готово ¦ A Ошибка при записи
3 Команда не опознана ¦ B Ошибка при чтении
4 Неверно переданы данные ¦ C Общая ошибка
5 Неверна длина заголовка запроса¦ D Зарезервировано
6 Ошибка при установке головки ¦ E Зарезервировано
7 Неопознанный носитель данных ¦ F Недопустимая смена диска
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Примечание 1. Все коды ошибок представлены в виде шестнадцати-
ричных значений.
Примечание 2. Код ошибки 0FH поддерживается только в MS-DOS вер-
сии 3.0 и более поздних.
- 6-29 -
Команды драйверов устройств
Заголовок запроса, как правило, содержит не всю информацию,
которая требуется для большинства команд. Команд, которые не тре-
буют дополнительной информации, довольно мало -- это команды
INPUN/OUTPUT STATUS , FLUSH OUTPUT, OPEN/CLOSE DEVICE и REMOVABLE
MEDIA. Все остальные команды требуют гораздо больше информации,
чем содержится в заголовке запроса. Для каждой из этих команд к
заголовку запроса добавляется дополнительная информация. Поле
request.length заголовка запроса содержит при этом общий размер
блока запроса (в байтах).
Для облегчения доступа к различным элементам блока запроса,
опять-таки, могут быть использованы структуры. В листинге 6-10
(листинге драйвера RDISK, приведенного в конце главы) показано
определение структур для тех команд, которые обрабатываются этим
драйвером. Заметьте, что нам не нужно определять все поля в каж-
дом блоке, т.к. различные запросы часто используют похожие блоки
запросов. Это обстоятельство довольно удобно, т.к. MASM не позво-
ляет использовать одно и тоже имя более одного раза, даже для
различных структур.
Команда INIT
ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
є є
є Команда INIT (0) є
є є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ є
є +00 : 23 Длина ¦ X ¦ Блок. драйверы є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ є
є +01 : Устройство ЪДДД¬ є