1
0
mirror of https://github.com/TASVideos/desmume synced 2024-07-01 07:14:37 +00:00

Compare commits

...

7 Commits

Author SHA1 Message Date
DesperateProgrammer
437d3b4352
Merge a44d7ff406 into 90d0abdae0 2024-06-06 00:13:40 -04:00
zeromus
90d0abdae0
Merge pull request #792 from atsampson/xopen-strdup
libretro-common: fix implicit declarations
2024-05-13 07:59:48 -05:00
Adam Sampson
738298a9e8 libretro-common: fix implicit declarations
strdup and realpath are only declared by glibc's headers if
_XOPEN_SOURCE >= 500.
2024-05-13 12:47:10 +01:00
zeromus
4a53a30b91 winport - fix bug where desmume would create working directory using some wrong locale encoding and produce a Pok魯n directory instead of using the Pokémon that was already there (fixes #791) 2024-05-12 21:33:49 -04:00
Tim Seidel
a44d7ff406 NWRAM Initialization for a consistent startup setting. (Was handled by the default initialization, which might not be valid in all compiler settings) 2021-07-06 11:10:53 +02:00
DesperateProgrammer
4265ab80ca
Merge branch 'TASVideos:master' into DSi_Hardware_Support 2021-07-06 10:04:19 +02:00
Tim Seidel
d21d10e087 Added DSi NWRAM support
Guarded by define DSI_NEWWRAM, which is currently only set for the VS Studio Project
2021-07-06 10:02:39 +02:00
10 changed files with 1115 additions and 9 deletions

View File

@ -54,6 +54,10 @@
#define ASSERT_UNALIGNED(x)
#endif
#ifdef DSI_NEWWRAM
void FASTCALL MMU_UpdateNWRAM();
#endif
//TODO - do we need these here?
static _KEY2 key2;
@ -907,7 +911,7 @@ void MMU_Init(void)
LOG("MMU init\n");
memset(&MMU, 0, sizeof(MMU_struct));
MMU.blank_memory = &MMU.ARM9_LCD[0xA4000];
//MMU.DTCMRegion = 0x027C0000;
@ -926,14 +930,29 @@ void MMU_Init(void)
MMU.fw.isFirmware = true;
rtcInit();
slot1_Init();
slot2_Init();
if(Mic_Init() == FALSE)
if (Mic_Init() == FALSE)
INFO("Microphone init failed.\n");
else
INFO("Microphone successfully inited.\n");
#ifdef DSI_NEWWRAM
// Disable all NWRAM Banks on Init
for (int i = 0; i < 20; i++)
MMU.regNRWAM_BankControl[i] = 0;
// Disable all Windows
for (int i = 0; i < 2; i++)
for (int q = 0; q < 3; q++)
MMU.regNWRAM_Windows[i][q] = 0;
// No Write Protection
MMU.regNWRAM_Protect = 0 ;
// update internal data from these init settings
MMU_UpdateNWRAM();
#endif
}
void MMU_DeInit(void) {
@ -2717,6 +2736,19 @@ bool validateIORegsWrite(u32 addr, u8 size, u32 val)
// ...GBA
case REG_DISPB_MASTERBRIGHT:
// NWRAM
#ifdef DSI_NEWWRAM:
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_PROTECT:
#endif
// 0x04100000
case REG_IPCFIFORECV:
case REG_GCDATAIN:
@ -2818,6 +2850,19 @@ bool validateIORegsWrite(u32 addr, u8 size, u32 val)
// Sound
// NWRAM
#ifdef DSI_NEWWRAM:
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_PROTECT:
#endif
// 0x04100000 - IPC
case REG_IPCFIFORECV:
case REG_GCDATAIN:
@ -3824,6 +3869,61 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
case 0x040001AF :
LOG("%08X : %02X\r\n", adr, val);
#endif
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
{
// check if this bank is currently writeable
uint8_t bit = (adr >= REG_NWRAM_CTRL_SET1BANK0) ? ((adr - REG_NWRAM_CTRL_SET1BANK0) + 8) : (adr - REG_NWRAM_CTRL_SET0BANK0);
if (MMU.regNWRAM_Protect & (1 << bit))
return;
// otherwise update!
MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] = val;
MMU_UpdateNWRAM();
return;
}
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] &= ~(0xff << ((adr & 3) * 8));
MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] |= (val << ((adr & 3) * 8));
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
// not writeable on arm9
return;
#endif
}
MMU.MMU_MEM[ARMCPU_ARM9][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]]=val;
@ -3835,6 +3935,18 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
{
MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000][adr & 0x7fff] = val;
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);
if(unmapped) return;
@ -4541,6 +4653,64 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
case REG_GCROMCTRL+2 :
MMU_writeToGCControl<ARMCPU_ARM9>( (T1ReadLong(MMU.MMU_MEM[0][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16));
return;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
{
// check if this bank is currently writeable
for (int i = 0; i < 2; i++)
{
uint8_t bit = ((adr + i) >= REG_NWRAM_CTRL_SET1BANK0) ? (((adr+i) - REG_NWRAM_CTRL_SET1BANK0) + 8) : ((adr + i) - REG_NWRAM_CTRL_SET0BANK0);
if (MMU.regNWRAM_Protect & (1 << bit))
return;
// otherwise update!
MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] = val >> (i *8);
}
MMU_UpdateNWRAM();
return;
}
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] &= ~(0xffff << ((adr & 2) * 8));
MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] |= (val << ((adr & 2) * 8));
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
// not writeable on arm9
return;
#endif
}
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);
@ -4552,6 +4722,17 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000])
{
T1WriteWord(MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000], adr & 0x7fff, val);
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);
if(unmapped) return;
@ -5081,6 +5262,63 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
case REG_GCDATAIN:
MMU_writeToGC<ARMCPU_ARM9>(val);
return;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
{
// check if this bank is currently writeable
for (int i = 0; i < 4; i++)
{
uint8_t bit = ((adr + i) >= REG_NWRAM_CTRL_SET1BANK0) ? (((adr + i) - REG_NWRAM_CTRL_SET1BANK0) + 8) : ((adr + i) - REG_NWRAM_CTRL_SET0BANK0);
if (MMU.regNWRAM_Protect & (1 << bit))
return;
// otherwise update!
MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] = val >> (i * 8);
}
MMU_UpdateNWRAM();
return;
}
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] = val;
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
// not writeable on arm9
return;
#endif
}
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20], val);
@ -5092,6 +5330,17 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000])
{
T1WriteLong(MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000], adr & 0x7fff, val);
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);
if(unmapped) return;
@ -5221,9 +5470,59 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr)
case REG_KEYINPUT:
LagFrameFlag=0;
break;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0];
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return (MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] >> ((adr & 3) * 8)) & 0xff;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return (MMU.regNWRAM_Protect >> ((adr & 3) * 8)) & 0xff;
#endif
}
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000])
return MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000][adr & 0x7fff];
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted);
if(unmapped) return 0;
@ -5328,11 +5627,59 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr)
case eng_3D_FOG_TABLE+0x10: case eng_3D_FOG_TABLE+0x12: case eng_3D_FOG_TABLE+0x14: case eng_3D_FOG_TABLE+0x16:
case eng_3D_FOG_TABLE+0x18: case eng_3D_FOG_TABLE+0x1A: case eng_3D_FOG_TABLE+0x1C: case eng_3D_FOG_TABLE+0x1E:
return 0;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] | (MMU.regNRWAM_BankControl[adr + 1 - REG_NWRAM_CTRL_SET0BANK0] << 8);
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return (MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2] >> ((adr & 2) * 8)) & 0xffff;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return (MMU.regNWRAM_Protect >> ((adr & 2) * 8)) & 0xffff;
#endif
}
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000])
return T1ReadWord_guaranteedAligned(MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000], adr & 0x7fff);
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr,unmapped, restricted);
if(unmapped) return 0;
@ -5473,10 +5820,58 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr)
case REG_KEYINPUT:
LagFrameFlag=0;
break;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] | (MMU.regNRWAM_BankControl[adr + 1 - REG_NWRAM_CTRL_SET0BANK0] << 8)
| (MMU.regNRWAM_BankControl[adr + 2 - REG_NWRAM_CTRL_SET0BANK0] << 16) | (MMU.regNRWAM_BankControl[adr + 3 - REG_NWRAM_CTRL_SET0BANK0] << 24);
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2];
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return MMU.regNWRAM_Protect;
#endif
}
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr>>20]);
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000])
return T1ReadLong_guaranteedAligned(MMU.NWRAMBLOCKPTRS[1][(adr - 0x03000000) / 0x8000], adr & 0x7fff);
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM9>(adr,unmapped, restricted);
if(unmapped) return 0;
@ -5582,11 +5977,71 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val)
// into RAM at 0x027FF830
MMU_writeToSPIData(val);
return;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
/* These registers can not be changed by the arm7, as of a fuse bit in SCFG
TODO: If that SFCG is implemented this might get writeable */
return;
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] &= ~(0xff << ((adr & 3) * 8));
MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] |= (val << ((adr & 3) * 8));
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
MMU.regNWRAM_Protect &= ~(0xff << ((adr & 3) * 8));
MMU.regNWRAM_Protect |= (val << ((adr & 3) * 8));
return;
#endif
}
MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]]=val;
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
{
MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000][adr & 0x7fff] = val;
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return;
@ -5767,12 +6222,72 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val)
case REG_GCROMCTRL+2 :
MMU_writeToGCControl<ARMCPU_ARM7>( (T1ReadLong(MMU.MMU_MEM[1][0x40], 0x1A4) & 0xFFFF) | ((u32) val << 16));
return;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
/* These registers can not be changed by the arm7, as of a fuse bit in SCFG
TODO: If that SFCG is implemented this might get writeable */
return;
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] &= ~(0xffff << ((adr & 2) * 8));
MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] |= (val << ((adr & 2) * 8));
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
MMU.regNWRAM_Protect &= ~(0xffff << ((adr & 2) * 8));
MMU.regNWRAM_Protect |= (val << ((adr & 2) * 8));
return;
#endif
}
T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
{
T1WriteWord(MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000], adr & 0x7fff, val);
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return;
@ -5867,11 +6382,68 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val)
case REG_GCDATAIN:
MMU_writeToGC<ARMCPU_ARM7>(val);
return;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
/* These registers can not be changed by the arm7, as of a fuse bit in SCFG
TODO: If that SFCG is implemented this might get writeable */
return;
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] = val;
MMU_UpdateNWRAM();
return;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
MMU.regNWRAM_Protect = val;
return;
#endif
}
T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20], val);
return;
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
{
T1WriteLong(MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000], adr & 0x7fff, val);
return;
}
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return;
@ -5959,11 +6531,60 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr)
case REG_TM3CNTL+1: return _MMU_ARM7_read16(adr-1)>>8;
case REG_TM3CNTL+2: return _MMU_ARM7_read16(adr);
case REG_TM3CNTL+3: return _MMU_ARM7_read16(adr-1)>>8;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
case REG_NWRAM_CTRL_SET2BANK7:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0];
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return (MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] >> ((adr & 3) * 8)) & 0xff;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return (MMU.regNWRAM_Protect >> ((adr & 3) * 8)) & 0xff;
#endif
}
return MMU.MMU_MEM[ARMCPU_ARM7][adr>>20][adr&MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]];
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
return MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000][adr & 0x7fff];
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return 0;
@ -6044,10 +6665,58 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr)
//since the arm7 polls this (and EXTKEYIN) every frame, we shouldnt count this as an input check
//LagFrameFlag=0;
break;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
case REG_NWRAM_CTRL_SET2BANK5:
case REG_NWRAM_CTRL_SET2BANK6:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] | (MMU.regNRWAM_BankControl[adr + 1 - REG_NWRAM_CTRL_SET0BANK0] << 8);
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return (MMU.regNWRAM_Windows[0][(adr - REG_NWRAM_WINDOW_SET0) >> 2] >> ((adr & 2) * 8)) & 0xffff;
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return (MMU.regNWRAM_Protect >> ((adr & 2) * 8)) & 0xffff;
#endif
}
return T1ReadWord_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]);
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
return T1ReadWord_guaranteedAligned(MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000], adr & 0x7fff);
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return 0;
@ -6125,11 +6794,58 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr)
//make sure WRAMSTAT is stashed and then fallthrough return the value from memory. i know, gross.
T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x241, MMU.WRAMCNT);
break;
#ifdef DSI_NEWWRAM
case REG_NWRAM_CTRL_SET0BANK0:
case REG_NWRAM_CTRL_SET0BANK1:
case REG_NWRAM_CTRL_SET0BANK2:
case REG_NWRAM_CTRL_SET0BANK3:
case REG_NWRAM_CTRL_SET1BANK0:
case REG_NWRAM_CTRL_SET1BANK1:
case REG_NWRAM_CTRL_SET1BANK2:
case REG_NWRAM_CTRL_SET1BANK3:
case REG_NWRAM_CTRL_SET1BANK4:
case REG_NWRAM_CTRL_SET1BANK5:
case REG_NWRAM_CTRL_SET1BANK6:
case REG_NWRAM_CTRL_SET1BANK7:
case REG_NWRAM_CTRL_SET2BANK0:
case REG_NWRAM_CTRL_SET2BANK1:
case REG_NWRAM_CTRL_SET2BANK2:
case REG_NWRAM_CTRL_SET2BANK3:
case REG_NWRAM_CTRL_SET2BANK4:
return MMU.regNRWAM_BankControl[adr - REG_NWRAM_CTRL_SET0BANK0] | (MMU.regNRWAM_BankControl[adr + 1 - REG_NWRAM_CTRL_SET0BANK0] << 8)
| (MMU.regNRWAM_BankControl[adr + 2 - REG_NWRAM_CTRL_SET0BANK0] << 16) | (MMU.regNRWAM_BankControl[adr + 3 - REG_NWRAM_CTRL_SET0BANK0] << 24);
case REG_NWRAM_WINDOW_SET0:
case REG_NWRAM_WINDOW_SET0 + 1:
case REG_NWRAM_WINDOW_SET0 + 2:
case REG_NWRAM_WINDOW_SET0 + 3:
case REG_NWRAM_WINDOW_SET1:
case REG_NWRAM_WINDOW_SET1 + 1:
case REG_NWRAM_WINDOW_SET1 + 2:
case REG_NWRAM_WINDOW_SET1 + 3:
case REG_NWRAM_WINDOW_SET2:
case REG_NWRAM_WINDOW_SET2 + 1:
case REG_NWRAM_WINDOW_SET2 + 2:
case REG_NWRAM_WINDOW_SET2 + 3:
return MMU.regNWRAM_Windows[1][(adr - REG_NWRAM_WINDOW_SET0) >> 2];
case REG_NWRAM_PROTECT:
case REG_NWRAM_PROTECT + 1:
case REG_NWRAM_PROTECT + 2:
case REG_NWRAM_PROTECT + 3:
return MMU.regNWRAM_Protect;
#endif
}
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr>>20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr>>20]);
}
#ifdef DSI_NEWWRAM
if ((adr >> 24) == 0x03)
{
if (MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000])
return T1ReadLong_guaranteedAligned(MMU.NWRAMBLOCKPTRS[0][(adr - 0x03000000) / 0x8000], adr & 0x7fff);
}
#endif
bool unmapped, restricted;
adr = MMU_LCDmap<ARMCPU_ARM7>(adr,unmapped, restricted);
if(unmapped) return 0;
@ -6139,6 +6855,96 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr)
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM7][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM7][adr >> 20]);
}
#ifdef DSI_NEWWRAM
#pragma optimize( "g", off)
//================================================= MMU Update new WRAM Mapping
void FASTCALL MMU_UpdateNWRAM()
{
// move through all 32k Blocks in the 0x03000000 to 0x03FFFFFF range. The range consists of 512 blocks
// and check where the data for the arm7/arm9 shall point to
// TODO: This does not work when blending NWRAM into the HW Register range
uint32_t blockLimits[12];
uint32_t arm9BlockLimits[6];
// pre calculate the window limits in 32k Blocks for each core and window
for (int i = 0; i < 2; i++)
{
blockLimits[i * 6 + 0] = (MMU.regNWRAM_Windows[i][0] & 0x0FF0) >> 3;
blockLimits[i * 6 + 2] = (MMU.regNWRAM_Windows[i][1] & 0x0FF8) >> 3;
blockLimits[i * 6 + 4] = (MMU.regNWRAM_Windows[i][2] & 0x0FF8) >> 3;
blockLimits[i * 6 + 1] = (MMU.regNWRAM_Windows[i][0] & 0x0FF00000) >> 19;
blockLimits[i * 6 + 3] = (MMU.regNWRAM_Windows[i][1] & 0x0FF80000) >> 19;
blockLimits[i * 6 + 5] = (MMU.regNWRAM_Windows[i][2] & 0x0FF80000) >> 19;
}
// now check every block in the 0x03... range to which nwram page it belongs
for (int block = 0; block < 512; block++)
{
for (int core = 0; core < 2; core++)
{
u8* data = 0;
for (int set = 0; (set < 3) && (data == 0); set++)
{
// for each of the 3 sets
if ((block >= blockLimits[core * 6 + set * 2]) && (block < blockLimits[core * 6 + set * 2 + 1]))
{
// This set is blended in at this region
uint8_t sectorLength = (MMU.regNWRAM_Windows[core][set] >> 12) & 0x03;
// the first set does not know an image size of 32kB (0) and will default to 64kB (1)
if ((sectorLength == 0) && (set == 0))
sectorLength = 1;
uint8_t sectorBlocks = 1 << sectorLength;
uint8_t sectorPart = block & (sectorBlocks - 1);
// now iterate through all banks in the set and check if it is
// enabled & assigned to the core
if (set == 0)
{
// the set A is special as it combines two 32kB blocks into a single 64kB Block
// therefor we have only 4 bank controls which are matching for 2 blocks each
for (int bank = 0; bank < 4; bank++)
{
if (!(MMU.regNRWAM_BankControl[bank] & 0x80)) // not enabled
continue;
if ((MMU.regNRWAM_BankControl[bank] & 0x03) != (1 - core)) // assigned to dsp or different core
continue;
if (((MMU.regNRWAM_BankControl[bank] >> 2) & 6) != (sectorPart & ~1))
continue;
// when this is reached, the current block is found in this set for this core
// So remember the data it shall point to
// for the first set the parts are of 2 blocks
data = &MMU.NWRAM[set][bank | (sectorPart & 1)][0];
}
}
else
{
// otherwise it is a regular set with each 32kB block having its own bank control register
for (int bank = 0; bank < 8; bank++)
{
if (!(MMU.regNRWAM_BankControl[bank + set * 8 - 4] & 0x80)) // not enabled
continue;
if ((MMU.regNRWAM_BankControl[bank + set * 8 - 4] & 0x03) != (1 - core)) // assigned to dsp or different core
continue;
if (((MMU.regNRWAM_BankControl[bank + set * 8 - 4] >> 2) & 7) != sectorPart)
continue;
// when this is reached, the current block is found in this set for this core
// So remember the data it shall point to
// for the first set the parts are of 2 blocks
data = &MMU.NWRAM[set][bank][0];
}
}
}
}
MMU.NWRAMBLOCKPTRS[core][block] = data;
}
}
// TODO
}
#pragma optimize( "g", on)
#endif
//=========================================================================================================
u32 FASTCALL MMU_read32(u32 proc, u32 adr)

