|
|
1.1 root 1: /*
2: Hatari - rtc.c
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
6:
7: Mega-ST real time clock.
8: There is probably a more efficient way to do it, such as using directly a
9: timer in ram instead of calling localtime for each function. For now it will
10: show that it works, at least...
11:
12: In fact these mappings seems to force the gem to ask the IKBD for the real
13: time (seconds units). See ikbd.c for the time returned by the IKBD.
14: */
1.1.1.4 ! root 15: const char Rtc_rcsid[] = "Hatari $Id: rtc.c,v 1.8 2007/12/19 11:54:41 thothy Exp $";
1.1 root 16:
17: #include <time.h>
18:
19: #include "main.h"
1.1.1.4 ! root 20: #include "ioMem.h"
1.1 root 21: #include "rtc.h"
22:
23:
24: static BOOL rtc_bank; /* RTC bank select (0=normal, 1=configuration(?)) */
25: static Sint8 fake_am, fake_amz;
26:
27:
28: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 29: /**
! 30: * Read seconds units.
! 31: */
1.1 root 32: void Rtc_SecondsUnits_ReadByte(void)
33: {
1.1.1.4 ! root 34: struct tm *SystemTime;
! 35: time_t nTimeTicks;
1.1 root 36:
1.1.1.4 ! root 37: /* Get system time */
! 38: nTimeTicks = time(NULL);
! 39: SystemTime = localtime(&nTimeTicks);
! 40: IoMem[0xfffc21] = SystemTime->tm_sec % 10;
1.1 root 41: }
42:
43:
44: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 45: /**
! 46: * Read seconds tens.
! 47: */
1.1 root 48: void Rtc_SecondsTens_ReadByte(void)
49: {
1.1.1.4 ! root 50: struct tm *SystemTime;
! 51: time_t nTimeTicks;
1.1 root 52:
1.1.1.4 ! root 53: /* Get system time */
! 54: nTimeTicks = time(NULL);
! 55: SystemTime = localtime(&nTimeTicks);
! 56: IoMem[0xfffc23] = SystemTime->tm_sec / 10;
1.1 root 57: }
58:
59:
60: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 61: /**
! 62: * Read minutes units.
! 63: */
1.1 root 64: void Rtc_MinutesUnits_ReadByte(void)
65: {
1.1.1.4 ! root 66: if (rtc_bank)
! 67: {
! 68: IoMem[0xfffc25] = fake_am;
! 69: }
! 70: else
! 71: {
! 72: struct tm *SystemTime;
! 73: time_t nTimeTicks;
! 74:
! 75: /* Get system time */
! 76: nTimeTicks = time(NULL);
! 77: SystemTime = localtime(&nTimeTicks);
! 78: IoMem[0xfffc25] = SystemTime->tm_min % 10;
! 79: }
1.1 root 80: }
81:
82:
83: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 84: /**
! 85: * Write minutes units.
! 86: */
1.1 root 87: void Rtc_MinutesUnits_WriteByte(void)
88: {
1.1.1.4 ! root 89: /* TOS 1.0x uses this... */
! 90: if (rtc_bank)
! 91: fake_am = ((IoMem[0xfffc25] & 0x0f) | 0xf0);
! 92: /* else ignore */
1.1 root 93: }
94:
95:
96: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 97: /**
! 98: * Read minutes tens.
! 99: */
1.1 root 100: void Rtc_MinutesTens_ReadByte(void)
101: {
1.1.1.4 ! root 102: if (rtc_bank)
! 103: {
! 104: IoMem[0xfffc27] = fake_amz;
! 105: }
! 106: else
! 107: {
! 108: struct tm *SystemTime;
! 109: time_t nTimeTicks;
! 110:
! 111: /* Get system time */
! 112: nTimeTicks = time(NULL);
! 113: SystemTime = localtime(&nTimeTicks);
! 114: IoMem[0xfffc27] = SystemTime->tm_min / 10;
! 115: }
1.1 root 116: }
117:
118:
119: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 120: /**
! 121: * Write minutes tens.
! 122: */
1.1 root 123: void Rtc_MinutesTens_WriteByte(void)
124: {
1.1.1.4 ! root 125: /* TOS 1.0x uses this... */
! 126: if (rtc_bank)
! 127: fake_amz = ((IoMem[0xfffc27] & 0x0f) | 0xf0);
! 128: /* else ignore */
1.1 root 129: }
130:
131:
132: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 133: /**
! 134: * Read hours units.
! 135: */
1.1 root 136: void Rtc_HoursUnits_ReadByte(void)
137: {
1.1.1.4 ! root 138: struct tm *SystemTime;
! 139: time_t nTimeTicks;
1.1 root 140:
1.1.1.4 ! root 141: /* Get system time */
! 142: nTimeTicks = time(NULL);
! 143: SystemTime = localtime(&nTimeTicks);
! 144: IoMem[0xfffc29] = SystemTime->tm_hour % 10;
1.1 root 145: }
146:
147:
148: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 149: /**
! 150: * Read hours tens.
! 151: */
1.1 root 152: void Rtc_HoursTens_ReadByte(void)
153: {
1.1.1.4 ! root 154: struct tm *SystemTime;
! 155: time_t nTimeTicks;
1.1 root 156:
1.1.1.4 ! root 157: /* Get system time */
! 158: nTimeTicks = time(NULL);
! 159: SystemTime = localtime(&nTimeTicks);
! 160: IoMem[0xfffc2b] = SystemTime->tm_hour / 10;
1.1 root 161: }
162:
163:
164: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 165: /**
! 166: * Read weekday.
! 167: */
1.1 root 168: void Rtc_Weekday_ReadByte(void)
169: {
1.1.1.4 ! root 170: struct tm *SystemTime;
! 171: time_t nTimeTicks;
1.1 root 172:
1.1.1.4 ! root 173: /* Get system time */
! 174: nTimeTicks = time(NULL);
! 175: SystemTime = localtime(&nTimeTicks);
! 176: IoMem[0xfffc2d] = SystemTime->tm_wday;
1.1 root 177: }
178:
179:
180: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 181: /**
! 182: * Read day units.
! 183: */
1.1 root 184: void Rtc_DayUnits_ReadByte(void)
185: {
1.1.1.4 ! root 186: struct tm *SystemTime;
! 187: time_t nTimeTicks;
1.1 root 188:
1.1.1.4 ! root 189: /* Get system time */
! 190: nTimeTicks = time(NULL);
! 191: SystemTime = localtime(&nTimeTicks);
! 192: IoMem[0xfffc2f] = SystemTime->tm_mday % 10;
1.1 root 193: }
194:
195:
196: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 197: /**
! 198: * Read day tens.
! 199: */
1.1 root 200: void Rtc_DayTens_ReadByte(void)
201: {
1.1.1.4 ! root 202: struct tm *SystemTime;
! 203: time_t nTimeTicks;
1.1 root 204:
1.1.1.4 ! root 205: /* Get system time */
! 206: nTimeTicks = time(NULL);
! 207: SystemTime = localtime(&nTimeTicks);
! 208: IoMem[0xfffc31] = SystemTime->tm_mday / 10;
1.1 root 209: }
210:
211:
212: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 213: /**
! 214: * Read month units.
! 215: */
1.1 root 216: void Rtc_MonthUnits_ReadByte(void)
217: {
1.1.1.4 ! root 218: struct tm *SystemTime;
! 219: time_t nTimeTicks;
1.1 root 220:
1.1.1.4 ! root 221: /* Get system time */
! 222: nTimeTicks = time(NULL);
! 223: SystemTime = localtime(&nTimeTicks);
! 224: IoMem[0xfffc33] = (SystemTime->tm_mon + 1) % 10;
1.1 root 225: }
226:
227:
228: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 229: /**
! 230: * Read month tens.
! 231: */
1.1 root 232: void Rtc_MonthTens_ReadByte(void)
233: {
1.1.1.4 ! root 234: struct tm *SystemTime;
! 235: time_t nTimeTicks;
1.1 root 236:
1.1.1.4 ! root 237: /* Get system time */
! 238: nTimeTicks = time(NULL);
! 239: SystemTime = localtime(&nTimeTicks);
! 240: IoMem[0xfffc35] = (SystemTime->tm_mon + 1) / 10;
1.1 root 241: }
242:
243:
244: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 245: /**
! 246: * Read year units.
! 247: */
1.1 root 248: void Rtc_YearUnits_ReadByte(void)
249: {
1.1.1.4 ! root 250: struct tm *SystemTime;
! 251: time_t nTimeTicks;
1.1 root 252:
1.1.1.4 ! root 253: /* Get system time */
! 254: nTimeTicks = time(NULL);
! 255: SystemTime = localtime(&nTimeTicks);
! 256: IoMem[0xfffc37] = SystemTime->tm_year % 10;
1.1 root 257: }
258:
259:
260: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 261: /**
! 262: * Read year tens.
! 263: */
1.1 root 264: void Rtc_YearTens_ReadByte(void)
265: {
1.1.1.4 ! root 266: struct tm *SystemTime;
! 267: time_t nTimeTicks;
1.1 root 268:
1.1.1.4 ! root 269: /* Get system time */
! 270: nTimeTicks = time(NULL);
! 271: SystemTime = localtime(&nTimeTicks);
! 272: IoMem[0xfffc39] = (SystemTime->tm_year - 80) / 10;
1.1 root 273: }
274:
275:
276: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 277: /**
! 278: * Read clock mod.
! 279: */
1.1 root 280: void Rtc_ClockMod_ReadByte(void)
281: {
1.1.1.4 ! root 282: IoMem[0xfffc3b] = ((IoMem[0xfffc3b] & 0x0f) | 0xf0);
1.1 root 283: }
284:
285:
286: /*-----------------------------------------------------------------------*/
1.1.1.4 ! root 287: /**
! 288: * Write clock mod.
! 289: */
1.1 root 290: void Rtc_ClockMod_WriteByte(void)
291: {
1.1.1.4 ! root 292: rtc_bank = IoMem[0xfffc3b] & 1;
1.1 root 293: }
294:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.