rpcsx/rpcs3/Emu/System.h

209 lines
4.7 KiB
C
Raw Normal View History

#pragma once
2014-09-13 22:40:12 +02:00
#include "Loader/Loader.h"
2014-07-10 22:54:12 +02:00
enum Status
{
Running,
Paused,
Stopped,
Ready,
};
2014-08-26 01:55:37 +02:00
class CPUThreadManager;
class PadManager;
class KeyboardManager;
class MouseManager;
class ID_manager;
2014-08-26 01:55:37 +02:00
class GSManager;
class AudioManager;
2014-09-11 21:18:19 +02:00
class CallbackManager;
2014-08-26 01:55:37 +02:00
class CPUThread;
class EventManager;
class ModuleManager;
2014-08-26 01:55:37 +02:00
struct VFS;
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;
u32 m_primary_prio = 0x50;
public:
EmuInfo()
{
}
};
class Emulator
{
enum Mode
{
DisAsm,
InterpreterDisAsm,
Interpreter,
};
volatile uint m_status;
uint m_mode;
u32 m_rsx_callback;
u32 m_cpu_thr_stop;
std::vector<u64> m_break_points;
std::vector<u64> m_marked_points;
2015-03-04 05:42:04 +01:00
std::mutex m_core_mutex;
2014-08-28 18:29:05 +02:00
2014-08-26 01:55:37 +02:00
CPUThreadManager* m_thread_manager;
PadManager* m_pad_manager;
KeyboardManager* m_keyboard_manager;
MouseManager* m_mouse_manager;
ID_manager* m_id_manager;
2014-08-26 01:55:37 +02:00
GSManager* m_gs_manager;
AudioManager* m_audio_manager;
CallbackManager* m_callback_manager;
EventManager* m_event_manager;
ModuleManager* m_module_manager;
VFS* m_vfs;
EmuInfo m_info;
loader::loader m_loader;
public:
std::string m_path;
std::string m_elf_path;
2014-11-29 14:16:53 +01:00
std::string m_emu_path;
std::string m_title_id;
std::string m_title;
Emulator();
2014-08-26 01:55:37 +02:00
~Emulator();
void Init();
void SetPath(const std::string& path, const std::string& elf_path = "");
void SetTitleID(const std::string& id);
void SetTitle(const std::string& title);
std::string GetPath() const
{
return m_elf_path;
}
2014-11-29 14:16:53 +01:00
std::string GetEmulatorPath() const
{
return m_emu_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;
}
2014-11-29 14:16:53 +01:00
void SetEmulatorPath(const std::string& path)
{
m_emu_path = path;
}
2015-03-04 05:42:04 +01:00
std::mutex& GetCoreMutex() { return m_core_mutex; }
2014-08-28 18:29:05 +02:00
CPUThreadManager& GetCPU() { return *m_thread_manager; }
2014-08-26 01:55:37 +02:00
PadManager& GetPadManager() { return *m_pad_manager; }
KeyboardManager& GetKeyboardManager() { return *m_keyboard_manager; }
MouseManager& GetMouseManager() { return *m_mouse_manager; }
ID_manager& GetIdManager() { return *m_id_manager; }
2014-08-26 01:55:37 +02:00
GSManager& GetGSManager() { return *m_gs_manager; }
AudioManager& GetAudioManager() { return *m_audio_manager; }
CallbackManager& GetCallbackManager() { return *m_callback_manager; }
VFS& GetVFS() { return *m_vfs; }
std::vector<u64>& GetBreakPoints() { return m_break_points; }
std::vector<u64>& GetMarkedPoints() { return m_marked_points; }
2014-04-04 15:25:38 +02:00
EventManager& GetEventManager() { return *m_event_manager; }
ModuleManager& GetModuleManager() { return *m_module_manager; }
void ResetInfo()
{
m_info.~EmuInfo();
new (&m_info) EmuInfo();
}
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;
}
void SetParams(u32 sdk_ver, u32 malloc_pagesz, u32 stacksz, u32 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 SetRSXCallback(u32 addr)
{
m_rsx_callback = addr;
}
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; }
u32 GetPrimaryPrio() { return m_info.m_primary_prio; }
u32 GetRSXCallback() const { return m_rsx_callback; }
u32 GetCPUThreadStop() const { return m_cpu_thr_stop; }
void CheckStatus();
2014-12-26 17:16:57 +01:00
bool BootGame(const std::string& path, bool direct = false);
void Load();
void Run();
void Pause();
void Resume();
void Stop();
2013-11-27 20:16:19 +01:00
void SavePoints(const std::string& path);
bool LoadPoints(const std::string& path);
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-04-13 15:32:09 +02:00
using lv2_lock_type = std::unique_lock<std::mutex>;
#define LV2_LOCK lv2_lock_type lv2_lock(Emu.GetCoreMutex())
#define CHECK_LV2_LOCK(x) assert((x).owns_lock() && (x).mutex() == &Emu.GetCoreMutex())
2014-08-28 18:29:05 +02:00
extern Emulator Emu;
2014-08-24 19:42:19 +02:00
typedef void(*CallAfterCbType)(std::function<void()> func);
void CallAfter(std::function<void()> func);
void SetCallAfterCallback(CallAfterCbType cb);