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).
This commit is contained in:
luigi__ 2009-02-14 22:04:24 +00:00
parent fc6cbdf03d
commit 7ad6fc5257
3 changed files with 38 additions and 16 deletions

View File

@ -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 :

View File

@ -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);
}

View File

@ -28,6 +28,6 @@
#include "types.h"
extern void rtcInit();
extern u8 rtcRead();
extern u16 rtcRead();
extern void rtcWrite(u16 val);
#endif