Страница 20 из 27
7.2.4 Доступ к драйверу устройства. Драйвер устройства устанавливается путем включения имени гото- вой программы в файл конфигурации системы. Для установки пробной программы поместите в файл CONFIG.SYS строку DEVICE = DEVI- CE12.COM. Затем перезагрузите систему для установки драйвера. Если машина не будет загружаться, то скорее всего имеется ошибка в коде инициализации драйвера. После того как драйвер установлен, для доступа к нему пользуй- тесь обычными функциями MS DOS прерывания 21H. Какие функции можно использовать зависит от того, заменяет ли устройство стан- дартное устройство 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 - для параллельного. Напоминаем, что при использовании предопре- деленных номеров файла нет необходимости открывать устройство. Если устройство не заменяет одно из стандартных устройств 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.
|