diff --git a/include/services/fs.hpp b/include/services/fs.hpp index f13341f7..960caaa6 100644 --- a/include/services/fs.hpp +++ b/include/services/fs.hpp @@ -37,6 +37,7 @@ class FSService { void createFile(u32 messagePointer); void closeArchive(u32 messagePointer); void deleteFile(u32 messagePointer); + void formatSaveData(u32 messagePointer); void getFormatInfo(u32 messagePointer); void getPriority(u32 messagePointer); void initialize(u32 messagePointer); diff --git a/src/core/services/fs.cpp b/src/core/services/fs.cpp index 2170a8fe..9f5ae451 100644 --- a/src/core/services/fs.cpp +++ b/src/core/services/fs.cpp @@ -19,6 +19,7 @@ namespace FSCommands { CloseArchive = 0x080E0080, IsSdmcDetected = 0x08170000, GetFormatInfo = 0x084500C2, + FormatSaveData = 0x084C0242, InitializeWithSdkVersion = 0x08610042, SetPriority = 0x08620040, GetPriority = 0x08630000 @@ -131,6 +132,7 @@ void FSService::handleSyncRequest(u32 messagePointer) { case FSCommands::CreateFile: createFile(messagePointer); break; case FSCommands::CloseArchive: closeArchive(messagePointer); break; case FSCommands::DeleteFile: deleteFile(messagePointer); break; + case FSCommands::FormatSaveData: formatSaveData(messagePointer); break; case FSCommands::GetFormatInfo: getFormatInfo(messagePointer); break; case FSCommands::GetPriority: getPriority(messagePointer); break; case FSCommands::Initialize: initialize(messagePointer); break; @@ -355,6 +357,31 @@ void FSService::getFormatInfo(u32 messagePointer) { mem.write8(messagePointer + 20, info.duplicateData ? 1 : 0); } +void FSService::formatSaveData(u32 messagePointer) { + const u32 archiveID = mem.read32(messagePointer + 4); + if (archiveID != ArchiveID::SaveData) + Helpers::panic("FS::FormatSaveData: Archive is not SaveData"); + + // Read path and path info + const u32 pathType = mem.read32(messagePointer + 8); + const u32 pathSize = mem.read32(messagePointer + 12); + const u32 pathPointer = mem.read32(messagePointer + 44); + auto path = readPath(pathType, pathPointer, pathSize); + // Size of a block. Seems to always be 0x200 + const u32 blockSize = mem.read32(messagePointer + 16); + + if (blockSize != 0x200 && blockSize != 0x1000) + Helpers::panic("FS::FormatSaveData: Invalid SaveData block size"); + + const u32 directoryNum = mem.read32(messagePointer + 20); // Max number of directories + const u32 fileNum = mem.read32(messagePointer + 24); // Max number of files + const u32 directoryBucketNum = mem.read32(messagePointer + 28); // Not sure what a directory bucket is...? + const u32 fileBucketNum = mem.read32(messagePointer + 32); // Same here + const bool duplicateData = mem.read8(messagePointer + 36) != 0; + + printf("Stubbed FS::FormatSaveData. File num: %d, directory num: %d\n", fileNum, directoryNum); +} + void FSService::getPriority(u32 messagePointer) { log("FS::GetPriority\n");