Actually check whether float instructions should execute

This commit is contained in:
Aly 2021-04-10 13:49:48 -07:00
parent a3be4673b1
commit 84e64220ab

View File

@ -1311,196 +1311,235 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
{ {
case 0x0: case 0x0:
{ {
cheat_state.floatMode = arg1 & 0x1; if(!skipExecution)
{
cheat_state.floatMode = arg1 & 0x1;
}
} }
break; break;
case 0x1: case 0x1:
{ {
if (cheat_state.floatMode) if (!skipExecution)
{ {
float flarg1; if (cheat_state.floatMode)
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
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; else
memcpy(&value, &tmp, sizeof(float));
value += flarg1;
memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; u32 tmp;
} if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
} {
else return 0;
{ }
u32 tmp; tmp += arg1;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; return 0;
} }
tmp += arg1;
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{
return 0;
} }
} }
} }
break; break;
case 0x2: case 0x2:
{ {
if (cheat_state.floatMode) if (!skipExecution)
{ {
float flarg1; if (cheat_state.floatMode)
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
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; else
memcpy(&value, &tmp, sizeof(float));
value *= flarg1;
memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; u32 tmp;
} if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
} {
else return 0;
{ }
u32 tmp; tmp *= arg1;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; return 0;
} }
tmp *= arg1;
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{
return 0;
} }
} }
} }
break; break;
case 0x3: case 0x3:
{ {
if (cheat_state.floatMode) if (!skipExecution)
{ {
float flarg1; if (cheat_state.floatMode)
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
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; else
memcpy(&value, &tmp, sizeof(float));
value /= flarg1;
memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; u32 tmp;
} if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
} {
else return 0;
{ }
u32 tmp; tmp /= arg1;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
return 0; return 0;
} }
tmp /= arg1;
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{
return 0;
} }
} }
} }
break; break;
case 0x4: case 0x4:
{ {
if (cheat_state.data1Mode) if (!skipExecution)
{ {
float flarg1; if (cheat_state.data1Mode)
memcpy(&flarg1, &arg1, sizeof(float)); {
float value; float flarg1;
memcpy(&value, activeData(), sizeof(float)); memcpy(&flarg1, &arg1, sizeof(float));
value *= flarg1; float value;
memcpy(activeData(), &value, sizeof(float)); memcpy(&value, activeData(), sizeof(float));
} value *= flarg1;
else memcpy(activeData(), &value, sizeof(float));
{ }
*activeData() *= arg1; else
{
*activeData() *= arg1;
}
} }
} }
break; break;
case 0x5: case 0x5:
{ {
if (cheat_state.data1Mode) if (!skipExecution)
{ {
float flarg1; if (cheat_state.data1Mode)
memcpy(&flarg1, &arg1, sizeof(float)); {
float value; float flarg1;
memcpy(&value, activeData(), sizeof(float)); memcpy(&flarg1, &arg1, sizeof(float));
value /= flarg1; float value;
memcpy(activeData(), &value, sizeof(float)); memcpy(&value, activeData(), sizeof(float));
} value /= flarg1;
else memcpy(activeData(), &value, sizeof(float));
{ }
*activeData() /= arg1; else
{
*activeData() /= arg1;
}
} }
} }
break; break;
case 0x6: case 0x6:
{ {
*activeData() &= arg1; if (!skipExecution)
{
*activeData() &= arg1;
}
} }
break; break;
case 0x7: case 0x7:
{ {
*activeData() |= arg1; if (!skipExecution)
{
*activeData() |= arg1;
}
} }
break; break;
case 0x8: case 0x8:
{ {
*activeData() ^= arg1; if (!skipExecution)
{
*activeData() ^= arg1;
}
} }
break; break;
case 0x9: case 0x9:
{ {
*activeData() = ~*activeData(); if (!skipExecution)
{
*activeData() = ~*activeData();
}
} }
break; break;
case 0xA: case 0xA:
{ {
*activeData() <<= arg1; if (!skipExecution)
{
*activeData() <<= arg1;
}
} }
break; break;
case 0xB: case 0xB:
{ {
*activeData() >>= arg1; if (!skipExecution)
{
*activeData() >>= arg1;
}
} }
break; break;
case 0xC: case 0xC:
{ {
u8 origActiveOffset = cheat_state.activeOffset; if (!skipExecution)
for (size_t i = 0; i < arg1; i++)
{ {
u8 data; u8 origActiveOffset = cheat_state.activeOffset;
cheat_state.activeOffset = 1; for (size_t i = 0; i < arg1; i++)
if (!Cheat_Read8(processHandle, 0, &data))
{ {
return 0; u8 data;
} cheat_state.activeOffset = 1;
cheat_state.activeOffset = 0; if (!Cheat_Read8(processHandle, 0, &data))
if (!Cheat_Write8(processHandle, 0, data)) {
{ return 0;
return 0; }
cheat_state.activeOffset = 0;
if (!Cheat_Write8(processHandle, 0, data))
{
return 0;
}
} }
cheat_state.activeOffset = origActiveOffset;
} }
cheat_state.activeOffset = origActiveOffset;
} }
break; break;
// Search for pattern // Search for pattern
@ -1553,9 +1592,12 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
break; break;
case 0xF: case 0xF:
{ {
u32 range = arg1 - (arg0 & 0xFFFFFF); if (!skipExecution)
u32 number = Cheat_GetRandomNumber() % range; {
*activeData() = (arg0 & 0xFFFFFF) + number; u32 range = arg1 - (arg0 & 0xFFFFFF);
u32 number = Cheat_GetRandomNumber() % range;
*activeData() = (arg0 & 0xFFFFFF) + number;
}
} }
break; break;
default: default: