gnuboy: initial 1.0.3 import (last official release)
[rofl0r-gnuboy.git] / rtc.c
blobc3f96ec903ea137ad3d8b31c8b70d452a76d5cce
4 #include <stdio.h>
6 #include "defs.h"
7 #include "mem.h"
8 #include "rtc.h"
9 #include "rc.h"
11 struct rtc rtc;
13 static int syncrtc = 1;
15 rcvar_t rtc_exports[] =
17 RCV_BOOL("syncrtc", &syncrtc),
18 RCV_END
22 void rtc_latch(byte b)
24 if ((rtc.latch ^ b) & b & 1)
26 rtc.regs[0] = rtc.s;
27 rtc.regs[1] = rtc.m;
28 rtc.regs[2] = rtc.h;
29 rtc.regs[3] = rtc.d;
30 rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7);
31 rtc.regs[5] = 0xff;
32 rtc.regs[6] = 0xff;
33 rtc.regs[7] = 0xff;
35 rtc.latch = b;
38 void rtc_write(byte b)
40 /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */
41 if (!(rtc.sel & 8)) return;
42 switch (rtc.sel & 7)
44 case 0:
45 rtc.s = rtc.regs[0] = b;
46 while (rtc.s >= 60) rtc.s -= 60;
47 break;
48 case 1:
49 rtc.m = rtc.regs[1] = b;
50 while (rtc.m >= 60) rtc.m -= 60;
51 break;
52 case 2:
53 rtc.h = rtc.regs[2] = b;
54 while (rtc.h >= 24) rtc.h -= 24;
55 break;
56 case 3:
57 rtc.regs[3] = b;
58 rtc.d = (rtc.d & 0x100) | b;
59 break;
60 case 4:
61 rtc.regs[4] = b;
62 rtc.d = (rtc.d & 0xff) | ((b&1)<<9);
63 rtc.stop = (b>>6)&1;
64 rtc.carry = (b>>7)&1;
65 break;
69 void rtc_tick()
71 if (rtc.stop) return;
72 if (++rtc.t == 60)
74 if (++rtc.s == 60)
76 if (++rtc.m == 60)
78 if (++rtc.h == 24)
80 if (++rtc.d == 365)
82 rtc.d = 0;
83 rtc.carry = 1;
85 rtc.h = 0;
87 rtc.m = 0;
89 rtc.s = 0;
91 rtc.t = 0;
95 void rtc_save_internal(FILE *f)
97 fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n",
98 rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t,
99 time(0));
102 void rtc_load_internal(FILE *f)
104 int rt = 0;
105 fscanf(
106 f, "%d %d %d %02d %02d %02d %02d\n%d\n",
107 &rtc.carry, &rtc.stop, &rtc.d,
108 &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt);
109 while (rtc.t >= 60) rtc.t -= 60;
110 while (rtc.s >= 60) rtc.s -= 60;
111 while (rtc.m >= 60) rtc.m -= 60;
112 while (rtc.h >= 24) rtc.h -= 24;
113 while (rtc.d >= 365) rtc.d -= 365;
114 rtc.stop &= 1;
115 rtc.carry &= 1;
116 if (rt) rt = (time(0) - rt) * 60;
117 if (syncrtc) while (rt-- > 0) rtc_tick();