From 7ad6fc52572114e2e05de3936173a4f9cfa07f8a Mon Sep 17 00:00:00 2001 From: luigi__ Date: Sat, 14 Feb 2009 22:04:24 +0000 Subject: [PATCH] Added support for 16-bit and 32-bit read/writes to the RTC reg, and fixed the little-endian commands. With these fixes, the SPP menu background has now the right colour depending on the time (formerly it was always night blue). --- desmume/src/MMU.cpp | 19 +++++++++++++++++-- desmume/src/rtc.cpp | 33 ++++++++++++++++++++------------- desmume/src/rtc.h | 2 +- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 27b597f28..f11e8b141 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -3015,7 +3015,7 @@ static u32 FASTCALL _MMU_ARM9_read32(u32 adr) adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20)]); // this is hack - gxstat |= 0x00000002; + //gxstat |= 0x00000002; return gxstat; } #endif @@ -3234,6 +3234,10 @@ static void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) /* Address is an IO register */ switch(adr) { + case REG_RTC: + rtcWrite(val); + break; + case REG_EXMEMCNT: { u16 oldval = T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x204); @@ -3624,6 +3628,7 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) return; } #endif + #ifdef EXPERIMENTAL_WIFI @@ -3648,6 +3653,10 @@ static void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) { switch(adr) { + case REG_RTC: + rtcWrite((u16)val); + break; + case REG_IME : { u32 old_val = MMU.reg_IME[ARMCPU_ARM7]; @@ -3884,7 +3893,7 @@ static u8 FASTCALL _MMU_ARM7_read08(u32 adr) return (unsigned char)cflash_read(adr); #endif - if (adr == REG_RTC) return rtcRead(); + if (adr == REG_RTC) return (u8)rtcRead(); #ifdef _MMU_DEBUG mmu_log_debug_ARM7(adr, "(read08) %0x%X", @@ -3918,6 +3927,9 @@ static u16 FASTCALL _MMU_ARM7_read16(u32 adr) /* Address is an IO register */ switch(adr) { + case REG_RTC: + return rtcRead(); + case REG_IME : return (u16)MMU.reg_IME[ARMCPU_ARM7]; @@ -3969,6 +3981,9 @@ static u32 FASTCALL _MMU_ARM7_read32(u32 adr) /* Address is an IO register */ switch(adr) { + case REG_RTC: + return (u32)rtcRead(); + case REG_IME : return MMU.reg_IME[ARMCPU_ARM7]; case REG_IE : diff --git a/desmume/src/rtc.cpp b/desmume/src/rtc.cpp index 76520d1cb..7c434cd67 100644 --- a/desmume/src/rtc.cpp +++ b/desmume/src/rtc.cpp @@ -70,8 +70,9 @@ static void rtcRecv() { case 0: // status register 1 //INFO("RTC: read regstatus1 (0x%02X)\n", rtc.regStatus1); + rtc.regStatus1 &= 0x0F; rtc.data[0] = rtc.regStatus1; - rtc.regStatus1 &= 0x7F; + //rtc.regStatus1 &= 0x7F; break; case 1: // status register 2 //INFO("RTC: read regstatus2 (0x%02X)\n", rtc.regStatus1); @@ -135,18 +136,19 @@ static void rtcSend() { case 0: // status register 1 //INFO("RTC: write regstatus1 0x%02X\n", rtc.data[0]); - rtc.regStatus1 &= 0xF1; - rtc.regStatus1 |= (rtc.data[0] | 0x0E); + // rtc.regStatus1 &= 0xF1; + // rtc.regStatus1 |= (rtc.data[0] | 0x0E); + rtc.regStatus1 = rtc.data[0]; break; case 1: // status register 2 //INFO("RTC: write regstatus2 0x%02X\n", rtc.data[0]); rtc.regStatus2 = rtc.data[0]; break; case 2: // date & time - //INFO("RTC: write date & time\n"); + //INFO("RTC: write date & time : %02X %02X %02X %02X %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2], rtc.data[3], rtc.data[4], rtc.data[5], rtc.data[6]); break; case 3: // time - //INFO("RTC: write time\n"); + //INFO("RTC: write time : %02X %02X %02X\n", rtc.data[0], rtc.data[1], rtc.data[2]); break; case 4: // freq/alarm 1 /*if (cmdBitsSize[0x04] == 8) @@ -174,7 +176,7 @@ void rtcInit() rtc.regStatus1 |= 0x02; } -u8 rtcRead() +u16 rtcRead() { //INFO("MMU Read RTC 0x%02X (%03i)\n", rtc._REG, rtc.bitsCount); return (rtc._REG); @@ -213,15 +215,20 @@ void rtcWrite(u16 val) rtc.bitsCount ++; if (rtc.bitsCount == 7) { - if ( (rtc.cmd & 0x06) != 0x06 ) + // Little-endian command + if((rtc.cmd & 0x0F) == 0x06) { - rtc.cmdStat = 0; - //INFO("RTC uknown command 0x02%X\n", rtc.cmd); - break; + rtc.cmdStat = 2; + u8 tmp = rtc.cmd; + rtc.cmd = ((tmp & 0x40) >> 6) | ((tmp & 0x20) >> 4) | ((tmp & 0x10) >> 2); + } + // Big-endian command + else + { + rtc.cmdStat = 2; + rtc.cmd >>= 1; + rtc.cmd &= 0x07; } - rtc.cmdStat = 2; - rtc.cmd >>= 4; - rtc.cmd &= 0x07; //INFO("RTC command 0x%02X\n", rtc.cmd); } diff --git a/desmume/src/rtc.h b/desmume/src/rtc.h index 74161970c..fbc016532 100644 --- a/desmume/src/rtc.h +++ b/desmume/src/rtc.h @@ -28,6 +28,6 @@ #include "types.h" extern void rtcInit(); -extern u8 rtcRead(); +extern u16 rtcRead(); extern void rtcWrite(u16 val); #endif \ No newline at end of file