#pragma once #include "stdafx.h" #include "DmaController.h" #include "DebugTypes.h" #include "BaseEventManager.h" #include "../Utilities/SimpleLock.h" enum class DebugEventType; struct DebugEventInfo; struct EventViewerDisplayOptions; class Cpu; class Ppu; class Debugger; class DmaController; class MemoryManager; class EventManager final : public IEventManager { private: static constexpr int ScanlineWidth = 1364 / 2; Cpu* _cpu; Ppu* _ppu; MemoryManager* _memoryManager; DmaController* _dmaController; Debugger* _debugger; vector _debugEvents; vector _prevDebugEvents; vector _sentEvents; vector _snapshot; int16_t _snapshotScanline = -1; uint16_t _snapshotCycle = 0; SimpleLock _lock; bool _overscanMode = false; bool _useHighResOutput = false; uint32_t _scanlineCount = 262; uint16_t* _ppuBuffer = nullptr; void DrawEvent(DebugEventInfo& evt, bool drawBackground, uint32_t* buffer, EventViewerDisplayOptions& options); void FilterEvents(EventViewerDisplayOptions& options); public: EventManager(Debugger* debugger, Cpu* cpu, Ppu* ppu, MemoryManager* memoryManager, DmaController* dmaController); ~EventManager(); void AddEvent(DebugEventType type, MemoryOperationInfo& operation, int32_t breakpointId = -1); void AddEvent(DebugEventType type); void GetEvents(DebugEventInfo* eventArray, uint32_t& maxEventCount); uint32_t GetEventCount(EventViewerDisplayOptions options); void ClearFrameEvents(); uint32_t TakeEventSnapshot(EventViewerDisplayOptions options); void GetDisplayBuffer(uint32_t* buffer, uint32_t bufferSize, EventViewerDisplayOptions options); DebugEventInfo GetEvent(uint16_t scanline, uint16_t cycle, EventViewerDisplayOptions& options); };