diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index ea6f0d575d..cb6f972e38 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -133,21 +133,39 @@ private: return ctr_ok && cond_ok; } - u64& GetRegBySPR(u32 spr) + u64 ReadSPR(u32 spr) { const u32 n = (spr >> 5) | ((spr & 0x1f) << 5); - switch(n) + switch (n) { case 0x001: return CPU.XER.XER; case 0x008: return CPU.LR; case 0x009: return CPU.CTR; case 0x100: return CPU.USPRG0; + case 0x10C: return CPU.TBL; } - UNK(fmt::Format("GetRegBySPR error: Unknown SPR 0x%x!", n)); + UNK(fmt::Format("ReadSPR error: Unknown SPR 0x%x!", n)); return CPU.XER.XER; } + + void WriteSPR(u32 spr, u64 value) + { + const u32 n = (spr >> 5) | ((spr & 0x1f) << 5); + + switch (n) + { + case 0x001: CPU.XER.XER = value; return; + case 0x008: CPU.LR = value; return; + case 0x009: CPU.CTR = value; return; + case 0x100: CPU.USPRG0 = value; return; + case 0x10C: CPU.TBL = value; return; + } + + UNK(fmt::Format("WriteSPR error: Unknown SPR 0x%x!", n)); + return; + } void TDI(u32 to, u32 ra, s32 simm16) { @@ -2911,7 +2929,7 @@ private: } void MFSPR(u32 rd, u32 spr) { - CPU.GPR[rd] = GetRegBySPR(spr); + CPU.GPR[rd] = ReadSPR(spr); } void LWAX(u32 rd, u32 ra, u32 rb) { @@ -3062,7 +3080,7 @@ private: } void MTSPR(u32 spr, u32 rs) { - GetRegBySPR(spr) = CPU.GPR[rs]; + WriteSPR(spr, CPU.GPR[rs]); } void DCBI(u32 ra, u32 rb) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index 31eae6d11c..db80ed037f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -43,18 +43,18 @@ u32 map_offset_pos = 0; u32 gcmGetLocalMemorySize(u32 sdk_version) { if (sdk_version >= 0x00220000) { - return 0x0F900000; // 249MB + return 0x0F900000; // 249MB } if (sdk_version >= 0x00200000) { - return 0x0F200000; // 242MB + return 0x0F200000; // 242MB } if (sdk_version >= 0x00190000) { - return 0x0EA00000; // 234MB + return 0x0EA00000; // 234MB } if (sdk_version >= 0x00180000) { - return 0x0E800000; // 232MB + return 0x0E800000; // 232MB } - return 0x0E000000; // 224MB + return 0x0E000000; // 224MB } CellGcmOffsetTable offsetTable; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp index 323e33a172..3e22257a26 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp @@ -71,17 +71,24 @@ int cellSailDescriptorGetMediaInfo() int cellSailDescriptorSetAutoSelection(vm::ptr pSelf, bool autoSelection) { - cellSail->Todo("cellSailDescriptorSetAutoSelection(pSelf_addr=0x%x, autoSelection=%b)", pSelf.addr(), autoSelection); + cellSail->Todo("cellSailDescriptorSetAutoSelection(pSelf_addr=0x%x, autoSelection=%s)", pSelf.addr(), autoSelection ? "true" : "false"); - pSelf->autoSelection = autoSelection; + if (pSelf) { + pSelf->autoSelection = autoSelection; + return autoSelection; + } - return autoSelection; + return CELL_OK; } int cellSailDescriptorIsAutoSelection(vm::ptr pSelf) { cellSail->Warning("cellSailDescriptorIsAutoSelection(pSelf_addr=0x%x)", pSelf.addr()); - return pSelf->autoSelection; + + if (pSelf) + return pSelf->autoSelection; + + return CELL_OK; } int cellSailDescriptorCreateDatabase() @@ -595,7 +602,7 @@ int cellSailPlayerAddDescriptor(vm::ptr pSelf, vm::ptrWarning("cellSailPlayerAddDescriptor(pSelf_addr=0x%x, pDesc_addr=0x%x)", pSelf.addr(), pDesc.addr()); - if (pSelf->descriptors < 3 && pDesc) + if (pSelf && pSelf->descriptors < 3 && pDesc) { pSelf->descriptors++; pSelf->registeredDescriptors[pSelf->descriptors] = pDesc;