mirror of https://github.com/bsnes-emu/bsnes.git
68 lines
2.0 KiB
C++
68 lines
2.0 KiB
C++
uint4 SharpRTC::rtc_read(uint4 addr) {
|
|
switch(addr) {
|
|
case 0: return second % 10;
|
|
case 1: return second / 10;
|
|
case 2: return minute % 10;
|
|
case 3: return minute / 10;
|
|
case 4: return hour % 10;
|
|
case 5: return hour / 10;
|
|
case 6: return day % 10;
|
|
case 7: return day / 10;
|
|
case 8: return month;
|
|
case 9: return year % 10;
|
|
case 10: return year / 10 % 10;
|
|
case 11: return year / 100;
|
|
case 12: return weekday;
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
void SharpRTC::rtc_write(uint4 addr, uint4 data) {
|
|
switch(addr) {
|
|
case 0: second = second / 10 * 10 + data; break;
|
|
case 1: second = data * 10 + second % 10; break;
|
|
case 2: minute = minute / 10 * 10 + data; break;
|
|
case 3: minute = data * 10 + minute % 10; break;
|
|
case 4: hour = hour / 10 * 10 + data; break;
|
|
case 5: hour = data * 10 + hour % 10; break;
|
|
case 6: day = day / 10 * 10 + data; break;
|
|
case 7: day = data * 10 + day % 10; break;
|
|
case 8: month = data; break;
|
|
case 9: year = year / 10 * 10 + data; break;
|
|
case 10: year = year / 100 * 100 + data * 10 + year % 10; break;
|
|
case 11: year = data * 100 + year % 100; break;
|
|
case 12: weekday = data; break;
|
|
}
|
|
}
|
|
|
|
void SharpRTC::load(const uint8* data) {
|
|
for(unsigned byte = 0; byte < 8; byte++) {
|
|
rtc_write(byte * 2 + 0, data[byte] >> 0);
|
|
rtc_write(byte * 2 + 1, data[byte] >> 4);
|
|
}
|
|
|
|
uint64 timestamp = 0;
|
|
for(unsigned byte = 0; byte < 8; byte++) {
|
|
timestamp |= data[8 + byte] << (byte * 8);
|
|
}
|
|
|
|
uint64 diff = (uint64)time(0) - timestamp;
|
|
while(diff >= 60 * 60 * 24) { tick_day(); diff -= 60 * 60 * 24; }
|
|
while(diff >= 60 * 60) { tick_hour(); diff -= 60 * 60; }
|
|
while(diff >= 60) { tick_minute(); diff -= 60; }
|
|
while(diff--) tick_second();
|
|
}
|
|
|
|
void SharpRTC::save(uint8* data) {
|
|
for(unsigned byte = 0; byte < 8; byte++) {
|
|
data[byte] = rtc_read(byte * 2 + 0) << 0;
|
|
data[byte] |= rtc_read(byte * 2 + 1) << 4;
|
|
}
|
|
|
|
uint64 timestamp = (uint64)time(0);
|
|
for(unsigned byte = 0; byte < 8; byte++) {
|
|
data[8 + byte] = timestamp;
|
|
timestamp >>= 8;
|
|
}
|
|
}
|