Play-/Source/PS2VM.h

208 lines
5.2 KiB
C
Raw Normal View History

#pragma once
#include <thread>
#include <future>
2019-10-16 20:51:11 -04:00
#include "filesystem_def.h"
#include "Types.h"
#include "MIPS.h"
#include "MailBox.h"
#include "PadHandler.h"
#include "ScreenPositionListener.h"
#include "OpticalMedia.h"
#include "VirtualMachine.h"
#include "ee/Ee_SubSystem.h"
#include "iop/Iop_SubSystem.h"
2014-10-20 22:34:44 -04:00
#include "../tools/PsfPlayer/Source/SoundHandler.h"
#include "FrameLimiter.h"
#include "Profiler.h"
class CPS2VM : public CVirtualMachine
{
public:
struct CPU_UTILISATION_INFO
{
int32 eeTotalTicks = 0;
int32 eeIdleTicks = 0;
int32 iopTotalTicks = 0;
int32 iopIdleTicks = 0;
};
2022-10-03 18:46:38 -04:00
typedef std::unique_ptr<COpticalMedia> OpticalMediaPtr;
typedef std::unique_ptr<Ee::CSubSystem> EeSubSystemPtr;
typedef std::unique_ptr<Iop::CSubSystem> IopSubSystemPtr;
typedef Framework::CSignal<void()> NewFrameEvent;
typedef std::function<void(CPS2VM*)> ExecutableReloadedHandler;
2018-04-30 21:01:23 +01:00
CPS2VM();
2018-06-22 13:26:49 -04:00
virtual ~CPS2VM() = default;
2018-04-30 21:01:23 +01:00
void Initialize();
void Destroy();
2018-04-30 21:01:23 +01:00
void StepEe();
void StepIop();
void StepVu0();
void StepVu1();
2018-04-30 21:01:23 +01:00
void Resume() override;
void Pause() override;
2020-12-24 13:36:40 +00:00
void PauseAsync();
void Reset(uint32 = PS2::EE_BASE_RAM_SIZE, uint32 = PS2::IOP_BASE_RAM_SIZE);
2018-04-30 21:01:23 +01:00
STATUS GetStatus() const override;
2018-04-30 21:01:23 +01:00
void CreateGSHandler(const CGSHandler::FactoryFunction&);
CGSHandler* GetGSHandler();
void DestroyGSHandler();
2018-04-30 21:01:23 +01:00
void CreatePadHandler(const CPadHandler::FactoryFunction&);
CPadHandler* GetPadHandler();
void DestroyPadHandler();
2018-04-30 21:01:23 +01:00
void CreateSoundHandler(const CSoundHandler::FactoryFunction&);
CSoundHandler* GetSoundHandler();
void ReloadSpuBlockCount();
2023-06-21 12:42:28 -04:00
void DestroySoundHandler();
void CDROM0_SyncPath();
void CDROM0_Reset();
void SetEeFrequencyScale(uint32, uint32);
2021-02-24 11:55:09 -05:00
void ReloadFrameRateLimit();
2019-10-16 20:51:11 -04:00
static fs::path GetStateDirectoryPath();
fs::path GenerateStatePath(unsigned int) const;
2019-10-16 20:51:11 -04:00
std::future<bool> SaveState(const fs::path&);
std::future<bool> LoadState(const fs::path&);
2018-04-30 21:01:23 +01:00
CPU_UTILISATION_INFO GetCpuUtilisationInfo() const;
#ifdef DEBUGGER_INCLUDED
fs::path MakeDebugTagsPackagePath(const char*);
2018-04-30 21:01:23 +01:00
void LoadDebugTags(const char*);
void SaveDebugTags(const char*);
#endif
2023-03-19 22:24:29 -04:00
void ReportGunPosition(float, float);
bool HasGunListener() const;
void SetGunListener(CScreenPositionListener*);
2023-03-19 22:24:29 -04:00
2024-02-15 15:36:23 +08:00
void ReportTouchPosition(float, float);
bool HasTouchListener() const;
void SetTouchListener(CScreenPositionListener*);
void ReleaseScreenPosition();
2024-02-15 15:36:23 +08:00
2022-10-03 18:46:38 -04:00
OpticalMediaPtr m_cdrom0;
CPadHandler* m_pad = nullptr;
2018-04-30 21:01:23 +01:00
EeSubSystemPtr m_ee;
IopSubSystemPtr m_iop;
NewFrameEvent OnNewFrame;
2022-12-20 15:39:16 -05:00
ExecutableReloadedHandler BeforeExecutableReloaded;
ExecutableReloadedHandler AfterExecutableReloaded;
2022-12-20 15:39:16 -05:00
2021-11-27 10:19:57 -05:00
protected:
virtual void CreateVM();
void ResumeImpl();
2021-11-27 10:19:57 -05:00
CMailBox m_mailBox;
private:
2023-06-21 12:42:28 -04:00
void ValidateThreadContext();
2018-04-30 21:01:23 +01:00
void ResetVM();
void DestroyVM();
2019-10-16 20:51:11 -04:00
bool SaveVMState(const fs::path&);
bool LoadVMState(const fs::path&);
void SaveVmTimingState(Framework::CZipArchiveWriter&);
void LoadVmTimingState(Framework::CZipArchiveReader&);
2018-04-30 21:01:23 +01:00
void ReloadExecutable(const char*, const CPS2OS::ArgumentList&);
2021-02-24 16:04:10 -05:00
void OnCrtModeChange();
2018-04-30 21:01:23 +01:00
void PauseImpl();
void DestroyImpl();
2018-04-30 21:01:23 +01:00
void CreateGsHandlerImpl(const CGSHandler::FactoryFunction&);
void DestroyGsHandlerImpl();
2018-04-30 21:01:23 +01:00
void CreatePadHandlerImpl(const CPadHandler::FactoryFunction&);
void DestroyPadHandlerImpl();
2018-04-30 21:01:23 +01:00
void CreateSoundHandlerImpl(const CSoundHandler::FactoryFunction&);
void DestroySoundHandlerImpl();
2023-06-21 12:42:28 -04:00
void ReloadSpuBlockCountImpl();
2018-04-30 21:01:23 +01:00
void UpdateEe();
void UpdateIop();
void UpdateSpu();
2018-04-30 21:01:23 +01:00
void SetIopOpticalMedia(COpticalMedia*);
2018-04-30 21:01:23 +01:00
void RegisterModulesInPadHandler();
2018-04-30 21:01:23 +01:00
void EmuThread();
2018-04-30 21:01:23 +01:00
std::thread m_thread;
2023-05-02 08:56:25 -04:00
STATUS m_nStatus = PAUSED;
bool m_nEnd = false;
uint32 m_eeFreqScaleNumerator = 1;
uint32 m_eeFreqScaleDenominator = 1;
uint32 m_eeRamSize = PS2::EE_BASE_RAM_SIZE;
uint32 m_iopRamSize = PS2::IOP_BASE_RAM_SIZE;
uint32 m_hblankTicksTotal = 0;
uint32 m_onScreenTicksTotal = 0;
uint32 m_vblankTicksTotal = 0;
int m_hblankTicks = 0;
2018-04-30 21:01:23 +01:00
int m_vblankTicks = 0;
2023-05-02 08:56:25 -04:00
bool m_inVblank = false;
int64 m_spuUpdateTicks = 0;
2023-07-09 11:13:53 -04:00
int64 m_spuUpdateTicksTotal = 0;
2018-04-30 21:01:23 +01:00
int m_eeExecutionTicks = 0;
int m_iopExecutionTicks = 0;
static const int m_eeTickStep = 4800;
int m_iopTickStep = 0;
CFrameLimiter m_frameLimiter;
2018-04-30 21:01:23 +01:00
CPU_UTILISATION_INFO m_cpuUtilisation;
2023-05-02 08:56:25 -04:00
bool m_singleStepEe = false;
bool m_singleStepIop = false;
bool m_singleStepVu0 = false;
bool m_singleStepVu1 = false;
2018-04-30 21:01:23 +01:00
2018-04-16 09:14:24 -04:00
//SPU update parameters
2014-10-20 22:34:44 -04:00
enum
{
2018-04-16 09:14:24 -04:00
DST_SAMPLE_RATE = 44100,
SAMPLES_PER_UPDATE = 45, //44100 / 45 -> 980 SPU updates per second
SPU_UPDATE_TICKS_PRECISION = 32,
BLOCK_SIZE = SAMPLES_PER_UPDATE * 2,
2023-06-21 12:42:28 -04:00
MAX_BLOCK_COUNT = 400,
2014-10-20 22:34:44 -04:00
};
2023-06-21 12:42:28 -04:00
int16 m_samples[BLOCK_SIZE * MAX_BLOCK_COUNT];
2018-04-30 21:01:23 +01:00
int m_currentSpuBlock = 0;
2023-06-21 12:42:28 -04:00
int m_spuBlockCount = 0;
2018-04-30 21:01:23 +01:00
CSoundHandler* m_soundHandler = nullptr;
2014-10-20 22:34:44 -04:00
CScreenPositionListener* m_gunListener = nullptr;
CScreenPositionListener* m_touchListener = nullptr;
2023-05-30 21:00:01 -04:00
2018-04-30 21:01:23 +01:00
CProfiler::ZoneHandle m_eeProfilerZone = 0;
CProfiler::ZoneHandle m_iopProfilerZone = 0;
CProfiler::ZoneHandle m_spuProfilerZone = 0;
CProfiler::ZoneHandle m_gsSyncProfilerZone = 0;
CProfiler::ZoneHandle m_otherProfilerZone = 0;
2019-06-20 00:40:28 +01:00
CPS2OS::RequestLoadExecutableEvent::Connection m_OnRequestLoadExecutableConnection;
2021-02-24 16:04:10 -05:00
Framework::CSignal<void()>::Connection m_OnCrtModeChangeConnection;
};