#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <dos.h>

union REGS inregs, outregs;
struct SREGS segregs;

int main(void)
{
  char buf[100];
  int io_handle;

  // Открываем устройство с именем IODRIVER
  if((io_handle = open("IODRIVER", O_RDWR)) == - 1)
  {
    // Если открыть не удалось, выводим код ошибки
    printf("Open: ошибка %d", errno);
    return errno;
  }

  // Читаем 8 байт из устройства в буфер buf
  if(read(io_handle, buf, 8) == -1)
  {
    // Если при чтении произошла ошибка,
    // выводим ее код
    printf("Read: ошибка %d", errno);
    return errno;
  }

  // Закрываем прочитанную строку нулем
  // для последующего вывода функцией printf
  buf[8] = 0;
  printf("\nПрочитана строка: <%s>", buf);

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

  if(write(io_handle, buf, 8) == -1)
  {
    // Если при записи произошла ошибка,
    // выводим ее код
    printf("Write: ошибка %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: ошибка %x\n", &outregs.x.ax);
    return(-1);
  }

  // Выводим конфигурацию устройства на экран
  printf("\nКонфигурация устройства:  %04X\n",
     outregs.x.dx);

  // Устанавливаем бит 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: ошибка %x\n",&outregs.x.ax);
    return(-1);
  }

  // Выводим конфигурацию устройства
  printf("\nКонфигурация устройства:  %04X\n",
    outregs.x.dx);

  // Читаем 8 байт из устройства в буфер buf
  // Теперь обмен выполняется в двоичном режиме
  if(read(io_handle, buf, 8) == -1)
  {
    // Если при чтении произошла ошибка,
    // выводим ее код
    printf("Read: ошибка %d",errno);
    return errno;
  }

  // Закрываем прочитанную строку нулем
  // для последующего вывода функцией printf
  buf[8] = 0;

  printf("\nПрочитана строка: <%s>", buf);

  // Выводим только что прочитанные данные
  // обратно на то же устройство
  if(write(io_handle, buf, 8) == -1)
  {
    // Если при записи произошла ошибка,
    // выводим ее код
    printf("Write: ошибка %d", errno);
    return errno;
  }

  // Закрываем устройство
  close(io_handle);

  return(0);
}

