diff --git a/rpcs3/Emu/Cell/PPUInterpreter.cpp b/rpcs3/Emu/Cell/PPUInterpreter.cpp index e50db64530..9806f57e6b 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.cpp +++ b/rpcs3/Emu/Cell/PPUInterpreter.cpp @@ -4405,7 +4405,15 @@ bool ppu_interpreter::LBZU(ppu_thread& ppu, ppu_opcode_t op) bool ppu_interpreter::STW(ppu_thread& ppu, ppu_opcode_t op) { const u64 addr = op.ra ? ppu.gpr[op.ra] + op.simm16 : op.simm16; - vm::write32(vm::cast(addr, HERE), (u32)ppu.gpr[op.rs]); + const u32 value = (u32)ppu.gpr[op.rs]; + vm::write32(vm::cast(addr, HERE), value); + + //Insomniac engine v3 & v4 (newer R&C, Fuse, Resitance 3) + if (UNLIKELY(value == 0xAAAAAAAA)) + { + vm::reservation_update(addr, 128); + } + return true; } diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 95e8d8e24a..b611e7fff7 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1309,6 +1309,7 @@ extern void ppu_initialize(const ppu_module& info) { "__lvrx", s_use_ssse3 ? (u64)&sse_cellbe_lvrx : (u64)&sse_cellbe_lvrx_v0 }, { "__stvlx", s_use_ssse3 ? (u64)&sse_cellbe_stvlx : (u64)&sse_cellbe_stvlx_v0 }, { "__stvrx", s_use_ssse3 ? (u64)&sse_cellbe_stvrx : (u64)&sse_cellbe_stvrx_v0 }, + { "__resupdate", (u64)&vm::reservation_update }, }; for (u64 index = 0; index < 1024; index++) diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 37230509c4..63803e17b8 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -3407,7 +3407,18 @@ void PPUTranslator::STW(ppu_opcode_t op) m_rel = nullptr; } - WriteMemory(op.ra ? m_ir->CreateAdd(GetGpr(op.ra), imm) : imm, GetGpr(op.rs, 32)); + const auto value = GetGpr(op.rs, 32); + const auto addr = op.ra ? m_ir->CreateAdd(GetGpr(op.ra), imm) : imm; + WriteMemory(addr, value); + + //Insomniac engine v3 & v4 (newer R&C, Fuse, Resitance 3) + if (auto ci = llvm::dyn_cast(value)) + { + if (ci->getZExtValue() == 0xAAAAAAAA) + { + Call(GetType(), "__resupdate", m_thread, addr, m_ir->getInt32(128)); + } + } } void PPUTranslator::STWU(ppu_opcode_t op)