diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 0aa510981..5bda4613d 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -1209,11 +1209,15 @@ private: } void VPERM(u32 vd, u32 va, u32 vb, u32 vc) { + u8 tmpSRC[32]; + memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); + memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); + for (uint b = 0; b < 16; b++) { u8 index = CPU.VPR[vc]._u8[b] & 0x1f; - CPU.VPR[vd]._u8[b] = index < 0x10 ? CPU.VPR[va]._u8[0xf - index] : CPU.VPR[vb]._u8[0xf - (index - 0x10)]; + CPU.VPR[vd]._u8[b] = tmpSRC[0x1f - index]; } } void VPKPX(u32 vd, u32 va, u32 vb) @@ -1552,13 +1556,13 @@ private: } void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) { - for (uint b = 0; b < 16 - sh; b++) + u8 tmpSRC[32]; + memcpy(tmpSRC, CPU.VPR[vb]._u8, 16); + memcpy(tmpSRC + 16, CPU.VPR[va]._u8, 16); + + for(uint b=0; b<16; b++) { - CPU.VPR[vd]._u8[15 - b] = CPU.VPR[va]._u8[15 - (b + sh)]; - } - for (uint b = 16 - sh; b < 16; b++) - { - CPU.VPR[vd]._u8[15 - b] = CPU.VPR[vb]._u8[15 - (b - (16 - sh))]; + CPU.VPR[vd]._u8[15 - b] = tmpSRC[31 - (b + sh)]; } } void VSLH(u32 vd, u32 va, u32 vb) diff --git a/rpcs3/Emu/SysCalls/SC_FUNC.h b/rpcs3/Emu/SysCalls/SC_FUNC.h index 832e0bf2b..0157a8bf2 100644 --- a/rpcs3/Emu/SysCalls/SC_FUNC.h +++ b/rpcs3/Emu/SysCalls/SC_FUNC.h @@ -2,19 +2,40 @@ #define RESULT(x) SC_ARGS_1 = (x) -template +template struct get_arg; -template -struct get_arg { static __forceinline T func(PPUThread& CPU, int i) { return (T&)CPU.GPR[i + 2]; } }; +template +struct get_arg // not fp, not ptr, 1..8 +{ + static __forceinline T func(PPUThread& CPU) { return (T&)CPU.GPR[i + 2]; } +}; -template -struct get_arg { static __forceinline T func(PPUThread& CPU, int i) { return CPU.GPR[i + 2] ? (T)&Memory[CPU.GPR[i + 2]] : nullptr; } }; +template +struct get_arg // ptr, 1..8 +{ + static __forceinline T func(PPUThread& CPU) { return CPU.GPR[i + 2] ? (T)&Memory[CPU.GPR[i + 2]] : nullptr; } +}; -template -struct get_arg { static __forceinline T func(PPUThread& CPU, int i) { return CPU.FPR[i]; } }; +template +struct get_arg // fp, 1..12 +{ + static __forceinline T func(PPUThread& CPU) { return CPU.FPR[i]; } +}; -#define ARG(n) get_arg::value, std::is_pointer::value, T##n>::func(CPU, n) +template +struct get_arg // not fp, not ptr, 9..12 +{ + static __forceinline T func(PPUThread& CPU) { u64 res = Memory.Read64(CPU.GPR[1] + 0x70 + 0x8 * (i - 9)); return (T&)res; } +}; + +template +struct get_arg // ptr, 9..12 +{ + static __forceinline T func(PPUThread& CPU) { u64 addr = Memory.Read64(CPU.GPR[1] + 0x70 + 0x8 * (i - 9)); return addr ? (T)&Memory[addr] : nullptr; } +}; + +#define ARG(n) get_arg<((n) > 8), std::is_floating_point::value, std::is_pointer::value, T##n, n>::func(CPU) template class binder_func_0 : public func_caller diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index 7c18cb6df..56acf6188 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -376,10 +376,12 @@ extern int sys_rsx_attribute(); #define SC_ARG_5 CPU.GPR[8] #define SC_ARG_6 CPU.GPR[9] #define SC_ARG_7 CPU.GPR[10] +/* // these definitions are wrong: #define SC_ARG_8 CPU.GPR[11] #define SC_ARG_9 CPU.GPR[12] #define SC_ARG_10 CPU.GPR[13] #define SC_ARG_11 CPU.GPR[14] +*/ #define SC_ARGS_1 SC_ARG_0 #define SC_ARGS_2 SC_ARGS_1,SC_ARG_1 @@ -389,10 +391,12 @@ extern int sys_rsx_attribute(); #define SC_ARGS_6 SC_ARGS_5,SC_ARG_5 #define SC_ARGS_7 SC_ARGS_6,SC_ARG_6 #define SC_ARGS_8 SC_ARGS_7,SC_ARG_7 +/* #define SC_ARGS_9 SC_ARGS_8,SC_ARG_8 #define SC_ARGS_10 SC_ARGS_9,SC_ARG_9 #define SC_ARGS_11 SC_ARGS_10,SC_ARG_10 #define SC_ARGS_12 SC_ARGS_11,SC_ARG_11 +*/ extern bool dump_enable; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp index f1674f6ab..86f24d65d 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Memory.cpp @@ -162,6 +162,7 @@ int sys_mmapper_map_memory(u32 start_addr, u32 mem_id, u64 flags) int sys_memory_get_user_memory_size(u32 mem_info_addr) { + sc_mem.Warning("sys_memory_get_user_memory_size(mem_info_addr=0x%x)", mem_info_addr); sys_memory_info info; info.total_user_memory = re(Memory.GetUserMemTotalSize()); info.available_user_memory = re(Memory.GetUserMemAvailSize()); diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp index 4ef5ffa01..c70d43838 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Pad.cpp @@ -74,7 +74,7 @@ int cellPadClearBuf(u32 port_no) int cellPadGetData(u32 port_no, u32 data_addr) { - //ConLog.Warning("cellPadGetData[port_no: %d, data_addr: 0x%x]", port_no, data_addr); + sys_io.Log("cellPadGetData[port_no: %d, data_addr: 0x%x]", port_no, data_addr); const Array& pads = Emu.GetPadManager().GetPads(); if(!Emu.GetPadManager().IsInited()) return CELL_PAD_ERROR_UNINITIALIZED; if(port_no >= pads.GetCount()) return CELL_PAD_ERROR_INVALID_PARAMETER; diff --git a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp index 341e36fca..52e6c7cc3 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_SPU_Thread.cpp @@ -458,6 +458,7 @@ int sys_spu_thread_get_spu_cfg(u32 id, mem64_t value) //184 int sys_spu_thread_write_snr(u32 id, u32 number, u32 value) { + sc_spu.Log("sys_spu_thread_write_snr(id=0x%x, number=%d, value=0x%x)", id, number, value); CPUThread* thr = Emu.GetCPU().GetThread(id); if(!thr || (thr->GetType() != CPU_THREAD_SPU && thr->GetType() != CPU_THREAD_RAW_SPU))