#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)
{
  int io_handle;

  struct
  {
    unsigned days;
    unsigned char min;
    unsigned char hours;
    unsigned char sec_per_100;
    unsigned char sec;
  } clock_buf;

  // Открываем устройство с именем CLOCK$
  if((io_handle = open("CLOCK$", O_RDWR)) == - 1)
  {
    // Если открыть устройство не удалось, выводим
    // код ошибки
    printf("Open: ошибка %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);
  }

  // Устанавливаем бит 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);

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

  printf("\nПолучено от драйвера часов CLOCK$:"
   "\n"
   "\nПрошло дней после 01.01.80:  %d"
   "\nМинуты:                      %d"
   "\nЧасы:                        %d"
   "\nСекунды:                     %d"
   "\nСотые доли секунды:          %d"
   "\n",
   clock_buf.days, clock_buf.min, clock_buf.hours,
   clock_buf.sec,  clock_buf.sec_per_100);

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

   return(0);
}

