/**
*.Name         timer
*.Title        Работа с часами реального времени
*
*.Descr        Эта функция предназначена для обслуживания
*              системных часов реального времени через
*              прерывание INT 1Ah.
*
*.Proto        int timer(char fn, SYSTIMER *tm)
*
*.Params       char     fn - выполняемая функция:
*
*              RTC_GET_TIME      - прочитать показания часов;
*              RTC_SET_TIME      - установить часы;
*              RTC_GET_DATE      - прочитать дату;
*              RTC_SET_DATE      - установить дату;
*              RTC_SET_ALARM     - установить будильник;
*              RTC_CLEAR_ALARM   - сбросить будильник.
*
*                 Все эти константы описаны в файле sysp.h
*
*              SYSTIMER tm - структура, содержащая данные
*                            для установки часов или
*                            показания часов:
*
*              typedef struct _SYSTIMER_ {
*
*                 char hour;     // часы
*                 char min;      // минуты
*                 char sec;      // секунды
*                 unsigned year; // год
*                 char month;    // месяц
*                 char day;      // число
*                 char daylight_savings; // флаг разрешения
*                                        // дневного сохранения
*                                        // (для включения режима
*                                        // должен быть равен 1)
*
*              } SYSTIMER;
*
*.Return       0   - успешное выполнение функции;
*              -1  - часы реального времени отсуствуют
*                    в компьютере.
*
*.Sample       setalarm.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

union REGS reg;

int timer(char fn, SYSTIMER *tm) {

	reg.h.ah = fn;

	switch (fn) {

		case RTC_SET_TIME:

			reg.h.ch = tm->hour;
			reg.h.cl = tm->min;
			reg.h.dh = tm->sec;
			reg.h.dl = tm->daylight_savings;

			break;

		case RTC_SET_DATE:

			reg.x.cx = tm->year;
			reg.h.dh = tm->month;
			reg.h.dl = tm->day;

			break;

		case RTC_SET_ALARM:

			reg.h.ch = tm->hour;
			reg.h.cl = tm->min;
			reg.h.dh = tm->sec;

			break;

	}

	int86(0x1a,&reg,&reg);

	if(reg.x.cflag == 1) return(-1);

	switch (fn) {

		case RTC_GET_TIME:

			tm->hour = reg.h.ch;
			tm->min = reg.h.cl;
			tm->sec = reg.h.dh;

			break;

		case RTC_GET_DATE:

			tm->year = reg.x.cx;
			tm->month = reg.h.dh;
			tm->day = reg.h.dl;

			break;
	}

	return(0);
}

