#pragma once #include "stdafx.h" #include "CartTypes.h" #include "ConsoleLock.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; enum class MemoryOperationType; enum class SnesMemoryType; enum class EventType; enum class ConsoleRegion; class Console : public std::enable_shared_from_this { private: 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 _debugger; shared_ptr _notificationManager; shared_ptr _soundMixer; shared_ptr _videoRenderer; shared_ptr _videoDecoder; shared_ptr _debugHud; shared_ptr _settings; shared_ptr _saveStateManager; shared_ptr _rewindManager; thread::id _emulationThreadId; atomic _lockCounter; SimpleLock _runLock; SimpleLock _debuggerLock; atomic _stopFlag; atomic _paused; ConsoleRegion _region; uint32_t _masterClockRate; double GetFrameDelay(); void UpdateRegion(); void WaitForLock(); void WaitForPauseEnd(); public: ~Console(); void Initialize(); void Release(); void Run(); void Stop(bool sendNotification); void Reset(); void PowerCycle(); void Pause(); void Resume(); bool IsPaused(); bool LoadRom(VirtualFile romFile, VirtualFile patchFile, bool stopRom = true); RomInfo GetRomInfo(); uint32_t GetMasterClockRate(); ConsoleRegion GetRegion(); ConsoleLock AcquireLock(); void Lock(); void Unlock(); void Serialize(ostream &out); void Deserialize(istream &in, uint32_t fileFormatVersion); 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 GetCpu(); shared_ptr GetPpu(); shared_ptr GetSpc(); shared_ptr GetCartridge(); shared_ptr GetMemoryManager(); shared_ptr GetInternalRegisters(); shared_ptr GetControlManager(); shared_ptr GetDmaController(); shared_ptr GetDebugger(bool autoStart = true); void StopDebugger(); thread::id GetEmulationThreadId(); bool IsRunning(); void ProcessCpuRead(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessCpuWrite(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessPpuRead(uint32_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessPpuWrite(uint32_t addr, uint8_t value, SnesMemoryType memoryType); void ProcessSpcRead(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessSpcWrite(uint32_t addr, uint8_t value, MemoryOperationType type); void ProcessWorkRamRead(uint32_t addr, uint8_t value); void ProcessWorkRamWrite(uint32_t addr, uint8_t value); void ProcessPpuCycle(); void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi); void ProcessEvent(EventType type); };