mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-22 02:32:36 +01:00
Make buildable with GCC in Linux
* replace GetThreadID with std::this_thread.getId() * name all anonymous structs and unions that contain non-trivially constructable objects * made default constructor for big endian type noexcept to make it work with std::atomic * move instantiated specialized template function members ouside of the class definition to comply with the standard * added default instantiation for template parameter "=nullptr" * used the C++11 standardized thread_local instead of the __declspec(thread) * added transitional definitions to bridge the microsoft specific calls (compare and exchange and aligned alloc) * removed cyclic dependency between Emulator->CPUThreadManager->CPUThread->SMutex->Emulator->... * fixed some instances of indentation by space instead of tabs * surrounded some unused code with an #if 0 block to make sure it doesn't compile
This commit is contained in:
parent
07135570f4
commit
9a30ce5f18
@ -52,9 +52,7 @@ class be_t
|
||||
T m_data;
|
||||
|
||||
public:
|
||||
be_t()
|
||||
{
|
||||
}
|
||||
be_t() noexcept = default;
|
||||
|
||||
be_t(const T& value)
|
||||
{
|
||||
|
@ -1,8 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#if defined(__GNUG__)
|
||||
#include <math.h>
|
||||
#define _fpclass(x) fpclassify(x)
|
||||
#include <cmath>
|
||||
#define _fpclass(x) std::fpclassify(x)
|
||||
#define __forceinline __attribute__((always_inline))
|
||||
#define _byteswap_ushort(x) __builtin_bswap16(x)
|
||||
#define _byteswap_ulong(x) __builtin_bswap32(x)
|
||||
@ -11,4 +11,9 @@
|
||||
#define mkdir(x) mkdir(x, 0777)
|
||||
#define INFINITE 0xFFFFFFFF
|
||||
#define _CRT_ALIGN(x) __attribute__((aligned(x)))
|
||||
#define InterlockedCompareExchange(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val)
|
||||
#define InterlockedCompareExchange64(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val)
|
||||
#define _aligned_malloc(size,alignment) aligned_alloc(alignment,size)
|
||||
#define _aligned_free(pointer) free(pointer)
|
||||
#define DWORD int64_t
|
||||
#endif
|
||||
|
@ -96,7 +96,7 @@ public:
|
||||
m_cur_id = s_first_id;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template<typename T = char>
|
||||
ID_TYPE GetNewID(const std::string& name = "", T* data = nullptr, const u8 attr = 0)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mtx_main);
|
||||
@ -155,4 +155,4 @@ public:
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
@ -95,4 +95,4 @@ public:
|
||||
|
||||
wxDialog::Close(force);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
@ -6,9 +6,9 @@ __forceinline void SM_Sleep()
|
||||
Sleep(1);
|
||||
}
|
||||
|
||||
__forceinline DWORD SM_GetCurrentThreadId()
|
||||
__forceinline std::thread::id SM_GetCurrentThreadId()
|
||||
{
|
||||
return GetCurrentThreadId();
|
||||
return std::this_thread::get_id();
|
||||
}
|
||||
|
||||
__forceinline u32 SM_GetCurrentCPUThreadId()
|
||||
@ -23,4 +23,4 @@ __forceinline u32 SM_GetCurrentCPUThreadId()
|
||||
__forceinline be_t<u32> SM_GetCurrentCPUThreadIdBE()
|
||||
{
|
||||
return SM_GetCurrentCPUThreadId();
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
extern void SM_Sleep();
|
||||
extern DWORD SM_GetCurrentThreadId();
|
||||
extern std::thread::id SM_GetCurrentThreadId();
|
||||
extern u32 SM_GetCurrentCPUThreadId();
|
||||
extern be_t<u32> SM_GetCurrentCPUThreadIdBE();
|
||||
|
||||
@ -22,7 +22,7 @@ template
|
||||
typename T,
|
||||
u32 free_value = 0,
|
||||
u32 dead_value = ~0,
|
||||
void (wait)() = SM_Sleep
|
||||
void (*wait)() = SM_Sleep
|
||||
>
|
||||
class SMutexBase
|
||||
{
|
||||
@ -149,9 +149,9 @@ typedef SMutexBase<u32>
|
||||
typedef SMutexBase<be_t<u32>>
|
||||
SMutexBE;
|
||||
|
||||
typedef SMutexLockerBase<DWORD, SM_GetCurrentThreadId>
|
||||
typedef SMutexLockerBase<std::thread::id, SM_GetCurrentThreadId>
|
||||
SMutexGeneralLocker;
|
||||
typedef SMutexLockerBase<u32, SM_GetCurrentCPUThreadId>
|
||||
SMutexLocker;
|
||||
typedef SMutexLockerBase<be_t<u32>, SM_GetCurrentCPUThreadIdBE>
|
||||
SMutexBELocker;
|
||||
SMutexBELocker;
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "Thread.h"
|
||||
|
||||
__declspec(thread) NamedThreadBase* g_tls_this_thread = nullptr;
|
||||
/*__declspec(thread)*/ thread_local NamedThreadBase* g_tls_this_thread = nullptr;
|
||||
|
||||
NamedThreadBase* GetCurrentNamedThread()
|
||||
{
|
||||
@ -124,7 +124,7 @@ void thread::start(std::function<void()> func)
|
||||
catch(...)
|
||||
{
|
||||
ConLog.Error("Crash :(");
|
||||
terminate();
|
||||
std::terminate();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -142,4 +142,4 @@ void thread::join()
|
||||
bool thread::joinable() const
|
||||
{
|
||||
return m_thr.joinable();
|
||||
}
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ class StepThread : public ThreadBase
|
||||
volatile bool m_exit;
|
||||
|
||||
protected:
|
||||
StepThread(const wxString& name = "Unknown StepThread")
|
||||
StepThread(const std::string& name = "Unknown StepThread")
|
||||
: ThreadBase(true, name)
|
||||
, m_exit(false)
|
||||
{
|
||||
|
@ -3,14 +3,15 @@ cmake_minimum_required(VERSION 2.8)
|
||||
project(rpcs3)
|
||||
|
||||
if (CMAKE_COMPILER_IS_GNUCXX)
|
||||
add_definitions(-std=gnu++11)
|
||||
add_definitions(-D__WXGTK__)
|
||||
#add_definitions(-Wfatal-errors)
|
||||
add_definitions(-w) # TODO: remove me
|
||||
add_definitions(-DwxUSE_UNICODE=0)
|
||||
add_definitions(-fpermissive) # TODO: remove me
|
||||
add_definitions(-std=gnu++11)
|
||||
#add_definitions(-D__WXGTK__)
|
||||
#add_definitions(-Wfatal-errors)
|
||||
add_definitions(-w) # TODO: remove me
|
||||
add_definitions(-fpermissive) # TODO: remove me
|
||||
endif()
|
||||
|
||||
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/../bin")
|
||||
|
||||
add_definitions(-DGL_GLEXT_PROTOTYPES)
|
||||
add_definitions(-DGLX_GLXEXT_PROTOTYPES)
|
||||
|
||||
|
@ -21,7 +21,7 @@ struct reservation_struct
|
||||
|
||||
extern reservation_struct reservation;
|
||||
|
||||
enum CPUThreadType
|
||||
enum CPUThreadType :unsigned char
|
||||
{
|
||||
CPU_THREAD_PPU,
|
||||
CPU_THREAD_SPU,
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include "CPUThread.h"
|
||||
class CPUThread;
|
||||
enum CPUThreadType : unsigned char;
|
||||
|
||||
class CPUThreadManager
|
||||
{
|
||||
@ -24,4 +25,4 @@ public:
|
||||
|
||||
void Exec();
|
||||
void Task();
|
||||
};
|
||||
};
|
||||
|
@ -1,3 +1,4 @@
|
||||
#if 0
|
||||
#include "stdafx.h"
|
||||
#include "PPCThreadManager.h"
|
||||
#include "PPUThread.h"
|
||||
@ -33,7 +34,7 @@ PPCThread& PPCThreadManager::AddThread(PPCThreadType type)
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
new_thread->SetId(Emu.GetIdManager().GetNewID(wxString::Format("%s Thread", name), new_thread));
|
||||
new_thread->SetId(Emu.GetIdManager().GetNewID(wxString::Format("%s Thread", name).ToStdString(), new_thread));
|
||||
|
||||
m_threads.Add(new_thread);
|
||||
wxGetApp().SendDbgCommand(DID_CREATE_THREAD, new_thread);
|
||||
@ -106,3 +107,4 @@ void PPCThreadManager::Exec()
|
||||
m_threads[i].Exec();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -3,9 +3,9 @@
|
||||
|
||||
enum PPCThreadType
|
||||
{
|
||||
PPC_THREAD_PPU,
|
||||
PPC_THREAD_SPU,
|
||||
PPC_THREAD_RAW_SPU
|
||||
PPC_THREAD_PPU,
|
||||
PPC_THREAD_SPU,
|
||||
PPC_THREAD_RAW_SPU
|
||||
};
|
||||
|
||||
class PPCThreadManager
|
||||
@ -17,7 +17,7 @@ class PPCThreadManager
|
||||
std::mutex m_mtx_thread;
|
||||
wxSemaphore m_sem_task;
|
||||
Stack<u32> m_delete_threads;
|
||||
u32 m_raw_spu_num;
|
||||
u32 m_raw_spu_num;
|
||||
|
||||
public:
|
||||
PPCThreadManager();
|
||||
|
@ -97,7 +97,7 @@ private:
|
||||
const int fpc = _fpclass(v);
|
||||
#ifdef __GNUG__
|
||||
if(fpc == FP_SUBNORMAL)
|
||||
return signbit(v) ? -0.0f : 0.0f;
|
||||
return std::signbit(v) ? -0.0f : 0.0f;
|
||||
#else
|
||||
if(fpc & _FPCLASS_ND) return -0.0f;
|
||||
if(fpc & _FPCLASS_PD) return 0.0f;
|
||||
@ -3361,7 +3361,7 @@ private:
|
||||
#ifdef _MSC_VER
|
||||
if(_fpclass(CPU.FPR[frb]) >= _FPCLASS_NZ)
|
||||
#else
|
||||
if(_fpclass(CPU.FPR[frb]) == FP_ZERO || signbit(CPU.FPR[frb]) == 0)
|
||||
if(_fpclass(CPU.FPR[frb]) == FP_ZERO || std::signbit(CPU.FPR[frb]) == 0)
|
||||
#endif
|
||||
{
|
||||
res = static_cast<float>(1.0 / CPU.FPR[frb]);
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "Emu/Cell/PPCThread.h"
|
||||
#include "Emu/SysCalls/SysCalls.h"
|
||||
#include "rpcs3.h"
|
||||
#include <cmath>
|
||||
|
||||
enum
|
||||
{
|
||||
@ -373,10 +374,10 @@ struct PPCdouble
|
||||
switch (fpc)
|
||||
{
|
||||
case FP_NAN: return FPR_QNAN;
|
||||
case FP_INFINITE: return signbit(_double) ? FPR_NINF : FPR_PINF;
|
||||
case FP_SUBNORMAL: return signbit(_double) ? FPR_ND : FPR_PD;
|
||||
case FP_ZERO: return signbit(_double) ? FPR_NZ : FPR_PZ;
|
||||
default: return signbit(_double) ? FPR_NN : FPR_PN;
|
||||
case FP_INFINITE: return std::signbit(_double) ? FPR_NINF : FPR_PINF;
|
||||
case FP_SUBNORMAL: return std::signbit(_double) ? FPR_ND : FPR_PD;
|
||||
case FP_ZERO: return std::signbit(_double) ? FPR_NZ : FPR_PZ;
|
||||
default: return std::signbit(_double) ? FPR_NN : FPR_PN;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
#include "stdafx.h"
|
||||
#include "vfsLocalDir.h"
|
||||
#include <direct.h>
|
||||
|
||||
vfsLocalDir::vfsLocalDir(vfsDevice* device) : vfsDirBase(device)
|
||||
{
|
||||
@ -50,4 +49,4 @@ bool vfsLocalDir::Rename(const wxString& from, const wxString& to)
|
||||
bool vfsLocalDir::Remove(const wxString& path)
|
||||
{
|
||||
return wxRmdir(path);
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "GLGSRender.h"
|
||||
#include "Emu/Cell/PPCInstrTable.h"
|
||||
#include "Gui/RSXDebugger.h"
|
||||
#include "OpenGL.h"
|
||||
|
||||
#define CMD_DEBUG 0
|
||||
#define DUMP_VERTEX_DATA 0
|
||||
@ -649,12 +650,10 @@ void GLGSRender::OnInitThread()
|
||||
|
||||
#ifdef _WIN32
|
||||
glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0);
|
||||
|
||||
glGenTextures(1, &g_depth_tex);
|
||||
glGenTextures(1, &g_flip_tex);
|
||||
#else
|
||||
if (GLXDrawable drawable = glXGetCurrentDrawable())
|
||||
glXSwapIntervalEXT(glXGetCurrentDisplay(), drawable, Ini.GSVSyncEnable.GetValue() ? 1 : 0);
|
||||
if (GLXDrawable drawable = glXGetCurrentDrawable()){
|
||||
//glXSwapIntervalEXT(glXGetCurrentDisplay(), drawable, Ini.GSVSyncEnable.GetValue() ? 1 : 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "GL/GLGSRender.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(GSFrame, wxFrame)
|
||||
EVT_PAINT(GSFrame::OnPaint)
|
||||
EVT_PAINT(GSFrame::OnPaint)
|
||||
EVT_SIZE(GSFrame::OnSize)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
@ -45,4 +45,4 @@ u8 GSManager::GetState()
|
||||
u8 GSManager::GetColorSpace()
|
||||
{
|
||||
return CELL_VIDEO_OUT_COLOR_SPACE_RGB;
|
||||
}
|
||||
}
|
||||
|
@ -78,4 +78,4 @@ void GSFrame::SetSize(int width, int height)
|
||||
|
||||
GSLockCurrent::GSLockCurrent(GSLockType type) : GSLock(Emu.GetGSManager().GetRender(), type)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ enum CellVideoOutPortType
|
||||
|
||||
enum CellVideoOutDisplayAspect
|
||||
{
|
||||
CELL_VIDEO_OUT_ASPECT_AUTO,
|
||||
CELL_VIDEO_OUT_ASPECT_AUTO,
|
||||
CELL_VIDEO_OUT_ASPECT_4_3,
|
||||
CELL_VIDEO_OUT_ASPECT_16_9,
|
||||
};
|
||||
|
@ -482,7 +482,7 @@ public:
|
||||
|
||||
int OpenDir(const wxString& name)
|
||||
{
|
||||
ConLog.Warning("OpenDir(%s)", name.mb_str());
|
||||
ConLog.Warning("OpenDir(%s)", name.wx_str());
|
||||
u64 entry_block;
|
||||
if(!SearchEntry(name, entry_block))
|
||||
return -1;
|
||||
@ -769,7 +769,7 @@ public:
|
||||
|
||||
if(entry.type == vfsHDD_Entry_Dir && name != "." && name != "..")
|
||||
{
|
||||
ConLog.Warning("removing sub folder '%s'", name.mb_str());
|
||||
ConLog.Warning("removing sub folder '%s'", name.wx_str());
|
||||
RemoveBlocksDir(entry.data_block);
|
||||
}
|
||||
else if(entry.type == vfsHDD_Entry_File)
|
||||
@ -869,4 +869,4 @@ public:
|
||||
{
|
||||
return m_file.GetSize();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include "MemoryBlock.h"
|
||||
#include <vector>
|
||||
|
||||
enum MemoryType
|
||||
{
|
||||
@ -912,10 +913,10 @@ public:
|
||||
return m_ptr;
|
||||
}
|
||||
|
||||
T operator [](int index)
|
||||
{
|
||||
return *(m_ptr + index);
|
||||
}
|
||||
T operator [](int index)
|
||||
{
|
||||
return *(m_ptr + index);
|
||||
}
|
||||
|
||||
template<typename T1>
|
||||
operator const mem_t<T1>() const
|
||||
|
@ -96,20 +96,20 @@ struct CellDmuxResource2
|
||||
be_t<u32> memSize;
|
||||
be_t<u32> ppuThreadPriority;
|
||||
be_t<u32> ppuThreadStackSize;
|
||||
union
|
||||
union cell_info
|
||||
{
|
||||
struct
|
||||
struct spu_info
|
||||
{
|
||||
be_t<u32> noex_spuThreadPriority;
|
||||
be_t<u32> noex_numOfSpus;
|
||||
};
|
||||
struct
|
||||
}spu_inf;
|
||||
struct spurs_info
|
||||
{
|
||||
be_t<u32> ex_spurs_addr;
|
||||
u8 ex_priority[8];
|
||||
be_t<u32> ex_maxContention;
|
||||
};
|
||||
};
|
||||
}spurs_inf;
|
||||
}cell_inf;
|
||||
};
|
||||
|
||||
struct CellDmuxCb
|
||||
@ -140,8 +140,8 @@ struct CellDmuxEsAttr
|
||||
|
||||
struct CellDmuxEsResource
|
||||
{
|
||||
be_t<u32> memAddr;
|
||||
be_t<u32> memSize;
|
||||
be_t<u32> memAddr;
|
||||
be_t<u32> memSize;
|
||||
};
|
||||
|
||||
struct CellDmuxAuInfo
|
||||
@ -149,7 +149,7 @@ struct CellDmuxAuInfo
|
||||
be_t<u32> auAddr;
|
||||
be_t<u32> auSize;
|
||||
be_t<u32> auMaxSize;
|
||||
be_t<u64> userData;
|
||||
be_t<u64> userData;
|
||||
be_t<u32> ptsUpper;
|
||||
be_t<u32> ptsLower;
|
||||
be_t<u32> dtsUpper;
|
||||
@ -165,4 +165,4 @@ struct CellDmuxAuInfoEx
|
||||
be_t<u64> userData;
|
||||
CellCodecTimeStamp pts;
|
||||
CellCodecTimeStamp dts;
|
||||
};
|
||||
};
|
||||
|
@ -292,7 +292,7 @@ int cellGameContentErrorDialog(s32 type, s32 errNeedSizeKB, u32 dirName_addr)
|
||||
}
|
||||
|
||||
std::string errorMsg = wxString::Format("%s\nSpace needed: %d KB\nDirectory name: %s",
|
||||
wxString(errorName).wx_str(), errNeedSizeKB, wxString(dirName).wx_str());
|
||||
wxString(errorName).wx_str(), errNeedSizeKB, wxString(dirName).wx_str()).ToStdString();
|
||||
wxMessageBox(errorMsg, wxGetApp().GetAppName(), wxICON_ERROR | wxOK);
|
||||
return CELL_OK;
|
||||
}
|
||||
|
@ -728,9 +728,9 @@ int cellRescSetBufferAddress(mem32_t colorBuffers, mem32_t vertexArray, mem32_t
|
||||
if(!colorBuffers.IsGood() || !vertexArray.IsGood() || !fragmentShader.IsGood())
|
||||
return CELL_RESC_ERROR_BAD_ARGUMENT;
|
||||
if(colorBuffers.GetAddr() % COLOR_BUFFER_ALIGNMENT ||
|
||||
vertexArray.GetAddr() % VERTEX_BUFFER_ALIGNMENT ||
|
||||
fragmentShader.GetAddr() % FRAGMENT_SHADER_ALIGNMENT)
|
||||
return CELL_RESC_ERROR_BAD_ALIGNMENT;
|
||||
vertexArray.GetAddr() % VERTEX_BUFFER_ALIGNMENT ||
|
||||
fragmentShader.GetAddr() % FRAGMENT_SHADER_ALIGNMENT)
|
||||
return CELL_RESC_ERROR_BAD_ALIGNMENT;
|
||||
|
||||
s_rescInternalInstance->m_colorBuffersEA_addr = colorBuffers.GetAddr();
|
||||
s_rescInternalInstance->m_vertexArrayEA_addr = vertexArray.GetAddr();
|
||||
@ -813,4 +813,4 @@ void cellResc_init()
|
||||
void cellResc_unload()
|
||||
{
|
||||
s_rescInternalInstance->m_bInitialized = false;
|
||||
}
|
||||
}
|
||||
|
@ -24,14 +24,12 @@ enum
|
||||
};
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct CellSyncMutex {
|
||||
union {
|
||||
struct {
|
||||
be_t<u16> m_freed;
|
||||
be_t<u16> m_order;
|
||||
};
|
||||
volatile u32 m_data;
|
||||
};
|
||||
union CellSyncMutex {
|
||||
struct cell_sync_mutex_info{
|
||||
be_t<u16> m_freed;
|
||||
be_t<u16> m_order;
|
||||
}parts;
|
||||
volatile u32 m_data;
|
||||
/*
|
||||
(???) Initialize: set zeros
|
||||
(???) Lock: increase m_order and wait until m_freed == old m_order
|
||||
@ -87,9 +85,9 @@ int cellSyncMutexLock(mem_ptr_t<CellSyncMutex> mutex)
|
||||
{
|
||||
reservation.clear();
|
||||
}
|
||||
old_order = mutex->m_order;
|
||||
mutex->m_order = mutex->m_order + 1;
|
||||
if (old_order == mutex->m_freed)
|
||||
old_order = mutex->parts.m_order;
|
||||
mutex->parts.m_order = mutex->parts.m_order + 1;
|
||||
if (old_order == mutex->parts.m_freed)
|
||||
{
|
||||
return CELL_OK;
|
||||
}
|
||||
@ -127,11 +125,11 @@ int cellSyncMutexTryLock(mem_ptr_t<CellSyncMutex> mutex)
|
||||
{
|
||||
reservation.clear();
|
||||
}
|
||||
if (mutex->m_order != mutex->m_freed)
|
||||
if (mutex->parts.m_order != mutex->parts.m_freed)
|
||||
{
|
||||
return CELL_SYNC_ERROR_BUSY;
|
||||
}
|
||||
mutex->m_order = mutex->m_order + 1;
|
||||
mutex->parts.m_order = mutex->parts.m_order + 1;
|
||||
return CELL_OK;
|
||||
}
|
||||
}
|
||||
@ -156,7 +154,7 @@ int cellSyncMutexUnlock(mem_ptr_t<CellSyncMutex> mutex)
|
||||
{
|
||||
reservation.clear();
|
||||
}
|
||||
mutex->m_freed = mutex->m_freed + 1;
|
||||
mutex->parts.m_freed = mutex->parts.m_freed + 1;
|
||||
return CELL_OK;
|
||||
}
|
||||
}
|
||||
@ -167,4 +165,4 @@ void cellSync_init()
|
||||
cellSync.AddFunc(0x1bb675c2, cellSyncMutexLock);
|
||||
cellSync.AddFunc(0xd06918c4, cellSyncMutexTryLock);
|
||||
cellSync.AddFunc(0x91f2b7b0, cellSyncMutexUnlock);
|
||||
}
|
||||
}
|
||||
|
@ -1007,4 +1007,4 @@ void cellSysutil_init()
|
||||
cellSysutil.AddFunc(0x1e7bff94, cellSysCacheMount);
|
||||
cellSysutil.AddFunc(0x744c1544, cellSysCacheClear);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,16 @@
|
||||
#if 0
|
||||
#include "stdafx.h"
|
||||
#include "Emu/SysCalls/SysCalls.h"
|
||||
#include "Emu/SysCalls/SC_FUNC.h"
|
||||
|
||||
#include "sceNp.h"
|
||||
|
||||
void sceNp_init();
|
||||
void sceNpTrophy_init();
|
||||
Module sceNp(0x0016, sceNpTrophy_init);
|
||||
|
||||
void sceNpTrophy_init()
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -129,8 +129,8 @@ int cellFsSdataOpen(u32 path_addr, int flags, mem32_t fd, mem32_t arg, u64 size)
|
||||
return CELL_OK;
|
||||
}
|
||||
|
||||
std::atomic<u32> g_FsAioReadID = 0;
|
||||
std::atomic<u32> g_FsAioReadCur = 0;
|
||||
std::atomic<u32> g_FsAioReadID( 0 );
|
||||
std::atomic<u32> g_FsAioReadCur( 0 );
|
||||
bool aio_init;
|
||||
|
||||
void fsAioRead(u32 fd, mem_ptr_t<CellFsAio> aio, int xid, mem_func_ptr_t<void (*)(mem_ptr_t<CellFsAio> xaio, u32 error, int xid, u64 size)> func)
|
||||
|
@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include "Modules.h"
|
||||
|
||||
#define RESULT(x) SC_ARGS_1 = (x)
|
||||
|
||||
|
@ -3,6 +3,13 @@
|
||||
#include "Modules.h"
|
||||
#include "SC_FUNC.h"
|
||||
|
||||
namespace detail{
|
||||
template<> bool CheckId(u32 id, ID*& _id,const std::string &name)
|
||||
{
|
||||
return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->m_name == name;
|
||||
}
|
||||
}
|
||||
|
||||
void default_syscall();
|
||||
static func_caller *null_func = bind_func(default_syscall);
|
||||
|
||||
@ -358,4 +365,4 @@ void SysCalls::DoSyscall(u32 code)
|
||||
//TODO: remove this
|
||||
declCPU();
|
||||
RESULT(DoFunc(code));
|
||||
}
|
||||
}
|
||||
|
@ -14,6 +14,20 @@
|
||||
|
||||
#define declCPU PPUThread& CPU = GetCurrentPPUThread
|
||||
|
||||
class SysCallBase;
|
||||
|
||||
namespace detail{
|
||||
template<typename T> bool CheckId(u32 id, T*& data,const std::string &name)
|
||||
{
|
||||
ID* id_data;
|
||||
if(!CheckId(id, id_data,name)) return false;
|
||||
data = id_data->m_data->get<T>();
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> bool CheckId<ID>(u32 id, ID*& _id,const std::string &name);
|
||||
}
|
||||
|
||||
class SysCallBase //Module
|
||||
{
|
||||
private:
|
||||
@ -94,18 +108,7 @@ public:
|
||||
|
||||
template<typename T> bool CheckId(u32 id, T*& data)
|
||||
{
|
||||
ID* id_data;
|
||||
|
||||
if(!CheckId(id, id_data)) return false;
|
||||
|
||||
data = id_data->m_data->get<T>();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<> bool CheckId(u32 id, ID*& _id)
|
||||
{
|
||||
return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->m_name == GetName();
|
||||
return detail::CheckId(id,data,GetName());
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
|
@ -430,4 +430,4 @@ int sys_event_port_send(u32 eport_id, u64 data1, u64 data2, u64 data3)
|
||||
}
|
||||
|
||||
return CELL_OK;
|
||||
}
|
||||
}
|
||||
|
@ -86,11 +86,11 @@ int sys_lwcond_signal(mem_ptr_t<sys_lwcond_t> lwcond)
|
||||
|
||||
if (be_t<u32> target = mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? sq->pop_prio() : sq->pop())
|
||||
{
|
||||
if (mutex->owner.trylock(target) != SMR_OK)
|
||||
if (mutex->vars.parts.owner.trylock(target) != SMR_OK)
|
||||
{
|
||||
mutex->owner.lock(tid);
|
||||
mutex->vars.parts.owner.lock(tid);
|
||||
mutex->recursive_count = 1;
|
||||
mutex->owner.unlock(tid, target);
|
||||
mutex->vars.parts.owner.unlock(tid, target);
|
||||
}
|
||||
}
|
||||
|
||||
@ -122,11 +122,11 @@ int sys_lwcond_signal_all(mem_ptr_t<sys_lwcond_t> lwcond)
|
||||
|
||||
while (be_t<u32> target = mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? sq->pop_prio() : sq->pop())
|
||||
{
|
||||
if (mutex->owner.trylock(target) != SMR_OK)
|
||||
if (mutex->vars.parts.owner.trylock(target) != SMR_OK)
|
||||
{
|
||||
mutex->owner.lock(tid);
|
||||
mutex->vars.parts.owner.lock(tid);
|
||||
mutex->recursive_count = 1;
|
||||
mutex->owner.unlock(tid, target);
|
||||
mutex->vars.parts.owner.unlock(tid, target);
|
||||
}
|
||||
}
|
||||
|
||||
@ -163,11 +163,11 @@ int sys_lwcond_signal_to(mem_ptr_t<sys_lwcond_t> lwcond, u32 ppu_thread_id)
|
||||
|
||||
be_t<u32> target = ppu_thread_id;
|
||||
|
||||
if (mutex->owner.trylock(target) != SMR_OK)
|
||||
if (mutex->vars.parts.owner.trylock(target) != SMR_OK)
|
||||
{
|
||||
mutex->owner.lock(tid);
|
||||
mutex->vars.parts.owner.lock(tid);
|
||||
mutex->recursive_count = 1;
|
||||
mutex->owner.unlock(tid, target);
|
||||
mutex->vars.parts.owner.unlock(tid, target);
|
||||
}
|
||||
|
||||
if (Emu.IsStopped())
|
||||
@ -197,7 +197,7 @@ int sys_lwcond_wait(mem_ptr_t<sys_lwcond_t> lwcond, u64 timeout)
|
||||
u32 tid_le = GetCurrentPPUThread().GetId();
|
||||
be_t<u32> tid = tid_le;
|
||||
|
||||
if (mutex->owner.GetOwner() != tid)
|
||||
if (mutex->vars.parts.owner.GetOwner() != tid)
|
||||
{
|
||||
return CELL_EPERM; // caller must own this lwmutex
|
||||
}
|
||||
@ -205,7 +205,7 @@ int sys_lwcond_wait(mem_ptr_t<sys_lwcond_t> lwcond, u64 timeout)
|
||||
sq->push(tid_le);
|
||||
|
||||
mutex->recursive_count = 0;
|
||||
mutex->owner.unlock(tid);
|
||||
mutex->vars.parts.owner.unlock(tid);
|
||||
|
||||
u32 counter = 0;
|
||||
const u32 max_counter = timeout ? (timeout / 1000) : ~0;
|
||||
@ -216,7 +216,7 @@ int sys_lwcond_wait(mem_ptr_t<sys_lwcond_t> lwcond, u64 timeout)
|
||||
case SMR_OK: mutex->unlock(tid); break;
|
||||
case SMR_SIGNAL: return CELL_OK;
|
||||
} */
|
||||
if (mutex->owner.GetOwner() == tid)
|
||||
if (mutex->vars.parts.owner.GetOwner() == tid)
|
||||
{
|
||||
_mm_mfence();
|
||||
mutex->recursive_count = 1;
|
||||
|
@ -28,7 +28,7 @@ int sys_lwmutex_create(mem_ptr_t<sys_lwmutex_t> lwmutex, mem_ptr_t<sys_lwmutex_a
|
||||
}
|
||||
|
||||
lwmutex->attribute = attr->attr_protocol | attr->attr_recursive;
|
||||
lwmutex->all_info = 0;
|
||||
lwmutex->vars.all_info = 0;
|
||||
lwmutex->pad = 0;
|
||||
lwmutex->recursive_count = 0;
|
||||
|
||||
@ -68,7 +68,7 @@ int sys_lwmutex_lock(mem_ptr_t<sys_lwmutex_t> lwmutex, u64 timeout)
|
||||
if (!lwmutex.IsGood()) return CELL_EFAULT;
|
||||
|
||||
//ConLog.Write("*** lock mutex (addr=0x%x, attr=0x%x, Nrec=%d, owner=%d, waiter=%d)",
|
||||
//lwmutex.GetAddr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, lwmutex->owner.GetOwner(), (u32)lwmutex->waiter);
|
||||
//lwmutex.GetAddr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, lwmutex->vars.parts.owner.GetOwner(), (u32)lwmutex->waiter);
|
||||
|
||||
return lwmutex->lock(GetCurrentPPUThread().GetId(), timeout ? ((timeout < 1000) ? 1 : (timeout / 1000)) : 0);
|
||||
}
|
||||
@ -89,7 +89,7 @@ int sys_lwmutex_unlock(mem_ptr_t<sys_lwmutex_t> lwmutex)
|
||||
if (!lwmutex.IsGood()) return CELL_EFAULT;
|
||||
|
||||
//ConLog.Write("*** unlocking mutex (addr=0x%x, attr=0x%x, Nrec=%d, owner=%d, waiter=%d)",
|
||||
//lwmutex.GetAddr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, (u32)lwmutex->owner.GetOwner(), (u32)lwmutex->waiter);
|
||||
//lwmutex.GetAddr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, (u32)lwmutex->vars.parts.owner.GetOwner(), (u32)lwmutex->waiter);
|
||||
|
||||
return lwmutex->unlock(GetCurrentPPUThread().GetId());
|
||||
}
|
||||
@ -204,7 +204,7 @@ int sys_lwmutex_t::trylock(be_t<u32> tid)
|
||||
{
|
||||
if (!attribute.ToBE()) return CELL_EINVAL;
|
||||
|
||||
if (tid == owner.GetOwner())
|
||||
if (tid == vars.parts.owner.GetOwner())
|
||||
{
|
||||
if (attribute.ToBE() & se32(SYS_SYNC_RECURSIVE))
|
||||
{
|
||||
@ -218,7 +218,7 @@ int sys_lwmutex_t::trylock(be_t<u32> tid)
|
||||
}
|
||||
}
|
||||
|
||||
switch (owner.trylock(tid))
|
||||
switch (vars.parts.owner.trylock(tid))
|
||||
{
|
||||
case SMR_OK: recursive_count = 1; return CELL_OK;
|
||||
case SMR_FAILED: return CELL_EBUSY;
|
||||
@ -228,7 +228,7 @@ int sys_lwmutex_t::trylock(be_t<u32> tid)
|
||||
|
||||
int sys_lwmutex_t::unlock(be_t<u32> tid)
|
||||
{
|
||||
if (tid != owner.GetOwner())
|
||||
if (tid != vars.parts.owner.GetOwner())
|
||||
{
|
||||
return CELL_EPERM;
|
||||
}
|
||||
@ -245,7 +245,7 @@ int sys_lwmutex_t::unlock(be_t<u32> tid)
|
||||
SleepQueue* sq;
|
||||
if (!Emu.GetIdManager().GetIDData(sleep_queue, sq)) return CELL_ESRCH;
|
||||
target = attribute.ToBE() & se32(SYS_SYNC_FIFO) ? sq->pop() : sq->pop_prio();
|
||||
case se32(SYS_SYNC_RETRY): default: owner.unlock(tid, target); break;
|
||||
case se32(SYS_SYNC_RETRY): default: vars.parts.owner.unlock(tid, target); break;
|
||||
}
|
||||
}
|
||||
return CELL_OK;
|
||||
@ -271,7 +271,7 @@ int sys_lwmutex_t::lock(be_t<u32> tid, u64 timeout)
|
||||
default: break;
|
||||
}
|
||||
|
||||
switch (owner.lock(tid, timeout))
|
||||
switch (vars.parts.owner.lock(tid, timeout))
|
||||
{
|
||||
case SMR_OK:
|
||||
sq->invalidate(tid);
|
||||
@ -284,4 +284,4 @@ int sys_lwmutex_t::lock(be_t<u32> tid, u64 timeout)
|
||||
default:
|
||||
sq->invalidate(tid); return CELL_EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,18 +65,15 @@ struct SleepQueue
|
||||
|
||||
struct sys_lwmutex_t
|
||||
{
|
||||
union // sys_lwmutex_variable_t
|
||||
union sys_lwmutex_variable_t
|
||||
{
|
||||
struct // sys_lwmutex_lock_info_t
|
||||
struct sys_lwmutex_lock_info_t
|
||||
{
|
||||
/* volatile */ SMutexBE owner;
|
||||
/* volatile */ be_t<u32> waiter; // not used
|
||||
};
|
||||
struct
|
||||
{
|
||||
}parts;
|
||||
/* volatile */ be_t<u64> all_info;
|
||||
};
|
||||
};
|
||||
}vars;
|
||||
be_t<u32> attribute;
|
||||
be_t<u32> recursive_count;
|
||||
be_t<u32> sleep_queue;
|
||||
@ -85,4 +82,4 @@ struct sys_lwmutex_t
|
||||
int trylock(be_t<u32> tid);
|
||||
int unlock(be_t<u32> tid);
|
||||
int lock(be_t<u32> tid, u64 timeout);
|
||||
};
|
||||
};
|
||||
|
@ -1,3 +1,4 @@
|
||||
#if 0
|
||||
#include "stdafx.h"
|
||||
#include "Emu/SysCalls/SysCalls.h"
|
||||
|
||||
@ -19,3 +20,4 @@ int sys_raw_spu_create(u32 id_addr, u32 attr_addr)
|
||||
Memory.Write32(id_addr, Emu.GetIdManager().GetNewID("raw_spu"));
|
||||
return CELL_OK;
|
||||
}
|
||||
#endif
|
||||
|
@ -190,8 +190,8 @@ void Emulator::Load()
|
||||
|
||||
if(IsSelf(m_path.ToStdString()))
|
||||
{
|
||||
std::string self_path = m_path.mb_str();
|
||||
std::string elf_path = wxFileName(m_path).GetPath().c_str();
|
||||
std::string self_path = m_path.ToStdString();
|
||||
std::string elf_path = wxFileName(m_path).GetPath().ToStdString();
|
||||
|
||||
if(wxFileName(m_path).GetFullName().CmpNoCase("EBOOT.BIN") == 0)
|
||||
{
|
||||
@ -216,7 +216,7 @@ void Emulator::Load()
|
||||
ConLog.Write("Mount info:");
|
||||
for(uint i=0; i<m_vfs.m_devices.GetCount(); ++i)
|
||||
{
|
||||
ConLog.Write("%s -> %s", m_vfs.m_devices[i].GetPs3Path().wx_str(), m_vfs.m_devices[i].GetLocalPath().wx_str());
|
||||
ConLog.Write("%s -> %s", static_cast<const char *>(m_vfs.m_devices[i].GetPs3Path()), static_cast<const char *>(m_vfs.m_devices[i].GetLocalPath().ToAscii()));
|
||||
}
|
||||
ConLog.SkipLn();
|
||||
|
||||
|
@ -12,8 +12,9 @@
|
||||
#include "Emu/DbgConsole.h"
|
||||
#include "Loader/Loader.h"
|
||||
#include "SysCalls/Callback.h"
|
||||
#include "SysCalls/Modules.h"
|
||||
#include "event.h"
|
||||
|
||||
class EventManager;
|
||||
extern void UnloadModules();
|
||||
|
||||
struct EmuInfo
|
||||
{
|
||||
@ -90,7 +91,7 @@ class Emulator
|
||||
AudioManager m_audio_manager;
|
||||
CallbackManager m_callback_manager;
|
||||
CPUThread* m_ppu_callback_thr;
|
||||
EventManager m_event_manager;
|
||||
EventManager &m_event_manager;
|
||||
|
||||
VFS m_vfs;
|
||||
|
||||
@ -164,4 +165,4 @@ public:
|
||||
__forceinline bool IsReady() const { return m_status == Ready; }
|
||||
};
|
||||
|
||||
extern Emulator Emu;
|
||||
extern Emulator Emu;
|
||||
|
@ -167,7 +167,7 @@ void InterpreterDisAsmFrame::OnKeyDown(wxKeyEvent& event)
|
||||
{
|
||||
if(event.GetKeyCode() == WXK_SPACE)
|
||||
{
|
||||
wxCommandEvent ce;
|
||||
wxCommandEvent ce;
|
||||
DoStep(ce);
|
||||
return;
|
||||
}
|
||||
@ -222,7 +222,7 @@ void InterpreterDisAsmFrame::OnResize(wxSizeEvent& event)
|
||||
|
||||
void InterpreterDisAsmFrame::DoUpdate()
|
||||
{
|
||||
wxCommandEvent ce;
|
||||
wxCommandEvent ce;
|
||||
Show_PC(ce);
|
||||
WriteRegs();
|
||||
WriteCallStack();
|
||||
|
@ -228,7 +228,7 @@ void MainFrame::InstallPkg(wxCommandEvent& WXUNUSED(event))
|
||||
Emu.Stop();
|
||||
|
||||
// Open and install PKG file
|
||||
std::string filePath = ctrl.GetPath();
|
||||
std::string filePath = ctrl.GetPath().ToStdString();
|
||||
wxFile pkg_f(filePath, wxFile::read); // TODO: Use VFS to install PKG files
|
||||
|
||||
if (pkg_f.IsOpened())
|
||||
|
@ -25,7 +25,7 @@ MemoryViewerPanel::MemoryViewerPanel(wxWindow* parent)
|
||||
|
||||
wxStaticBoxSizer& s_tools_mem_bytes = *new wxStaticBoxSizer(wxHORIZONTAL, this, "Bytes");
|
||||
sc_bytes = new wxSpinCtrl(this, wxID_ANY, "16", wxDefaultPosition, wxSize(44,-1));
|
||||
sc_bytes->SetRange(1, 16);
|
||||
sc_bytes->SetRange(1, 16);
|
||||
s_tools_mem_bytes.Add(sc_bytes);
|
||||
|
||||
wxStaticBoxSizer& s_tools_mem_buttons = *new wxStaticBoxSizer(wxHORIZONTAL, this, "Control");
|
||||
@ -52,7 +52,7 @@ MemoryViewerPanel::MemoryViewerPanel(wxWindow* parent)
|
||||
s_tools_img_size.Add(new wxStaticText(this, wxID_ANY, " x "));
|
||||
s_tools_img_size.Add(sc_img_size_y);
|
||||
|
||||
sc_img_size_x->SetRange(1, 8192);
|
||||
sc_img_size_x->SetRange(1, 8192);
|
||||
sc_img_size_y->SetRange(1, 8192);
|
||||
|
||||
wxStaticBoxSizer& s_tools_img_mode = *new wxStaticBoxSizer(wxHORIZONTAL, this, "Mode");
|
||||
|
@ -58,7 +58,7 @@ VFSEntrySettingsDialog::VFSEntrySettingsDialog(wxWindow* parent, VFSManagerEntry
|
||||
m_tctrl_mount->SetValue(m_entry.mount);
|
||||
m_ch_type->SetSelection(m_entry.device);
|
||||
|
||||
wxCommandEvent ce;
|
||||
wxCommandEvent ce;
|
||||
OnSelectType(ce);
|
||||
}
|
||||
|
||||
|
@ -347,10 +347,10 @@ VHDDSetInfoDialog::VHDDSetInfoDialog(wxWindow* parent) : wxDialog(parent, wxID_A
|
||||
m_ch_type->Append("MB");
|
||||
m_ch_type->Append("GB");
|
||||
|
||||
m_spin_size->SetRange(1, 0x7fffffff);
|
||||
m_spin_size->SetRange(1, 0x7fffffff);
|
||||
m_spin_size->SetValue(64);
|
||||
m_ch_type->SetSelection(3);
|
||||
m_spin_block_size->SetRange(64, 0x7fffffff);
|
||||
m_spin_block_size->SetRange(64, 0x7fffffff);
|
||||
m_spin_block_size->SetValue(2048);
|
||||
Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(VHDDSetInfoDialog::OnOk));
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ Ini::Ini()
|
||||
wxGetCwd() + "\\rpcs3.ini",
|
||||
wxEmptyString, wxCONFIG_USE_LOCAL_FILE );
|
||||
#else
|
||||
m_Config = new wxConfig("rpcs3");
|
||||
m_Config = new wxConfig("rpcs3");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ bool PKGLoader::Install(std::string dest, bool show)
|
||||
return false;
|
||||
|
||||
std::string titleID = std::string(m_header.title_id).substr(7, 9);
|
||||
std::string decryptedFile = wxGetCwd() + "/dev_hdd1/" + titleID + ".dec";
|
||||
std::string decryptedFile = wxGetCwd().ToStdString() + "/dev_hdd1/" + titleID + ".dec";
|
||||
|
||||
if (wxDirExists(dest+titleID)) {
|
||||
wxMessageDialog d_overwrite(NULL, "Another installation was found. Do you want to overwrite it?", "PKG Decrypter / Installer", wxYES_NO|wxCENTRE);
|
||||
|
@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include "Gui/MainFrame.h"
|
||||
|
||||
template<typename T> T min(const T a, const T b) { return a < b ? a : b; }
|
||||
@ -66,4 +65,4 @@ DECLARE_APP(Rpcs3App)
|
||||
//extern CPUThread& GetCPU(const u8 core);
|
||||
|
||||
extern Rpcs3App* TheApp;
|
||||
static const u64 PS3_CLK = 3200000000;
|
||||
static const u64 PS3_CLK = 3200000000;
|
||||
|
@ -3,19 +3,33 @@
|
||||
#define NOMINMAX
|
||||
|
||||
#ifndef QT_UI
|
||||
#ifdef _WIN32
|
||||
#include <wx/msw/setup.h>
|
||||
#include <wx/wx.h>
|
||||
#endif
|
||||
#include <wx/config.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/propdlg.h>
|
||||
#include <wx/stdpaths.h>
|
||||
#include <wx/filename.h>
|
||||
#include <wx/filefn.h>
|
||||
#include <wx/dcclient.h>
|
||||
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/dir.h>
|
||||
#include <wx/spinctrl.h>
|
||||
#include <wx/datetime.h>
|
||||
#include <wx/filepicker.h>
|
||||
#include <wx/menu.h>
|
||||
#include <wx/menuitem.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/msgdlg.h>
|
||||
#include "wx/gauge.h"
|
||||
#include <wx/stattext.h>
|
||||
#include "wx/scrolbar.h"
|
||||
#include "wx/frame.h"
|
||||
#include <wx/combobox.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include "wx/app.h"
|
||||
|
||||
#include <wx/wxprec.h>
|
||||
#endif
|
||||
@ -199,12 +213,15 @@ enum Status
|
||||
|
||||
#include "AppConnector.h"
|
||||
|
||||
#include "Emu/SysCalls/Callback.h"
|
||||
#include "Ini.h"
|
||||
#include "Gui/FrameBase.h"
|
||||
#include "Gui/ConLog.h"
|
||||
#include "Emu/Memory/Memory.h"
|
||||
#include "Emu/System.h"
|
||||
#include "Emu/Cell/PPUThread.h"
|
||||
#include "Emu/SysCalls/Modules.h"
|
||||
|
||||
|
||||
#include "Emu/FS/vfsDirBase.h"
|
||||
#include "Emu/FS/vfsFileBase.h"
|
||||
|
Loading…
Reference in New Issue
Block a user