From eb44833171e3ce4da049a37a0bd639b71e618215 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Fri, 14 Feb 2020 21:19:36 +0100 Subject: [PATCH] well, more AR shito --- src/AREngine.cpp | 152 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 146 insertions(+), 6 deletions(-) diff --git a/src/AREngine.cpp b/src/AREngine.cpp index 45684738..d74d5331 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(0x90): // IF b.l = ((~b.h) & u16[a]) + 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]) { 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;