mirror of
https://github.com/CookiePLMonster/SilentPatch.git
synced 2024-12-28 14:53:01 +05:00
SilentPatchVC: Add GCC-style inline assembly statements
This also includes a small wrapper to call a C++ function from GCC-style inline ASM These statements almost work on llvm-mingw too (but there's some stubborn call instructions)
This commit is contained in:
parent
c3570a9d89
commit
a8c40aabde
1 changed files with 172 additions and 0 deletions
|
@ -671,6 +671,7 @@ float FixedRefValue()
|
|||
|
||||
__declspec(naked) void SubtitlesShadowFix()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov [esp], eax
|
||||
|
@ -683,10 +684,33 @@ __declspec(naked) void SubtitlesShadowFix()
|
|||
call Recalculate
|
||||
jmp SubtitlesShadowFix_JumpBack
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov [esp], eax\n"
|
||||
"fild dword ptr [esp]\n"
|
||||
"push eax\n"
|
||||
"lea eax, [esp+0x20-0x18]\n"
|
||||
"push eax\n"
|
||||
"lea eax, [esp+0x24-0x14]\n"
|
||||
"push eax\n"
|
||||
"call %[Recalculate]\n"
|
||||
"jmp %[SubtitlesShadowFix_JumpBack]"
|
||||
:: [Recalculate] "i" (Recalculate),
|
||||
[SubtitlesShadowFix_JumpBack] "m" (SubtitlesShadowFix_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
// C-style wrapper for calling a C++ function in GCC-style inline assembly (the function signature is really important here)
|
||||
RwFrame* __thiscall CVehicleModelInfo_GetExtrasFrame(CVehicleModelInfo* modelInfo, RpClump* clump)
|
||||
{
|
||||
return modelInfo->GetExtrasFrame(clump);
|
||||
}
|
||||
|
||||
__declspec(naked) void CreateInstance_BikeFix()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push eax
|
||||
|
@ -694,6 +718,16 @@ __declspec(naked) void CreateInstance_BikeFix()
|
|||
call CVehicleModelInfo::GetExtrasFrame
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"push eax\n"
|
||||
"mov ecx, ebp\n"
|
||||
"call %[CVehicleModelInfo_GetExtrasFrame]\n"
|
||||
"ret"
|
||||
:: [CVehicleModelInfo_GetExtrasFrame] "i" (CVehicleModelInfo_GetExtrasFrame)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
char** ppUserFilesDir = AddressByVersion<char**>(0x6022AA, 0x60228A, 0x601ECA);
|
||||
|
@ -733,6 +767,7 @@ unsigned int __cdecl AutoPilotTimerCalculation_VC(unsigned int nTimer, int nScal
|
|||
|
||||
__declspec(naked) void AutoPilotTimerFix_VC()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push dword ptr [esp + 0xC]
|
||||
|
@ -746,6 +781,22 @@ __declspec(naked) void AutoPilotTimerFix_VC()
|
|||
pop ebx
|
||||
ret 4
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [esp + 0xC]\n"
|
||||
"push dword ptr [ebx + 0x10]\n"
|
||||
"push eax\n"
|
||||
"call %[AutoPilotTimerCalculation_VC]\n"
|
||||
"add esp, 0xC\n"
|
||||
"mov [ebx + 0xC], eax\n"
|
||||
"add esp, 0x30\n"
|
||||
"pop ebp\n"
|
||||
"pop ebx\n"
|
||||
"ret 4"
|
||||
:: [AutoPilotTimerCalculation_VC] "i" (AutoPilotTimerCalculation_VC)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -866,6 +917,7 @@ namespace SirenSwitchingFix
|
|||
{
|
||||
__declspec(naked) static void IsFBIRanchOrFBICar()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov dword ptr [esi+0x1C], 0x1C
|
||||
|
@ -882,6 +934,24 @@ namespace SirenSwitchingFix
|
|||
xor al, al
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov dword ptr [esi+0x1C], 0x1C\n"
|
||||
|
||||
// al = 0 - high pitched siren
|
||||
// al = 1 - normal siren
|
||||
"cmp dword ptr [ebp+0x14], 90\n" // fbiranch
|
||||
"je IsFBIRanchOrFBICar_HighPitchSiren\n"
|
||||
"cmp dword ptr [ebp+0x14], 17\n" // fbicar
|
||||
"setne al\n"
|
||||
"ret\n"
|
||||
|
||||
"IsFBIRanchOrFBICar_HighPitchSiren:\n"
|
||||
"xor al, al\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -950,6 +1020,7 @@ namespace RemoveDriverStatusFix
|
|||
{
|
||||
// if (m_nStatus != STATUS_WRECKED)
|
||||
// m_nStatus = STATUS_ABANDONED;
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov cl, [ebx+0x50]
|
||||
|
@ -963,6 +1034,21 @@ namespace RemoveDriverStatusFix
|
|||
DontSetStatus:
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov cl, [ebx+0x50]\n"
|
||||
"mov al, cl\n"
|
||||
"and cl, 0xF8\n"
|
||||
"cmp cl, 0x28\n"
|
||||
"je DontSetStatus\n"
|
||||
"and al, 7\n"
|
||||
"or al, 0x20\n"
|
||||
|
||||
"DontSetStatus:\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1035,12 +1121,22 @@ namespace NullTerminatedLines
|
|||
static void* orgSscanf_LoadPath;
|
||||
__declspec(naked) static void sscanf1_LoadPath_Terminate()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov eax, [esp+4]
|
||||
mov byte ptr [eax+ecx], 0
|
||||
jmp orgSscanf_LoadPath
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov eax, [esp+4]\n"
|
||||
"mov byte ptr [eax+ecx], 0\n"
|
||||
"jmp %[orgSscanf_LoadPath]"
|
||||
:: [orgSscanf_LoadPath] "m" (orgSscanf_LoadPath)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1065,16 +1161,26 @@ namespace PickupEffectsFixes
|
|||
{
|
||||
__declspec(naked) static void PickUpEffects_BigDollarColor()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
mov byte ptr [esp+0x184-0x170], 0
|
||||
mov dword ptr [esp+0x184-0x174], 37
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"mov byte ptr [esp+0x184-0x170], 0\n"
|
||||
"mov dword ptr [esp+0x184-0x174], 37\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
__declspec(naked) static void PickUpEffects_Minigun2Glow()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
cmp ecx, 294 // minigun2
|
||||
|
@ -1090,6 +1196,23 @@ namespace PickupEffectsFixes
|
|||
mov ebx, ecx
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"cmp ecx, 294\n" // minigun2
|
||||
"jnz NotMinigun2\n"
|
||||
"mov byte ptr [esp+0x184-0x170], 0\n"
|
||||
"xor eax, eax\n"
|
||||
"jmp Return\n"
|
||||
|
||||
"NotMinigun2:\n"
|
||||
"lea eax, [ecx+1]\n"
|
||||
|
||||
"Return:\n"
|
||||
"mov ebx, ecx\n"
|
||||
"ret"
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1106,6 +1229,7 @@ namespace IsPlayerTargettingCharFix
|
|||
__declspec(naked) static void IsPlayerTargettingChar_ExtraChecks()
|
||||
{
|
||||
// After this extra block of code, there is a jz Return, so set ZF to 0 here if this path is to be entered
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
test bl, bl
|
||||
|
@ -1126,6 +1250,31 @@ namespace IsPlayerTargettingCharFix
|
|||
xor al, al
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"test bl, bl\n"
|
||||
"jnz ReturnToUpdateCompareFlag\n"
|
||||
"mov eax, %[bUseMouse3rdPerson]\n"
|
||||
"cmp byte ptr [eax], 0\n"
|
||||
"jne CmpAndReturn\n"
|
||||
"mov ecx, %[TheCamera]\n"
|
||||
"call %[Using1stPersonWeaponMode]\n"
|
||||
"test al, al\n"
|
||||
"jz ReturnToUpdateCompareFlag\n"
|
||||
|
||||
"CmpAndReturn:\n"
|
||||
"cmp byte ptr [esp+0x11C-0x10C], 0\n"
|
||||
"ret\n"
|
||||
|
||||
"ReturnToUpdateCompareFlag:\n"
|
||||
"xor al, al\n"
|
||||
"ret"
|
||||
:: [bUseMouse3rdPerson] "m" (bUseMouse3rdPerson),
|
||||
[TheCamera] "m" (TheCamera),
|
||||
[Using1stPersonWeaponMode] "m" (Using1stPersonWeaponMode)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1211,6 +1360,7 @@ namespace SelectableBackfaceCulling
|
|||
static void* EntityRender_Prologue_JumpBack;
|
||||
__declspec(naked) static void __fastcall EntityRender_Original(CEntity*)
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push ebx
|
||||
|
@ -1218,6 +1368,16 @@ namespace SelectableBackfaceCulling
|
|||
cmp dword ptr [ebx+0x4C], 0
|
||||
jmp EntityRender_Prologue_JumpBack
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"push ebx\n"
|
||||
"mov ebx, ecx\n"
|
||||
"cmp dword ptr [ebx+0x4C], 0\n"
|
||||
"jmp %[EntityRender_Prologue_JumpBack]"
|
||||
:: [EntityRender_Prologue_JumpBack] "m" (EntityRender_Prologue_JumpBack)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool ShouldDisableBackfaceCulling(const CEntity* entity)
|
||||
|
@ -1393,6 +1553,7 @@ namespace TommyFistShakeWithWeapons
|
|||
|
||||
__declspec(naked) static void CheckWeaponGroupHook()
|
||||
{
|
||||
#ifdef MSC_VER
|
||||
_asm
|
||||
{
|
||||
push dword ptr [eax]
|
||||
|
@ -1401,6 +1562,17 @@ namespace TommyFistShakeWithWeapons
|
|||
test al, al
|
||||
ret
|
||||
}
|
||||
#else
|
||||
__asm__ volatile
|
||||
(
|
||||
"push dword ptr [eax]\n"
|
||||
"call %[WeaponProhibitsFistShake]\n"
|
||||
"add esp, 4\n"
|
||||
"test al, al\n"
|
||||
"ret"
|
||||
:: [WeaponProhibitsFistShake] "i" (WeaponProhibitsFistShake)
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<std::size_t Index>
|
||||
|
|
Loading…
Reference in a new issue