rpcsx/rpcs3/Emu/System.h

189 lines
4.1 KiB
C
Raw Normal View History

#pragma once
2014-09-13 22:40:12 +02:00
2016-04-14 00:59:00 +02:00
#include "VFS.h"
#include "DbgCommand.h"
2015-12-02 10:23:25 +01:00
enum class frame_type;
2015-10-07 18:02:10 +02:00
struct EmuCallbacks
{
std::function<void(std::function<void()>)> call_after;
std::function<void()> process_events;
2016-04-14 00:59:00 +02:00
std::function<void()> exit;
std::function<void(DbgCommand, class cpu_thread*)> send_dbg_command;
std::function<std::shared_ptr<class KeyboardHandlerBase>()> get_kb_handler;
std::function<std::shared_ptr<class MouseHandlerBase>()> get_mouse_handler;
std::function<std::shared_ptr<class PadHandlerBase>()> get_pad_handler;
std::function<std::unique_ptr<class GSFrameBase>(frame_type, int, int)> get_gs_frame;
std::function<std::shared_ptr<class GSRender>()> get_gs_render;
std::function<std::shared_ptr<class AudioThread>()> get_audio;
2015-12-19 12:40:52 +01:00
std::function<std::shared_ptr<class MsgDialogBase>()> get_msg_dialog;
std::function<std::unique_ptr<class SaveDialogBase>()> get_save_dialog;
};
2015-07-01 00:25:52 +02:00
enum Status : u32
2014-07-10 22:54:12 +02:00
{
Running,
Paused,
Stopped,
Ready,
};
2015-08-11 15:26:08 +02:00
// Emulation Stopped exception event
class EmulationStopped {};
2014-09-11 21:18:19 +02:00
class CallbackManager;
struct EmuInfo
{
private:
friend class Emulator;
u32 m_tls_addr = 0;
u32 m_tls_filesz = 0;
u32 m_tls_memsz = 0;
u32 m_sdk_version = 0x360001;
u32 m_malloc_pagesize = 0x100000;
u32 m_primary_stacksize = 0x100000;
2015-07-01 00:25:52 +02:00
s32 m_primary_prio = 0x50;
public:
EmuInfo()
{
}
};
class Emulator final
{
2016-04-14 00:59:00 +02:00
atomic_t<u32> m_status;
2016-04-14 00:59:00 +02:00
EmuCallbacks m_cb;
2016-04-14 00:59:00 +02:00
atomic_t<u64> m_pause_start_time; // set when paused
atomic_t<u64> m_pause_amend_time; // increased when resumed
2016-04-14 00:59:00 +02:00
u32 m_cpu_thr_stop;
2014-08-28 18:29:05 +02:00
2015-07-04 21:23:10 +02:00
std::unique_ptr<CallbackManager> m_callback_manager;
EmuInfo m_info;
std::string m_path;
std::string m_elf_path;
std::string m_title_id;
std::string m_title;
public:
Emulator();
void SetCallbacks(EmuCallbacks&& cb)
{
m_cb = std::move(cb);
}
const auto& GetCallbacks() const
{
return m_cb;
}
2016-04-14 00:59:00 +02:00
void SendDbgCommand(DbgCommand cmd, class cpu_thread* thread = nullptr)
{
if (m_cb.send_dbg_command) m_cb.send_dbg_command(cmd, thread);
}
2016-04-14 00:59:00 +02:00
// Call from the GUI thread
void CallAfter(std::function<void()>&& func) const
{
2016-04-14 00:59:00 +02:00
return m_cb.call_after(std::move(func));
}
/** Set emulator mode to running unconditionnaly.
* Required to execute various part (PPUInterpreter, memory manager...) outside of rpcs3.
*/
void SetTestMode()
{
m_status = Running;
}
void Init();
2016-04-14 00:59:00 +02:00
void SetPath(const std::string& path, const std::string& elf_path = {});
const std::string& GetPath() const
{
return m_elf_path;
}
2015-02-28 15:41:15 +01:00
const std::string& GetTitleID() const
{
return m_title_id;
}
2015-02-28 15:41:15 +01:00
const std::string& GetTitle() const
{
return m_title;
}
2015-07-04 21:23:10 +02:00
u64 GetPauseTime()
{
return m_pause_amend_time;
}
2014-08-28 18:29:05 +02:00
2016-04-14 00:59:00 +02:00
CallbackManager& GetCallbackManager()
{
return *m_callback_manager;
}
void ResetInfo()
{
m_info = {};
}
2015-01-31 17:44:26 +01:00
void SetTLSData(u32 addr, u32 filesz, u32 memsz)
{
m_info.m_tls_addr = addr;
m_info.m_tls_filesz = filesz;
m_info.m_tls_memsz = memsz;
}
2015-07-01 00:25:52 +02:00
void SetParams(u32 sdk_ver, u32 malloc_pagesz, u32 stacksz, s32 prio)
{
m_info.m_sdk_version = sdk_ver;
m_info.m_malloc_pagesize = malloc_pagesz;
m_info.m_primary_stacksize = stacksz;
m_info.m_primary_prio = prio;
}
void SetCPUThreadStop(u32 addr)
{
2014-11-30 13:08:23 +01:00
m_cpu_thr_stop = addr;
}
u32 GetTLSAddr() const { return m_info.m_tls_addr; }
u32 GetTLSFilesz() const { return m_info.m_tls_filesz; }
u32 GetTLSMemsz() const { return m_info.m_tls_memsz; }
u32 GetMallocPageSize() { return m_info.m_malloc_pagesize; }
u32 GetSDKVersion() { return m_info.m_sdk_version; }
u32 GetPrimaryStackSize() { return m_info.m_primary_stacksize; }
2015-07-01 00:25:52 +02:00
s32 GetPrimaryPrio() { return m_info.m_primary_prio; }
u32 GetCPUThreadStop() const { return m_cpu_thr_stop; }
2014-12-26 17:16:57 +01:00
bool BootGame(const std::string& path, bool direct = false);
void Load();
void Run();
2015-09-13 00:37:57 +02:00
bool Pause();
void Resume();
void Stop();
force_inline bool IsRunning() const { return m_status == Running; }
force_inline bool IsPaused() const { return m_status == Paused; }
force_inline bool IsStopped() const { return m_status == Stopped; }
force_inline bool IsReady() const { return m_status == Ready; }
};
2015-07-26 13:21:25 +02:00
extern Emulator Emu;
2015-08-11 15:26:08 +02:00
#define CHECK_EMU_STATUS if (Emu.IsStopped()) throw EmulationStopped{}