Demo: c_dylink OK, DynamicLink 99%

This commit is contained in:
LagoLunatic
2025-05-19 22:41:12 -04:00
parent ec17b3e819
commit 34214f75d8
5 changed files with 187 additions and 30 deletions
+92 -10
View File
@@ -50,32 +50,46 @@ DynamicModuleControlBase::DynamicModuleControlBase() {
}
BOOL DynamicModuleControlBase::link() {
#if VERSION != VERSION_DEMO
OSThread* thread = OSGetCurrentThread();
if (thread != &mainThread) {
OSReport_Error("DynamicModuleControlBase::link not mainthread %08x\n", thread);
}
#endif
if (mLinkCount == 0) {
do_load();
if (do_link() == false) {
return false;
}
#if VERSION == VERSION_DEMO
mDoLinkCount++;
#else
if (mDoLinkCount < 0xFFFF) {
mDoLinkCount++;
}
#endif
}
#if VERSION != VERSION_DEMO
JUT_ASSERT(100, mLinkCount < 65535);
#endif
#if VERSION == VERSION_DEMO
mLinkCount++;
#else
if (mLinkCount < 0xFFFF) {
mLinkCount++;
}
#endif
return true;
}
BOOL DynamicModuleControlBase::unlink() {
#if VERSION != VERSION_DEMO
OSThread* thread = OSGetCurrentThread();
if (thread != &mainThread) {
OSReport_Error("DynamicModuleControlBase::unlink not mainthread %08x\n", thread);
}
#endif
if (mLinkCount != 0) {
mLinkCount--;
@@ -106,16 +120,19 @@ bool DynamicModuleControlBase::force_unlink() {
}
void DynamicModuleControlBase::dump() {
u16 doLinkCount;
u16 linkCount;
DynamicModuleControlBase* current = getFirstClass();
size_t totalSize = 0;
JUTReportConsole_f("\nDynamicModuleControlBase::dump()\n");
JUTReportConsole_f("Do Ln Size Name\n");
while (current != NULL) {
doLinkCount = current->mDoLinkCount;
linkCount = current->mLinkCount;
if (doLinkCount != 0 || linkCount != 0) {
#if VERSION == VERSION_DEMO
u32 doLinkCount = current->mDoLinkCount;
u32 linkCount = current->mLinkCount;
#else
u16 doLinkCount = current->mDoLinkCount;
u16 linkCount = current->mLinkCount;
#endif
if (current->mDoLinkCount != 0 || current->mLinkCount != 0) {
u32 size = current->getModuleSize();
const char* name = current->getModuleName();
if (size < 0xFFFFFFFF) {
@@ -130,7 +147,9 @@ void DynamicModuleControlBase::dump() {
JUTReportConsole_f("%3d%3d ???? ????? %-4s %s\n", doLinkCount, linkCount, type,
name);
}
#if VERSION != VERSION_DEMO
current->dump2();
#endif
}
current = current->getNextClass();
}
@@ -143,9 +162,11 @@ DynamicModuleControl::DynamicModuleControl(char const* name) {
unk_24 = 0;
mName = name;
mResourceType = 0;
#if VERSION != VERSION_DEMO
unk_33 = 0;
mChecksum = 0;
mSize = 0;
#endif
mAsyncLoadCallback = NULL;
}
@@ -171,6 +192,10 @@ JKRArchive* DynamicModuleControl::mountCallback(void* param_0) {
return sArchive;
}
void DynamicModuleControl::mountCreate() {
mDoDvdThd_callback_c::create((mDoDvdThd_callback_func)DynamicModuleControl::callback, NULL);
}
bool DynamicModuleControl::initialize() {
sFileCache = NULL;
sAllocBytes = 0;
@@ -194,6 +219,48 @@ static u32 calcSum2(u16 const* data, u32 size) {
return sum;
}
#if VERSION == VERSION_DEMO
bool DynamicModuleControl::do_load() {
/* Nonmatching - sArchive load order */
if (mModule != NULL) {
return true;
}
char buffer[64];
snprintf(buffer, 64, "%s.rel", mName);
if (mModule == NULL && sArchive != NULL) {
if (mModule == NULL) {
mModule = (OSModuleHeader*)JKRGetResource('MMEM', buffer, sArchive);
if (mModule != NULL) {
mResourceType = 1;
}
}
if (mModule == NULL) {
mModule = (OSModuleHeader*)JKRGetResource('AMEM', buffer, sArchive);
if (mModule != NULL) {
mResourceType = 2;
}
}
if (mModule == NULL) {
mModule = (OSModuleHeader*)JKRGetResource('DMEM', buffer, sArchive);
if (mModule != NULL) {
mResourceType = 3;
}
}
}
if (mModule == NULL) {
mModule = (OSModuleHeader*)sFileCache->getResource('rels', buffer);
if (mModule != NULL) {
mResourceType = 3;
}
}
if (mModule == NULL) {
// "DynamicModuleControl::do_load() Resource load failure [%s]\n"
OSReport_Error("DynamicModuleControl::do_load() リソース読み込み失敗 [%s]\n", mName);
return false;
}
return true;
}
#else
bool DynamicModuleControl::do_load() {
if (mModule != NULL) {
return true;
@@ -287,6 +354,7 @@ bool DynamicModuleControl::do_load() {
}
return true;
}
#endif
BOOL DynamicModuleControl::do_load_async() {
if (mAsyncLoadCallback == NULL) {
@@ -312,12 +380,17 @@ BOOL DynamicModuleControl::do_load_async() {
bool DynamicModuleControl::do_unload() {
if (mModule != NULL) {
#if VERSION == VERSION_DEMO
JKRFileLoader::removeResource(mModule, NULL);
#else
JKRFree(mModule);
#endif
mModule = NULL;
}
return true;
}
#if VERSION != VERSION_DEMO
void DynamicModuleControl::dump2() {
if (mModule != NULL) {
OSSectionInfo* section = (OSSectionInfo*)mModule->info.sectionInfoOffset;
@@ -326,6 +399,7 @@ void DynamicModuleControl::dump2() {
mModule->impSize);
}
}
#endif
BOOL DynamicModuleControl::do_link() {
OSGetTime();
@@ -333,8 +407,10 @@ BOOL DynamicModuleControl::do_link() {
do_load();
}
if (mModule != NULL) {
JUT_ASSERT(613, mModule->info.sectionInfoOffset < 0x80000000);
JUT_ASSERT(VERSION_SELECT(501, 613, 613, 613), mModule->info.sectionInfoOffset < 0x80000000);
#if VERSION != VERSION_DEMO
JUT_ASSERT(615, (u32)mModule + mModule->fixSize < 0x82000000);
#endif
OSGetTime();
OSGetTime();
if (mModule->info.version >= 3) {
@@ -402,7 +478,7 @@ BOOL DynamicModuleControl::do_link() {
}
}
} else {
JUT_ASSERT(724, FALSE);
JUT_ASSERT(VERSION_SELECT(610, 724, 724, 724), FALSE);
}
OSGetTime();
sAllocBytes = sAllocBytes + getModuleSize();
@@ -413,13 +489,19 @@ BOOL DynamicModuleControl::do_link() {
}
error:
#if VERSION != VERSION_DEMO
unk_33 = 0;
#endif
if (mBss != NULL) {
JKRHeap::free(mBss, NULL);
JKRFree(mBss);
mBss = NULL;
}
if (mModule != NULL) {
#if VERSION == VERSION_DEMO
JKRFileLoader::removeResource(mModule, NULL);
#else
JKRHeap::free(mModule, NULL);
#endif
mModule = NULL;
}
return FALSE;
@@ -484,7 +566,7 @@ extern "C" void ModuleUnresolved() {
}
extern "C" void ModuleConstructorsX(void (**_ctors)()) {
JUT_ASSERT(850, _ctors);
JUT_ASSERT(VERSION_SELECT(726, 850, 850, 850), _ctors);
while (*_ctors != 0) {
(**_ctors)();
_ctors++;
@@ -492,7 +574,7 @@ extern "C" void ModuleConstructorsX(void (**_ctors)()) {
}
extern "C" void ModuleDestructorsX(void (**_dtors)()) {
JUT_ASSERT(864, _dtors);
JUT_ASSERT(VERSION_SELECT(740, 864, 864, 864), _dtors);
while (*_dtors != 0) {
(**_dtors)();
_dtors++;