aboutsummaryrefslogtreecommitdiff
path: root/NDSCart.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NDSCart.cpp')
-rw-r--r--NDSCart.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/NDSCart.cpp b/NDSCart.cpp
index 5334c15..37722db 100644
--- a/NDSCart.cpp
+++ b/NDSCart.cpp
@@ -38,6 +38,7 @@ bool CartInserted;
u8* CartROM;
u32 CartROMSize;
u32 CartID;
+bool CartIsHomebrew;
u32 CmdEncMode;
u32 DataEncMode;
@@ -174,6 +175,7 @@ void Reset()
CartROM = NULL;
CartROMSize = 0;
CartID = 0;
+ CartIsHomebrew = false;
CmdEncMode = 0;
DataEncMode = 0;
@@ -213,6 +215,30 @@ void LoadROM(char* path)
// it just has to stay the same throughout gameplay
CartID = 0x00001FC2;
+ u32 arm9base = *(u32*)&CartROM[0x20];
+ if (arm9base < 0x8000)
+ {
+ if (arm9base >= 0x4000)
+ {
+ // reencrypt secure area if needed
+ if (*(u32*)&CartROM[arm9base] == 0xE7FFDEFF)
+ {
+ printf("Re-encrypting cart secure area\n");
+
+ strncpy((char*)&CartROM[arm9base], "encryObj", 8);
+
+ Key1_InitKeycode(gamecode, 3, 2);
+ for (u32 i = 0; i < 0x800; i += 8)
+ Key1_Encrypt((u32*)&CartROM[arm9base + i]);
+
+ Key1_InitKeycode(gamecode, 2, 2);
+ Key1_Encrypt((u32*)&CartROM[arm9base]);
+ }
+ }
+ else
+ CartIsHomebrew = true;
+ }
+
// encryption
Key1_InitKeycode(gamecode, 2, 2);
}
@@ -231,7 +257,11 @@ void ReadROM(u32 addr, u32 len, u32 offset)
void ReadROM_B7(u32 addr, u32 len, u32 offset)
{
addr &= (CartROMSize-1);
- if (addr < 0x8000) addr = 0x8000 + (addr & 0x1FF);
+ if (!CartIsHomebrew)
+ {
+ if (addr < 0x8000)
+ addr = 0x8000 + (addr & 0x1FF);
+ }
memcpy(DataOut+offset, CartROM+addr, len);
}
@@ -318,11 +348,11 @@ void WriteCnt(u32 val)
*(u32*)&cmd[4] = *(u32*)&ROMCommand[4];
}
- printf("ROM COMMAND %04X %08X %02X%02X%02X%02X%02X%02X%02X%02X SIZE %04X\n",
+ /*printf("ROM COMMAND %04X %08X %02X%02X%02X%02X%02X%02X%02X%02X SIZE %04X\n",
SPICnt, ROMCnt,
cmd[0], cmd[1], cmd[2], cmd[3],
cmd[4], cmd[5], cmd[6], cmd[7],
- datasize);
+ datasize);*/
switch (cmd[0])
{
@@ -380,6 +410,13 @@ void WriteCnt(u32 val)
*(u32*)&DataOut[pos] = CartID;
break;
+ case 0x20:
+ {
+ u32 addr = (cmd[2] & 0xF0) << 8;
+ ReadROM(addr, 0x1000, 0);
+ }
+ break;
+
case 0xA0:
CmdEncMode = 2;
break;