#pragma once #include "stdafx.h" #include "CartTypes.h" #include "DebugTypes.h" #include "Debugger.h" #include "ConsoleLock.h" #include "HistoryViewer.h" #include "../Utilities/Timer.h" #include "../Utilities/VirtualFile.h" #include "../Utilities/SimpleLock.h" class Cpu; class Ppu; class Spc; class BaseCartridge; class MemoryManager; class InternalRegisters; class ControlManager; class DmaController; class Debugger; class DebugHud; class SoundMixer; class VideoRenderer; class VideoDecoder; class NotificationManager; class EmuSettings; class SaveStateManager; class RewindManager; class BatteryManager; class CheatManager; class MovieManager; class SpcHud; class FrameLimiter; class DebugStats; class Msu1; enum class MemoryOperationType; enum class SnesMemoryType; enum class EventType; enum class ConsoleRegion; enum class ConsoleType; class Console : public std::enable_shared_from_this { private: unique_ptr _emuThread; shared_ptr _cpu; shared_ptr _ppu; shared_ptr _spc; shared_ptr _memoryManager; shared_ptr _cart; shared_ptr _internalRegisters; shared_ptr _controlManager; shared_ptr _dmaController; shared_ptr _msu1; shared_ptr _debugger; shared_ptr _notificationManager; shared_ptr _batteryManager; shared_ptr _soundMixer; shared_ptr _videoRenderer; shared_ptr _videoDecoder; shared_ptr _debugHud; shared_ptr _settings; shared_ptr _saveStateManager; shared_ptr _rewindManager; shared_ptr _historyViewer; shared_ptr _cheatManager; shared_ptr _movieManager; shared_ptr _spcHud; thread::id _emulationThreadId; atomic _lockCounter; SimpleLock _runLock; SimpleLock _emulationLock; SimpleLock _debuggerLock; atomic _stopFlag; atomic _paused; atomic _pauseOnNextFrame; atomic _threadPaused; ConsoleRegion _region; ConsoleType _consoleType; uint32_t _masterClockRate; atomic _isRunAheadFrame; bool _frameRunning = false; unique_ptr _stats; unique_ptr _frameLimiter; Timer _lastFrameTimer; double _frameDelay = 0; double GetFrameDelay(); void UpdateRegion(); void WaitForLock(); void WaitForPauseEnd(); void RunFrame(); bool ProcessSystemActions(); void RunFrameWithRunAhead(); public: Console(); ~Console(); void Initialize(); void Release(); void Run(); void RunSingleFrame(); void Stop(bool sendNotification); void ProcessEndOfFrame(); void Reset(); void ReloadRom(bool forPowerCycle); void PowerCycle(); void PauseOnNextFrame(); void Pause(); void Resume(); bool IsPaused(); bool LoadRom(VirtualFile romFile, VirtualFile patchFile, bool stopRom = true, bool forPowerCycle = false); RomInfo GetRomInfo(); uint64_t GetMasterClock(); uint32_t GetMasterClockRate(); ConsoleRegion GetRegion(); ConsoleType GetConsoleType(); ConsoleLock AcquireLock(); void Lock(); void Unlock(); bool IsThreadPaused(); void Serialize(ostream &out, int compressionLevel = 1); void Deserialize(istream &in, uint32_t fileFormatVersion, bool compressed = true); shared_ptr GetSoundMixer(); shared_ptr GetVideoRenderer(); shared_ptr GetVideoDecoder(); shared_ptr GetNotificationManager(); shared_ptr GetSettings(); shared_ptr GetSaveStateManager(); shared_ptr GetRewindManager(); shared_ptr GetDebugHud(); shared_ptr GetBatteryManager(); shared_ptr GetCheatManager(); shared_ptr GetMovieManager(); shared_ptr GetCpu(); shared_ptr GetPpu(); shared_ptr GetSpc(); shared_ptr GetCartridge(); shared_ptr GetMemoryManager(); shared_ptr GetInternalRegisters(); shared_ptr GetControlManager(); shared_ptr GetDmaController(); shared_ptr GetMsu1(); HistoryViewer* GetHistoryViewer(); shared_ptr GetDebugger(bool autoStart = true); void StopDebugger(); bool IsDebugging(); thread::id GetEmulationThreadId(); bool IsRunning(); bool IsRunAheadFrame(); uint32_t GetFrameCount(); double GetFps(); void CopyRewindData(shared_ptr sourceConsole); template __forceinline void ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationType opType) { if(_debugger) { _debugger->ProcessMemoryRead(addr, value, opType); } } template __forceinline void ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationType opType) { if(_debugger) { _debugger->ProcessMemoryWrite(addr, value, opType); } } __forceinline void ProcessPpuRead(uint32_t addr, uint8_t value, SnesMemoryType memoryType) { if(_debugger) { _debugger->ProcessPpuRead(addr, value, memoryType); } } __forceinline void ProcessPpuWrite(uint32_t addr, uint8_t value, SnesMemoryType memoryType) { if(_debugger) { _debugger->ProcessPpuWrite(addr, value, memoryType); } } __forceinline void ProcessWorkRamRead(uint32_t addr, uint8_t value) { if(_debugger) { _debugger->ProcessWorkRamRead(addr, value); } } __forceinline void ProcessWorkRamWrite(uint32_t addr, uint8_t value) { if(_debugger) { _debugger->ProcessWorkRamWrite(addr, value); } } template __forceinline void ProcessPpuCycle() { if(_debugger) { _debugger->ProcessPpuCycle(); } } __forceinline void DebugLog(string log) { if(_debugger) { _debugger->Log(log); } } template void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi); void ProcessEvent(EventType type); void BreakImmediately(BreakSource source); };