aboutsummaryrefslogtreecommitdiff
path: root/src/AREngine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/AREngine.cpp')
-rw-r--r--src/AREngine.cpp152
1 files changed, 146 insertions, 6 deletions
diff --git a/src/AREngine.cpp b/src/AREngine.cpp
index 4568473..d74d533 100644
--- a/src/AREngine.cpp
+++ b/src/AREngine.cpp
@@ -53,10 +53,10 @@ void Reset()
NumCheatCodes = 0;
// TODO: acquire codes from a sensible source!
+#define TEMP_PUTCODE(a, b) *ptr++ = a; *ptr++ = b;
CheatEntry* entry = &CheatCodes[0];
u32* ptr = &entry->Code[0];
-#define TEMP_PUTCODE(a, b) *ptr++ = a; *ptr++ = b;
- // NSMBDS EUR - giant fucking Mario
+ /*// NSMBDS EUR - giant fucking Mario
TEMP_PUTCODE(0x1209DBD0, 0x0000027C);
TEMP_PUTCODE(0x2209DBC0, 0x00000003);
TEMP_PUTCODE(0x94000130, 0xFFFD0000);
@@ -64,6 +64,44 @@ void Reset()
TEMP_PUTCODE(0x2209DBC0, 0x00000003);
entry->Enabled = true;
NumCheatCodes++;
+
+ entry = &CheatCodes[1];
+ ptr = &entry->Code[0];*/
+ // NSMBDS EUR - jump to the sky
+ /*TEMP_PUTCODE(0x9209DC90, 0xFFFD0002);
+ TEMP_PUTCODE(0x920DC910, 0x00000000);
+ TEMP_PUTCODE(0x021C1944, 0x00004000);
+ TEMP_PUTCODE(0xD2000000, 0x00000000);
+ TEMP_PUTCODE(0x9209DC90, 0xFFFE0001);
+ TEMP_PUTCODE(0x920DC910, 0x00000000);
+ TEMP_PUTCODE(0x021C1944, 0x00004000);
+ TEMP_PUTCODE(0xD2000000, 0x00000000);*/
+ // SM64DS EUR redcoin
+ /*TEMP_PUTCODE(0x0210CC3E, 0x00000121);
+ TEMP_PUTCODE(0x5209F30C, 0x00000008);
+ TEMP_PUTCODE(0x0209F30C, 0x00000000);
+ TEMP_PUTCODE(0xD2000000, 0x00000000);*/
+ // SM64DS EUR shroom-o-matic
+ /*TEMP_PUTCODE(0x9209D09A , 0x00000000);
+ TEMP_PUTCODE(0x6209B468 , 0x00000000);
+ TEMP_PUTCODE(0xB209B468 , 0x00000000);
+ TEMP_PUTCODE(0x10000672 , 0x000003FF);
+ TEMP_PUTCODE(0xD2000000 , 0x00000000);
+ TEMP_PUTCODE(0x9209D09A , 0x00000000);
+ TEMP_PUTCODE(0x94000130 , 0xFCBF0000);
+ TEMP_PUTCODE(0x6209B468 , 0x00000000);
+ TEMP_PUTCODE(0xB209B468 , 0x00000000);
+ TEMP_PUTCODE(0x200006B3 , 0x00000001);
+ TEMP_PUTCODE(0x200006B4 , 0x00000001);
+ TEMP_PUTCODE(0xD2000000 , 0x00000000);
+ TEMP_PUTCODE(0x9209D09A , 0x00000000);
+ TEMP_PUTCODE(0x94000130 , 0xFC7F0000);
+ TEMP_PUTCODE(0x6209B468 , 0x00000000);
+ TEMP_PUTCODE(0xB209B468 , 0x00000000);
+ TEMP_PUTCODE(0x10000672 , 0x00000000);
+ TEMP_PUTCODE(0xD2000000 , 0x00000000);*/
+ entry->Enabled = true;
+ NumCheatCodes++;
}
@@ -77,6 +115,8 @@ void RunCheat(CheatEntry* entry)
{
u32* code = &entry->Code[0];
+ u32 offset = 0;
+ u32 datareg = 0;
u32 cond = 1;
u32 condstack = 0;
@@ -100,18 +140,88 @@ void RunCheat(CheatEntry* entry)
switch (op)
{
case16(0x00): // 32-bit write
- NDS::ARM7Write32(a & 0x0FFFFFFF, b);
+ NDS::ARM7Write32((a & 0x0FFFFFFF) + offset, b);
break;
case16(0x10): // 16-bit write
- NDS::ARM7Write16(a & 0x0FFFFFFF, b & 0xFFFF);
+ NDS::ARM7Write16((a & 0x0FFFFFFF) + offset, b & 0xFFFF);
break;
case16(0x20): // 8-bit write
- NDS::ARM7Write8(a & 0x0FFFFFFF, b & 0xFF);
+ NDS::ARM7Write8((a & 0x0FFFFFFF) + offset, b & 0xFF);
+ break;
+
+ case16(0x30): // IF b > u32[a]
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u32 chk = NDS::ARM7Read32(a & 0x0FFFFFFF);
+
+ cond = (b > chk) ? 1:0;
+ }
+ break;
+
+ case16(0x40): // IF b < u32[a]
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u32 chk = NDS::ARM7Read32(a & 0x0FFFFFFF);
+
+ cond = (b < chk) ? 1:0;
+ }
+ break;
+
+ case16(0x50): // IF b == u32[a]
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u32 chk = NDS::ARM7Read32(a & 0x0FFFFFFF);
+
+ cond = (b == chk) ? 1:0;
+ }
+ break;
+
+ case16(0x60): // IF b != u32[a]
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u32 chk = NDS::ARM7Read32(a & 0x0FFFFFFF);
+
+ cond = (b != chk) ? 1:0;
+ }
+ break;
+
+ case16(0x70): // IF b.l > ((~b.h) & u16[a])
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u16 val = NDS::ARM7Read16(a & 0x0FFFFFFF);
+ u16 chk = ~(b >> 16);
+ chk &= val;
+
+ cond = ((b & 0xFFFF) > chk) ? 1:0;
+ }
+ break;
+
+ case16(0x80): // IF b.l < ((~b.h) & u16[a])
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u16 val = NDS::ARM7Read16(a & 0x0FFFFFFF);
+ u16 chk = ~(b >> 16);
+ chk &= val;
+
+ cond = ((b & 0xFFFF) < chk) ? 1:0;
+ }
break;
- case16(0x90): // IF b.l = ((~b.h) & u16[a])
+ case16(0x90): // IF b.l == ((~b.h) & u16[a])
{
condstack <<= 1;
condstack |= cond;
@@ -124,6 +234,36 @@ void RunCheat(CheatEntry* entry)
}
break;
+ case16(0xA0): // IF b.l != ((~b.h) & u16[a])
+ {
+ condstack <<= 1;
+ condstack |= cond;
+
+ u16 val = NDS::ARM7Read16(a & 0x0FFFFFFF);
+ u16 chk = ~(b >> 16);
+ chk &= val;
+
+ cond = ((b & 0xFFFF) != chk) ? 1:0;
+ }
+ break;
+
+ case16(0xB0): // offset = u32[a + offset]
+ offset = NDS::ARM7Read32((a & 0x0FFFFFFF) + offset);
+ break;
+
+ case 0xD0: // ENDIF
+ cond = condstack & 0x1;
+ condstack >>= 1;
+ break;
+
+ case 0xD2: // NEXT+FLUSH
+ // TODO: loop shenanigans!
+ offset = 0;
+ datareg = 0;
+ condstack = 0;
+ cond = 1;
+ break;
+
default:
printf("!! bad AR opcode %08X %08X\n", a, b);
return;