aboutsummaryrefslogtreecommitdiff
path: root/src/DSi.cpp
diff options
context:
space:
mode:
authorWaluigiWare64 <68647953+WaluigiWare64@users.noreply.github.com>2020-10-23 00:39:29 +0100
committerGitHub <noreply@github.com>2020-10-23 00:39:29 +0100
commit8d70d0926c6307368398a894cbebfbdc0f538194 (patch)
tree72774a626ff8a30850c36eba33fdac38962739cb /src/DSi.cpp
parenta8851a51f19577f153a3fa5d1021be5794f0921a (diff)
parent65be1840f02a7499fa08178abcefddfefec6d9b0 (diff)
Merge branch 'master' into feature/zip-support
Diffstat (limited to 'src/DSi.cpp')
-rw-r--r--src/DSi.cpp87
1 files changed, 65 insertions, 22 deletions
diff --git a/src/DSi.cpp b/src/DSi.cpp
index 42541fe..e8b1231 100644
--- a/src/DSi.cpp
+++ b/src/DSi.cpp
@@ -699,20 +699,37 @@ void MapNWRAMRange(u32 cpu, u32 num, u32 val)
}
}
+void ApplyNewRAMSize(u32 size)
+{
+ switch (size)
+ {
+ case 0:
+ case 1:
+ NDS::MainRAMMask = 0x3FFFFF;
+ printf("RAM: 4MB\n");
+ break;
+ case 2:
+ case 3: // TODO: debug console w/ 32MB?
+ NDS::MainRAMMask = 0xFFFFFF;
+ printf("RAM: 16MB\n");
+ break;
+ }
+}
+
void Set_SCFG_Clock9(u16 val)
{
- SCFG_Clock9 = val & 0x0187;
- return;
-
NDS::ARM9Timestamp >>= NDS::ARM9ClockShift;
+ NDS::ARM9Target >>= NDS::ARM9ClockShift;
printf("CLOCK9=%04X\n", val);
SCFG_Clock9 = val & 0x0187;
if (SCFG_Clock9 & (1<<0)) NDS::ARM9ClockShift = 2;
else NDS::ARM9ClockShift = 1;
+
NDS::ARM9Timestamp <<= NDS::ARM9ClockShift;
+ NDS::ARM9Target <<= NDS::ARM9ClockShift;
NDS::ARM9->UpdateRegionTimings(0x00000000, 0xFFFFFFFF);
}
@@ -895,6 +912,20 @@ void ARM9Write8(u32 addr, u8 val)
case 0x04000000:
ARM9IOWrite8(addr, val);
return;
+
+ case 0x06000000:
+ if (!(SCFG_EXT[0] & (1<<13))) return;
+#ifdef JIT_ENABLED
+ ARMJIT::CheckAndInvalidate<0, ARMJIT_Memory::memregion_VRAM>(addr);
+#endif
+ switch (addr & 0x00E00000)
+ {
+ case 0x00000000: GPU::WriteVRAM_ABG<u8>(addr, val); return;
+ case 0x00200000: GPU::WriteVRAM_BBG<u8>(addr, val); return;
+ case 0x00400000: GPU::WriteVRAM_AOBJ<u8>(addr, val); return;
+ case 0x00600000: GPU::WriteVRAM_BOBJ<u8>(addr, val); return;
+ default: GPU::WriteVRAM_LCDC<u8>(addr, val); return;
+ }
}
return NDS::ARM9Write8(addr, val);
@@ -1549,25 +1580,37 @@ void ARM9IOWrite32(u32 addr, u32 val)
switch (addr)
{
case 0x04004008:
- SCFG_EXT[0] &= ~0x8007F19F;
- SCFG_EXT[0] |= (val & 0x8007F19F);
- SCFG_EXT[1] &= ~0x0000F080;
- SCFG_EXT[1] |= (val & 0x0000F080);
- printf("SCFG_EXT = %08X / %08X (val9 %08X)\n", SCFG_EXT[0], SCFG_EXT[1], val);
- /*switch ((SCFG_EXT[0] >> 14) & 0x3)
{
- case 0:
- case 1:
- NDS::MainRAMMask = 0x3FFFFF;
- printf("RAM: 4MB\n");
- break;
- case 2:
- case 3: // TODO: debug console w/ 32MB?
- NDS::MainRAMMask = 0xFFFFFF;
- printf("RAM: 16MB\n");
- break;
- }*/
- printf("from %08X, ARM7 %08X, %08X\n", NDS::GetPC(0), NDS::GetPC(1), NDS::ARM7->R[1]);
+ u32 oldram = (SCFG_EXT[0] >> 14) & 0x3;
+ u32 newram = (val >> 14) & 0x3;
+
+ SCFG_EXT[0] &= ~0x8007F19F;
+ SCFG_EXT[0] |= (val & 0x8007F19F);
+ SCFG_EXT[1] &= ~0x0000F080;
+ SCFG_EXT[1] |= (val & 0x0000F080);
+ printf("SCFG_EXT = %08X / %08X (val9 %08X)\n", SCFG_EXT[0], SCFG_EXT[1], val);
+ /*switch ((SCFG_EXT[0] >> 14) & 0x3)
+ {
+ case 0:
+ case 1:
+ NDS::MainRAMMask = 0x3FFFFF;
+ printf("RAM: 4MB\n");
+ //baziderp=true;
+ break;
+ case 2:
+ case 3: // TODO: debug console w/ 32MB?
+ NDS::MainRAMMask = 0xFFFFFF;
+ printf("RAM: 16MB\n");
+ break;
+ }*/
+ // HAX!!
+ // a change to the RAM size setting is supposed to apply immediately (it does so on hardware)
+ // however, doing so will cause DS-mode app startup to break, because the change happens while the ARM7
+ // is still busy clearing/relocating shit
+ //if (newram != oldram)
+ // NDS::ScheduleEvent(NDS::Event_DSi_RAMSizeChange, false, 512*512*512, ApplyNewRAMSize, newram);
+ printf("from %08X, ARM7 %08X, %08X\n", NDS::GetPC(0), NDS::GetPC(1), NDS::ARM7->R[1]);
+ }
return;
case 0x04004040:
@@ -1660,7 +1703,7 @@ u8 ARM7IORead8(u32 addr)
case 0x04004501: return DSi_I2C::Cnt;
case 0x04004D00: if (SCFG_BIOS & (1<<10)) return 0; return ConsoleID & 0xFF;
- case 0x04004fD01: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 8) & 0xFF;
+ case 0x04004D01: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 8) & 0xFF;
case 0x04004D02: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 16) & 0xFF;
case 0x04004D03: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 24) & 0xFF;
case 0x04004D04: if (SCFG_BIOS & (1<<10)) return 0; return (ConsoleID >> 32) & 0xFF;