From 0f11b4020d667a22db8978231fd344cea2100251 Mon Sep 17 00:00:00 2001 From: DH Date: Fri, 5 Dec 2025 19:21:23 +0300 Subject: [PATCH] ipmi: implement basic PlayGo simulation --- rpcsx/ipmi.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/rpcsx/ipmi.cpp b/rpcsx/ipmi.cpp index b8fe62448..0ca98d8ba 100644 --- a/rpcsx/ipmi.cpp +++ b/rpcsx/ipmi.cpp @@ -874,7 +874,70 @@ void ipmi::createShellCoreObjects(orbis::Process *process) { createIpmiServer(process, "SceNpGameIntent"); createIpmiServer(process, "SceBgft"); createIpmiServer(process, "SceCntMgrService"); - createIpmiServer(process, "ScePlayGo"); + createIpmiServer(process, "ScePlayGo") + // .addSyncMethod(0x30000, + // [](std::uint32_t &result) { + // rx::println(stderr, + // "PlayGo: 0x30000"); + // result = 1; + // return 0; + // }) + // .addSyncMethod(0x30001, + // [](std::uint32_t unk) { + // rx::println(stderr, + // "PlayGo: 0x30001 {:x}", + // unk); + // return 0; + // }) + .addSyncMethod(0x30008, + [](std::vector> &out, + const std::vector> &in) { + // scePlayGoGetLocus + rx::println(stderr, "PlayGo: 0x30008 out {}, in {}", + out.size(), in.size()); + + std::memset(out[0].data(), 3, out[0].size()); + return orbis::ErrorCode{}; + }) + .addSyncMethod(0x3000a, + [](std::vector> &out, + const std::vector> &in) { + rx::println(stderr, "PlayGo: 0x3000a out {}, in {}", + out.size(), in.size()); + // scePlayGoGetToDoList + + if (out.size() != 2 || in.size() != 1) { + return orbis::ErrorCode::INVAL; + } + + std::memset(out[0].data(), 0, out[0].size()); + out[1] = toBytes(1000); + return orbis::ErrorCode{}; + }) + .addSyncMethod(0x3000e, + [](std::vector> &out, + const std::vector> &in) { + rx::println(stderr, "PlayGo: 0x3000a out {}, in {}", + out.size(), in.size()); + // scePlayGoGetChunkId + + if (out.size() != 2 || in.size() != 1) { + return orbis::ErrorCode::INVAL; + } + + std::memset(out[0].data(), 0, out[0].size()); + out[1] = toBytes(1); + return orbis::ErrorCode{}; + }) + + .addSyncMethod( + 0x3000f, [](std::uint32_t &result, std::uint32_t unk) { + rx::println(stderr, "PlayGo: 0x3000f {:x}", unk); + result = 1000; + std::this_thread::sleep_for(std::chrono::seconds(1)); + return 0; + }); + createIpmiServer(process, "SceCompAppProxyUtil"); createIpmiServer(process, "SceShareSpIpcService"); createIpmiServer(process, "SceRnpsAppMgr");