#pragma once #include "stdafx.h" #include #include "../Utilities/SimpleLock.h" #include "DebuggerTypes.h" class Debugger; enum class CallbackType { CpuRead = 0, CpuWrite = 1, CpuExec = 2, PpuRead = 3, PpuWrite = 4 }; class ScriptingContext { private: //Must be static to be thread-safe when switching game //UI updates all script windows in a single thread, so this is safe static string _log; std::deque _logRows; SimpleLock _logLock; bool _inStartFrameEvent = false; protected: vector _callbacks[5][0x10000]; vector _eventCallbacks[7]; public: virtual bool LoadScript(string scriptContent, Debugger* debugger) = 0; void Log(string message); const char* GetLog(); virtual void CallMemoryCallback(uint16_t addr, uint8_t &value, CallbackType type) = 0; virtual int InternalCallEventCallback(EventType type) = 0; int CallEventCallback(EventType type); bool CheckInStartFrameEvent(); void RegisterMemoryCallback(CallbackType type, int startAddr, int endAddr, int reference); void UnregisterMemoryCallback(CallbackType type, int startAddr, int endAddr, int reference); void RegisterEventCallback(EventType type, int reference); void UnregisterEventCallback(EventType type, int reference); };