Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Доступ к драйверу устройства
ОГЛАВЛЕНИЕ
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.