From ba373ca72a4ae3442725820d4556fc2a56676dd9 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 17 Aug 2020 19:15:45 +0200 Subject: DSi: make ARM9-clock-selector actually work --- src/DSi.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 21 deletions(-) (limited to 'src/DSi.cpp') diff --git a/src/DSi.cpp b/src/DSi.cpp index 42541fe..66b8ed0 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); } @@ -1549,25 +1566,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: -- cgit v1.2.3 From aa94cbaeb0cca8c3f05639fd93a979b38757f899 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Thu, 3 Sep 2020 11:51:50 +0200 Subject: DSi: add support for 8-bit VRAM writes when enabled in SCFG_EXT. fixes #733 --- src/DSi.cpp | 14 ++++++++++++++ src/DSi_Camera.cpp | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'src/DSi.cpp') diff --git a/src/DSi.cpp b/src/DSi.cpp index 66b8ed0..a96322b 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -912,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(addr, val); return; + case 0x00200000: GPU::WriteVRAM_BBG(addr, val); return; + case 0x00400000: GPU::WriteVRAM_AOBJ(addr, val); return; + case 0x00600000: GPU::WriteVRAM_BOBJ(addr, val); return; + default: GPU::WriteVRAM_LCDC(addr, val); return; + } } return NDS::ARM9Write8(addr, val); diff --git a/src/DSi_Camera.cpp b/src/DSi_Camera.cpp index cc44052..56cba1c 100644 --- a/src/DSi_Camera.cpp +++ b/src/DSi_Camera.cpp @@ -140,7 +140,7 @@ u16 DSi_Camera::ReadReg(u16 addr) case 0x301A: return ((~StandbyCnt) & 0x4000) >> 12; } - printf("DSi_Camera%d: unknown read %04X\n", Num, addr); + //printf("DSi_Camera%d: unknown read %04X\n", Num, addr); return 0; } @@ -162,5 +162,5 @@ void DSi_Camera::WriteReg(u16 addr, u16 val) return; } - printf("DSi_Camera%d: unknown write %04X %04X\n", Num, addr, val); + //printf("DSi_Camera%d: unknown write %04X %04X\n", Num, addr, val); } -- cgit v1.2.3 From 00e2ec3faf43b1fa6ad3def0e97828083244a47a Mon Sep 17 00:00:00 2001 From: PoroCYon <3253268+PoroCYon@users.noreply.github.com> Date: Mon, 7 Sep 2020 02:09:03 +0000 Subject: fix 8-bit ConsoleID address decoding typo (#749) --- src/DSi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/DSi.cpp') diff --git a/src/DSi.cpp b/src/DSi.cpp index a96322b..e8b1231 100644 --- a/src/DSi.cpp +++ b/src/DSi.cpp @@ -1703,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; -- cgit v1.2.3