implement bit 10 of exmemcnt

This commit is contained in:
Jaklyy 2024-12-10 08:04:00 -05:00
parent b048e0cbfd
commit 96c8f67d5f
2 changed files with 11 additions and 4 deletions

View File

@ -129,6 +129,9 @@ void DSi::Reset()
//ARM9.CP15Write(0x911, 0x00000020);
//ARM9.CP15Write(0x100, ARM9.CP15Read(0x100) | 0x00050000);
NDS::Reset();
ExMemCnt[0] = 0xEC8C; // checkme: bit 10 should be explicitly set?
ExMemCnt[1] = 0xEC8C;
// The SOUNDBIAS register does nothing on DSi
SPU.SetApplyBias(false);
@ -3114,6 +3117,7 @@ void DSi::ARM7IOWrite32(u32 addr, u32 val)
SCFG_EXT[0] |= (val & 0x03000000);
SCFG_EXT[1] &= ~0x93FF0F07;
SCFG_EXT[1] |= (val & 0x93FF0F07);
if (!(val & (1<<24))) { ExMemCnt[0] &= ~(1<<10); ExMemCnt[1] &= ~(1<<10); } // bit 10 of exmemcnt is cleared when disabling second card slot access
Log(LogLevel::Debug, "SCFG_EXT = %08X / %08X (val7 %08X)\n", SCFG_EXT[0], SCFG_EXT[1], val);
return;
case 0x04004010:

View File

@ -484,7 +484,7 @@ void NDS::Reset()
MapSharedWRAM(0);
ExMemCnt[0] = 0xE88C; // checkme: is this correct? ...and what does bit 10 do...? it can be set on 3ds it seems...
ExMemCnt[0] = 0xE88C; // checkme: is this correct?
ExMemCnt[1] = 0xE88C; // note: these should only matter for direct boot; bios sets these values fairly quickly during native boot
memset(ROMSeed0, 0, 2*8);
memset(ROMSeed1, 0, 2*8);
@ -3801,9 +3801,11 @@ void NDS::ARM9IOWrite16(u32 addr, u16 val)
case 0x04000204:
{
u16 settablemask = 0x88FF;
if ((ConsoleType == 1) && (((DSi*)this)->SCFG_EXT[1] & (1<<24))) settablemask |= 0x0400; // bit 10 can be set if SCFG_EXT bit 24 is set
u16 oldVal = ExMemCnt[0];
ExMemCnt[0] = (ExMemCnt[0] & 0x7700) | (val & 0x88FF);
ExMemCnt[1] = (ExMemCnt[1] & 0x777F) | (val & 0x8880);
ExMemCnt[0] = (ExMemCnt[0] & ~settablemask) | (val & settablemask);
ExMemCnt[1] = (ExMemCnt[1] & (~settablemask | 0x7F)) | (val & (settablemask & ~0x7F));
if ((oldVal ^ ExMemCnt[0]) & 0xFF)
SetGBASlotTimings();
return;
@ -4596,8 +4598,9 @@ void NDS::ARM7IOWrite16(u32 addr, u16 val)
case 0x04000204:
{
u16 settablemask = 0x007F;
u16 oldVal = ExMemCnt[1];
ExMemCnt[1] = (ExMemCnt[1] & 0xFF80) | (val & 0x007F);
ExMemCnt[1] = (ExMemCnt[1] & ~settablemask) | (val & settablemask);
if ((ExMemCnt[1] ^ oldVal) & 0xFF)
SetGBASlotTimings();
return;