From 9803b1c784b5f1396b9cfd64d0ff38f4dd8b0f89 Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sat, 2 Jul 2022 22:01:27 +0300 Subject: [PATCH 1/5] request things --- source/game/system/ResourceManager.cpp | 27 ++++++++++++++++++++++---- source/game/system/ResourceManager.hpp | 11 +++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index 78a986836..1d5e6eec3 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -827,7 +827,7 @@ void ResourceManager::attachArcResourceAccessor(void* arcResourceAccessor, } else { archiveStart = nullptr; } - + ArcResourceAccessor_attach(arcResourceAccessor, archiveStart, dirname); } @@ -1008,7 +1008,7 @@ char* _unk_getNullString() { return ""; } // Symbol: unk_80541c48 // PAL: 0x80541c48..0x80541cbc -MARK_BINARY_BLOB(unk_80541c48, 0x80541c48, 0x80541cbc); +/*MARK_BINARY_BLOB(unk_80541c48, 0x80541c48, 0x80541cbc); asm UNKNOWN_FUNCTION(unk_80541c48) { // clang-format off nofralloc; @@ -1045,11 +1045,11 @@ asm UNKNOWN_FUNCTION(unk_80541c48) { addi r1, r1, 0x10; blr; // clang-format on -} +}*/ // Symbol: unk_80541cbc // PAL: 0x80541cbc..0x80541ce0 -MARK_BINARY_BLOB(unk_80541cbc, 0x80541cbc, 0x80541ce0); +/*MARK_BINARY_BLOB(unk_80541cbc, 0x80541cbc, 0x80541ce0); asm UNKNOWN_FUNCTION(unk_80541cbc) { // clang-format off nofralloc; @@ -1064,8 +1064,27 @@ asm UNKNOWN_FUNCTION(unk_80541cbc) { li r3, 0; blr; // clang-format on +}*/ +namespace System { +bool ResourceManager::tryRequestTask(EGG::TaskThread::TFunction fun, + void* arg) { + bool res = this->requestTask(fun, arg, (void*)0x10000001); + if (res) { + this->process(); + } + return res; } +bool ResourceManager::requestTask(EGG::TaskThread::TFunction fun, void* arg, + void* _8) { + if (this->requestsEnabled) { + this->requestPending = true; + return this->taskThread->request(fun, arg, _8); + } + return false; +} +} // namespace System + // Symbol: unk_80541ce0 // PAL: 0x80541ce0..0x80541e44 MARK_BINARY_BLOB(unk_80541ce0, 0x80541ce0, 0x80541e44); diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index e4961298d..beab4058d 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -270,12 +270,12 @@ class ResourceManager { bool _60d; // these variables don't have names yet, but are used EGG::ExpHeap* _610; EGG::Heap* _614; - bool _618; - bool _619; + bool requestPending; + bool requestsEnabled; void foo() volatile { - _618 = 0; - _619 = 1; + requestPending = false; + requestsEnabled = true; } void bar() volatile { _614 = 0; @@ -335,6 +335,9 @@ class ResourceManager { const char* dirname); u16 getLoadedArchiveCount(s32 idx); u16 getMenuArchiveCount(); + bool tryRequestTask(EGG::TaskThread::TFunction mainFunction, void* arg); + bool requestTask(EGG::TaskThread::TFunction mainFunction, void* arg, + void* _8); void attachArcResourceAccessor(void* arcResourceAccessor, const char* dirname); void preloadCourseAsync(CourseId courseId); From c19a7b390cae4c1304f9f6d8bd43b85e0843f20d Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sun, 3 Jul 2022 00:12:42 +0300 Subject: [PATCH 2/5] doLoadGlobe --- source/game/system/ResourceManager.cpp | 26 +++++++++++++++++++++++++- source/game/system/ResourceManager.hpp | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index 1d5e6eec3..cb8d477e7 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #pragma dont_reuse_strings on @@ -1643,7 +1645,7 @@ asm UNKNOWN_FUNCTION(unk_8054247c) { // Symbol: unk_8054248c // PAL: 0x8054248c..0x80542524 -MARK_BINARY_BLOB(unk_8054248c, 0x8054248c, 0x80542524); +/*MARK_BINARY_BLOB(unk_8054248c, 0x8054248c, 0x80542524); asm UNKNOWN_FUNCTION(unk_8054248c) { // clang-format off nofralloc; @@ -1686,7 +1688,29 @@ asm UNKNOWN_FUNCTION(unk_8054248c) { addi r1, r1, 0x40; blr; // clang-format on +}*/ + +namespace System { +void ResourceManager::FUN_8054248c(EGG::Heap* globeHeap) { + EGG::LZStreamDecomp lzstream; + + const char* globePath = Resource::GetResourcePath(SYS_RES_GLOBE); + EGG::Archive* globeArchive = (EGG::Archive*)EGG::Archive::loadFromDisc( + globePath, globeHeap, 0xffffffe0); + globeArchive = + EGG::Archive::mountNoFastGet(globeArchive, globeHeap, 0xffffffe0); + + EGG::Archive::FileInfo globeInfo; + globeInfo.startOffset = 0; + globeInfo.length = 0; + globeArchive->getFile(EarthResourceListing, &globeInfo); + globePath = Resource::GetResourcePath(SYS_RES_GLOBE); + + EGG::DvdRipper::loadToMainRAMDecomp( + globePath, &lzstream, 0, globeHeap, EGG::DvdRipper::ALLOC_DIR_TOP, + globeInfo.startOffset, globeInfo.length, 0x20000); } +} // namespace System // Symbol: unk_80542524 // PAL: 0x80542524..0x80542584 diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index beab4058d..28bc4ccb5 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -341,6 +341,7 @@ class ResourceManager { void attachArcResourceAccessor(void* arcResourceAccessor, const char* dirname); void preloadCourseAsync(CourseId courseId); + static void FUN_8054248c(EGG::Heap* globeHeap); void clear(); void process(); static void doLoadTask(void* jobContext); From 60e56316a04089b5d606963a5293ec0c0a10cd69 Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sun, 3 Jul 2022 11:59:20 +0300 Subject: [PATCH 3/5] globe loads --- source/egg/core/eggStreamDecomp.hpp | 9 +- source/game/system/ResourceManager.cpp | 296 ++----------------------- source/game/system/ResourceManager.hpp | 12 +- 3 files changed, 25 insertions(+), 292 deletions(-) diff --git a/source/egg/core/eggStreamDecomp.hpp b/source/egg/core/eggStreamDecomp.hpp index cb95d0ee8..11e3b94ee 100644 --- a/source/egg/core/eggStreamDecomp.hpp +++ b/source/egg/core/eggStreamDecomp.hpp @@ -16,10 +16,11 @@ namespace EGG { //! class StreamDecomp { public: - virtual bool init(void* dst, u32 maxCompressedSize) = 0; - virtual bool decomp(const void* src, u32 len) = 0; - virtual u32 getHeaderSize() = 0; - virtual u32 getUncompressedSize(const void* src) = 0; + virtual bool init(void* dst, u32 maxCompressedSize); + virtual bool decomp(const void* src, u32 len); + virtual u32 getHeaderSize(); + virtual u32 getUncompressedSize(const void* src); + void foo(); }; class LZStreamDecomp : public StreamDecomp { diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index cb8d477e7..806b09f05 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -176,7 +176,7 @@ extern UNKNOWN_FUNCTION(unk_805553b0); namespace System { -ResourceManager* ResourceManager::createInstance() { +volatile ResourceManager* ResourceManager::createInstance() { if (spInstance == nullptr) { spInstance = new ResourceManager(); } @@ -208,7 +208,7 @@ System::ResourceManager::~ResourceManager() { } void ResourceManager::doLoadTask(void* jobContext) { - JobContext* context = &spInstance->jobContexts[(s32)jobContext]; + JobContext* context = (JobContext*)&spInstance->jobContexts[(s32)jobContext]; switch ((s32)jobContext) { case 6: @@ -680,67 +680,6 @@ void* ResourceManager::getBspFile(s32 playerIdx, size_t* size) { : nullptr; } -} // namespace System -/* #else -MARK_BINARY_BLOB(ResourceManager_loadBSP, 0x805414a8, 0x8054155c); -asm UNKNOWN_FUNCTION(ResourceManager_loadBSP) { - // clang-format off - nofralloc; - stwu r1, -0x30(r1); - mflr r0; - stw r0, 0x34(r1); - mulli r0, r4, 0xf0; - lis r4, 0; - stw r31, 0x2c(r1); - mr r31, r5; - stw r30, 0x28(r1); - mr r30, r3; - lwz r6, 0(r4); - lis r4, 0; - addi r4, r4, 0; - add r3, r6, r0; - lwz r0, 0x30(r3); - addi r5, r4, 0x120; - addi r3, r1, 8; - li r4, 0x20; - cmpwi r0, 0x24; - blt lbl_805414fc; - li r6, 0; - b lbl_8054150c; -lbl_805414fc: - lis r6, 0; - slwi r0, r0, 2; - addi r6, r6, 0; - lwzx r6, r6, r0; -lbl_8054150c: - crclr 6; - bl unk_805553b0; - lwz r3, 4(r30); - lwz r3, 0(r3); - bl isLoaded__Q26System15MultiDvdArchiveFv; - cmpwi r3, 0; - beq lbl_80541540; - lwz r3, 4(r30); - mr r5, r31; - addi r4, r1, 8; - lwz r3, 0(r3); - bl getFile__Q26System15MultiDvdArchiveFPCcPUl; - b lbl_80541544; -lbl_80541540: - li r3, 0; -lbl_80541544: - lwz r0, 0x34(r1); - lwz r31, 0x2c(r1); - lwz r30, 0x28(r1); - mtlr r0; - addi r1, r1, 0x30; - blr; - // clang-format on -} -#endif */ - -namespace System { - void* ResourceManager::getFileCopy(s32 archiveIdx, char* filename, EGG::Heap* heap, size_t* size, s8 param_5) { return !isDvdArchiveLoaded(archiveIdx) ? nullptr @@ -936,7 +875,8 @@ namespace System { #pragma dont_inline on #endif void preloadCourseTask(void* courseId) { - ResourceManager::spInstance->courseCache.load((CourseId)courseId); + ((ResourceManager*)ResourceManager::spInstance) + ->courseCache.load((CourseId)courseId); } #ifdef __CWCC__ #pragma dont_inline off @@ -1008,65 +948,6 @@ void CourseCache::loadOther(MultiDvdArchive* other, EGG::Heap* heap) { char* _unk_getNullString() { return ""; } -// Symbol: unk_80541c48 -// PAL: 0x80541c48..0x80541cbc -/*MARK_BINARY_BLOB(unk_80541c48, 0x80541c48, 0x80541cbc); -asm UNKNOWN_FUNCTION(unk_80541c48) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - mflr r0; - stw r0, 0x14(r1); - stw r31, 0xc(r1); - stw r30, 8(r1); - mr r30, r3; - lbz r0, 0x619(r3); - cmpwi r0, 0; - beq lbl_80541c8c; - li r0, 1; - stb r0, 0x618(r3); - lis r6, 0x1000; - lwz r3, 0x584(r3); - addi r6, r6, 1; - bl unk_805553b0; - mr r31, r3; - b lbl_80541c90; -lbl_80541c8c: - li r31, 0; -lbl_80541c90: - cmpwi r31, 0; - beq lbl_80541ca0; - mr r3, r30; - bl process__Q26System15ResourceManagerFv; -lbl_80541ca0: - mr r3, r31; - lwz r31, 0xc(r1); - lwz r30, 8(r1); - lwz r0, 0x14(r1); - mtlr r0; - addi r1, r1, 0x10; - blr; - // clang-format on -}*/ - -// Symbol: unk_80541cbc -// PAL: 0x80541cbc..0x80541ce0 -/*MARK_BINARY_BLOB(unk_80541cbc, 0x80541cbc, 0x80541ce0); -asm UNKNOWN_FUNCTION(unk_80541cbc) { - // clang-format off - nofralloc; - lbz r0, 0x619(r3); - cmpwi r0, 0; - beq lbl_80541cd8; - li r0, 1; - stb r0, 0x618(r3); - lwz r3, 0x584(r3); - b unk_805553b0; -lbl_80541cd8: - li r3, 0; - blr; - // clang-format on -}*/ namespace System { bool ResourceManager::tryRequestTask(EGG::TaskThread::TFunction fun, void* arg) { @@ -1643,55 +1524,8 @@ asm UNKNOWN_FUNCTION(unk_8054247c) { // clang-format on } -// Symbol: unk_8054248c -// PAL: 0x8054248c..0x80542524 -/*MARK_BINARY_BLOB(unk_8054248c, 0x8054248c, 0x80542524); -asm UNKNOWN_FUNCTION(unk_8054248c) { - // clang-format off - nofralloc; - stwu r1, -0x40(r1); - mflr r0; - lis r4, 0; - stw r0, 0x44(r1); - addi r4, r4, 0; - stw r31, 0x3c(r1); - mr r31, r3; - li r3, 3; - stw r4, 0x10(r1); - bl unk_805553b0; - mr r4, r31; - li r5, -32; - bl unk_805553b0; - mr r4, r31; - li r5, -32; - bl unk_805553b0; - lis r4, 0; - li r0, 0; - stw r0, 8(r1); - addi r5, r1, 8; - lwz r4, 0(r4); - stw r0, 0xc(r1); - bl unk_805553b0; - li r3, 3; - bl unk_805553b0; - lwz r8, 8(r1); - mr r6, r31; - lwz r9, 0xc(r1); - addi r4, r1, 0x10; - li r5, 0; - li r7, 1; - lis r10, 2; - bl unk_805553b0; - lwz r0, 0x44(r1); - lwz r31, 0x3c(r1); - mtlr r0; - addi r1, r1, 0x40; - blr; - // clang-format on -}*/ - namespace System { -void ResourceManager::FUN_8054248c(EGG::Heap* globeHeap) { +u8* ResourceManager::FUN_8054248c(EGG::Heap* globeHeap) { EGG::LZStreamDecomp lzstream; const char* globePath = Resource::GetResourcePath(SYS_RES_GLOBE); @@ -1706,7 +1540,7 @@ void ResourceManager::FUN_8054248c(EGG::Heap* globeHeap) { globeArchive->getFile(EarthResourceListing, &globeInfo); globePath = Resource::GetResourcePath(SYS_RES_GLOBE); - EGG::DvdRipper::loadToMainRAMDecomp( + return EGG::DvdRipper::loadToMainRAMDecomp( globePath, &lzstream, 0, globeHeap, EGG::DvdRipper::ALLOC_DIR_TOP, globeInfo.startOffset, globeInfo.length, 0x20000); } @@ -1774,120 +1608,16 @@ asm UNKNOWN_FUNCTION(unk_80542584) { // clang-format on } -// Symbol: unk_805425d0 -// PAL: 0x805425d0..0x80542694 -MARK_BINARY_BLOB(unk_805425d0, 0x805425d0, 0x80542694); -asm UNKNOWN_FUNCTION(unk_805425d0) { - // clang-format off - nofralloc; - stwu r1, -0x50(r1); - mflr r0; - lis r4, 0; - lis r5, 0; - stw r0, 0x54(r1); - addi r4, r4, 0; - stw r31, 0x4c(r1); - stw r30, 0x48(r1); - stw r29, 0x44(r1); - stw r28, 0x40(r1); - mr r28, r3; - li r3, 3; - lwz r29, 0(r5); - lwz r30, 0x614(r29); - stw r4, 0x10(r1); - bl unk_805553b0; - mr r4, r30; - li r5, -32; - bl unk_805553b0; - mr r4, r30; - li r5, -32; - bl unk_805553b0; - lis r4, 0; - li r31, 0; - stw r31, 8(r1); - addi r5, r1, 8; - lwz r4, 0(r4); - stw r31, 0xc(r1); - bl unk_805553b0; - li r3, 3; - bl unk_805553b0; - lwz r8, 8(r1); - mr r6, r30; - lwz r9, 0xc(r1); - addi r4, r1, 0x10; - li r5, 0; - li r7, 1; - lis r10, 2; - bl unk_805553b0; - stw r3, 0(r28); - stb r31, 0x60c(r29); - lwz r0, 0x54(r1); - lwz r31, 0x4c(r1); - lwz r30, 0x48(r1); - lwz r29, 0x44(r1); - lwz r28, 0x40(r1); - mtlr r0; - addi r1, r1, 0x50; - blr; - // clang-format on +namespace System { +void ResourceManager::doLoadGlobe(u8** globeBlob) { + ResourceManager::spInstance->doLoadGlobeImpl(globeBlob); } -// Symbol: unk_80542694 -// PAL: 0x80542694..0x80542754 -MARK_BINARY_BLOB(unk_80542694, 0x80542694, 0x80542754); -asm UNKNOWN_FUNCTION(unk_80542694) { - // clang-format off - nofralloc; - stwu r1, -0x50(r1); - mflr r0; - lis r5, 0; - stw r0, 0x54(r1); - addi r5, r5, 0; - stw r31, 0x4c(r1); - stw r30, 0x48(r1); - stw r29, 0x44(r1); - mr r29, r4; - stw r28, 0x40(r1); - mr r28, r3; - lwz r30, 0x614(r3); - li r3, 3; - stw r5, 0x10(r1); - bl unk_805553b0; - mr r4, r30; - li r5, -32; - bl unk_805553b0; - mr r4, r30; - li r5, -32; - bl unk_805553b0; - lis r4, 0; - li r31, 0; - stw r31, 8(r1); - addi r5, r1, 8; - lwz r4, 0(r4); - stw r31, 0xc(r1); - bl unk_805553b0; - li r3, 3; - bl unk_805553b0; - lwz r8, 8(r1); - mr r6, r30; - lwz r9, 0xc(r1); - addi r4, r1, 0x10; - li r5, 0; - li r7, 1; - lis r10, 2; - bl unk_805553b0; - stw r3, 0(r29); - stb r31, 0x60c(r28); - lwz r0, 0x54(r1); - lwz r31, 0x4c(r1); - lwz r30, 0x48(r1); - lwz r29, 0x44(r1); - lwz r28, 0x40(r1); - mtlr r0; - addi r1, r1, 0x50; - blr; - // clang-format on +void ResourceManager::doLoadGlobeImpl(u8** globeBlob) volatile { + *globeBlob = ResourceManager::FUN_8054248c(this->globeHeap); + this->isGlobeLoadingBusy = false; } +} // namespace System // Symbol: unk_80542754 // PAL: 0x80542754..0x805427bc diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index 28bc4ccb5..2e1d0b58e 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -251,10 +251,10 @@ class ResourceManager { virtual ~ResourceManager(); public: - static ResourceManager* createInstance(); + static volatile ResourceManager* createInstance(); static void destroyInstance(); - static ResourceManager* spInstance; + static volatile ResourceManager* spInstance; ResourceManager(); @@ -269,7 +269,7 @@ class ResourceManager { bool isGlobeLoadingBusy; bool _60d; // these variables don't have names yet, but are used EGG::ExpHeap* _610; - EGG::Heap* _614; + EGG::Heap* globeHeap; bool requestPending; bool requestsEnabled; @@ -278,7 +278,7 @@ class ResourceManager { requestsEnabled = true; } void bar() volatile { - _614 = 0; + globeHeap = nullptr; isGlobeLoadingBusy = false; } @@ -341,7 +341,9 @@ class ResourceManager { void attachArcResourceAccessor(void* arcResourceAccessor, const char* dirname); void preloadCourseAsync(CourseId courseId); - static void FUN_8054248c(EGG::Heap* globeHeap); + static void doLoadGlobe(u8** glodeBlob); + void doLoadGlobeImpl(u8** glodeBlob) volatile; + static u8* FUN_8054248c(EGG::Heap* globeHeap); void clear(); void process(); static void doLoadTask(void* jobContext); From 7262b44c4c990e01c24d9b4f815d542a1f4ec74c Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Sun, 3 Jul 2022 12:43:03 +0300 Subject: [PATCH 4/5] load globe async --- source/game/system/ResourceManager.cpp | 46 ++++---------------------- source/game/system/ResourceManager.hpp | 12 ++++++- 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index 806b09f05..7c02f5dda 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -1609,53 +1609,21 @@ asm UNKNOWN_FUNCTION(unk_80542584) { } namespace System { -void ResourceManager::doLoadGlobe(u8** globeBlob) { - ResourceManager::spInstance->doLoadGlobeImpl(globeBlob); +void ResourceManager::doLoadGlobe(void* globeBlob) { + ResourceManager::spInstance->doLoadGlobeImpl((u8**)globeBlob); } void ResourceManager::doLoadGlobeImpl(u8** globeBlob) volatile { *globeBlob = ResourceManager::FUN_8054248c(this->globeHeap); this->isGlobeLoadingBusy = false; } -} // namespace System -// Symbol: unk_80542754 -// PAL: 0x80542754..0x805427bc -MARK_BINARY_BLOB(unk_80542754, 0x80542754, 0x805427bc); -asm UNKNOWN_FUNCTION(unk_80542754) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - mflr r0; - mr r5, r4; - stw r0, 0x14(r1); - lbz r0, 0x60c(r3); - cmpwi r0, 0; - beq lbl_80542778; - li r3, 0; - b lbl_805427ac; -lbl_80542778: - li r4, 1; - stb r4, 0x60c(r3); - lbz r0, 0x619(r3); - cmpwi r0, 0; - beq lbl_805427a8; - stb r4, 0x618(r3); - lis r4, 0; - lis r6, 0x1000; - lwz r3, 0x584(r3); - addi r4, r4, 0; - addi r6, r6, 4; - bl unk_805553b0; -lbl_805427a8: - li r3, 1; -lbl_805427ac: - lwz r0, 0x14(r1); - mtlr r0; - addi r1, r1, 0x10; - blr; - // clang-format on +bool ResourceManager::loadGlobeAsync(void* arg) { + return this->isGlobeLoadingBusy + ? false + : requestGlobeTaskHelper(arg, (void*)0x10000004); } +} // namespace System // Symbol: SaveManager_loadStaffGhostAsync // PAL: 0x805427bc..0x80542868 diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index 2e1d0b58e..c44d8f1e7 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -341,9 +341,19 @@ class ResourceManager { void attachArcResourceAccessor(void* arcResourceAccessor, const char* dirname); void preloadCourseAsync(CourseId courseId); - static void doLoadGlobe(u8** glodeBlob); + static void doLoadGlobe(void* glodeBlob); void doLoadGlobeImpl(u8** glodeBlob) volatile; + // for matching purposes + inline bool requestGlobeTaskHelper(void* arg, void* arg2) volatile { + this->isGlobeLoadingBusy = true; + if (this->requestsEnabled) { + this->requestPending = true; + this->taskThread->request(ResourceManager::doLoadGlobe, arg, arg2); + } + return true; + } static u8* FUN_8054248c(EGG::Heap* globeHeap); + bool loadGlobeAsync(void* arg); void clear(); void process(); static void doLoadTask(void* jobContext); From a970100c324be2c981ae762cadbaab698609357f Mon Sep 17 00:00:00 2001 From: Theodoros Tyrovouzis Date: Mon, 4 Jul 2022 00:34:41 +0300 Subject: [PATCH 5/5] (de)init globeHeap --- source/game/system/ResourceManager.cpp | 66 +++++++++++--------------- source/game/system/ResourceManager.hpp | 5 +- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/source/game/system/ResourceManager.cpp b/source/game/system/ResourceManager.cpp index 7c02f5dda..0c4535263 100644 --- a/source/game/system/ResourceManager.cpp +++ b/source/game/system/ResourceManager.cpp @@ -18,6 +18,13 @@ extern void ArcResourceAccessor_attach(void* arcResourceAccessor, extern const char* EarthResourceListing; +// TODO: Define externally +struct GameScene { + u8 _00[0xc94 - 0x0]; + HeapCollection dynamicHeaps; +}; +extern "C" GameScene* getGameScene(); + // .rodata const char* RESOURCES[] = { // clang-format off @@ -143,7 +150,7 @@ extern UNKNOWN_FUNCTION(getFileCopy__Q26System10DvdArchiveFPcPQ23EGG4HeapPUlSc); // PAL: 0x805192cc extern UNKNOWN_FUNCTION(unmount__Q26System10DvdArchiveFv); // PAL: 0x8051bed0 -extern UNKNOWN_FUNCTION(getGameScene); +// extern UNKNOWN_FUNCTION(getGameScene); extern UNKNOWN_FUNCTION( createMultiDvdArchive__6SystemFQ26System17ResourceChannelID); extern UNKNOWN_FUNCTION(__ct__Q26System16CourseDvdArchiveFv); @@ -970,8 +977,8 @@ bool ResourceManager::requestTask(EGG::TaskThread::TFunction fun, void* arg, // Symbol: unk_80541ce0 // PAL: 0x80541ce0..0x80541e44 -MARK_BINARY_BLOB(unk_80541ce0, 0x80541ce0, 0x80541e44); -asm UNKNOWN_FUNCTION(unk_80541ce0) { +MARK_BINARY_BLOB(flush__Q26System15ResourceManagerFv, 0x80541ce0, 0x80541e44); +asm UNKNOWN_FUNCTION(flush__Q26System15ResourceManagerFv) { // clang-format off nofralloc; stwu r1, -0x20(r1); @@ -1544,42 +1551,26 @@ u8* ResourceManager::FUN_8054248c(EGG::Heap* globeHeap) { globePath, &lzstream, 0, globeHeap, EGG::DvdRipper::ALLOC_DIR_TOP, globeInfo.startOffset, globeInfo.length, 0x20000); } -} // namespace System -// Symbol: unk_80542524 -// PAL: 0x80542524..0x80542584 -MARK_BINARY_BLOB(unk_80542524, 0x80542524, 0x80542584); -asm UNKNOWN_FUNCTION(unk_80542524) { - // clang-format off - nofralloc; - stwu r1, -0x10(r1); - mflr r0; - cmpwi r5, 0; - stw r0, 0x14(r1); - stw r31, 0xc(r1); - mr r31, r4; - stw r30, 8(r1); - mr r30, r3; - bne lbl_80542550; - bl getGameScene; - lwz r5, 0xc98(r3); -lbl_80542550: - addis r3, r31, 2; - mr r4, r5; - addi r0, r3, 0x41f; - li r5, 0; - rlwinm r3, r0, 0, 0, 0x1a; - bl unk_805553b0; - stw r3, 0x614(r30); - lwz r31, 0xc(r1); - lwz r30, 8(r1); - lwz r0, 0x14(r1); - mtlr r0; - addi r1, r1, 0x10; - blr; - // clang-format on +void ResourceManager::initGlobeHeap(size_t size, EGG::Heap* heap) { + if (heap == nullptr) { + GameScene* gameScene = getGameScene(); + heap = gameScene->dynamicHeaps.mpHeaps[1]; + } + this->globeHeap = EGG::ExpHeap::create(size + 0x2041fU & 0xffffffe0, heap, 0); } +} // namespace System +#ifdef MATCHING +namespace System { +void ResourceManager::deinitGlobeHeap() volatile { + this->flush(); + this->globeHeap->destroy(); + this->globeHeap = nullptr; + this->isGlobeLoadingBusy = false; +} +} // namespace System +#else // Symbol: unk_80542584 // PAL: 0x80542584..0x805425d0 MARK_BINARY_BLOB(unk_80542584, 0x80542584, 0x805425d0); @@ -1591,7 +1582,7 @@ asm UNKNOWN_FUNCTION(unk_80542584) { stw r0, 0x14(r1); stw r31, 0xc(r1); mr r31, r3; - bl unk_80541ce0; + bl flush__Q26System15ResourceManagerFv; lwz r3, 0x614(r31); lwz r12, 0(r3); lwz r12, 0x1c(r12); @@ -1607,6 +1598,7 @@ asm UNKNOWN_FUNCTION(unk_80542584) { blr; // clang-format on } +#endif namespace System { void ResourceManager::doLoadGlobe(void* globeBlob) { diff --git a/source/game/system/ResourceManager.hpp b/source/game/system/ResourceManager.hpp index c44d8f1e7..c00c2106c 100644 --- a/source/game/system/ResourceManager.hpp +++ b/source/game/system/ResourceManager.hpp @@ -125,7 +125,7 @@ UNKNOWN_FUNCTION(unk_80541c48); // PAL: 0x80541cbc..0x80541ce0 UNKNOWN_FUNCTION(unk_80541cbc); // PAL: 0x80541ce0..0x80541e44 -UNKNOWN_FUNCTION(unk_80541ce0); +// UNKNOWN_FUNCTION(flush__Q26System15ResourceManagerFv); // PAL: 0x80541e44..0x80542030 UNKNOWN_FUNCTION(unk_80541e44); // PAL: 0x80542030..0x80542210 @@ -341,6 +341,9 @@ class ResourceManager { void attachArcResourceAccessor(void* arcResourceAccessor, const char* dirname); void preloadCourseAsync(CourseId courseId); + void initGlobeHeap(size_t size, EGG::Heap* heap); + void flush() volatile; + void deinitGlobeHeap() volatile; static void doLoadGlobe(void* glodeBlob); void doLoadGlobeImpl(u8** glodeBlob) volatile; // for matching purposes