aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDesperateProgrammer <Tim.seidel@rwth-Aachen.de>2021-08-02 22:15:33 +0200
committerGitHub <noreply@github.com>2021-08-02 22:15:33 +0200
commit85c2a767748e586bf98097ee6c966c1dc4b5d831 (patch)
treeed715af992d0327b78a1fa098a2cbfa888be073c /src
parent946eb7a834e1d452ed17a9ab5d76bcf55211e54d (diff)
Fix for https://github.com/Arisotura/melonDS/issues/1169 (#1171)
* Fix for https://github.com/Arisotura/melonDS/issues/1169 LoadNAND was storing the stage 2 bootloader, while NWRAM access was disabled by Bit25 of SCFG_EXT putting the stage 2 into old shared WRAM, while executing it later with the bit enabled and fetching from an empty NWRAM. * Fixed bug, where access to the NWRAM Bank A used the wrong page mask for write access * Remove spaces before comma Co-authored-by: Tim Seidel <t.seidel@kts-systeme.de> Co-authored-by: RSDuck <RSDuck@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/DSi.cpp43
1 files changed, 25 insertions, 18 deletions
diff --git a/src/DSi.cpp b/src/DSi.cpp
index b22dc8f..01dcd35 100644
--- a/src/DSi.cpp
+++ b/src/DSi.cpp
@@ -348,6 +348,13 @@ bool LoadNAND()
{
printf("Loading DSi NAND\n");
+ // Make sure NWRAM is accessible.
+ // The Bits are set to the startup values in Reset() and we might
+ // still have them on default (0) or some bits cleared by the previous
+ // run.
+ SCFG_EXT[0] |= (1 << 25);
+ SCFG_EXT[1] |= (1 << 25);
+
memset(NWRAM_A, 0, NWRAMSize);
memset(NWRAM_B, 0, NWRAMSize);
memset(NWRAM_C, 0, NWRAMSize);
@@ -1041,14 +1048,14 @@ void ARM9Write8(u32 addr, u8 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[0][0] << 3)) | 0x80;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[0][0] << 2)) | 0x80;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[0][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u8*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u8*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif
@@ -1139,14 +1146,14 @@ void ARM9Write16(u32 addr, u16 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[0][0] << 3)) | 0x80;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[0][0] << 2)) | 0x80;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[0][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u16*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u16*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif
@@ -1223,14 +1230,14 @@ void ARM9Write32(u32 addr, u32 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[0][0] << 3)) | 0x80;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[0][0] << 2)) | 0x80;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[0][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u32*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u32*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif
@@ -1503,14 +1510,14 @@ void ARM7Write8(u32 addr, u8 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[1][0] << 3)) | 0x81;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[1][0] << 2)) | 0x81;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[1][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u8*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u8*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<1, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif
@@ -1590,14 +1597,14 @@ void ARM7Write16(u32 addr, u16 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[1][0] << 3)) | 0x81;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[1][0] << 2)) | 0x81;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[1][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u16*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u16*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<1, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif
@@ -1677,14 +1684,14 @@ void ARM7Write32(u32 addr, u32 val)
// parts that are mapped and not just the highest priority
// See http://melonds.kuribo64.net/board/thread.php?pid=3974#3974
// so we need to iterate through all parts and write to all mapped here
- unsigned int destPartSetting = ((addr >> 13) & (NWRAMMask[1][0] << 3)) | 0x81;
+ unsigned int destPartSetting = ((addr >> 14) & (NWRAMMask[1][0] << 2)) | 0x81;
for (int page = 0; page < 4; page++)
{
unsigned int bankInfo = (MBK[1][0 + (page / 4)] >> ((page % 4) * 8)) & 0xff;
if (bankInfo != destPartSetting)
continue;
- u8* ptr = &NWRAM_A[page * 0x8000];
- *(u32*)&ptr[addr & 0x7FFF] = val;
+ u8* ptr = &NWRAM_A[page * 0x10000];
+ *(u32*)&ptr[addr & 0xFFFF] = val;
#ifdef JIT_ENABLED
ARMJIT::CheckAndInvalidate<1, ARMJIT_Memory::memregion_NewSharedWRAM_A>(addr);
#endif