summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/rtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/rtc.c')
-rw-r--r--apps/plugins/rockboy/rtc.c176
1 files changed, 83 insertions, 93 deletions
diff --git a/apps/plugins/rockboy/rtc.c b/apps/plugins/rockboy/rtc.c
index 05ad69864a..0b011a828c 100644
--- a/apps/plugins/rockboy/rtc.c
+++ b/apps/plugins/rockboy/rtc.c
@@ -7,119 +7,109 @@
7#include "defs.h" 7#include "defs.h"
8#include "mem.h" 8#include "mem.h"
9#include "rtc-gb.h" 9#include "rtc-gb.h"
10#include "rc.h"
11
12struct rtc rtc IBSS_ATTR;
13
14static int syncrtc = 1;
15
16rcvar_t rtc_exports[] =
17{
18 RCV_BOOL("syncrtc", &syncrtc),
19 RCV_END
20};
21 10
11struct rtc rtc;
22 12
23void rtc_latch(byte b) 13void rtc_latch(byte b)
24{ 14{
25 if ((rtc.latch ^ b) & b & 1) 15 if ((rtc.latch ^ b) & b & 1)
26 { 16 {
27 rtc.regs[0] = rtc.s; 17 rtc.regs[0] = rtc.s;
28 rtc.regs[1] = rtc.m; 18 rtc.regs[1] = rtc.m;
29 rtc.regs[2] = rtc.h; 19 rtc.regs[2] = rtc.h;
30 rtc.regs[3] = rtc.d; 20 rtc.regs[3] = rtc.d;
31 rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); 21 rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7);
32 rtc.regs[5] = 0xff; 22 rtc.regs[5] = 0xff;
33 rtc.regs[6] = 0xff; 23 rtc.regs[6] = 0xff;
34 rtc.regs[7] = 0xff; 24 rtc.regs[7] = 0xff;
35 } 25 }
36 rtc.latch = b; 26 rtc.latch = b;
37} 27}
38 28
39void rtc_write(byte b) 29void rtc_write(byte b)
40{ 30{
41 /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ 31 /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */
42 if (!(rtc.sel & 8)) return; 32 if (!(rtc.sel & 8)) return;
43 switch (rtc.sel & 7) 33 switch (rtc.sel & 7)
44 { 34 {
45 case 0: 35 case 0:
46 rtc.s = rtc.regs[0] = b; 36 rtc.s = rtc.regs[0] = b;
47 while (rtc.s >= 60) rtc.s -= 60; 37 while (rtc.s >= 60) rtc.s -= 60;
48 break; 38 break;
49 case 1: 39 case 1:
50 rtc.m = rtc.regs[1] = b; 40 rtc.m = rtc.regs[1] = b;
51 while (rtc.m >= 60) rtc.m -= 60; 41 while (rtc.m >= 60) rtc.m -= 60;
52 break; 42 break;
53 case 2: 43 case 2:
54 rtc.h = rtc.regs[2] = b; 44 rtc.h = rtc.regs[2] = b;
55 while (rtc.h >= 24) rtc.h -= 24; 45 while (rtc.h >= 24) rtc.h -= 24;
56 break; 46 break;
57 case 3: 47 case 3:
58 rtc.regs[3] = b; 48 rtc.regs[3] = b;
59 rtc.d = (rtc.d & 0x100) | b; 49 rtc.d = (rtc.d & 0x100) | b;
60 break; 50 break;
61 case 4: 51 case 4:
62 rtc.regs[4] = b; 52 rtc.regs[4] = b;
63 rtc.d = (rtc.d & 0xff) | ((b&1)<<9); 53 rtc.d = (rtc.d & 0xff) | ((b&1)<<9);
64 rtc.stop = (b>>6)&1; 54 rtc.stop = (b>>6)&1;
65 rtc.carry = (b>>7)&1; 55 rtc.carry = (b>>7)&1;
66 break; 56 break;
67 } 57 }
68} 58}
69 59
70void rtc_tick() 60void rtc_tick()
71{ 61{
72 if (rtc.stop) return; 62 if (rtc.stop) return;
73 if (++rtc.t == 60) 63 if (++rtc.t == 60)
74 { 64 {
75 if (++rtc.s == 60) 65 if (++rtc.s == 60)
76 { 66 {
77 if (++rtc.m == 60) 67 if (++rtc.m == 60)
78 { 68 {
79 if (++rtc.h == 24) 69 if (++rtc.h == 24)
80 { 70 {
81 if (++rtc.d == 365) 71 if (++rtc.d == 365)
82 { 72 {
83 rtc.d = 0; 73 rtc.d = 0;
84 rtc.carry = 1; 74 rtc.carry = 1;
85 } 75 }
86 rtc.h = 0; 76 rtc.h = 0;
87 } 77 }
88 rtc.m = 0; 78 rtc.m = 0;
89 } 79 }
90 rtc.s = 0; 80 rtc.s = 0;
91 } 81 }
92 rtc.t = 0; 82 rtc.t = 0;
93 } 83 }
94} 84}
95 85
96void rtc_save_internal(int fd) 86void rtc_save_internal(int fd)
97{ 87{
98 (void)fd; // stop compiler complaining 88 (void)fd; /* stop compiler complaining */
99 // TODO 89 /* TODO */
100// fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n", 90 /* fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n",
101// rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t, 91 rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t,
102// time(0)); 92 time(0)); */
103} 93}
104 94
105void rtc_load_internal(int fd) 95void rtc_load_internal(int fd)
106{ 96{
107 //int rt = 0; 97 /* int rt = 0; */
108 (void)fd; // stop compiler complaining 98 (void)fd; /* stop compiler complaining */
109 // TODO 99 /* TODO */
110/* fscanf( 100 /* fscanf(
111 f, "%d %d %d %02d %02d %02d %02d\n%d\n", 101 f, "%d %d %d %02d %02d %02d %02d\n%d\n",
112 &rtc.carry, &rtc.stop, &rtc.d, 102 &rtc.carry, &rtc.stop, &rtc.d,
113 &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); 103 &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt);
114 while (rtc.t >= 60) rtc.t -= 60; 104 while (rtc.t >= 60) rtc.t -= 60;
115 while (rtc.s >= 60) rtc.s -= 60; 105 while (rtc.s >= 60) rtc.s -= 60;
116 while (rtc.m >= 60) rtc.m -= 60; 106 while (rtc.m >= 60) rtc.m -= 60;
117 while (rtc.h >= 24) rtc.h -= 24; 107 while (rtc.h >= 24) rtc.h -= 24;
118 while (rtc.d >= 365) rtc.d -= 365; 108 while (rtc.d >= 365) rtc.d -= 365;
119 rtc.stop &= 1; 109 rtc.stop &= 1;
120 rtc.carry &= 1; 110 rtc.carry &= 1;
121 if (rt) rt = (time(0) - rt) * 60; 111 if (rt) rt = (time(0) - rt) * 60;
122 if (syncrtc) while (rt-- > 0) rtc_tick(); */ 112 if (syncrtc) while (rt-- > 0) rtc_tick(); */
123} 113}
124 114
125 115