add events.onexecvalue

This commit is contained in:
shygoo 2018-11-21 02:57:50 -06:00
parent 4c5f5c4eab
commit 9f4323c06b
7 changed files with 670 additions and 608 deletions

File diff suppressed because it is too large Load Diff

View File

@ -391,6 +391,7 @@ void CDebuggerUI::CPUStepStarted()
uint32_t JumpToLocation = R4300iOp::m_JumpToLocation; uint32_t JumpToLocation = R4300iOp::m_JumpToLocation;
m_ScriptSystem->HookCPUExec()->InvokeByParamInRange(PROGRAM_COUNTER); m_ScriptSystem->HookCPUExec()->InvokeByParamInRange(PROGRAM_COUNTER);
m_ScriptSystem->HookCPUExecValue()->InvokeByParamInRangeWithMaskedValue(PROGRAM_COUNTER, R4300iOp::m_Opcode.Hex);
// Memory breakpoints // Memory breakpoints

View File

@ -4,7 +4,8 @@
#include "ScriptInstance.h" #include "ScriptInstance.h"
#include "ScriptSystem.h" #include "ScriptSystem.h"
int CScriptHook::Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t param, uint32_t param2, bool bOnce) int CScriptHook::Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t param, uint32_t param2,
uint32_t param3, uint32_t param4, bool bOnce)
{ {
JSCALLBACK jsCallback; JSCALLBACK jsCallback;
jsCallback.scriptInstance = scriptInstance; jsCallback.scriptInstance = scriptInstance;
@ -12,6 +13,8 @@ int CScriptHook::Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t pa
jsCallback.callbackId = m_ScriptSystem->GetNextCallbackId(); jsCallback.callbackId = m_ScriptSystem->GetNextCallbackId();
jsCallback.param = param; jsCallback.param = param;
jsCallback.param2 = param2; jsCallback.param2 = param2;
jsCallback.param3 = param3;
jsCallback.param4 = param4;
jsCallback.bOnce = bOnce; jsCallback.bOnce = bOnce;
m_Callbacks.push_back(jsCallback); m_Callbacks.push_back(jsCallback);
return jsCallback.callbackId; return jsCallback.callbackId;
@ -56,6 +59,22 @@ void CScriptHook::InvokeByParamInRange(uint32_t param)
} }
} }
void CScriptHook::InvokeByParamInRangeWithMaskedValue(uint32_t param, uint32_t value)
{
int nCallbacks = m_Callbacks.size();
for (int i = 0; i < nCallbacks; i++)
{
if (param == m_Callbacks[i].param || (param >= m_Callbacks[i].param && param < m_Callbacks[i].param2))
{
if ((m_Callbacks[i].param3 & m_Callbacks[i].param4) == (value & m_Callbacks[i].param4))
{
m_Callbacks[i].scriptInstance->Invoke(m_Callbacks[i].heapptr, param);
return;
}
}
}
}
void CScriptHook::InvokeAll() void CScriptHook::InvokeAll()
{ {
int nCallbacks = m_Callbacks.size(); int nCallbacks = m_Callbacks.size();

View File

@ -13,6 +13,8 @@ private:
void* heapptr; void* heapptr;
uint32_t param; uint32_t param;
uint32_t param2; uint32_t param2;
uint32_t param3;
uint32_t param4;
int callbackId; int callbackId;
bool bOnce; bool bOnce;
} JSCALLBACK; } JSCALLBACK;
@ -22,18 +24,21 @@ private:
//int m_NextCallbackId; //int m_NextCallbackId;
vector<JSCALLBACK> m_Callbacks; vector<JSCALLBACK> m_Callbacks;
public: public:
CScriptHook(CScriptSystem* scriptSystem); CScriptHook(CScriptSystem* scriptSystem);
~CScriptHook(); ~CScriptHook();
int Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t param = 0, uint32_t param2 = 0, bool bOnce = false); int Add(CScriptInstance* scriptInstance, void* heapptr, uint32_t param = 0, uint32_t param2 = 0,
uint32_t param3 = 0, uint32_t param4 = 0, bool bOnce = false);
void InvokeAll(); void InvokeAll();
void InvokeById(int callbackId); void InvokeById(int callbackId);
void InvokeByParam(uint32_t param); void InvokeByParam(uint32_t param);
/* invoke if param >= cb.param && param < cb.param2*/ /* invoke if param >= cb.param && param < cb.param2*/
void InvokeByParamInRange(uint32_t param); void InvokeByParamInRange(uint32_t param);
/* invoke if param >= cb.param && param < cb.param2 && (value & cb.param4) == cb.param3 */
void InvokeByParamInRangeWithMaskedValue(uint32_t param, uint32_t value);
void RemoveById(int callbackId); void RemoveById(int callbackId);
void RemoveByParam(uint32_t tag); void RemoveByParam(uint32_t tag);
void RemoveByInstance(CScriptInstance* scriptInstance); void RemoveByInstance(CScriptInstance* scriptInstance);
bool HasContext(CScriptInstance* scriptInstance); bool HasContext(CScriptInstance* scriptInstance);
//bool HasTag(uint32_t tag); //bool HasTag(uint32_t tag);
}; };

