From 2b8fe71a82b74a2364bb29f23b7bafa28cd40061 Mon Sep 17 00:00:00 2001 From: Berk Date: Sun, 5 Jul 2026 22:08:53 +0300 Subject: [PATCH] [savedata-improvements-2] added sceSaveDataCreateTransactionResource (#20) --- src/SharpEmu.Libs/SaveData/SaveDataExports.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/SharpEmu.Libs/SaveData/SaveDataExports.cs b/src/SharpEmu.Libs/SaveData/SaveDataExports.cs index 28355a0..8b448ac 100644 --- a/src/SharpEmu.Libs/SaveData/SaveDataExports.cs +++ b/src/SharpEmu.Libs/SaveData/SaveDataExports.cs @@ -244,6 +244,36 @@ public static class SaveDataExports } } + private static int _nextTransactionResource; + [SysAbiExport( + Nid = "gjRZNnw0JPE", + ExportName = "sceSaveDataCreateTransactionResource", + Target = Generation.Gen4 | Generation.Gen5, + LibraryName = "libSceSaveData")] + public static int SaveDataCreateTransactionResource(CpuContext ctx) + { + var userId = unchecked((int)ctx[CpuRegister.Rdi]); + var reserved = ctx[CpuRegister.Rsi]; + var resourceAddress = ctx[CpuRegister.Rdx]; + + if (resourceAddress == 0) + { + return SetReturn(ctx, OrbisSaveDataErrorParameter); + } + + var id = (uint)Interlocked.Increment(ref _nextTransactionResource); + + if (!TryWriteUInt32(ctx, resourceAddress, id)) + { + return SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT); + } + + TraceSaveData( + $"create_transaction_resource user={userId} reserved=0x{reserved:X} resource_addr=0x{resourceAddress:X} id={id}"); + + return SetReturn(ctx, 0); + } + private static bool TryReadSearchCond(CpuContext ctx, ulong address, out SearchCond cond) { cond = default;