aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/DSi.cpp118
1 files changed, 117 insertions, 1 deletions
diff --git a/src/DSi.cpp b/src/DSi.cpp
index b0c1ceb..a450666 100644
--- a/src/DSi.cpp
+++ b/src/DSi.cpp
@@ -197,6 +197,9 @@ bool LoadNAND()
// read and apply new-WRAM settings
+ MBK[0][8] = 0;
+ MBK[1][8] = 0;
+
u32 mbk[12];
fseek(f, 0x380, SEEK_SET);
fread(mbk, 4, 12, f);
@@ -232,7 +235,10 @@ bool LoadNAND()
MapNWRAMRange(1, 1, mbk[9]);
MapNWRAMRange(1, 2, mbk[10]);
- // TODO: MBK9 protect thing
+ // TODO: find out why it is 0xFF000000
+ mbk[11] &= 0x00FFFF0F;
+ MBK[0][8] = mbk[11];
+ MBK[1][8] = mbk[11];
// load binaries
// TODO: optionally support loading from actual NAND?
@@ -364,6 +370,12 @@ void StopNDMAs(u32 cpu, u32 mode)
void MapNWRAM_A(u32 num, u8 val)
{
+ if (MBK[0][8] & (1 << num))
+ {
+ printf("trying to map NWRAM_A %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]);
+ return;
+ }
+
int mbkn = 0, mbks = 8*num;
u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF;
@@ -389,6 +401,12 @@ void MapNWRAM_A(u32 num, u8 val)
void MapNWRAM_B(u32 num, u8 val)
{
+ if (MBK[0][8] & (1 << (8+num)))
+ {
+ printf("trying to map NWRAM_B %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]);
+ return;
+ }
+
int mbkn = 1+(num>>2), mbks = 8*(num&3);
u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF;
@@ -418,6 +436,12 @@ void MapNWRAM_B(u32 num, u8 val)
void MapNWRAM_C(u32 num, u8 val)
{
+ if (MBK[0][8] & (1 << (16+num)))
+ {
+ printf("trying to map NWRAM_C %d to %02X, but it is write-protected (%08X)\n", num, val, MBK[0][8]);
+ return;
+ }
+
int mbkn = 3+(num>>2), mbks = 8*(num&3);
u8 oldval = (MBK[0][mbkn] >> mbks) & 0xFF;
@@ -928,10 +952,23 @@ bool ARM7GetMemRegion(u32 addr, bool write, NDS::MemRegion* region)
case (addr+2): return ((val) >> 16) & 0xFF; \
case (addr+3): return (val) >> 24;
+#define CASE_READ16_32BIT(addr, val) \
+ case (addr): return (val) & 0xFFFF; \
+ case (addr+2): return (val) >> 16;
+
u8 ARM9IORead8(u32 addr)
{
switch (addr)
{
+ CASE_READ8_32BIT(0x04004040, MBK[0][0])
+ CASE_READ8_32BIT(0x04004044, MBK[0][1])
+ CASE_READ8_32BIT(0x04004048, MBK[0][2])
+ CASE_READ8_32BIT(0x0400404C, MBK[0][3])
+ CASE_READ8_32BIT(0x04004050, MBK[0][4])
+ CASE_READ8_32BIT(0x04004054, MBK[0][5])
+ CASE_READ8_32BIT(0x04004058, MBK[0][6])
+ CASE_READ8_32BIT(0x0400405C, MBK[0][7])
+ CASE_READ8_32BIT(0x04004060, MBK[0][8])
}
return NDS::ARM9IORead8(addr);
@@ -942,6 +979,16 @@ u16 ARM9IORead16(u32 addr)
switch (addr)
{
case 0x04004004: return 0; // TODO
+
+ CASE_READ16_32BIT(0x04004040, MBK[0][0])
+ CASE_READ16_32BIT(0x04004044, MBK[0][1])
+ CASE_READ16_32BIT(0x04004048, MBK[0][2])
+ CASE_READ16_32BIT(0x0400404C, MBK[0][3])
+ CASE_READ16_32BIT(0x04004050, MBK[0][4])
+ CASE_READ16_32BIT(0x04004054, MBK[0][5])
+ CASE_READ16_32BIT(0x04004058, MBK[0][6])
+ CASE_READ16_32BIT(0x0400405C, MBK[0][7])
+ CASE_READ16_32BIT(0x04004060, MBK[0][8])
}
return NDS::ARM9IORead16(addr);
@@ -953,6 +1000,16 @@ u32 ARM9IORead32(u32 addr)
{
case 0x04004010: return 1; // todo
+ case 0x04004040: return MBK[0][0];
+ case 0x04004044: return MBK[0][1];
+ case 0x04004048: return MBK[0][2];
+ case 0x0400404C: return MBK[0][3];
+ case 0x04004050: return MBK[0][4];
+ case 0x04004054: return MBK[0][5];
+ case 0x04004058: return MBK[0][6];
+ case 0x0400405C: return MBK[0][7];
+ case 0x04004060: return MBK[0][8];
+
case 0x04004100: return NDMACnt[0];
case 0x04004104: return NDMAs[0]->SrcAddr;
case 0x04004108: return NDMAs[0]->DstAddr;
@@ -991,6 +1048,26 @@ void ARM9IOWrite8(u32 addr, u8 val)
{
switch (addr)
{
+ case 0x04004040: MapNWRAM_A(0, val); return;
+ case 0x04004041: MapNWRAM_A(1, val); return;
+ case 0x04004042: MapNWRAM_A(2, val); return;
+ case 0x04004043: MapNWRAM_A(3, val); return;
+ case 0x04004044: MapNWRAM_B(0, val); return;
+ case 0x04004045: MapNWRAM_B(1, val); return;
+ case 0x04004046: MapNWRAM_B(2, val); return;
+ case 0x04004047: MapNWRAM_B(3, val); return;
+ case 0x04004048: MapNWRAM_B(4, val); return;
+ case 0x04004049: MapNWRAM_B(5, val); return;
+ case 0x0400404A: MapNWRAM_B(6, val); return;
+ case 0x0400404B: MapNWRAM_B(7, val); return;
+ case 0x0400404C: MapNWRAM_C(0, val); return;
+ case 0x0400404D: MapNWRAM_C(1, val); return;
+ case 0x0400404E: MapNWRAM_C(2, val); return;
+ case 0x0400404F: MapNWRAM_C(3, val); return;
+ case 0x04004050: MapNWRAM_C(4, val); return;
+ case 0x04004051: MapNWRAM_C(5, val); return;
+ case 0x04004052: MapNWRAM_C(6, val); return;
+ case 0x04004053: MapNWRAM_C(7, val); return;
}
return NDS::ARM9IOWrite8(addr, val);
@@ -1009,6 +1086,10 @@ void ARM9IOWrite32(u32 addr, u32 val)
{
switch (addr)
{
+ case 0x04004054: MapNWRAMRange(0, 0, val); return;
+ case 0x04004058: MapNWRAMRange(0, 1, val); return;
+ case 0x0400405C: MapNWRAMRange(0, 2, val); return;
+
case 0x04004100: NDMACnt[0] = val & 0x800F0000; return;
case 0x04004104: NDMAs[0]->SrcAddr = val & 0xFFFFFFFC; return;
case 0x04004108: NDMAs[0]->DstAddr = val & 0xFFFFFFFC; return;
@@ -1051,6 +1132,16 @@ u8 ARM7IORead8(u32 addr)
case 0x04004000: return 0x01;
case 0x04004001: return 0x01;
+ CASE_READ8_32BIT(0x04004040, MBK[1][0])
+ CASE_READ8_32BIT(0x04004044, MBK[1][1])
+ CASE_READ8_32BIT(0x04004048, MBK[1][2])
+ CASE_READ8_32BIT(0x0400404C, MBK[1][3])
+ CASE_READ8_32BIT(0x04004050, MBK[1][4])
+ CASE_READ8_32BIT(0x04004054, MBK[1][5])
+ CASE_READ8_32BIT(0x04004058, MBK[1][6])
+ CASE_READ8_32BIT(0x0400405C, MBK[1][7])
+ CASE_READ8_32BIT(0x04004060, MBK[1][8])
+
case 0x04004500: return DSi_I2C::ReadData();
case 0x04004501: printf("read I2C CNT %02X\n", DSi_I2C::Cnt); return DSi_I2C::Cnt;
@@ -1078,6 +1169,16 @@ u16 ARM7IORead16(u32 addr)
case 0x04004004: return 0x0187;
case 0x04004006: return 0; // JTAG register
+ CASE_READ16_32BIT(0x04004040, MBK[1][0])
+ CASE_READ16_32BIT(0x04004044, MBK[1][1])
+ CASE_READ16_32BIT(0x04004048, MBK[1][2])
+ CASE_READ16_32BIT(0x0400404C, MBK[1][3])
+ CASE_READ16_32BIT(0x04004050, MBK[1][4])
+ CASE_READ16_32BIT(0x04004054, MBK[1][5])
+ CASE_READ16_32BIT(0x04004058, MBK[1][6])
+ CASE_READ16_32BIT(0x0400405C, MBK[1][7])
+ CASE_READ16_32BIT(0x04004060, MBK[1][8])
+
case 0x04004D00: return ConsoleID & 0xFFFF;
case 0x04004D02: return (ConsoleID >> 16) & 0xFFFF;
case 0x04004D04: return (ConsoleID >> 32) & 0xFFFF;
@@ -1106,6 +1207,16 @@ u32 ARM7IORead32(u32 addr)
case 0x04004008: return 0x80000000; // HAX
+ case 0x04004040: return MBK[1][0];
+ case 0x04004044: return MBK[1][1];
+ case 0x04004048: return MBK[1][2];
+ case 0x0400404C: return MBK[1][3];
+ case 0x04004050: return MBK[1][4];
+ case 0x04004054: return MBK[1][5];
+ case 0x04004058: return MBK[1][6];
+ case 0x0400405C: return MBK[1][7];
+ case 0x04004060: return MBK[1][8];
+
case 0x04004100: return NDMACnt[1];
case 0x04004104: return NDMAs[4]->SrcAddr;
case 0x04004108: return NDMAs[4]->DstAddr;
@@ -1198,6 +1309,11 @@ void ARM7IOWrite32(u32 addr, u32 val)
case 0x04000218: NDS::IE2 = (val & 0x7FF7); NDS::UpdateIRQ(1); return;
case 0x0400021C: NDS::IF2 &= ~(val & 0x7FF7); NDS::UpdateIRQ(1); return;
+ case 0x04004054: MapNWRAMRange(1, 0, val); return;
+ case 0x04004058: MapNWRAMRange(1, 1, val); return;
+ case 0x0400405C: MapNWRAMRange(1, 2, val); return;
+ case 0x04004060: val &= 0x00FFFF0F; MBK[0][8] = val; MBK[1][8] = val; return;
+
case 0x04004100: NDMACnt[1] = val & 0x800F0000; return;
case 0x04004104: NDMAs[4]->SrcAddr = val & 0xFFFFFFFC; return;
case 0x04004108: NDMAs[4]->DstAddr = val & 0xFFFFFFFC; return;