From 9e3e01b6ace2940df06f1783a0c5d9190aac0edb Mon Sep 17 00:00:00 2001 From: Aly Date: Sat, 10 Apr 2021 12:17:41 -0700 Subject: [PATCH 1/3] Fix conditional mode checking for the conditional operators --- sysmodules/rosalina/source/menus/cheats.c | 148 +++++++++++++++------- 1 file changed, 104 insertions(+), 44 deletions(-) diff --git a/sysmodules/rosalina/source/menus/cheats.c b/sysmodules/rosalina/source/menus/cheats.c index 0b085f8..9d36768 100755 --- a/sysmodules/rosalina/source/menus/cheats.c +++ b/sysmodules/rosalina/source/menus/cheats.c @@ -322,18 +322,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const // Simple: If the value at address 0XXXXXXX is less than the value YYYYYYYY. // Example: 323D6B28 10000000 { + bool newSkip; u32 value = 0; - if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; - + switch (cheat_state.conditionalMode) + { + case 0x0: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value < arg1); + break; + case 0x1: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value < *activeData()); + break; + case 0x2: + newSkip = !(*activeData() < arg1); + break; + case 0x3: + newSkip = !(*activeStorage(cheat) < arg1); + break; + case 0x4: + newSkip = !(*activeData() < *activeStorage(cheat)); + break; + default: + return 0; + } cheat_state.ifStack <<= 1; - if (value < arg1) - { - cheat_state.ifStack |= skipExecution ? 1 : 0; - } - else - { - cheat_state.ifStack |= 1; - } + cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0; cheat_state.ifCount++; } break; @@ -344,18 +358,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const // Simple: If the value at address 0XXXXXXX is greater than the value YYYYYYYY. // Example: 423D6B28 10000000 { + bool newSkip; u32 value = 0; - if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; - + switch (cheat_state.conditionalMode) + { + case 0x0: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value > arg1); + break; + case 0x1: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value > *activeData()); + break; + case 0x2: + newSkip = !(*activeData() > arg1); + break; + case 0x3: + newSkip = !(*activeStorage(cheat) > arg1); + break; + case 0x4: + newSkip = !(*activeData() > *activeStorage(cheat)); + break; + default: + return 0; + } cheat_state.ifStack <<= 1; - if (value > arg1) - { - cheat_state.ifStack |= skipExecution ? 1 : 0; - } - else - { - cheat_state.ifStack |= 1; - } + cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0; cheat_state.ifCount++; } break; @@ -366,18 +394,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const // Simple: If the value at address 0XXXXXXX is equal to the value YYYYYYYY. // Example: 523D6B28 10000000 { + bool newSkip; u32 value = 0; - if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; - + switch (cheat_state.conditionalMode) + { + case 0x0: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value == arg1); + break; + case 0x1: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value == *activeData()); + break; + case 0x2: + newSkip = !(*activeData() == arg1); + break; + case 0x3: + newSkip = !(*activeStorage(cheat) == arg1); + break; + case 0x4: + newSkip = !(*activeData() == *activeStorage(cheat)); + break; + default: + return 0; + } cheat_state.ifStack <<= 1; - if (value == arg1) - { - cheat_state.ifStack |= skipExecution ? 1 : 0; - } - else - { - cheat_state.ifStack |= 1; - } + cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0; cheat_state.ifCount++; } break; @@ -388,18 +430,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const // Simple: If the value at address 0XXXXXXX is not equal to the value YYYYYYYY. // Example: 623D6B28 10000000 { + bool newSkip; u32 value = 0; - if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; - + switch (cheat_state.conditionalMode) + { + case 0x0: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value != arg1); + break; + case 0x1: + if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; + newSkip = !(value != *activeData()); + break; + case 0x2: + newSkip = !(*activeData() != arg1); + break; + case 0x3: + newSkip = !(*activeStorage(cheat) != arg1); + break; + case 0x4: + newSkip = !(*activeData() != *activeStorage(cheat)); + break; + default: + return 0; + } cheat_state.ifStack <<= 1; - if (value != arg1) - { - cheat_state.ifStack |= skipExecution ? 1 : 0; - } - else - { - cheat_state.ifStack |= 1; - } + cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0; cheat_state.ifCount++; } break; @@ -413,13 +469,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const bool newSkip; u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 value = 0; - if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; switch (cheat_state.conditionalMode) { case 0x0: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) < (arg1 & 0xFFFF)); break; case 0x1: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) < (*activeData() & (~mask))); break; case 0x2: @@ -449,13 +506,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const bool newSkip; u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 value = 0; - if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; switch (cheat_state.conditionalMode) { case 0x0: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) > (arg1 & 0xFFFF)); break; case 0x1: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) > (*activeData() & (~mask))); break; case 0x2: @@ -486,13 +544,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const bool newSkip; u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 value = 0; - if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; switch (cheat_state.conditionalMode) { case 0x0: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) == (arg1 & 0xFFFF)); break; case 0x1: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) == (*activeData() & (~mask))); break; case 0x2: @@ -523,13 +582,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const bool newSkip; u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 value = 0; - if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; switch (cheat_state.conditionalMode) { case 0x0: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) != (arg1 & 0xFFFF)); break; case 0x1: + if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; newSkip = !((value & (~mask)) != (*activeData() & (~mask))); break; case 0x2: From a3be4673b18fde4913ba2b8b643b61c17a1d9a10 Mon Sep 17 00:00:00 2001 From: Aly Date: Sat, 10 Apr 2021 12:38:37 -0700 Subject: [PATCH 2/3] Fix float mode checking for arithmetic operators --- sysmodules/rosalina/source/menus/cheats.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sysmodules/rosalina/source/menus/cheats.c b/sysmodules/rosalina/source/menus/cheats.c index 9d36768..e221e81 100755 --- a/sysmodules/rosalina/source/menus/cheats.c +++ b/sysmodules/rosalina/source/menus/cheats.c @@ -1318,6 +1318,8 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { if (cheat_state.floatMode) { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); u32 tmp; if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) { @@ -1325,7 +1327,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const } float value; memcpy(&value, &tmp, sizeof(float)); - value += arg1; + value += flarg1; memcpy(&tmp, &value, sizeof(u32)); if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) { @@ -1351,6 +1353,8 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { if (cheat_state.floatMode) { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); u32 tmp; if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) { @@ -1358,7 +1362,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const } float value; memcpy(&value, &tmp, sizeof(float)); - value *= arg1; + value *= flarg1; memcpy(&tmp, &value, sizeof(u32)); if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) { @@ -1384,6 +1388,8 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { if (cheat_state.floatMode) { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); u32 tmp; if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) { @@ -1391,7 +1397,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const } float value; memcpy(&value, &tmp, sizeof(float)); - value /= arg1; + value /= flarg1; memcpy(&tmp, &value, sizeof(u32)); if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) { @@ -1417,9 +1423,11 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { if (cheat_state.data1Mode) { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); float value; memcpy(&value, activeData(), sizeof(float)); - value *= arg1; + value *= flarg1; memcpy(activeData(), &value, sizeof(float)); } else @@ -1432,9 +1440,11 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { if (cheat_state.data1Mode) { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); float value; memcpy(&value, activeData(), sizeof(float)); - value /= arg1; + value /= flarg1; memcpy(activeData(), &value, sizeof(float)); } else From 84e64220ab2c4a808ee8bf9267dbf098bea73711 Mon Sep 17 00:00:00 2001 From: Aly Date: Sat, 10 Apr 2021 13:49:48 -0700 Subject: [PATCH 3/3] Actually check whether float instructions should execute --- sysmodules/rosalina/source/menus/cheats.c | 280 +++++++++++++--------- 1 file changed, 161 insertions(+), 119 deletions(-) diff --git a/sysmodules/rosalina/source/menus/cheats.c b/sysmodules/rosalina/source/menus/cheats.c index e221e81..1b9b1aa 100755 --- a/sysmodules/rosalina/source/menus/cheats.c +++ b/sysmodules/rosalina/source/menus/cheats.c @@ -1311,196 +1311,235 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const { case 0x0: { - cheat_state.floatMode = arg1 & 0x1; + if(!skipExecution) + { + cheat_state.floatMode = arg1 & 0x1; + } } break; case 0x1: { - if (cheat_state.floatMode) + if (!skipExecution) { - float flarg1; - memcpy(&flarg1, &arg1, sizeof(float)); - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + if (cheat_state.floatMode) { - return 0; + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + float value; + memcpy(&value, &tmp, sizeof(float)); + value += flarg1; + memcpy(&tmp, &value, sizeof(u32)); + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } - float value; - memcpy(&value, &tmp, sizeof(float)); - value += flarg1; - memcpy(&tmp, &value, sizeof(u32)); - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + else { - return 0; - } - } - else - { - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) - { - return 0; - } - tmp += arg1; - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) - { - return 0; + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + tmp += arg1; + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } } } break; case 0x2: { - if (cheat_state.floatMode) + if (!skipExecution) { - float flarg1; - memcpy(&flarg1, &arg1, sizeof(float)); - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + if (cheat_state.floatMode) { - return 0; + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + float value; + memcpy(&value, &tmp, sizeof(float)); + value *= flarg1; + memcpy(&tmp, &value, sizeof(u32)); + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } - float value; - memcpy(&value, &tmp, sizeof(float)); - value *= flarg1; - memcpy(&tmp, &value, sizeof(u32)); - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + else { - return 0; - } - } - else - { - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) - { - return 0; - } - tmp *= arg1; - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) - { - return 0; + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + tmp *= arg1; + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } } } break; case 0x3: { - if (cheat_state.floatMode) + if (!skipExecution) { - float flarg1; - memcpy(&flarg1, &arg1, sizeof(float)); - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + if (cheat_state.floatMode) { - return 0; + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + float value; + memcpy(&value, &tmp, sizeof(float)); + value /= flarg1; + memcpy(&tmp, &value, sizeof(u32)); + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } - float value; - memcpy(&value, &tmp, sizeof(float)); - value /= flarg1; - memcpy(&tmp, &value, sizeof(u32)); - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + else { - return 0; - } - } - else - { - u32 tmp; - if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) - { - return 0; - } - tmp /= arg1; - if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) - { - return 0; + u32 tmp; + if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) + { + return 0; + } + tmp /= arg1; + if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) + { + return 0; + } } } } break; case 0x4: { - if (cheat_state.data1Mode) + if (!skipExecution) { - float flarg1; - memcpy(&flarg1, &arg1, sizeof(float)); - float value; - memcpy(&value, activeData(), sizeof(float)); - value *= flarg1; - memcpy(activeData(), &value, sizeof(float)); - } - else - { - *activeData() *= arg1; + if (cheat_state.data1Mode) + { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); + float value; + memcpy(&value, activeData(), sizeof(float)); + value *= flarg1; + memcpy(activeData(), &value, sizeof(float)); + } + else + { + *activeData() *= arg1; + } } } break; case 0x5: { - if (cheat_state.data1Mode) + if (!skipExecution) { - float flarg1; - memcpy(&flarg1, &arg1, sizeof(float)); - float value; - memcpy(&value, activeData(), sizeof(float)); - value /= flarg1; - memcpy(activeData(), &value, sizeof(float)); - } - else - { - *activeData() /= arg1; + if (cheat_state.data1Mode) + { + float flarg1; + memcpy(&flarg1, &arg1, sizeof(float)); + float value; + memcpy(&value, activeData(), sizeof(float)); + value /= flarg1; + memcpy(activeData(), &value, sizeof(float)); + } + else + { + *activeData() /= arg1; + } } } break; case 0x6: { - *activeData() &= arg1; + if (!skipExecution) + { + *activeData() &= arg1; + } } break; case 0x7: { - *activeData() |= arg1; + if (!skipExecution) + { + *activeData() |= arg1; + } } break; case 0x8: { - *activeData() ^= arg1; + if (!skipExecution) + { + *activeData() ^= arg1; + } } break; case 0x9: { - *activeData() = ~*activeData(); + if (!skipExecution) + { + *activeData() = ~*activeData(); + } } break; case 0xA: { - *activeData() <<= arg1; + if (!skipExecution) + { + *activeData() <<= arg1; + } } break; case 0xB: { - *activeData() >>= arg1; + if (!skipExecution) + { + *activeData() >>= arg1; + } } break; case 0xC: { - u8 origActiveOffset = cheat_state.activeOffset; - for (size_t i = 0; i < arg1; i++) + if (!skipExecution) { - u8 data; - cheat_state.activeOffset = 1; - if (!Cheat_Read8(processHandle, 0, &data)) + u8 origActiveOffset = cheat_state.activeOffset; + for (size_t i = 0; i < arg1; i++) { - return 0; - } - cheat_state.activeOffset = 0; - if (!Cheat_Write8(processHandle, 0, data)) - { - return 0; + u8 data; + cheat_state.activeOffset = 1; + if (!Cheat_Read8(processHandle, 0, &data)) + { + return 0; + } + cheat_state.activeOffset = 0; + if (!Cheat_Write8(processHandle, 0, data)) + { + return 0; + } } + cheat_state.activeOffset = origActiveOffset; } - cheat_state.activeOffset = origActiveOffset; } break; // Search for pattern @@ -1553,9 +1592,12 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const break; case 0xF: { - u32 range = arg1 - (arg0 & 0xFFFFFF); - u32 number = Cheat_GetRandomNumber() % range; - *activeData() = (arg0 & 0xFFFFFF) + number; + if (!skipExecution) + { + u32 range = arg1 - (arg0 & 0xFFFFFF); + u32 number = Cheat_GetRandomNumber() % range; + *activeData() = (arg0 & 0xFFFFFF) + number; + } } break; default: