#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) {

	 int io_handle;
	 unsigned count;

	 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("Ошибка при открытии устройства %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);
	}

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


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

	 if((count = read(io_handle, &clock_buf, 6)) == -1) {

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

		 printf("Ошибка чтения %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);

	exit(0);
}

