Эта подфункция позволяет устанавливать некоторые
Таблица 23
Регистр | Содержание |
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); }