#ifndef __RTC_H__
 
#define __RTC_H__
 
/**
 
 * @file
 
 * @brief RTC support.
 
 * @author http://www.nedopc.com
 
 *
 
 * RTC PCF8583 support for ZX Evolution.
 
 *
 
 * ZX Evolution emulate Gluk clock standard:
 
 * - full read/write time emulate;
 
 * - full read/write nvram emulate;
 
 * - registers A,B,C,D read only;
 
 * - alarm functions not emulated.
 
 *
 
 * Save modes of ZX Evolution to RTC NVRAM.
 
 */
 
 
 
/** Address of PCF8583 RTC chip.*/
 
#define RTC_ADDRESS  0xA0
 
 
 
/** Register for year additional data. */
 
#define RTC_YEAR_ADD_REG     0xFF
 
/** Register for common modes. */
 
#define RTC_COMMON_MODE_REG  0xFE
 
/** Register for ps2mouse resolution. */
 
#define RTC_PS2MOUSE_RES_REG 0xFD
 
 
 
/** Init RTC.*/
 
void rtc_init(void);
 
 
 
/**
 
 * Write byte to RTC.
 
 * @param addr [in] - address of internal register on RTC
 
 * @param data [in] - data to write
 
 */
 
void rtc_write(UBYTE addr, UBYTE data);
 
 
 
/**
 
 * Read byte from RTC.
 
 * @return data
 
 * @param addr [in] - address of internal register on RTC
 
 */
 
UBYTE rtc_read(UBYTE addr);
 
 
 
 
 
/** Seconds register index. */
 
#define GLUK_REG_SEC        0x00
 
/** Seconds alarm register index. */
 
#define GLUK_REG_SEC_ALARM  0x01
 
/** Minutes register index. */
 
#define GLUK_REG_MIN        0x02
 
/** Minutes alarm register index. */
 
#define GLUK_REG_MIN_ALARM  0x03
 
/** Hours register index. */
 
#define GLUK_REG_HOUR       0x04
 
/** Hours alarm register index. */
 
#define GLUK_REG_HOUR_ALARM 0x05
 
/** Day of week register index. */
 
#define GLUK_REG_DAY_WEEK   0x06
 
/** Day of month register index. */
 
#define GLUK_REG_DAY_MONTH  0x07
 
/** Month register index. */
 
#define GLUK_REG_MONTH      0x08
 
/** Year register index. */
 
#define GLUK_REG_YEAR       0x09
 
/** A register index. */
 
#define GLUK_REG_A          0x0A
 
/** B register index. */
 
#define GLUK_REG_B          0x0B
 
/** C register index. */
 
#define GLUK_REG_C          0x0C
 
/** D register index. */
 
#define GLUK_REG_D          0x0D
 
 
 
/** B register 2 bit - data mode (A 1 in DM signifies binary data while a 0 in DM specifies BCD data). */
 
#define GLUK_B_DATA_MODE      0x04
 
/** B register 1 bit - 24/12 mode (A 1 indicates the 24-hour mode and a 0 indicates the 12-hour mode). */
 
#define GLUK_B_24_12_MODE     0x02
 
/** C register 4 bit - Update-ended interrupt flag [UF] (Bit is set after each update cycle, UF is cleared by reading Register C or a RESET). */
 
#define GLUK_C_UPDATE_FLAG    0x10
 
/** C register 0 bit - unused in original but in ZXEVO clear PS2 keyboard log. */
 
#define GLUK_C_CLEAR_LOG_FLAG 0x01
 
/** C register 1 bit - unused in original but in ZXEVO switch CAPS LED mode on PS2 keyboard. */
 
#define GLUK_C_CAPS_LED_FLAG  0x02
 
 
 
/** Initial value for Gluk A register. */
 
#define GLUK_A_INIT_VALUE   0x00
 
/** Initial value for Gluk B register. */
 
#define GLUK_B_INIT_VALUE   0x02
 
/** Initial value for Gluk C register. */
 
#define GLUK_C_INIT_VALUE   0x00
 
/** Initial value for Gluk D register. */
 
#define GLUK_D_INIT_VALUE   0x80
 
 
 
/** Read values from RTC and setup Gluk clock registers. */
 
void gluk_init(void);
 
 
 
/** Increment Gluk clock registers on one second. */
 
void gluk_inc(void);
 
 
 
/**
 
 * Get Gluk clock registers data.
 
 * @return registers data
 
 * @param index [in] - index of Gluck clock register
 
 */
 
UBYTE gluk_get_reg(UBYTE index);
 
 
 
/**
 
 * Set Gluk clock registers data.
 
 * @param index [in] - index of Gluck clock register
 
 * @param data [in] - data
 
 */
 
void gluk_set_reg(UBYTE index, UBYTE data);
 
 
 
 
 
#endif //__RTC_H__