6 static unsigned char rtc_mystery_reg[3];
7 unsigned char ricoh_memory[0x0F];
8 unsigned char ricoh_alarm[0x0F];
10 void put_rtc_byte(uint32_t address_, uint8_t value, uint8_t rtc_type) {
11 uint32_t address = address_ & 0x3F;
13 if (rtc_type == RTC_TYPE_MSM) {
16 rtc_mystery_reg[address - 0x0D] = value & (0x01 | 0x08);
20 rtc_mystery_reg[address - 0x0D] = value;
27 int rtc_bank = (rtc_mystery_reg[0] & 0x03);
28 if ((rtc_bank & 0x02) && address < 0x0D) {
29 if (rtc_bank & 0x01) {
30 // Low nibble of value -> high nibble in RTC memory
31 ricoh_memory[address] &= 0x0F;
32 ricoh_memory[address] |= ((value & 0x0F) << 4);
35 // Low nibble of value -> low nibble in RTC memory
36 ricoh_memory[address] &= 0xF0;
37 ricoh_memory[address] |= (value & 0x0F);
41 else if ((rtc_bank & 0x01) && address < 0x0D) {
42 // RTC alarm stuff, no idea what this is supposed to be for.
48 ricoh_alarm[address] = 0;
52 ricoh_alarm[address] = (value & (0x08 & 0xFF));
57 ricoh_alarm[address] = (value & (0x0C & 0xFF));
60 ricoh_alarm[address] = (value & (0x0E & 0xFF));
63 ricoh_alarm[address] = value;
68 else if (address >= 0x0D) {
69 rtc_mystery_reg[address - 0x0D] = value;
75 uint8_t get_rtc_byte(uint32_t address_, uint8_t rtc_type) {
76 uint32_t address = address_ & 0x3F;
80 struct tm *rtc_time = localtime(&t);
82 if (rtc_type == RTC_TYPE_RICOH) {
83 int rtc_bank = (rtc_mystery_reg[0] & 0x03);
84 if ((rtc_bank & 0x02) && address < 0x0D) {
85 // Get low/high nibble from memory (bank 2/3)
86 return ((ricoh_memory[address] >> (rtc_bank & 0x01) ? 4 : 0) & 0x0F);
88 else if ((rtc_bank & 0x01) && address < 0x0D) {
89 // Get byte from alarm
90 return ricoh_alarm[address];
95 case 0x00: // Seconds low?
96 return rtc_time->tm_sec % 10;
97 case 0x01: // Seconds high?
98 return rtc_time->tm_sec / 10;
99 case 0x02: // Minutes low?
100 return rtc_time->tm_min % 10;
101 case 0x03: // Minutes high?
102 return rtc_time->tm_min / 10;
103 case 0x04: // Hours low?
104 return rtc_time->tm_hour % 10;
105 case 0x05: // Hours high?
106 if (rtc_type == RTC_TYPE_MSM) {
107 if (rtc_mystery_reg[2] & 4) {
108 return ((rtc_time->tm_hour / 10) | (rtc_time->tm_hour >= 12) ? 0x04 : 0x00);
111 return rtc_time->tm_hour / 10;
114 if (ricoh_alarm[10] & 0x01) {
115 return rtc_time->tm_hour / 10;
118 return ((rtc_time->tm_hour / 10) | (rtc_time->tm_hour >= 12) ? 0x02 : 0x00);
122 case 0x06: // Day low?
123 if (rtc_type == RTC_TYPE_MSM)
124 return rtc_time->tm_mday % 10;
126 return rtc_time->tm_wday;
127 case 0x07: // Day high?
128 if (rtc_type == RTC_TYPE_MSM)
129 return rtc_time->tm_mday / 10;
131 return rtc_time->tm_mday % 10;
132 case 0x08: // Month low?
133 if (rtc_type == RTC_TYPE_MSM)
134 return (rtc_time->tm_mon + 1) % 10;
136 return rtc_time->tm_mday / 10;
137 case 0x09: // Month high?
138 if (rtc_type == RTC_TYPE_MSM)
139 return (rtc_time->tm_mon + 1) / 10;
141 return (rtc_time->tm_mon + 1) % 10;
142 case 0x0A: // Year low?
143 if (rtc_type == RTC_TYPE_MSM)
144 return rtc_time->tm_year % 10;
146 return (rtc_time->tm_mon + 1) / 10;
147 case 0x0B: // Year high?
148 if (rtc_type == RTC_TYPE_MSM)
149 return rtc_time->tm_year / 10;
151 return rtc_time->tm_year % 10;
152 case 0x0C: // Day of week?
153 if (rtc_type == RTC_TYPE_MSM)
154 return rtc_time->tm_wday;
156 return rtc_time->tm_year / 10;
157 case 0x0D: // Mystery register D-F?
160 if (rtc_type == RTC_TYPE_MSM) {
161 return rtc_mystery_reg[address - 0x0D];
164 if (address == 0x0D) return rtc_mystery_reg[address - 0x0D];