From cd398eb119442ad95d71c98cafda5cdd7d5b8e6b Mon Sep 17 00:00:00 2001 From: Max <34987259+mparisi20@users.noreply.github.com> Date: Fri, 12 Dec 2025 15:45:53 -0500 Subject: [PATCH] Match gf_file_io_handle.cpp --- config/RSBE01_02/splits.txt | 3 + config/RSBE01_02/symbols.txt | 38 +-- configure.py | 1 + include/lib/BrawlHeaders | 2 +- src/sora/gf/gf_file_io_handle.cpp | 431 ++++++++++++++++++++++++++++++ src/sora/ty/ty_fig_listmng.cpp | 6 +- 6 files changed, 457 insertions(+), 24 deletions(-) create mode 100644 src/sora/gf/gf_file_io_handle.cpp diff --git a/config/RSBE01_02/splits.txt b/config/RSBE01_02/splits.txt index d7b4a0d..759ecf9 100644 --- a/config/RSBE01_02/splits.txt +++ b/config/RSBE01_02/splits.txt @@ -59,6 +59,9 @@ sora/gf/gf_error_check.cpp: .bss start:0x804948E8 end:0x80494900 .sdata start:0x8059C508 end:0x8059C520 +sora/gf/gf_file_io_handle.cpp: + .text start:0x80020B38 end:0x80022054 + sora/gf/gf_gameframe_counter.cpp: .text start:0x800241B4 end:0x800242DC diff --git a/config/RSBE01_02/symbols.txt b/config/RSBE01_02/symbols.txt index fda78b5..1f7d278 100644 --- a/config/RSBE01_02/symbols.txt +++ b/config/RSBE01_02/symbols.txt @@ -2408,32 +2408,32 @@ checkFreeSize__14gfFileIOHandleFPCc = .text:0x800212B0; // type:function size:0x del__14gfFileIOHandleFPCc = .text:0x8002134C; // type:function size:0x9C writeNAND__14gfFileIOHandleFPviPCc = .text:0x800213E8; // type:function size:0xB0 readRequest__14gfFileIOHandleFPCcQ25Heaps8HeapTypeii = .text:0x80021498; // type:function size:0xA8 -readRequest1__14gfFileIOHandleFv = .text:0x80021540; // type:function size:0xA0 +readRequest__14gfFileIOHandleFPCcPCvii = .text:0x80021540; // type:function size:0xA0 readRequest__14gfFileIOHandleFPCcPvii = .text:0x800215E0; // type:function size:0xA0 readRequestCached__14gfFileIOHandleFPCcQ25Heaps8HeapTypeii = .text:0x80021680; // type:function size:0xB8 -readRequestCached__14gfFileIOHandleFPcPvii = .text:0x80021738; // type:function size:0xB0 +readRequestCached__14gfFileIOHandleFPCcPCvii = .text:0x80021738; // type:function size:0xB0 readRequestCached__14gfFileIOHandleFPCcPvii = .text:0x800217E8; // type:function size:0xB0 readRequestNoSync__14gfFileIOHandleFPCcQ25Heaps8HeapTypeii = .text:0x80021898; // type:function size:0xA8 readRequestNoSync__14gfFileIOHandleFPCcPvii = .text:0x80021940; // type:function size:0xA0 read__14gfFileIOHandleFPCcQ25Heaps8HeapTypei = .text:0x800219E0; // type:function size:0x12C -read__14gfFileIOHandleFPCcPvi = .text:0x80021B0C; // type:function size:0x124 -read2__14gfFileIOHandleFv = .text:0x80021C30; // type:function size:0x124 +read__14gfFileIOHandleFPCcPCvi = .text:0x80021B0C; // type:function size:0x124 +read__14gfFileIOHandleFPCcPvi = .text:0x80021C30; // type:function size:0x124 writeRequest__14gfFileIOHandleFPCcPvii = .text:0x80021D54; // type:function size:0x90 cancelRequest__14gfFileIOHandleFv = .text:0x80021DE4; // type:function size:0x114 -isCancelRequested__14gfFileIOHandleFv = .text:0x80021EF8; // type:function size:0x24 -isCanceled__14gfFileIOHandleFv = .text:0x80021F1C; // type:function size:0x1C -isReady__14gfFileIOHandleFv = .text:0x80021F38; // type:function size:0x30 -getReturnStatus__14gfFileIOHandleFv = .text:0x80021F68; // type:function size:0x20 -getSize__14gfFileIOHandleFv = .text:0x80021F88; // type:function size:0xC -getBuffer__14gfFileIOHandleFv = .text:0x80021F94; // type:function size:0xC -getPool__14gfFileIOHandleFv = .text:0x80021FA0; // type:function size:0xC +isCancelRequested__14gfFileIOHandleCFv = .text:0x80021EF8; // type:function size:0x24 +isCanceled__14gfFileIOHandleCFv = .text:0x80021F1C; // type:function size:0x1C +isReady__14gfFileIOHandleCFv = .text:0x80021F38; // type:function size:0x30 +getReturnStatus__14gfFileIOHandleCFv = .text:0x80021F68; // type:function size:0x20 +getSize__14gfFileIOHandleCFv = .text:0x80021F88; // type:function size:0xC +getBuffer__14gfFileIOHandleCFv = .text:0x80021F94; // type:function size:0xC +getPool__14gfFileIOHandleCFv = .text:0x80021FA0; // type:function size:0xC release__14gfFileIOHandleFv = .text:0x80021FAC; // type:function size:0xA8 fn_80022054 = .text:0x80022054; // type:function size:0x16C fn_800221C0 = .text:0x800221C0; // type:function size:0x78 -fn_80022238 = .text:0x80022238; // type:function size:0xE4 -fn_8002231C = .text:0x8002231C; // type:function size:0x80 -setReadParam__15gfFileIORequestFP15gfFileIORequestPCcPvii = .text:0x8002239C; // type:function size:0x80 -fn_8002241C = .text:0x8002241C; // type:function size:0x74 +setParam__15gfFileIORequestFPCc = .text:0x80022238; // type:function size:0xE4 +setReadParam__15gfFileIORequestFPCcPCvii = .text:0x8002231C; // type:function size:0x80 +setReadParam__15gfFileIORequestFPCcPvii = .text:0x8002239C; // type:function size:0x80 +setWriteParam__15gfFileIORequestFPCcPvii = .text:0x8002241C; // type:function size:0x74 fn_80022490 = .text:0x80022490; // type:function size:0x300 fn_80022790 = .text:0x80022790; // type:function size:0x300 fn_80022A90 = .text:0x80022A90; // type:function size:0x38 @@ -2442,9 +2442,9 @@ fn_80022DD0 = .text:0x80022DD0; // type:function size:0x14 fn_80022DE4 = .text:0x80022DE4; // type:function size:0x2C fn_80022E10 = .text:0x80022E10; // type:function size:0x174 fn_80022F84 = .text:0x80022F84; // type:function size:0x510 -fn_80023494 = .text:0x80023494; // type:function size:0x60 -fn_800234F4 = .text:0x800234F4; // type:function size:0xCC -fn_800235C0 = .text:0x800235C0; // type:function size:0x1E0 +push__15gfFileIOManagerFP15gfFileIORequest = .text:0x80023494; // type:function size:0x60 +allocRequest__15gfFileIOManagerFv = .text:0x800234F4; // type:function size:0xCC +freeRequest__15gfFileIOManagerFP15gfFileIORequest = .text:0x800235C0; // type:function size:0x1E0 fn_800237A0 = .text:0x800237A0; // type:function size:0x104 fn_800238A4 = .text:0x800238A4; // type:function size:0x10 fn_800238B4 = .text:0x800238B4; // type:function size:0x38 @@ -30630,7 +30630,7 @@ lbl_8059FFE4 = .sbss:0x8059FFE4; // type:object size:0x4 data:4byte lbl_8059FFE8 = .sbss:0x8059FFE8; // type:object size:0x4 data:4byte lbl_8059FFEC = .sbss:0x8059FFEC; // type:object size:0x4 data:4byte lbl_8059FFF0 = .sbss:0x8059FFF0; // type:object size:0x4 data:4byte -lbl_8059FFF4 = .sbss:0x8059FFF4; // type:object size:0x4 data:4byte +g_gfFileIOManager = .sbss:0x8059FFF4; // type:object size:0x4 data:4byte lbl_8059FFF8 = .sbss:0x8059FFF8; // type:object size:0x1 data:byte lbl_8059FFFC = .sbss:0x8059FFFC; // type:object size:0x4 data:4byte lbl_805A0000 = .sbss:0x805A0000; // type:object size:0x8 data:byte diff --git a/configure.py b/configure.py index 1a6dd9e..541d1f4 100755 --- a/configure.py +++ b/configure.py @@ -298,6 +298,7 @@ def MatchingFor(*versions): Object(Matching, "sora/gf/gf_callback.cpp"), Object(Matching, "sora/gf/gf_decomp.cpp"), Object(Matching, "sora/gf/gf_error_check.cpp"), + Object(Matching, "sora/gf/gf_file_io_handle.cpp"), Object(Matching, "sora/gf/gf_gameframe_counter.cpp"), Object(Matching, "sora/gf/gf_keep_fb.cpp"), Object(Matching, "sora/gf/gf_memory_util.cpp"), diff --git a/include/lib/BrawlHeaders b/include/lib/BrawlHeaders index db488a5..fc62292 160000 --- a/include/lib/BrawlHeaders +++ b/include/lib/BrawlHeaders @@ -1 +1 @@ -Subproject commit db488a5d48b30ea1075a6db37d6c40112de2ddbc +Subproject commit fc62292e773cc3157656ed7ad5dfaab226c1cb9a diff --git a/src/sora/gf/gf_file_io_handle.cpp b/src/sora/gf/gf_file_io_handle.cpp new file mode 100644 index 0000000..9824651 --- /dev/null +++ b/src/sora/gf/gf_file_io_handle.cpp @@ -0,0 +1,431 @@ +#include +#include +#include +#include +#include +#include +#include + +#pragma dont_inline on +gfFileIOHandle::~gfFileIOHandle() { + if (m_request) { + release(); + } +} +#pragma dont_inline reset + +void gfFileIOHandle::setNotify(void* notify) { + ensureLoaded(); + m_request->m_notifyCallback = notify; +} + +bool gfFileIOHandle::createDirRequest(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::CreateDir; + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::checkFileRequest(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_heap = nullptr; + m_request->m_kind = gfFileIORequest::CheckFile; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::findfirstRequest(const char* filepath, HeapType heap) { + void* heapPtr = gfHeapManager::getHeap(heap); + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_heap = heapPtr; + m_request->m_kind = gfFileIORequest::FindFirst; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::findFileCountRequest(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::FindFileCount; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::checkDirRequest(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::CheckDir; + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::createVFSystemFile(const char* filepath, int length) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::CreateVFSystemFile; + m_request->m_readLen = length; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::mountVF(u8 p1, const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::MountVF; + m_request->m_vfUnk = p1; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::unmountVF(u8 p1) { + ensureLoaded(); + if (m_request) { + m_request->setParam(nullptr); + m_request->m_kind = gfFileIORequest::UnmountVF; + m_request->m_vfUnk = p1; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::formatVF(int p1) { + ensureLoaded(); + if (m_request) { + m_request->setParam(nullptr); + m_request->m_kind = gfFileIORequest::FormatVF; + m_request->m_vfUnk = p1; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::mountSD() { + ensureLoaded(); + if (m_request) { + m_request->setParam(nullptr); + m_request->m_kind = gfFileIORequest::MountSD; + m_request->m_vfUnk = 0; + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::unmountSD() { + ensureLoaded(); + if (m_request) { + m_request->setParam(nullptr); + m_request->m_kind = gfFileIORequest::UnmountSD; + m_request->m_vfUnk = 0; + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + + +bool gfFileIOHandle::checkFreeSize(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::CheckFreeSize; + m_request->m_vfUnk = 0; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::del(const char* filepath) { + ensureLoaded(); + if (m_request) { + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::Del; + m_request->m_vfUnk = 0; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::writeNAND(void* addr, int length, const char* filepath) { + ensureLoaded(); + m_request->setParam(filepath); + m_request->m_kind = gfFileIORequest::WriteNAND; + m_request->m_readLen = length; + m_request->m_dest = addr; + m_request->m_offset = 0; + g_gfFileIOManager->push(m_request); + return true; +} + +bool gfFileIOHandle::readRequest(const char* filepath, HeapType heap, int length, int offset) { + const void* heapPtr = gfHeapManager::getHeap(heap); + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequest(const char* filepath, const void* heapPtr, int length, int offset) { + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequest(const char* filepath, void* heapPtr, int length, int offset) { + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequestCached(const char* filepath, HeapType heap, int length, int offset) { + const void* heapPtr = gfHeapManager::getHeap(heap); + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->m_isCached = true; + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequestCached(const char* filepath, const void* heapPtr, int length, int offset) { + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->m_isCached = true; + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequestCached(const char* filepath, void* heapPtr, int length, int offset) { + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->m_isCached = true; + m_request->unk18_1 = true; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequestNoSync(const char* filepath, HeapType heap, int length, int offset) { + const void* heapPtr = gfHeapManager::getHeap(heap); + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::readRequestNoSync(const char* filepath, void* heapPtr, int length, int offset) { + ensureLoaded(); + if (m_request) { + m_request->setReadParam(filepath, heapPtr, length, offset); + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; + } + return false; +} + +bool gfFileIOHandle::read(const char* filepath, HeapType heap, int offset) { + const void* heapPtr = gfHeapManager::getHeap(heap); + ensureLoaded(); + m_request->setReadParam(filepath, heapPtr, 0, offset); + m_request->unk17_2 = false; + m_request->unk18_0 = true; + g_gfFileIOManager->push(m_request); + + goto loop; +sleep: + OSSleepTicks((OS_BUS_CLOCK_SPEED / 4) / 1000); +loop: + if (isReady()) { + goto end; + } + goto sleep; +end: + return !getReturnStatus(); +} + +bool gfFileIOHandle::read(const char* filepath, const void* heapPtr, int offset) { + ensureLoaded(); + m_request->setReadParam(filepath, heapPtr, 0, offset); + m_request->unk17_2 = false; + m_request->unk18_0 = true; + g_gfFileIOManager->push(m_request); + + goto loop; +sleep: + OSSleepTicks((OS_BUS_CLOCK_SPEED / 4) / 1000); +loop: + if (isReady()) { + goto end; + } + goto sleep; +end: + return !getReturnStatus(); +} + +bool gfFileIOHandle::read(const char* filepath, void* heapPtr, int offset) { + ensureLoaded(); + m_request->setReadParam(filepath, heapPtr, 0, offset); + m_request->unk17_2 = false; + m_request->unk18_0 = true; + g_gfFileIOManager->push(m_request); + + goto loop; +sleep: + OSSleepTicks((OS_BUS_CLOCK_SPEED / 4) / 1000); +loop: + if (isReady()) { + goto end; + } + goto sleep; +end: + return !getReturnStatus(); +} + +bool gfFileIOHandle::writeRequest(const char* filepath, void* heapPtr, int length, int offset) { + ensureLoaded(); + m_request->setWriteParam(filepath, heapPtr, length, offset); + m_request->unk17_2 = false; + g_gfFileIOManager->push(m_request); + return true; +} + +bool gfFileIOHandle::cancelRequest() { + bool res = false; + if (m_request) { + if (!m_request->m_isCancelRequested) { + int status = OSDisableInterrupts(); + bool r30 = m_request->unk17_0; + if (!r30) { + m_request->m_isCancelRequested = true; + } + OSRestoreInterrupts(status); + if (r30) { + if (!m_request->m_kind && m_request->m_heap && m_request->m_dest) { + gfHeapManager::free(m_request->m_dest); + m_request->m_dest = nullptr; + m_request->m_isCancelRequested = true; + m_request->m_isCanceled = true; + m_request->m_isReady = true; + } else { + m_request->m_isCancelRequested = true; + m_request->m_isCanceled = true; + } + } + res = true; + } + m_request->m_notifyCallback = nullptr; + } + return res; +} + +bool gfFileIOHandle::isCancelRequested() const { + return m_request && m_request->m_isCancelRequested; +} + +bool gfFileIOHandle::isCanceled() const { + bool res = false; + if (m_request->m_isCanceled) { + res = true; + } + return res; +} + +bool gfFileIOHandle::isReady() const { + return m_request == nullptr ? true : m_request->m_isReady == true; +} + +int gfFileIOHandle::getReturnStatus() const { + return !m_request ? 21 : m_request->m_returnStatus; +} + +int gfFileIOHandle::getSize() const { + return m_request->m_readLen; +} + +void* gfFileIOHandle::getBuffer() const { + return m_request->m_dest; +} + +void* gfFileIOHandle::getPool() const { + return m_request->m_heap; +} + +void gfFileIOHandle::release() { + if (m_request) { + bool r31 = true; + if (m_request->m_isCancelRequested && !m_request->m_isCanceled) { + int status = OSDisableInterrupts(); + if (!m_request->m_isCanceled) { + m_request->unk17_11 = true; + m_request->m_notifyCallback = nullptr; + r31 = false; + } + OSRestoreInterrupts(status); + } + if (r31) { + g_gfFileIOManager->freeRequest(m_request); + } + m_request->m_notifyCallback = nullptr; + m_request = nullptr; + } +} diff --git a/src/sora/ty/ty_fig_listmng.cpp b/src/sora/ty/ty_fig_listmng.cpp index 384d24d..51cc475 100644 --- a/src/sora/ty/ty_fig_listmng.cpp +++ b/src/sora/ty/ty_fig_listmng.cpp @@ -5,10 +5,8 @@ #include #include -tyFigListDataManager::tyFigListDataManager(bool loadFile) { - m_isLoaded = false; - m_fileHandle.fileToLoad = 0; - m_isUnloaded = true; +tyFigListDataManager::tyFigListDataManager(bool loadFile) : + m_isLoaded(false), m_isUnloaded(true) { if (loadFile) { loadRequest(); }