diff --git a/rpcs3/Emu/Cell/PPCThread.cpp b/rpcs3/Emu/Cell/PPCThread.cpp
deleted file mode 100644
index 4d77900d90..0000000000
--- a/rpcs3/Emu/Cell/PPCThread.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "stdafx.h"
-#include "PPCThread.h"
-#include "Emu/Memory/Memory.h"
-
-PPCThread* GetCurrentPPCThread()
-{
- CPUThread* thread = GetCurrentCPUThread();
-
- if(!thread || (thread->GetType() != CPU_THREAD_PPU && thread->GetType() != CPU_THREAD_SPU && thread->GetType() != CPU_THREAD_RAW_SPU))
- {
- throw std::string("GetCurrentPPCThread: bad thread");
- }
-
- return (PPCThread*)thread;
-}
-
-PPCThread::PPCThread(CPUThreadType type) : CPUThread(type)
-{
-}
-
-PPCThread::~PPCThread()
-{
-}
-
-void PPCThread::DoReset()
-{
-}
diff --git a/rpcs3/Emu/Cell/PPCThread.h b/rpcs3/Emu/Cell/PPCThread.h
deleted file mode 100644
index 2c3fa5c05b..0000000000
--- a/rpcs3/Emu/Cell/PPCThread.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-#include "Emu/CPU/CPUThread.h"
-
-class PPCThread : public CPUThread
-{
-public:
- virtual std::string GetThreadName() const
- {
- return fmt::format("%s[0x%08x]", GetFName(), PC);
- }
-
-protected:
- PPCThread(CPUThreadType type);
-
-public:
- virtual ~PPCThread();
-
-protected:
- virtual void DoReset() override;
-};
-
-PPCThread* GetCurrentPPCThread();
diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp
index 205dc2b4eb..9372ebe2c1 100644
--- a/rpcs3/Emu/Cell/PPUThread.cpp
+++ b/rpcs3/Emu/Cell/PPUThread.cpp
@@ -19,14 +19,14 @@ extern void ppu_free_tls(u32 thread);
PPUThread& GetCurrentPPUThread()
{
- PPCThread* thread = GetCurrentPPCThread();
+ CPUThread* thread = GetCurrentCPUThread();
if(!thread || thread->GetType() != CPU_THREAD_PPU) throw std::string("GetCurrentPPUThread: bad thread");
return *(PPUThread*)thread;
}
-PPUThread::PPUThread() : PPCThread(CPU_THREAD_PPU)
+PPUThread::PPUThread() : CPUThread(CPU_THREAD_PPU)
{
owned_mutexes = 0;
Reset();
@@ -39,8 +39,6 @@ PPUThread::~PPUThread()
void PPUThread::DoReset()
{
- PPCThread::DoReset();
-
//reset regs
memset(VPR, 0, sizeof(VPR));
memset(FPR, 0, sizeof(FPR));
diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h
index 64c11c7563..ee0254aa6a 100644
--- a/rpcs3/Emu/Cell/PPUThread.h
+++ b/rpcs3/Emu/Cell/PPUThread.h
@@ -1,6 +1,6 @@
#pragma once
#include "Emu/Cell/Common.h"
-#include "Emu/Cell/PPCThread.h"
+#include "Emu/CPU/CPUThread.h"
#include "Emu/Memory/vm.h"
enum
@@ -467,7 +467,7 @@ struct FPRdouble
static int Cmp(PPCdouble a, PPCdouble b);
};
-class PPUThread : public PPCThread
+class PPUThread : public CPUThread
{
public:
PPCdouble FPR[32]; //Floating Point Register
diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp
index 041ea63968..94f34c3fa0 100644
--- a/rpcs3/Emu/Cell/RawSPUThread.cpp
+++ b/rpcs3/Emu/Cell/RawSPUThread.cpp
@@ -47,7 +47,7 @@ bool RawSPUThread::Read32(const u32 addr, u32* value)
case SPU_MBox_Status_offs:
{
- *value = (SPU.Out_MBox.GetCount() & 0xff) | (SPU.In_MBox.GetFreeCount() << 8);
+ *value = (SPU.Out_MBox.GetCount() & 0xff) | (SPU.In_MBox.GetFreeCount() << 8) | (SPU.Out_IntrMBox.GetCount() << 16);
break;
}
diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp
index b0785cfd16..c986098d88 100644
--- a/rpcs3/Emu/Cell/SPUThread.cpp
+++ b/rpcs3/Emu/Cell/SPUThread.cpp
@@ -23,7 +23,7 @@
SPUThread& GetCurrentSPUThread()
{
- PPCThread* thread = GetCurrentPPCThread();
+ CPUThread* thread = GetCurrentCPUThread();
if(!thread || (thread->GetType() != CPU_THREAD_SPU && thread->GetType() != CPU_THREAD_RAW_SPU))
{
@@ -33,7 +33,7 @@ SPUThread& GetCurrentSPUThread()
return *(SPUThread*)thread;
}
-SPUThread::SPUThread(CPUThreadType type) : PPCThread(type)
+SPUThread::SPUThread(CPUThreadType type) : CPUThread(type)
{
assert(type == CPU_THREAD_SPU || type == CPU_THREAD_RAW_SPU);
@@ -73,10 +73,8 @@ void SPUThread::Task()
void SPUThread::DoReset()
{
- PPCThread::DoReset();
-
//reset regs
- memset(GPR, 0, sizeof(u128) * 128);
+ memset(GPR, 0, sizeof(GPR));
}
void SPUThread::InitRegs()
@@ -568,7 +566,7 @@ void SPUThread::WriteChannel(u32 ch, const u128& r)
return;
}
- //if (Ini.HLELogging.GetValue())
+ if (Ini.HLELogging.GetValue())
{
LOG_WARNING(Log::SPU, "sys_spu_thread_throw_event(spup=%d, data0=0x%x, data1=0x%x)", spup, v & 0x00ffffff, data);
}
diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h
index fa0dfd22d9..da9ec3e025 100644
--- a/rpcs3/Emu/Cell/SPUThread.h
+++ b/rpcs3/Emu/Cell/SPUThread.h
@@ -1,7 +1,7 @@
#pragma once
#include "Emu/Cell/Common.h"
+#include "Emu/CPU/CPUThread.h"
#include "Emu/Memory/atomic_type.h"
-#include "PPCThread.h"
#include "Emu/SysCalls/lv2/sleep_queue_type.h"
#include "Emu/SysCalls/lv2/sys_event.h"
#include "Emu/Event.h"
@@ -287,7 +287,7 @@ union SPU_SNRConfig_hdr
struct SpuGroupInfo;
-class SPUThread : public PPCThread
+class SPUThread : public CPUThread
{
public:
u128 GPR[128]; // General-Purpose Registers
diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp
index e6d8327f39..f839ead3fa 100644
--- a/rpcs3/Emu/SysCalls/Modules.cpp
+++ b/rpcs3/Emu/SysCalls/Modules.cpp
@@ -32,10 +32,17 @@ u32 add_ppu_func_sub(StaticFunc func)
u32 add_ppu_func_sub(const char group[8], const u64 ops[], const char* name, Module* module, ppu_func_caller func)
{
+ char group_name[9] = {};
+
+ if (group)
+ {
+ strcpy_trunc(group_name, group);
+ }
+
StaticFunc sf;
sf.index = add_ppu_func(ModuleFunc(get_function_id(name), 0, module, func));
sf.name = name;
- sf.group = *(u64*)group;
+ sf.group = *(u64*)group_name;
sf.found = 0;
// TODO: check for self-inclusions, use CRC
@@ -259,6 +266,12 @@ void hook_ppu_funcs(u32* base, u32 size)
{
const u64 group = g_ppu_func_subs[i].group;
+ if (!group)
+ {
+ // skip if group not set
+ continue;
+ }
+
enum GroupSearchResult : u32
{
GSR_SUCCESS = 0, // every function from this group has been found once
@@ -320,17 +333,17 @@ void hook_ppu_funcs(u32* base, u32 size)
if (g_ppu_func_subs[j].group == group) g_ppu_func_subs[j].found = 0;
}
- char name[9] = "????????";
+ char group_name[9] = {};
- *(u64*)name = group;
+ *(u64*)group_name = group;
if (res == GSR_SUCCESS)
{
- LOG_SUCCESS(LOADER, "Function group [%s] successfully hooked", std::string(name, 9).c_str());
+ LOG_SUCCESS(LOADER, "Function group [%s] successfully hooked", group_name);
}
else
{
- LOG_ERROR(LOADER, "Function group [%s] failed:%s%s", std::string(name, 9).c_str(),
+ LOG_ERROR(LOADER, "Function group [%s] failed:%s%s", group_name,
(res & GSR_MISSING ? " missing;" : ""),
(res & GSR_EXCESS ? " excess;" : ""));
}
diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h
index c013bae9f1..f6a06c4827 100644
--- a/rpcs3/Emu/SysCalls/Modules.h
+++ b/rpcs3/Emu/SysCalls/Modules.h
@@ -151,4 +151,6 @@ void hook_ppu_funcs(u32* base, u32 size);
static const u64 name ## _table[] = {__VA_ARGS__ , 0}; \
if (name ## _table[0]) add_ppu_func_sub(group, name ## _table, #name, &module, bind_func(name))
+#define op_mask(op) []() -> u64 { s32 XXX = 0; u64 _op = (op); XXX = -1; return ((op) ^ ~_op) << 32 | _op; }()
+
#define UNIMPLEMENTED_FUNC(module) module.Error("%s", __FUNCTION__)
diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp
index 2e2c07b723..d2d705477d 100644
--- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp
+++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp
@@ -1,8 +1,10 @@
#include "stdafx.h"
+#include "Utilities/Log.h"
#include "Emu/Memory/Memory.h"
#include "Emu/System.h"
#include "Emu/SysCalls/Modules.h"
#include "Emu/SysCalls/CB_FUNC.h"
+#include "Emu/Cell/PPUInstrTable.h"
#include "Emu/CPU/CPUThreadManager.h"
#include "cellAudio.h"
@@ -638,6 +640,8 @@ Module libmixer("libmixer", []()
ssp.clear();
};
+ using namespace PPU_instr;
+
REG_SUB(libmixer, "surmxAAN", cellAANAddData,
0xffffffff7c691b78,
0xffffffff7c0802a6,
@@ -776,7 +780,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerGetAANHandle,
- 0xff00000081428250, // lwz
+ op_mask(LWZ(10, 2, XXX)),
0xffffffff3d607fce,
0xffffffff616bfffe,
0xffffffff812a0018,
@@ -793,7 +797,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerChStripGetAANPortNo,
- 0xff00000081228250, // lwz
+ op_mask(LWZ(9, 2, XXX)),
0xffffffff7c661b78,
0xffffffff3c608031,
0xffffffff78c60020,
@@ -808,7 +812,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerSetNotifyCallback,
- 0xff00000081428250, // lwz
+ op_mask(LWZ(10, 2, XXX)),
0xffffffff7c0802a6,
0xfffffffff821ff81,
0xfffffffff8010090,
@@ -828,7 +832,7 @@ Module libmixer("libmixer", []()
0xffffffff7c0803a6,
0xffffffff4e800020,
0xffffff00419affec, // beq
- 0xf0000000800a001c, // lwz
+ op_mask(LWZ(0, 10, XXX)),
0xffffffff79290020,
0xffffffff38810070,
0xffffffff2f800000,
@@ -836,7 +840,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerRemoveNotifyCallback,
- 0xff00000081628250, // lwz
+ op_mask(LWZ(11, 2, XXX)),
0xffffffff7c0802a6,
0xfffffffff821ff81,
0xfffffffff8010090,
@@ -857,7 +861,7 @@ Module libmixer("libmixer", []()
0xfffffffff821ff71,
0xffffffff7c0802a6,
0xfffffffffbc10080,
- 0xf000000083c20000, // lwz
+ op_mask(LWZ(30, 2, XXX)),
0xfffffffff80100a0,
0xfffffffffba10078,
0xfffffffffbe10088,
@@ -881,7 +885,7 @@ Module libmixer("libmixer", []()
0xffffffff7c0802a6,
0xfffffffffbc10070,
0xfffffffffc000890,
- 0xf000000083c28250, // lwz
+ op_mask(LWZ(30, 2, XXX)),
0xffffffff3d208031,
0xfffffffff8010090,
0xfffffffffbe10078,
@@ -933,7 +937,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerSurBusAddData,
- 0xff00000081428250, // lwz
+ op_mask(LWZ(10, 2, XXX)),
0xffffffff7c0802a6,
0xfffffffff821ff91,
0xfffffffff8010080,
@@ -962,7 +966,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerChStripSetParameter,
- 0xff00000081028250, // lwz
+ op_mask(LWZ(8, 2, XXX)),
0xffffffff7c6b1b78,
0xffffffff3c608031,
0xffffffff7c8a2378,
@@ -982,7 +986,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerPause,
- 0xff00000081428250, // lwz
+ op_mask(LWZ(10, 2, XXX)),
0xffffffff7c0802a6,
0xfffffffff821ff81,
0xfffffffff8010090,
@@ -1007,7 +1011,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerGetCurrentBlockTag,
- 0xff00000081628250, // lwz
+ op_mask(LWZ(11, 2, XXX)),
0xffffffff3d208031,
0xffffffff61290002,
0xffffffff880b0020,
@@ -1021,7 +1025,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerGetTimestamp,
- 0xff00000081628250, // lwz
+ op_mask(LWZ(11, 2, XXX)),
0xffffffff7c0802a6,
0xfffffffff821ff91,
0xfffffffff8010080,
@@ -1043,7 +1047,7 @@ Module libmixer("libmixer", []()
);
REG_SUB(libmixer, "surmixer", cellSurMixerBeep,
- 0xff00000081228250, // lwz
+ op_mask(LWZ(9, 2, XXX)),
0xffffffff7c641b78,
0xffffffff80690018,
0xffffffff2f830000,
diff --git a/rpcs3/Gui/Debugger.cpp b/rpcs3/Gui/Debugger.cpp
index 26018d0563..66f85de571 100644
--- a/rpcs3/Gui/Debugger.cpp
+++ b/rpcs3/Gui/Debugger.cpp
@@ -7,7 +7,7 @@
#include "Debugger.h"
#include "InterpreterDisAsm.h"
#include "Emu/CPU/CPUThreadManager.h"
-#include "Emu/Cell/PPCThread.h"
+#include "Emu/CPU/CPUThread.h"
class DbgEmuPanel : public wxPanel
@@ -95,7 +95,7 @@ public:
break;
case DID_EXIT_THR_SYSCALL:
- Emu.GetCPU().RemoveThread(((PPCThread*)event.GetClientData())->GetId());
+ Emu.GetCPU().RemoveThread(((CPUThread*)event.GetClientData())->GetId());
break;
}
diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj
index a2b15df8d9..825b12b3b1 100644
--- a/rpcs3/emucore.vcxproj
+++ b/rpcs3/emucore.vcxproj
@@ -131,7 +131,6 @@
-
true
true
@@ -362,7 +361,6 @@
-
diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters
index 405e2c839b..54c89cec71 100644
--- a/rpcs3/emucore.vcxproj.filters
+++ b/rpcs3/emucore.vcxproj.filters
@@ -341,9 +341,6 @@
Emu\CPU\Cell
-
- Emu\CPU\Cell
-
Emu\CPU\Cell
@@ -1105,9 +1102,6 @@
Emu\CPU\Cell
-
- Emu\CPU\Cell
-
Emu\CPU\Cell