|
За-
тем программа ПРЕРЫВАНИЙ устанавливает бит DONE ("выполнено") в
слове состояния и возвращает управление MS-DOS. Так как возврат
управления должен быть выполнен командой RETF, программа ПРЕРЫВА-
НИЙ определяется как процедура типа FAR.
Листинг 6-3. |
panda 2007 |
|
|
Пример программы ПРЕРЫВАНИЙ.
-----------------------------------------------------------------
;
; Определение битов слова состояния драйвера устройства
;
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 указывающими на блок запроса. |
win zip |
|
|
Свой статус
; обработчик должен вернуть в регистре 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
----T---T---T---T---T---T---T---T---T---T---T---T---T---T---T---¬
¦ E ¦ ¦ ¦ ¦ ¦ ¦ B ¦ D ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ R ¦ ¦ ¦ ¦ ¦ ¦ U ¦ O ¦ ¦ ¦ КОД ОШИБКИ ¦ ¦ ¦
¦ R ¦ ЗАРЕЗЕРВИРОВАНО ¦ S ¦ N ¦ ¦ ЕСЛИ БИТ 15 РАВЕН 1 ¦ ¦
¦ O ¦ ¦ ¦ ¦ ¦ ¦ Y ¦ E ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
¦ R ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===¦===-
Значение битов :
ERROR = 1 : При обработке команды случилась ошибка.
Код ошибки находится в битах с 0 по 7.
BUSY = 1 : Устанавливается командами опроса состояния
и проверки смены носителя.
DONE = 1 : Команда выполнена. Устанавливается на выходе.
Рисунок 6-5. |
домашняя бухгалтерия |
|
|
резервное копирование данных, доктор веб, panda, немецко русский словарь, архиватор winrar, .
утилиты резервного копирования
|
Для передачи
управления определенному обработчику необходимо указать индекс
требуемой подпрограммы, заданной своим смещением в таблице пере-
ходов. Этот индекс (в нашем случае это код команды) преобразуется
в смещение в таблице, после чего выполняется косвенный вызов
подпрограммы или переход на нее через таблицу переходов
call word ptr cs:jumptab[bx] ; обработать команду
В связи с тем, что индекс (т.е. код команды) может быть боль-
ше, чем максимальный из используемых кодов команд, программа ПРЕ-
РЫВАНИЙ должна выполнять проверку индекса для того, чтобы убе-
диться в его правильности. При этом, вместо сравнения индекса с
каким-либо заранее фиксированным значением, программа ПРЕРЫВАНИЙ
сравнивает код команды с максимально допустимым значением, храня-
щимся в поле max_cmd :
cmp bl,[max_cmd] ; команда допустима ?
Для того, чтобы понять пользу хранения максимально допустимого
значения в памяти, взгляните на таблицу 6-2. В этой таблице
представлены команды, поддерживаемые различными версиями MS-DOS.
Максимальный код команды, обеспечиваемый MS-DOS версий до 3.0,
имеет значение 0CH. Однако, учитывая тот факт, что max_cmd распо-
лагается в памяти, драйвер может модифицировать это значение во
время инициализации, позволяя, таким образом, использовать новые
команды, если драйвер загружен под управлением новой версии
MS-DOS.
- 6-26 -
Таблица 6-2
Команды для драйверов устройств
--------T-------T---------T---------T---------T----------------------
Команда ¦ Версия¦ Блоковые¦ Симв-ные¦ Атрибут ¦ Название команды
¦ 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).
|
|
|