View File

@ -406,6 +406,25 @@ struct MMU_struct
//32KB of shared WRAM - can be switched between ARM7 & ARM9 in two blocks
u8 SWIRAM[0x8000];
#ifdef DSI_NEWWRAM
// new shared WRAM, 3 banks, each of 256k
// smallest chunk to blend in is 32k
u8 NWRAM[3][8][32 * 1024];
// Control register for each bank (named MBK?.? in gbatek)
u8 regNRWAM_BankControl[20];
// Window control registers. One set of 3 for each core
u32 regNWRAM_Windows[2][3];
// Bank control write protection register
u32 regNWRAM_Protect;
// Pointer for each block of the region from 0x03000000 to 0x03ffffff
// for each core. This way the memory lookup must not calculate the effective
// WRAM address on each access but prepares these pointers only when the
// window or bank registers changed.
u8* NWRAMBLOCKPTRS[2][512] ;
#endif
//Unused ram
u8 UNUSED_RAM[4];

View File

@ -57,6 +57,11 @@
<Import Project="desmume.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>HAVE_LIBAGG=1;HAVE_JIT=1;HAVE_LUA=1;%(PreprocessorDefinitions);DSI_NEWWRAM</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\addons\slot1comp_mc.cpp" />
<ClCompile Include="..\..\addons\slot1comp_protocol.cpp" />

