Глава 7. Ввод/вывод.

Раздел 2. Создание драйвера устройства.

7.2.4 Доступ к драйверу устройства.

Драйвер устройства устанавливается путем включения имени готовой программы в файл конфигурации системы. Для установки пробной программы поместите в файл CONFIG.SYS строку DEVICE = DEVICE12.COM. Затем перезагрузите систему для установки драйвера. Если машина не будет загружаться, то скорее всего имеется ошибка в коде инициализации драйвера.

После того как драйвер установлен, для доступа к нему пользуйтесь обычными функциями MS DOS прерывания 21H. Kакие функции можно использовать зависит от того, заменяет ли устройство стандартное устройство DOS (как в приведенном примере) или оно добавляется как совершенно новое устройство. Для замены стандартного последовательного устройства, назовите драйвер AUX, после чего функции 3 {7.1.7} и 4 {7.1.6} прерывания 21H будут осуществлять соответственно ввод и вывод. Если устройство параллельное, то назовите его PRN, после чего функция 5 {6.3.1} будет выводить данные на принтер. Другой возможностью является использование функции 3FH {5.4.4} для ввода и {5.4.3} для вывода. В этом случае используйте номер файла 3 - для последовательного устройства и 4 - для параллельного. Hапоминаем, что при использовании предопределенных номеров файла нет необходимости открывать устройство.

Если устройство не заменяет одно из стандартных устройств MS DOS (т.е. если оно не названо одним из резервных слов, таким как PRN, AUX и т.д.), то Вы можете открыть устройство с помощью одной из функций для открытия файла. Вы можете использовать как метод доступа с помощью управляющего блока файла, так и метод дескриптора файла, хотя последний предпочтительнее. Чтобы быть уверенным, что Вы по ошибке не откроете дисковый файл, поместите номер файла в BX, 0 - в AL, посде чего выполните функцию 44H прерывания 21H. Это функция IOCTL и если бит 7 значения, возвращаемого в DL установлен, то драйвер устройства загружен.

IOCTL требует, чтобы в байте атрибутов драйвера была соответствующая установка битов и чтобы по крайней мере основы процедуры обработки IOCTL имелись в процедуре обработчика прерывания драйвера. Функция IOCTL имеет 8 подфункций, пронумерованных от 0 до 7, при этом соответствующий кодовый номер помещается в AL при вызове функции:

 
   0    Возвратить информацию об устройстве в DX 
   1    Установить информацию об устройстве, используя DL (DH=0) 
   2    Считать CX байтов от драйвера устройства через управля
        щий канал и поместить их начиная с DS:DX 
   3    Записать CX байтов в драйвер устройства через управляющий 
        канал, взяв их начиная с DS:DX 
   4    То же, что и 2, но использовать номер накопителя в BL, 
        где 0 = накопитель по умолчанию, 1 = A и т.д. 
   5    То же, что и 3, но использовать номер накопителя как в 5 
   6    Получить статус ввода 
   7    Получить статус вывода 

В ответ возвращается различная информация, в зависимости от того, какая функция вызвана. Для подфункций 0 и 1 значение битов регистра DX следующее (при условии, что бит 7 = 1, что означает, что доступ получен к устройству, а не к файлу):

 
   0    1 = устройство консольного ввода 
   1    1 = устройство консольного вывода 
   2    1 = нулевое устройство 
   3    1 = устройство часы 
   4    резерв 
   5    1 = нет проверки на Ctrl-Z, 0 = есть проверка на Ctrl-Z 
   6    1 = не конец файла, 0 = конец файла 
   7    1 = устройство, 0 = дисковый файл 
8-13    резерв 
  14    1 = если можно использовать подфункции 2 и 3, 0 = нельзя 
  15    резерв 

Подфункции 2-5 позволяют программе и устройству обмениваться произвольными управляющими строками. Это позволяет передавать управляющие сообщения отдельно от основного потока данных, что существенно упрощает дело. При возврате AX будет содержать число переданных байтов. Подфункции 6-7 позволяют программе проверить, готово ли устройство для ввода или вывода. Для устройств в AL возвращается FF, если устройство готово и 0, если нет. При использовании с открытым файлом (бит 7 = 0) в AL возвращается FF до тех пор, пока не будет доститгнут конец файла.

Отметим, что в Бейсике 3.0 добавлены операторы IOCTL и IOCTL$. Они позволяют бейсиковской программе, соответственно, посылать и принимать управляющие строки от драйвера устройства, которое было предварительно открыто оператором OPEN. Выходная строка должна быть заключена в кавычки, как в IOCTL #3,"...". Подобным образом, A$ = IOCTL$(3) принимает информацию о статусе через IOCTL.


<~-7.2.3 Создание обработчика прерывания устройства.
Содержание
7.2.5 Обнаружение и анализ ошибок устройства.-~>

Сайт управляется системой uCoz