Core: Create a x86 call for calling this functions

This commit is contained in:
zilmar 2022-08-29 08:32:02 +09:30
parent 4218cbad23
commit 6782599687
4 changed files with 200 additions and 704 deletions

View File

@ -206,9 +206,9 @@ public:
void FoundMemoryBreakpoint(); void FoundMemoryBreakpoint();
void PreReadInstruction(); void PreReadInstruction();
void PreWriteInstruction(); void PreWriteInstruction();
void TestWriteBreakpoint(CX86Ops::x86Reg AddressReg, void * FunctAddress, const char * FunctName); void TestWriteBreakpoint(CX86Ops::x86Reg AddressReg, uint32_t FunctAddress, const char * FunctName);
void TestReadBreakpoint(CX86Ops::x86Reg AddressReg, void * FunctAddress, const char * FunctName); void TestReadBreakpoint(CX86Ops::x86Reg AddressReg, uint32_t FunctAddress, const char * FunctName);
void TestBreakpoint(CX86Ops::x86Reg AddressReg, void * FunctAddress, const char * FunctName); void TestBreakpoint(CX86Ops::x86Reg AddressReg, uint32_t FunctAddress, const char * FunctName);
void EnterCodeBlock(); void EnterCodeBlock();
void ExitCodeBlock(); void ExitCodeBlock();
void CompileExitCode(); void CompileExitCode();

View File

@ -200,24 +200,32 @@ void CX86Ops::X86BreakPoint(const char * FileName, int32_t LineNumber)
Pushad(); Pushad();
PushImm32(stdstr_f("%d", LineNumber).c_str(), LineNumber); PushImm32(stdstr_f("%d", LineNumber).c_str(), LineNumber);
PushImm32(FileName, (uint32_t)FileName); PushImm32(FileName, (uint32_t)FileName);
Call_Direct((void *)BreakPointNotification, "BreakPointNotification"); CallFunc((uint32_t)BreakPointNotification, "BreakPointNotification");
AddConstToX86Reg(x86_ESP, 8); AddConstToX86Reg(x86_ESP, 8);
Popad(); Popad();
} }
void CX86Ops::Call_Direct(void * FunctAddress, const char * FunctName) void CX86Ops::CallFunc(uint32_t FunctPtr, const char * FunctName)
{ {
CodeLog(" call offset %s", FunctName); CodeLog(" call offset %s", FunctName);
AddCode8(0xE8); AddCode8(0xE8);
AddCode32((uint32_t)FunctAddress - (uint32_t)*g_RecompPos - 4); AddCode32(FunctPtr - (uint32_t)*g_RecompPos - 4);
} }
void CX86Ops::Call_Indirect(void * FunctAddress, const char * FunctName) #ifdef _MSC_VER
void CX86Ops::CallThis(uint32_t ThisPtr, uint32_t FunctPtr, char * FunctName, uint32_t /*StackSize*/)
{ {
CodeLog(" call [%s]", FunctName); MoveConstToX86reg(ThisPtr, CX86Ops::x86_ECX);
AddCode16(0x15FF); CallFunc(FunctPtr, FunctName);
AddCode32((uint32_t)FunctAddress);
} }
#else
void CX86Ops::CallThis(uint32_t ThisPtr, uint32_t FunctPtr, char * FunctName, uint32_t StackSize)
{
m_Assembler.PushImm32(ThisPtr);
CallFunc(FunctPtr, FunctName);
m_Assembler.AddConstToX86Reg(CX86Ops::x86_ESP, StackSize);
}
#endif
void CX86Ops::CompConstToVariable(uint32_t Const, void * Variable, const char * VariableName) void CX86Ops::CompConstToVariable(uint32_t Const, void * Variable, const char * VariableName)
{ {
@ -4309,7 +4317,7 @@ void CX86Ops::SetJump8(uint8_t * Loc, uint8_t * JumpLoc)
*Loc = (uint8_t)diffrence; *Loc = (uint8_t)diffrence;
} }
void * CX86Ops::GetAddressOf(int value, ...) uint32_t CX86Ops::GetAddressOf(int value, ...)
{ {
void * Address; void * Address;
@ -4318,7 +4326,7 @@ void * CX86Ops::GetAddressOf(int value, ...)
Address = va_arg(ap, void *); Address = va_arg(ap, void *);
va_end(ap); va_end(ap);
return Address; return (uint32_t)Address;
} }
void CX86Ops::AddCode8(uint8_t value) void CX86Ops::AddCode8(uint8_t value)

View File

@ -75,8 +75,8 @@ public:
void AndX86RegToX86Reg(x86Reg Destination, x86Reg Source); void AndX86RegToX86Reg(x86Reg Destination, x86Reg Source);
void X86HardBreakPoint(); void X86HardBreakPoint();
void X86BreakPoint(const char * FileName, int32_t LineNumber); void X86BreakPoint(const char * FileName, int32_t LineNumber);
void Call_Direct(void * FunctAddress, const char * FunctName); void CallFunc(uint32_t FunctPtr, const char * FunctName);
void Call_Indirect(void * FunctAddress, const char * FunctName); void CallThis(uint32_t ThisPtr, uint32_t FunctPtr, char * FunctName, uint32_t StackSize);
void CompConstToVariable(uint32_t Const, void * Variable, const char * VariableName); void CompConstToVariable(uint32_t Const, void * Variable, const char * VariableName);
void CompConstToX86reg(x86Reg Reg, uint32_t Const); void CompConstToX86reg(x86Reg Reg, uint32_t Const);
void CompConstToX86regPointer(x86Reg Reg, uint32_t Const); void CompConstToX86regPointer(x86Reg Reg, uint32_t Const);
@ -287,7 +287,7 @@ public:
static bool Is8BitReg(x86Reg Reg); static bool Is8BitReg(x86Reg Reg);
static uint8_t CalcMultiplyCode(Multipler Multiply); static uint8_t CalcMultiplyCode(Multipler Multiply);
static void * GetAddressOf(int32_t value, ...); static uint32_t GetAddressOf(int32_t value, ...);
void SetJump32(uint32_t * Loc, uint32_t * JumpLoc); void SetJump32(uint32_t * Loc, uint32_t * JumpLoc);
void SetJump8(uint8_t * Loc, uint8_t * JumpLoc); void SetJump8(uint8_t * Loc, uint8_t * JumpLoc);