Операционная система MS DOS

       

# 01H Установить информацию об устройстве


Вызов:



Регистр
AH 44h
AL 01h
BX Индекс файла (handle)
DH 0
DL Устанавливаемая информация (биты 0-7 слова информации об устройстве, описанного выше)

Возврат без ошибки:

Регистр
CF 0

Возврат с ошибкой:

Регистр
CF 1
AX 01h - запрошена несуществующая функция;

06h - BX содержит несуществующий handle.

Эта подфункция позволяет устанавливать некоторые биты в слове информации об устройстве.

В зависимости от установки бита 5 (двоичный/ASCII) драйвер по-разному выполняет команды ввода-вывода.

В режиме ASCII обмен с драйвером символьного устройства выполняется по байтам (содержимое поля count в запросе всегда равно 1). Если Вам надо обслуживать быстродействующее устройство ввода/вывода, такой посимвольный обмен может оказаться слишком медленным. В этом случае Вы можете установить бит 5 в единицу и выполнять обмен в двоичном режиме. Разумеется, Вам придется самостоятельно отслеживать управляющие символы.

Ниже мы приведем пример программы, которая сначала устанавливает ASCII-режим для драйвера, описанного выше, выводит на него 8 символов, затем выполняет аналогичную операцию в двоичном режиме. Драйвер при каждом обращении к нему для ввода или вывода выдает сообщение на экран. Запустив программу (и не забыв подключить драйвер), Вы увидите, что в ASCII-режиме для записи или чтения восьми символов драйвер вызывается восемь раз, а в двоичном режиме - только один раз.

#include <io.h> #include <conio.h> #include <stdio.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <malloc.h> #include <errno.h> #include <dos.h>

int main(void);

union REGS inregs, outregs; struct SREGS segregs;

int main(void) {

char buf[100]; int io_handle; unsigned count;

// Открываем устройство с именем IODRIVER

if( (io_handle = open("IODRIVER", O_RDWR)) == - 1 ) {

// Если открыть не удалось, выводим // код ошибки

printf("Ошибка при открытии устройства %d",errno); return errno; }


// Читаем 8 байт из устройства в буфер buf

if( (count = read(io_handle, buf, 8)) == -1 ) {

// Если при чтении произошла ошибка, // выводим ее код

printf("Ошибка чтения %d",errno); return errno; }

// Закрываем прочитанную строку нулем // для последующего вывода функцией printf

buf[8]=0;

printf("\n___ Введена строка: %s ___",buf);

// Выводим только что прочитанные данные // обратно на то же устройство

if( (count = write(io_handle, buf, 8)) == -1 ) {

// Если при записи произошла ошибка, // выводим ее код

printf("Ошибка записи %d",errno); return errno; }

// Получаем информацию об устройстве

inregs.h.ah = 0x44; inregs.h.al = 0; inregs.x.bx = io_handle; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {

// При ошибке выводим ее код

printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); }

// Выводим слово информации об устройстве на экран

printf("\nDevice Information: %04X\n", outregs.x.dx);

// Устанавливаем в 1 бит 5 (переключаем драйвер // в двоичный режим обмена данными

inregs.x.dx = (outregs.x.dx | 0x0020) & 0x00ff;

// Устанавливаем слово информации об устройстве

inregs.h.ah = 0x44; inregs.h.al = 1; inregs.x.bx = io_handle; intdos( &inregs, &outregs ); if(outregs.x.cflag == 1) {

// При ошибке выводим код ошибки

printf("IOCTL error %x\n",&outregs.x.ax); exit(-1); }

// Выводим слово информации об устройстве на экран

printf("\nDevice Information: %04X\n", outregs.x.dx);

// Читаем 8 байт из устройства в буфер buf // Обмен теперь производится в двоичном режиме

if( (count = read(io_handle, buf, 8)) == -1 ) {

// Если при чтении произошла ошибка, // выводим ее код

printf("Ошибка чтения %d",errno); return errno; }

// Закрываем прочитанную строку нулем // для последующего вывода функцией printf

buf[8]=0;

printf("\n___ Введена строка: %s ___",buf);

// Выводим только что прочитанные данные // обратно на то же устройство

if( (count = write(io_handle, buf, 8)) == -1 ) {

// Если при записи произошла ошибка, // выводим ее код

printf("Ошибка записи %d",errno); return errno; }

// Закрываем устройство

close(io_handle);

exit(0); }


Содержание раздела