diff --git a/src/DSi.cpp b/src/DSi.cpp index e1e6816e..505fc411 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -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: diff --git a/src/NDS.cpp b/src/NDS.cpp index 9dcb2e71..3e124663 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -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;