View File

@ -229,7 +229,122 @@ IOReg IORegs9[] = {
{"DMA 1",9,1},{"DMA 2",10,1},{"DMA 3",11,1},{"Keypad",12,1},
{"Game Pak",13,1},{"IPC sync",16,1},{"IPC send FIFO empty",17,1},{"IPC recv FIFO not empty",18,1},
{"Gamecard transfer",19,1},{"Gamecard IREQ_MC",20,1},{"GX FIFO",21,1}}},
#ifdef DSI_NEWWRAM
{ CatBegin, "NWRAM registers", 0, 4, 0, {{0}} },
{ MMIOReg, "NWRAMCTRL_S0B0", REG_NWRAM_CTRL_SET0BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S0B1", REG_NWRAM_CTRL_SET0BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S0B2", REG_NWRAM_CTRL_SET0BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S0B3", REG_NWRAM_CTRL_SET0BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B0", REG_NWRAM_CTRL_SET0BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B1", REG_NWRAM_CTRL_SET1BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B2", REG_NWRAM_CTRL_SET1BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B3", REG_NWRAM_CTRL_SET1BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B4", REG_NWRAM_CTRL_SET1BANK4, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B5", REG_NWRAM_CTRL_SET1BANK5, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B6", REG_NWRAM_CTRL_SET1BANK6, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S1B7", REG_NWRAM_CTRL_SET1BANK7, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B0", REG_NWRAM_CTRL_SET1BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B1", REG_NWRAM_CTRL_SET1BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B2", REG_NWRAM_CTRL_SET1BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B3", REG_NWRAM_CTRL_SET1BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B4", REG_NWRAM_CTRL_SET1BANK4, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B5", REG_NWRAM_CTRL_SET1BANK5, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B6", REG_NWRAM_CTRL_SET1BANK6, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_S2B7", REG_NWRAM_CTRL_SET1BANK7, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}} },
{ MMIOReg, "NWRAMCTRL_WINDOW_0", REG_NWRAM_WINDOW_SET0, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_WINDOW_1", REG_NWRAM_WINDOW_SET1, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_WINDOW_2", REG_NWRAM_WINDOW_SET2, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_PROTECT", REG_NWRAM_PROTECT, 4, 20, {
{"Set 0 Part 0 Protected", 0, 1},
{"Set 0 Part 1 Protected", 1, 1},
{"Set 0 Part 2 Protected", 2, 1},
{"Set 0 Part 3 Protected", 3, 1},
{"Set 1 Part 0 Protected", 8, 1},
{"Set 1 Part 1 Protected", 9, 1},
{"Set 1 Part 2 Protected", 10, 1},
{"Set 1 Part 3 Protected", 11, 1},
{"Set 1 Part 4 Protected", 12, 1},
{"Set 1 Part 5 Protected", 13, 1},
{"Set 1 Part 6 Protected", 14, 1},
{"Set 1 Part 7 Protected", 15, 1},
{"Set 2 Part 0 Protected", 16, 1},
{"Set 2 Part 1 Protected", 17, 1},
{"Set 2 Part 2 Protected", 18, 1},
{"Set 2 Part 3 Protected", 19, 1},
{"Set 2 Part 4 Protected", 20, 1},
{"Set 2 Part 5 Protected", 21, 1},
{"Set 2 Part 6 Protected", 22, 1},
{"Set 2 Part 7 Protected", 23, 1}} },
#endif
{ListEnd, "", 0, 0, 0, {{0}}}
};
@ -271,8 +386,124 @@ IOReg IORegs7[] = {
{MMIOReg, "DMA3SAD", REG_DMA3SAD, 4, 1, {{"Value",0,27}}},
{MMIOReg, "DMA3DAD", REG_DMA3DAD, 4, 1, {{"Value",0,27}}},
{MMIOReg, "DMA3CNT", REG_DMA3CNTL, 4, 8, {{"Word Count",0,21}, {"Dest update method",21,2}, {"Src update method",23,2}, {"Repeat Flag",25,1}, {"32bit Width Enable",26,1},{"Start Mode",28,2}, {"IRQ Enable",30,1}, {"Enabled",31,1}}},
#ifdef DSI_NEWWRAM
{CatBegin, "NWRAM registers", 0, 4, 0, {{0}}},
{MMIOReg, "NWRAMCTRL_S0B0", REG_NWRAM_CTRL_SET0BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S0B1", REG_NWRAM_CTRL_SET0BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S0B2", REG_NWRAM_CTRL_SET0BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S0B3", REG_NWRAM_CTRL_SET0BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B0", REG_NWRAM_CTRL_SET0BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B1", REG_NWRAM_CTRL_SET1BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B2", REG_NWRAM_CTRL_SET1BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B3", REG_NWRAM_CTRL_SET1BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B4", REG_NWRAM_CTRL_SET1BANK4, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B5", REG_NWRAM_CTRL_SET1BANK5, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B6", REG_NWRAM_CTRL_SET1BANK6, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S1B7", REG_NWRAM_CTRL_SET1BANK7, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B0", REG_NWRAM_CTRL_SET1BANK0, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B1", REG_NWRAM_CTRL_SET1BANK1, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B2", REG_NWRAM_CTRL_SET1BANK2, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B3", REG_NWRAM_CTRL_SET1BANK3, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B4", REG_NWRAM_CTRL_SET1BANK4, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B5", REG_NWRAM_CTRL_SET1BANK5, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B6", REG_NWRAM_CTRL_SET1BANK6, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{MMIOReg, "NWRAMCTRL_S2B7", REG_NWRAM_CTRL_SET1BANK7, 1, 3, {
{"Enable", 7, 1},
{"Block", 2, 2},
{"Owner", 0, 2}}},
{ MMIOReg, "NWRAMCTRL_WINDOW_0", REG_NWRAM_WINDOW_SET0, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_WINDOW_1", REG_NWRAM_WINDOW_SET1, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_WINDOW_2", REG_NWRAM_WINDOW_SET2, 4, 3, {
{"Start block", 3, 8},
{"End Block", 19, 10},
{"Image Size", 12, 2}} },
{ MMIOReg, "NWRAMCTRL_PROTECT", REG_NWRAM_PROTECT, 4, 20, {
{"Set 0 Part 0 Protected", 0, 1},
{"Set 0 Part 1 Protected", 1, 1},
{"Set 0 Part 2 Protected", 2, 1},
{"Set 0 Part 3 Protected", 3, 1},
{"Set 1 Part 0 Protected", 8, 1},
{"Set 1 Part 1 Protected", 9, 1},
{"Set 1 Part 2 Protected", 10, 1},
{"Set 1 Part 3 Protected", 11, 1},
{"Set 1 Part 4 Protected", 12, 1},
{"Set 1 Part 5 Protected", 13, 1},
{"Set 1 Part 6 Protected", 14, 1},
{"Set 1 Part 7 Protected", 15, 1},
{"Set 2 Part 0 Protected", 16, 1},
{"Set 2 Part 1 Protected", 17, 1},
{"Set 2 Part 2 Protected", 18, 1},
{"Set 2 Part 3 Protected", 19, 1},
{"Set 2 Part 4 Protected", 20, 1},
{"Set 2 Part 5 Protected", 21, 1},
{"Set 2 Part 6 Protected", 22, 1},
{"Set 2 Part 7 Protected", 23, 1}} },
#endif
{ListEnd, "", 0, 0, 0, {{0}}}
};

View File

@ -87,7 +87,7 @@ void GetINIPath()
}
FCEUD_MakePathDirs(IniName);
wcscpy(IniNameW,mbstowcs(IniName).c_str()); //careful to use locale C-style mbstowcs to get IniName (which is with locale encoding) to unicode
wcscpy(IniNameW,mbstowcs_locale(IniName).c_str());
//write BOM to get unicode
FILE* test = fopen(IniName,"rb");