View File

@ -741,6 +741,8 @@ duk_ret_t CScriptInstance::js_AddCallback(duk_context* ctx)
void* heapptr; void* heapptr;
uint32_t param = 0; uint32_t param = 0;
uint32_t param2 = 0; uint32_t param2 = 0;
uint32_t param3 = 0;
uint32_t param4 = 0;
bool bOnce = false; bool bOnce = false;
int argc = duk_get_top(ctx); int argc = duk_get_top(ctx);
@ -748,25 +750,18 @@ duk_ret_t CScriptInstance::js_AddCallback(duk_context* ctx)
hookId = duk_get_string(ctx, 0); hookId = duk_get_string(ctx, 0);
heapptr = duk_get_heapptr(ctx, 1); heapptr = duk_get_heapptr(ctx, 1);
if (argc >= 3) if (argc >= 3) param = duk_get_uint(ctx, 2);
{ if (argc >= 4) param2 = duk_get_uint(ctx, 3);
param = duk_get_uint(ctx, 2); if (argc >= 5) param3 = duk_get_uint(ctx, 4);
if (argc > 3) if (argc >= 6) param4 = duk_get_uint(ctx, 5);
{ if (argc >= 7) bOnce = (duk_get_boolean(ctx, 6) != 0);
param2 = duk_get_uint(ctx, 3);
if (argc > 4)
{
bOnce = duk_get_boolean(ctx, 4) != 0;
}
}
}
int callbackId = -1; int callbackId = -1;
CScriptHook* hook = _this->m_ScriptSystem->GetHook(hookId); CScriptHook* hook = _this->m_ScriptSystem->GetHook(hookId);
if (hook != NULL) if (hook != NULL)
{ {
callbackId = hook->Add(_this, heapptr, param, param2, bOnce); callbackId = hook->Add(_this, heapptr, param, param2, param3, param4, bOnce);
} }
duk_pop_n(ctx, argc); duk_pop_n(ctx, argc);

View File

@ -25,6 +25,7 @@ CScriptSystem::CScriptSystem(CDebuggerUI* debugger)
m_Debugger = debugger; m_Debugger = debugger;
m_HookCPUExec = new CScriptHook(this); m_HookCPUExec = new CScriptHook(this);
m_HookCPUExecValue = new CScriptHook(this);
m_HookCPURead = new CScriptHook(this); m_HookCPURead = new CScriptHook(this);
m_HookCPUWrite = new CScriptHook(this); m_HookCPUWrite = new CScriptHook(this);
m_HookFrameDrawn = new CScriptHook(this); m_HookFrameDrawn = new CScriptHook(this);
@ -33,6 +34,7 @@ CScriptSystem::CScriptSystem(CDebuggerUI* debugger)
RegisterHook("read", m_HookCPURead); RegisterHook("read", m_HookCPURead);
RegisterHook("write", m_HookCPUWrite); RegisterHook("write", m_HookCPUWrite);
RegisterHook("draw", m_HookFrameDrawn); RegisterHook("draw", m_HookFrameDrawn);
RegisterHook("execvalue", m_HookCPUExecValue);
HMODULE hInst = GetModuleHandle(NULL); HMODULE hInst = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_JSAPI_TEXT), "TEXT"); HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_JSAPI_TEXT), "TEXT");

View File

@ -54,6 +54,7 @@ private:
CScriptHook* m_HookCPUExec; CScriptHook* m_HookCPUExec;
CScriptHook* m_HookCPURead; CScriptHook* m_HookCPURead;
CScriptHook* m_HookCPUWrite; CScriptHook* m_HookCPUWrite;
CScriptHook* m_HookCPUExecValue;
CScriptHook* m_HookFrameDrawn; CScriptHook* m_HookFrameDrawn;
@ -120,6 +121,11 @@ public:
return m_HookCPUWrite; return m_HookCPUWrite;
} }
CScriptHook* HookCPUExecValue()
{
return m_HookCPUExecValue;
}
CScriptHook* HookFrameDrawn() CScriptHook* HookFrameDrawn()
{ {
return m_HookFrameDrawn; return m_HookFrameDrawn;