2012-11-15 00:39:56 +01:00
|
|
|
#pragma once
|
|
|
|
|
#include "Loader/Loader.h"
|
2014-02-23 17:52:52 +01:00
|
|
|
|
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 IdManager;
|
|
|
|
|
class GSManager;
|
|
|
|
|
class AudioManager;
|
2014-09-11 21:18:19 +02:00
|
|
|
class CallbackManager;
|
2014-08-26 01:55:37 +02:00
|
|
|
class CPUThread;
|
2014-02-23 17:52:52 +01:00
|
|
|
class EventManager;
|
2014-05-02 08:30:32 +02:00
|
|
|
class ModuleManager;
|
|
|
|
|
class StaticFuncManager;
|
2014-08-26 01:55:37 +02:00
|
|
|
struct VFS;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
struct EmuInfo
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
u64 tls_addr;
|
|
|
|
|
u64 tls_filesz;
|
|
|
|
|
u64 tls_memsz;
|
|
|
|
|
|
|
|
|
|
sys_process_param_info proc_param;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
EmuInfo() { Reset(); }
|
|
|
|
|
|
|
|
|
|
sys_process_param_info& GetProcParam() { return proc_param; }
|
|
|
|
|
|
|
|
|
|
void Reset()
|
|
|
|
|
{
|
|
|
|
|
SetTLSData(0, 0, 0);
|
|
|
|
|
memset(&proc_param, 0, sizeof(sys_process_param_info));
|
|
|
|
|
|
|
|
|
|
proc_param.malloc_pagesize = 0x100000;
|
|
|
|
|
proc_param.sdk_version = 0x360001;
|
|
|
|
|
//TODO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SetTLSData(const u64 addr, const u64 filesz, const u64 memsz)
|
|
|
|
|
{
|
|
|
|
|
tls_addr = addr;
|
|
|
|
|
tls_filesz = filesz;
|
|
|
|
|
tls_memsz = memsz;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u64 GetTLSAddr() const { return tls_addr; }
|
|
|
|
|
u64 GetTLSFilesz() const { return tls_filesz; }
|
|
|
|
|
u64 GetTLSMemsz() const { return tls_memsz; }
|
|
|
|
|
};
|
|
|
|
|
|
2013-07-06 01:49:38 +02:00
|
|
|
class ModuleInitializer
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
ModuleInitializer();
|
|
|
|
|
|
|
|
|
|
virtual void Init() = 0;
|
|
|
|
|
};
|
|
|
|
|
|
2012-11-15 00:39:56 +01:00
|
|
|
class Emulator
|
|
|
|
|
{
|
|
|
|
|
enum Mode
|
|
|
|
|
{
|
|
|
|
|
DisAsm,
|
|
|
|
|
InterpreterDisAsm,
|
|
|
|
|
Interpreter,
|
|
|
|
|
};
|
2013-12-27 12:35:08 +01:00
|
|
|
|
|
|
|
|
volatile uint m_status;
|
2012-11-15 00:39:56 +01:00
|
|
|
uint m_mode;
|
|
|
|
|
|
|
|
|
|
u32 m_rsx_callback;
|
2013-06-30 10:46:29 +02:00
|
|
|
u32 m_ppu_thr_exit;
|
2014-04-14 10:55:43 +02:00
|
|
|
std::vector<std::unique_ptr<ModuleInitializer>> m_modules_init;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-04-10 00:54:32 +02:00
|
|
|
std::vector<u64> m_break_points;
|
|
|
|
|
std::vector<u64> m_marked_points;
|
2013-07-03 18:17:16 +02:00
|
|
|
|
2014-08-28 18:29:05 +02:00
|
|
|
std::recursive_mutex m_core_mutex;
|
|
|
|
|
|
2014-08-26 01:55:37 +02:00
|
|
|
CPUThreadManager* m_thread_manager;
|
|
|
|
|
PadManager* m_pad_manager;
|
|
|
|
|
KeyboardManager* m_keyboard_manager;
|
|
|
|
|
MouseManager* m_mouse_manager;
|
|
|
|
|
IdManager* m_id_manager;
|
|
|
|
|
GSManager* m_gs_manager;
|
|
|
|
|
AudioManager* m_audio_manager;
|
|
|
|
|
CallbackManager* m_callback_manager;
|
|
|
|
|
EventManager* m_event_manager;
|
|
|
|
|
StaticFuncManager* m_sfunc_manager;
|
|
|
|
|
ModuleManager* m_module_manager;
|
|
|
|
|
VFS* m_vfs;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
EmuInfo m_info;
|
|
|
|
|
|
|
|
|
|
public:
|
2014-04-01 02:33:55 +02:00
|
|
|
std::string m_path;
|
|
|
|
|
std::string m_elf_path;
|
|
|
|
|
std::string m_title_id;
|
2014-08-15 14:50:59 +02:00
|
|
|
u32 m_ppu_thr_stop;
|
2014-08-09 18:04:53 +02:00
|
|
|
s32 m_sdk_version;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
Emulator();
|
2014-08-26 01:55:37 +02:00
|
|
|
~Emulator();
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
void Init();
|
2014-04-01 02:33:55 +02:00
|
|
|
void SetPath(const std::string& path, const std::string& elf_path = "");
|
|
|
|
|
void SetTitleID(const std::string& id);
|
2013-09-24 23:11:29 +02:00
|
|
|
|
2014-08-28 18:29:05 +02:00
|
|
|
std::recursive_mutex& GetCoreMutex() { return m_core_mutex; }
|
|
|
|
|
|
2014-05-02 08:30:32 +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; }
|
|
|
|
|
IdManager& GetIdManager() { return *m_id_manager; }
|
|
|
|
|
GSManager& GetGSManager() { return *m_gs_manager; }
|
|
|
|
|
AudioManager& GetAudioManager() { return *m_audio_manager; }
|
|
|
|
|
CallbackManager& GetCallbackManager() { return *m_callback_manager; }
|
|
|
|
|
VFS& GetVFS() { return *m_vfs; }
|
2014-04-10 00:54:32 +02:00
|
|
|
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; }
|
2014-05-02 08:30:32 +02:00
|
|
|
StaticFuncManager& GetSFuncManager() { return *m_sfunc_manager; }
|
|
|
|
|
ModuleManager& GetModuleManager() { return *m_module_manager; }
|
|
|
|
|
|
2014-04-14 10:55:43 +02:00
|
|
|
void AddModuleInit(std::unique_ptr<ModuleInitializer> m)
|
2013-07-06 01:49:38 +02:00
|
|
|
{
|
2014-04-14 10:55:43 +02:00
|
|
|
m_modules_init.push_back(std::move(m));
|
2013-07-06 01:49:38 +02:00
|
|
|
}
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
void SetTLSData(const u64 addr, const u64 filesz, const u64 memsz)
|
|
|
|
|
{
|
|
|
|
|
m_info.SetTLSData(addr, filesz, memsz);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EmuInfo& GetInfo() { return m_info; }
|
|
|
|
|
|
|
|
|
|
u64 GetTLSAddr() const { return m_info.GetTLSAddr(); }
|
|
|
|
|
u64 GetTLSFilesz() const { return m_info.GetTLSFilesz(); }
|
|
|
|
|
u64 GetTLSMemsz() const { return m_info.GetTLSMemsz(); }
|
|
|
|
|
|
|
|
|
|
u32 GetMallocPageSize() { return m_info.GetProcParam().malloc_pagesize; }
|
|
|
|
|
|
|
|
|
|
u32 GetRSXCallback() const { return m_rsx_callback; }
|
2013-06-30 10:46:29 +02:00
|
|
|
u32 GetPPUThreadExit() const { return m_ppu_thr_exit; }
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
void CheckStatus();
|
2013-12-08 17:54:45 +01:00
|
|
|
bool BootGame(const std::string& path);
|
|
|
|
|
|
2013-06-30 10:46:29 +02:00
|
|
|
void Load();
|
|
|
|
|
void Run();
|
|
|
|
|
void Pause();
|
|
|
|
|
void Resume();
|
|
|
|
|
void Stop();
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2013-11-27 20:16:19 +01:00
|
|
|
void SavePoints(const std::string& path);
|
|
|
|
|
void LoadPoints(const std::string& path);
|
2013-07-03 18:17:16 +02:00
|
|
|
|
2014-04-04 15:25:38 +02:00
|
|
|
__forceinline bool IsRunning() const { return m_status == Running; }
|
|
|
|
|
__forceinline bool IsPaused() const { return m_status == Paused; }
|
|
|
|
|
__forceinline bool IsStopped() const { return m_status == Stopped; }
|
|
|
|
|
__forceinline bool IsReady() const { return m_status == Ready; }
|
2012-11-15 00:39:56 +01:00
|
|
|
};
|
|
|
|
|
|
2014-09-05 01:23:36 +02:00
|
|
|
#define LV2_LOCK(x) std::lock_guard<std::recursive_mutex> core_lock##x(Emu.GetCoreMutex())
|
2014-08-28 18:29:05 +02:00
|
|
|
|
2014-04-10 00:54:32 +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);
|