diff options
Diffstat (limited to 'apps/plugins/rockboy/rtc.c')
-rw-r--r-- | apps/plugins/rockboy/rtc.c | 176 |
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 | |||
12 | struct rtc rtc IBSS_ATTR; | ||
13 | |||
14 | static int syncrtc = 1; | ||
15 | |||
16 | rcvar_t rtc_exports[] = | ||
17 | { | ||
18 | RCV_BOOL("syncrtc", &syncrtc), | ||
19 | RCV_END | ||
20 | }; | ||
21 | 10 | ||
11 | struct rtc rtc; | ||
22 | 12 | ||
23 | void rtc_latch(byte b) | 13 | void 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 | ||
39 | void rtc_write(byte b) | 29 | void 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 | ||
70 | void rtc_tick() | 60 | void 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 | ||
96 | void rtc_save_internal(int fd) | 86 | void 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 | ||
105 | void rtc_load_internal(int fd) | 95 | void 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 | ||