View File

@ -20,6 +20,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#define _XOPEN_SOURCE 500 /* For strdup, realpath */
#include <stdlib.h>
#include <boolean.h>
#include <string.h>

View File

@ -170,7 +170,7 @@ void createDirectoryRecursively(std::wstring path)
void FCEUD_MakePathDirs(const char *fname)
{
createDirectoryRecursively(mbstowcs(fname));
createDirectoryRecursively(mbstowcs_locale(fname));
}
#endif
//------------------------------

View File

@ -227,6 +227,34 @@
#define REG_DISPB_BLDY 0x04001054
#define REG_DISPB_MASTERBRIGHT 0x0400106C
// NWRAM Ports
#ifdef DSI_NEWWRAM
#define REG_NWRAM_CTRL_SET0BANK0 0x04004040
#define REG_NWRAM_CTRL_SET0BANK1 0x04004041
#define REG_NWRAM_CTRL_SET0BANK2 0x04004042
#define REG_NWRAM_CTRL_SET0BANK3 0x04004043
#define REG_NWRAM_CTRL_SET1BANK0 0x04004044
#define REG_NWRAM_CTRL_SET1BANK1 0x04004045
#define REG_NWRAM_CTRL_SET1BANK2 0x04004046
#define REG_NWRAM_CTRL_SET1BANK3 0x04004047
#define REG_NWRAM_CTRL_SET1BANK4 0x04004048
#define REG_NWRAM_CTRL_SET1BANK5 0x04004049
#define REG_NWRAM_CTRL_SET1BANK6 0x0400404a
#define REG_NWRAM_CTRL_SET1BANK7 0x0400404b
#define REG_NWRAM_CTRL_SET2BANK0 0x0400404c
#define REG_NWRAM_CTRL_SET2BANK1 0x0400404d
#define REG_NWRAM_CTRL_SET2BANK2 0x0400404e
#define REG_NWRAM_CTRL_SET2BANK3 0x0400404f
#define REG_NWRAM_CTRL_SET2BANK4 0x04004050
#define REG_NWRAM_CTRL_SET2BANK5 0x04004051
#define REG_NWRAM_CTRL_SET2BANK6 0x04004052
#define REG_NWRAM_CTRL_SET2BANK7 0x04004053
#define REG_NWRAM_WINDOW_SET0 0x04004054
#define REG_NWRAM_WINDOW_SET1 0x04004058
#define REG_NWRAM_WINDOW_SET2 0x0400405c
#define REG_NWRAM_PROTECT 0x04004060
#endif
// Receive ports
#define REG_IPCFIFORECV 0x04100000
#define REG_GCDATAIN 0x04100010

View File

@ -284,6 +284,19 @@ std::string mass_replace(const std::string &source, const std::string &victim, c
return answer;
}
std::wstring mbstowcs_locale(std::string str)
{
#ifdef HOST_WINDOWS
int plenty = str.size()*4+1;
wchar_t *wgarbage = new wchar_t[plenty];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str.data(), -1, wgarbage, plenty);
std::wstring ret = wgarbage;
delete[] wgarbage;
return ret;
#endif
return mbstowcs(str);
}
//convert a std::string to std::wstring
std::wstring mbstowcs(std::string str)
{

View File

@ -107,5 +107,7 @@ std::string mass_replace(const std::string &source, const std::string &victim, c
std::wstring mbstowcs(std::string str);
std::string wcstombs(std::wstring str);
std::wstring mbstowcs_locale(std::string str);
#endif