FS#8961 - Anti-Aliased Fonts.
[kugel-rb.git] / apps / plugins / rockboy / rtc.c
blob6f33bc4f9d2d5cfaf4615b7b82db05a3e396fe48
4 #include "rockmacros.h"
5 #include <stdio.h>
7 #include "defs.h"
8 #include "mem.h"
9 #include "rtc-gb.h"
10 #include "sscanf.h"
12 struct rtc rtc;
14 void rtc_latch(byte b)
16 if ((rtc.latch ^ b) & b & 1)
18 rtc.regs[0] = rtc.s;
19 rtc.regs[1] = rtc.m;
20 rtc.regs[2] = rtc.h;
21 rtc.regs[3] = rtc.d;
22 rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7);
23 rtc.regs[5] = 0xff;
24 rtc.regs[6] = 0xff;
25 rtc.regs[7] = 0xff;
27 rtc.latch = b;
30 void rtc_write(byte b)
32 /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */
33 if (!(rtc.sel & 8)) return;
34 switch (rtc.sel & 7)
36 case 0:
37 rtc.s = rtc.regs[0] = b;
38 while (rtc.s >= 60) rtc.s -= 60;
39 break;
40 case 1:
41 rtc.m = rtc.regs[1] = b;
42 while (rtc.m >= 60) rtc.m -= 60;
43 break;
44 case 2:
45 rtc.h = rtc.regs[2] = b;
46 while (rtc.h >= 24) rtc.h -= 24;
47 break;
48 case 3:
49 rtc.regs[3] = b;
50 rtc.d = (rtc.d & 0x100) | b;
51 break;
52 case 4:
53 rtc.regs[4] = b;
54 rtc.d = (rtc.d & 0xff) | ((b&1)<<9);
55 rtc.stop = (b>>6)&1;
56 rtc.carry = (b>>7)&1;
57 break;
61 void rtc_tick(void)
63 if (rtc.stop) return;
64 if (++rtc.t == 60)
66 if (++rtc.s == 60)
68 if (++rtc.m == 60)
70 if (++rtc.h == 24)
72 if (++rtc.d == 365)
74 rtc.d = 0;
75 rtc.carry = 1;
77 rtc.h = 0;
79 rtc.m = 0;
81 rtc.s = 0;
83 rtc.t = 0;
87 void rtc_save_internal(int fd)
89 int rt = 0;
91 #if CONFIG_RTC
92 rt = rb->mktime(rb->get_time());
93 #endif
94 fdprintf(fd, "%d %d %d %d %d %d %d %d\n", rtc.carry, rtc.stop, rtc.d, rtc.h,
95 rtc.m, rtc.s, rtc.t, rt);
98 void rtc_load_internal(int fd)
100 int rt = 0;
101 char buf[32];
103 rb->read_line(fd, buf, sizeof(buf));
104 sscanf(buf, "%d %d %d %d %d %d %d %d\n", &rtc.carry, &rtc.stop, &rtc.d,
105 &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt);
107 while (rtc.t >= 60) rtc.t -= 60;
108 while (rtc.s >= 60) rtc.s -= 60;
109 while (rtc.m >= 60) rtc.m -= 60;
110 while (rtc.h >= 24) rtc.h -= 24;
111 while (rtc.d >= 365) rtc.d -= 365;
112 rtc.stop &= 1;
113 rtc.carry &= 1;
115 #if CONFIG_RTC
116 if (rt) rt = (rb->mktime(rb->get_time()) - rt) * 60;
117 #endif
118 while (rt-- > 0) rtc_tick();