mirror of https://github.com/zeldaret/tp.git
745 lines
26 KiB
C++
745 lines
26 KiB
C++
//
|
|
// Generated By: dol2asm
|
|
// Translation Unit: DynamicLink
|
|
//
|
|
|
|
#include "DynamicLink.h"
|
|
#include "dol2asm.h"
|
|
#include "dolphin/types.h"
|
|
#include "dolphin/os/OS.h"
|
|
#include "JSystem/JUtility/JUTConsole.h"
|
|
#include "m_Do/m_Do_ext.h"
|
|
#include "MSL_C.PPCEABI.bare.H/MSL_Common/Src/printf.h"
|
|
#include "JSystem/JKernel/JKRDvdRipper.h"
|
|
|
|
//
|
|
// Forward References:
|
|
//
|
|
|
|
extern "C" void __dt__24DynamicModuleControlBaseFv();
|
|
extern "C" void __ct__24DynamicModuleControlBaseFv();
|
|
extern "C" void link__24DynamicModuleControlBaseFv();
|
|
extern "C" void unlink__24DynamicModuleControlBaseFv();
|
|
extern "C" void load_async__24DynamicModuleControlBaseFv();
|
|
extern "C" void force_unlink__24DynamicModuleControlBaseFv();
|
|
extern "C" void dump__24DynamicModuleControlBaseFv();
|
|
extern "C" void __ct__20DynamicModuleControlFPCc();
|
|
extern "C" void mountCallback__20DynamicModuleControlFPv();
|
|
extern "C" void initialize__20DynamicModuleControlFv();
|
|
extern "C" void callback__20DynamicModuleControlFPv();
|
|
extern "C" static void calcSum2__FPCUsUl();
|
|
extern "C" void do_load__20DynamicModuleControlFv();
|
|
extern "C" void do_load_async__20DynamicModuleControlFv();
|
|
extern "C" void do_unload__20DynamicModuleControlFv();
|
|
extern "C" void dump2__20DynamicModuleControlFv();
|
|
extern "C" void do_link__20DynamicModuleControlFv();
|
|
extern "C" void do_unlink__20DynamicModuleControlFv();
|
|
extern "C" void getModuleSize__20DynamicModuleControlCFv();
|
|
extern "C" void getModuleTypeString__20DynamicModuleControlCFv();
|
|
extern "C" void ModuleProlog();
|
|
extern "C" void ModuleEpilog();
|
|
extern "C" void ModuleUnresolved();
|
|
extern "C" void ModuleConstructorsX(void(**ctors)());
|
|
extern "C" void ModuleDestructorsX(void(**dtors)());
|
|
extern "C" bool do_link__24DynamicModuleControlBaseFv();
|
|
extern "C" bool do_load__24DynamicModuleControlBaseFv();
|
|
extern "C" bool do_unload__24DynamicModuleControlBaseFv();
|
|
extern "C" bool do_unlink__24DynamicModuleControlBaseFv();
|
|
extern "C" bool do_load_async__24DynamicModuleControlBaseFv();
|
|
extern "C" void dump2__24DynamicModuleControlBaseFv();
|
|
extern "C" void getModuleTypeString__24DynamicModuleControlBaseCFv();
|
|
extern "C" bool getModuleSize__24DynamicModuleControlBaseCFv();
|
|
extern "C" void getModuleName__20DynamicModuleControlCFv();
|
|
extern "C" extern char const* const DynamicLink__stringBase0;
|
|
extern "C" u8 mFirst__24DynamicModuleControlBase[4];
|
|
extern "C" u8 mLast__24DynamicModuleControlBase[4];
|
|
extern "C" u8 sAllocBytes__20DynamicModuleControl[4];
|
|
extern "C" u8 sArchive__20DynamicModuleControl[4];
|
|
extern "C" u8 sFileCache__20DynamicModuleControl[4 + 4 /* padding */];
|
|
|
|
//
|
|
// External References:
|
|
//
|
|
|
|
extern "C" void mDoExt_getArchiveHeap__Fv();
|
|
extern "C" void create__20mDoDvdThd_callback_cFPFPv_PvPv();
|
|
extern "C" bool getModuleName__24DynamicModuleControlBaseCFv();
|
|
extern "C" void __dt__20DynamicModuleControlFv();
|
|
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
|
|
extern "C" void free__7JKRHeapFPvP7JKRHeap();
|
|
extern "C" void resize__7JKRHeapFPvUlP7JKRHeap();
|
|
extern "C" void getSize__7JKRHeapFPvP7JKRHeap();
|
|
extern "C" void __dl__FPv();
|
|
extern "C" void detachResource__13JKRFileLoaderFPvP13JKRFileLoader();
|
|
extern "C" void mount__12JKRFileCacheFPCcP7JKRHeapPCc();
|
|
extern "C" void
|
|
mount__10JKRArchiveFPCcQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection();
|
|
extern "C" void getGlbResource__10JKRArchiveFUlPCcP10JKRArchive();
|
|
extern "C" void
|
|
loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl();
|
|
extern "C" void _savegpr_26();
|
|
extern "C" void _savegpr_28();
|
|
extern "C" void _savegpr_29();
|
|
extern "C" void _restgpr_26();
|
|
extern "C" void _restgpr_28();
|
|
extern "C" void _restgpr_29();
|
|
|
|
//
|
|
// Declarations:
|
|
//
|
|
|
|
extern "C" void* __vt__20DynamicModuleControl[13];
|
|
extern "C" void* __vt__24DynamicModuleControlBase[13];
|
|
|
|
/* 80451138-8045113C 000638 0004+00 3/3 0/0 0/0 .sbss mFirst__24DynamicModuleControlBase
|
|
*/
|
|
DynamicModuleControlBase* DynamicModuleControlBase::mFirst;
|
|
|
|
/* 8045113C-80451140 00063C 0004+00 2/2 0/0 0/0 .sbss mLast__24DynamicModuleControlBase
|
|
*/
|
|
DynamicModuleControlBase* DynamicModuleControlBase::mLast;
|
|
|
|
/* 802621CC-80262284 25CB0C 00B8+00 1/0 2/2 0/0 .text __dt__24DynamicModuleControlBaseFv
|
|
*/
|
|
DynamicModuleControlBase::~DynamicModuleControlBase() {
|
|
force_unlink();
|
|
if (mPrev!=NULL) {
|
|
mPrev->mNext = mNext;
|
|
}
|
|
if (mNext!=NULL) {
|
|
mNext->mPrev = mPrev;
|
|
}
|
|
if (mFirst==this) {
|
|
mFirst = mNext;
|
|
}
|
|
if (mLast==this) {
|
|
mLast = mPrev;
|
|
}
|
|
mNext = NULL;
|
|
mPrev = NULL;
|
|
}
|
|
|
|
/* 80262284-802622D0 25CBC4 004C+00 1/1 0/0 0/0 .text __ct__24DynamicModuleControlBaseFv
|
|
*/
|
|
DynamicModuleControlBase::DynamicModuleControlBase() {
|
|
mLinkCount = 0;
|
|
mDoLinkCount = 0;
|
|
mNext = NULL;
|
|
if (mFirst==NULL) {
|
|
mFirst = this;
|
|
}
|
|
mPrev = mLast;
|
|
if (mPrev!=NULL) {
|
|
mPrev->mNext = this;
|
|
}
|
|
mLast = this;
|
|
}
|
|
|
|
/* 802622D0-80262364 25CC10 0094+00 0/0 2/2 0/0 .text link__24DynamicModuleControlBaseFv
|
|
*/
|
|
bool DynamicModuleControlBase::link() {
|
|
if (mLinkCount==0) {
|
|
do_load();
|
|
if (do_link()==false) {
|
|
return false;
|
|
}
|
|
if (mDoLinkCount<0xFFFF) {
|
|
mDoLinkCount++;
|
|
}
|
|
}
|
|
if(mLinkCount<0xFFFF) {
|
|
mLinkCount++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 80262364-802623EC 25CCA4 0088+00 0/0 1/1 0/0 .text unlink__24DynamicModuleControlBaseFv */
|
|
bool DynamicModuleControlBase::unlink() {
|
|
if(mLinkCount!=0) {
|
|
mLinkCount--;
|
|
if(mLinkCount==0) {
|
|
do_unlink();
|
|
do_unload();
|
|
}
|
|
}else{
|
|
OSReport_Warning("%08x DynamicModuleControlBase::unlink() mLinkCount id already zero.\n",this);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 802623EC-8026242C 25CD2C 0040+00 0/0 1/1 0/0 .text load_async__24DynamicModuleControlBaseFv */
|
|
bool DynamicModuleControlBase::load_async() {
|
|
if (mLinkCount==0) {
|
|
return do_load_async();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 8026242C-80262470 25CD6C 0044+00 1/1 0/0 0/0 .text force_unlink__24DynamicModuleControlBaseFv
|
|
*/
|
|
bool DynamicModuleControlBase::force_unlink() {
|
|
if (mLinkCount!=0) {
|
|
mLinkCount = 0;
|
|
do_unlink();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
void DynamicModuleControlBase::dump() {
|
|
DynamicModuleControlBase* current = getFirstClass();
|
|
int totalSize = 0;
|
|
JUTReportConsole_f("\nDynamicModuleControlBase::dump()\n");
|
|
JUTReportConsole_f("Do Lnk Size Name\n");
|
|
//lbl_80262608
|
|
while (current!=NULL) {
|
|
//lbl_802624B8
|
|
u16 doLinkCount = current->mDoLinkCount;
|
|
u16 linkCount = current->mLinkCount;
|
|
if (doLinkCount!=0||linkCount!=0) {
|
|
//lbl_802624D0
|
|
u32 size = current->getModuleSize();
|
|
const char* name = current->getModuleName();
|
|
if(size<0xFFFFFFFF) {
|
|
name = (name!=NULL) ? name : "(Null)";
|
|
//lbl_80262524
|
|
const char* type = current->getModuleTypeString();
|
|
JUTReportConsole_f("%3d%3d%5.1f %05x %-4s %-24s ",doLinkCount,linkCount,size*(1.0f/1024.0f),size,type,name);
|
|
totalSize=totalSize+size;
|
|
}else{
|
|
//lbl_80262588
|
|
name = (name!=NULL) ? name : "(Null)";
|
|
//lbl_802625A4
|
|
const char* type = current->getModuleTypeString();
|
|
JUTReportConsole_f("%3d%3d ???? ????? %-4s %-24s ",doLinkCount,linkCount,type,name);
|
|
}
|
|
//lbl_802625DC
|
|
current->dump2();
|
|
JUTReportConsole_f("\n");
|
|
}
|
|
//lbl_80262604
|
|
current = getNextClass();
|
|
}
|
|
//lbl_80262608
|
|
JUTReportConsole_f("TotalSize %6.2f %06x\n\n",(1.0f/1024.0f)*totalSize,totalSize);
|
|
}
|
|
#else
|
|
/* ############################################################################################## */
|
|
/* 80455008-80455010 003608 0004+04 1/1 0/0 0/0 .sdata2 @3772 */
|
|
SECTION_SDATA2 static f32 lit_3772[1 + 1 /* padding */] = {
|
|
0.0009765625f, // 1/1024
|
|
/* padding */
|
|
0.0f,
|
|
};
|
|
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DEAD static char const* const stringBase_8039A4E5 = "\nDynamicModuleControlBase::dump()\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A508 = "Do Lnk Size Name\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A520 = "(Null)";
|
|
SECTION_DEAD static char const* const stringBase_8039A527 = "%3d%3d%5.1f %05x %-4s %-24s ";
|
|
SECTION_DEAD static char const* const stringBase_8039A544 = "%3d%3d ???? ????? %-4s %-24s ";
|
|
SECTION_DEAD static char const* const stringBase_8039A562 = "\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A564 = "TotalSize %6.2f %06x\n\n";
|
|
#pragma pop
|
|
|
|
/* 80455010-80455018 003610 0008+00 1/1 0/0 0/0 .sdata2 @3774 */
|
|
SECTION_SDATA2 static f64 lit_3774 = 4503599627370496.0 /* cast u32 to float */;
|
|
|
|
/* 80262470-80262660 25CDB0 01F0+00 2/0 2/2 0/0 .text dump__24DynamicModuleControlBaseFv
|
|
*/
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
asm void DynamicModuleControlBase::dump() {
|
|
nofralloc
|
|
#include "asm/DynamicLink/dump__24DynamicModuleControlBaseFv.s"
|
|
}
|
|
#pragma pop
|
|
#endif
|
|
|
|
/* 80262660-802626D0 25CFA0 0070+00 0/0 2/2 0/0 .text __ct__20DynamicModuleControlFPCc */
|
|
DynamicModuleControl::DynamicModuleControl(char const* name) {
|
|
mModule = NULL;
|
|
mBss = NULL;
|
|
unk_24 = 0;
|
|
mName = name;
|
|
mResourceType = 0;
|
|
unk_33 = 0;
|
|
mChecksum = 0;
|
|
mSize = 0;
|
|
mAsyncLoadCallback = NULL;
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 80451140-80451144 000640 0004+00 3/3 0/0 0/0 .sbss sAllocBytes__20DynamicModuleControl
|
|
*/
|
|
u32 DynamicModuleControl::sAllocBytes;
|
|
|
|
/* 80451144-80451148 000644 0004+00 3/3 0/0 0/0 .sbss sArchive__20DynamicModuleControl */
|
|
JKRArchive* DynamicModuleControl::sArchive;
|
|
|
|
/* 80451148-80451150 000648 0004+04 3/3 0/0 0/0 .sbss sFileCache__20DynamicModuleControl
|
|
*/
|
|
JKRFileCache* DynamicModuleControl::sFileCache;
|
|
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DEAD static char const* const stringBase_8039A57B = "Base";
|
|
#pragma pop
|
|
|
|
/* 802626D0-8026275C 25D010 008C+00 1/1 0/0 0/0 .text mountCallback__20DynamicModuleControlFPv */
|
|
JKRArchive* DynamicModuleControl::mountCallback(void* param_0) {
|
|
JKRExpHeap* heap = mDoExt_getArchiveHeap();
|
|
sFileCache = JKRFileCache::mount("/rel/Final/Release",heap,NULL);
|
|
sArchive = JKRArchive::mount("aRELS.arc",JKRArchive::MOUNT_COMP,heap,JKRArchive::MOUNT_DIRECTION_HEAD);
|
|
if (sArchive == NULL) {
|
|
OSReport_Warning("マウント失敗ですが単にアーカイブを作ってないだけなら遅いだけです %s\n","RELS.arc");
|
|
}
|
|
return sArchive;
|
|
}
|
|
|
|
/* 8026275C-80262794 25D09C 0038+00 0/0 1/1 0/0 .text initialize__20DynamicModuleControlFv */
|
|
bool DynamicModuleControl::initialize() {
|
|
sFileCache = NULL;
|
|
sAllocBytes = 0;
|
|
sArchive = NULL;
|
|
mountCallback(NULL);
|
|
return true;
|
|
}
|
|
|
|
/* 80262794-802627C0 25D0D4 002C+00 1/1 0/0 0/0 .text callback__20DynamicModuleControlFPv
|
|
*/
|
|
void* DynamicModuleControl::callback(void* moduleControlPtr) {
|
|
DynamicModuleControl* moduleControl = (DynamicModuleControl*)moduleControlPtr;
|
|
moduleControl->do_load();
|
|
}
|
|
|
|
/* 802627C0-802627E8 25D100 0028+00 1/1 0/0 0/0 .text calcSum2__FPCUsUl */
|
|
static u32 calcSum2(u16 const* data, u32 size) {
|
|
u32 sum = 0;
|
|
while (size>0) {
|
|
sum = sum + *data;
|
|
size=size-2;
|
|
data++;
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
bool DynamicModuleControl::do_load() {
|
|
if (mModule!=NULL) {
|
|
return true;
|
|
}
|
|
JKRExpHeap* heap = mDoExt_getArchiveHeap();
|
|
s32 i = 0;
|
|
while(true) {
|
|
if(mModule != NULL) {
|
|
JKRHeap::free(mModule,NULL);
|
|
mModule = NULL;
|
|
}
|
|
char buffer[64];
|
|
snprintf(buffer,64,"%s.rel",mName);
|
|
if(mModule==NULL&&sArchive!=NULL) {
|
|
if(mModule==NULL) {
|
|
mModule = (OSModuleInfo*)JKRArchive::getGlbResource(0x4D4D454D,buffer,sArchive);
|
|
if(mModule!=NULL) {
|
|
mResourceType = 1;
|
|
}
|
|
}
|
|
if(mModule==NULL) {
|
|
mModule = (OSModuleInfo*)JKRArchive::getGlbResource(0x414D454D,buffer,sArchive);
|
|
if(mModule!=NULL) {
|
|
mResourceType = 2;
|
|
}
|
|
}
|
|
if(mModule==NULL) {
|
|
mModule = (OSModuleInfo*)JKRArchive::getGlbResource(0x444D454D,buffer,sArchive);
|
|
if(mModule!=NULL) {
|
|
mResourceType = 3;
|
|
}
|
|
}
|
|
}
|
|
if(mModule!=NULL) {
|
|
mSize = sArchive->getExpandedResSize(mModule);
|
|
JKRFileLoader::detachResource(mModule,NULL);
|
|
}else if(mModule==NULL){
|
|
snprintf(buffer,64,"/rel/Final/Release/%s.rel",mName);
|
|
mModule = (OSModuleInfo*)JKRDvdRipper::loadToMainRAM(buffer,NULL,EXPAND_SWITCH_UNKNOWN1,0,heap,JKRDvdRipper::ALLOC_DIRECTION_FORWARD,0,NULL,NULL);
|
|
if(mModule!=NULL) {
|
|
mSize = 0;
|
|
mResourceType = 7;
|
|
}
|
|
}
|
|
if(mModule==NULL&&sFileCache!=NULL) {
|
|
mModule = (OSModuleInfo*)sFileCache->getResource(0x72656C73,buffer);
|
|
if(mModule!=NULL) {
|
|
mSize = 0;
|
|
mResourceType = 11;
|
|
JKRFileLoader::detachResource(mModule,NULL);
|
|
}
|
|
}
|
|
if(mModule==NULL) {
|
|
OSReport_Error("\x44\x79\x6E\x61\x6D\x69\x63\x4D\x6F\x64\x75\x6C\x65\x43\x6F\x6E\x74\x72\x6F\x6C\x3A\x3A\x64\x6F\x5F\x6C\x6F\x61\x64\x28\x29\x20\x83\x8A\x83\x5C\x81\x5B\x83\x58\x93\xC7\x82\xDD\x8D\x9E\x82\xDD\x8E\xB8\x94\x73\x20\x5B\x25\x73\x5D\x0A",mName);
|
|
return false;
|
|
}
|
|
if(mSize>0) {
|
|
u32 sum = calcSum2((u16*)mModule,mSize);
|
|
if(unk_33==0) {
|
|
mChecksum=sum;
|
|
unk_33++;
|
|
}else{
|
|
u32 newsum = sum&0xFFFF;
|
|
if(newsum!=mChecksum) {
|
|
OSReport_Error("DynamicModuleControl::do_load() チェックサムエラー %04x %04x[%s]\n",newsum,mChecksum,mName);
|
|
unk_33 = 0;
|
|
i++;
|
|
if(i>=3) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
if(unk_33<0xFF) {
|
|
unk_33++;
|
|
return true;
|
|
}
|
|
}
|
|
if(unk_33<0xFF) {
|
|
unk_33++;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
#else
|
|
/* ############################################################################################## */
|
|
/* 8039A4A0-8039A4A0 026B00 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DEAD static char const* const stringBase_8039A5E1 = "%s.rel";
|
|
SECTION_DEAD static char const* const stringBase_8039A5E8 = "/rel/Final/Release/%s.rel";
|
|
// MWCC ignores mapping of some japanese characters using the
|
|
// byte 0x5C (ASCII '\'). This is why this string is hex-encoded.
|
|
SECTION_DEAD static char const* const stringBase_8039A602 =
|
|
"\x44\x79\x6E\x61\x6D\x69\x63\x4D\x6F\x64\x75\x6C\x65\x43\x6F\x6E\x74\x72\x6F\x6C\x3A\x3A\x64"
|
|
"\x6F\x5F\x6C\x6F\x61\x64\x28\x29\x20\x83\x8A\x83\x5C\x81\x5B\x83\x58\x93\xC7\x82\xDD\x8D\x9E"
|
|
"\x82\xDD"
|
|
"\x8E\xB8\x94\x73\x20\x5B\x25\x73\x5D\x0A";
|
|
SECTION_DEAD static char const* const stringBase_8039A63D =
|
|
"DynamicModuleControl::do_load() チェックサムエラー %04x %"
|
|
"04x[%s]\n";
|
|
#pragma pop
|
|
|
|
/* 802627E8-80262AFC 25D128 0314+00 1/0 0/0 0/0 .text do_load__20DynamicModuleControlFv
|
|
*/
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
asm bool DynamicModuleControl::do_load() {
|
|
nofralloc
|
|
#include "asm/DynamicLink/do_load__20DynamicModuleControlFv.s"
|
|
}
|
|
#pragma pop
|
|
#endif
|
|
|
|
/* 80262AFC-80262BC4 25D43C 00C8+00 1/0 0/0 0/0 .text do_load_async__20DynamicModuleControlFv */
|
|
bool DynamicModuleControl::do_load_async() {
|
|
if (mAsyncLoadCallback==NULL) {
|
|
if(mModule!=NULL) {
|
|
return true;
|
|
}
|
|
mAsyncLoadCallback = mDoDvdThd_callback_c::create(DynamicModuleControl::callback,this);
|
|
if(mAsyncLoadCallback==NULL) {
|
|
OSReport_Error("DynamicModuleControl::do_load_async() 非同期読み込みコールバック登録失敗 [%s]\n",mName);
|
|
}
|
|
}
|
|
if (mAsyncLoadCallback!=NULL&&mAsyncLoadCallback->sync()) {
|
|
mAsyncLoadCallback->destroy();
|
|
mAsyncLoadCallback = NULL;
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* 80262BC4-80262C0C 25D504 0048+00 1/0 0/0 0/0 .text do_unload__20DynamicModuleControlFv
|
|
*/
|
|
bool DynamicModuleControl::do_unload() {
|
|
if (mModule!=NULL){
|
|
JKRFree(mModule);
|
|
mModule = NULL;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 80262C0C-80262C5C 25D54C 0050+00 1/0 0/0 0/0 .text dump2__20DynamicModuleControlFv */
|
|
void DynamicModuleControl::dump2() {
|
|
if (mModule!=NULL) {
|
|
OSSectionInfo* section = (OSSectionInfo*)mModule->info.sectionInfoOffset;
|
|
OSSectionInfo* section2 = section+1;
|
|
u32 offset = section2->mOffset & ~(1);
|
|
OSReport("%08x-%08x %08x %08x",mModule,offset,offset+section2->mSize);
|
|
}
|
|
}
|
|
|
|
#ifdef NONMATCHING
|
|
BOOL DynamicModuleControl::do_link() {
|
|
OSGetTime();
|
|
if(mModule==NULL) {
|
|
do_load();
|
|
}
|
|
|
|
if(mModule!=NULL) {
|
|
ASSERT(mModule->info.sectionInfoOffset < 0x80000000);
|
|
ASSERT((u32)mModule + mModule->fixSize < 0x82000000);
|
|
OSGetTime();
|
|
OSGetTime();
|
|
if(mModule->mModuleVersion>=3) {
|
|
u32 unk = mModule->fixSize;
|
|
u32 unk3 = (unk+0x1f) & ~0x1f;
|
|
u32 unk2 = (u32)mModule+unk3;
|
|
s32 size = JKRHeap::getSize(mModule,NULL);
|
|
if(size<0) {
|
|
void* bss = JKRHeap::alloc(mModule->mBssSize,0x20,NULL);
|
|
if (bss==NULL) {
|
|
OSReport_Error("BSSメモリ確保失敗\n");
|
|
goto end;
|
|
}else{
|
|
mBss = bss;
|
|
BOOL linkResult = OSLink(mModule);
|
|
if(linkResult==FALSE) {
|
|
OSReport_Error("リンク失敗\n");
|
|
goto end;
|
|
}
|
|
}
|
|
}else{
|
|
if(mModule->mBssSize+unk<size) {
|
|
BOOL linkResult = OSLinkFixed(mModule,unk2);
|
|
if(linkResult==FALSE) {
|
|
OSReport_Error("リンク失敗\n");
|
|
goto end;
|
|
}else{
|
|
s32 result = JKRHeap::resize(mModule,mModule->mBssSize+unk,NULL);
|
|
if (result<0) {
|
|
OSReport_Error("モジュールリサイズ(縮小)失敗\n");
|
|
}
|
|
}
|
|
}else{ //lbl_80262DB0
|
|
s32 result = JKRHeap::resize(mModule,mModule->mBssSize+unk,NULL);
|
|
if (result>0) {
|
|
BOOL linkResult = OSLinkFixed(mModule,unk2);
|
|
if(linkResult==FALSE) {
|
|
OSReport_Error("リンク失敗\n");
|
|
goto end;
|
|
}
|
|
}else{ //lbl_80262DF0
|
|
void* bss = JKRHeap::alloc(mModule->mBssSize,0x20,NULL);
|
|
if (bss==NULL) {
|
|
OSReport_Error("BSSメモリ確保失敗 [%x]\n",mModule->mBssSize);
|
|
goto end;
|
|
}else{ //lbl_80262E2C
|
|
mBss = bss;
|
|
BOOL linkResult = OSLinkFixed(mModule,(u32)bss);
|
|
if (linkResult==FALSE) {
|
|
OSReport_Error("リンク失敗\n");
|
|
goto end;
|
|
}
|
|
//lbl_80262E58
|
|
s32 result = JKRHeap::resize(mModule,unk3,NULL);
|
|
if (result<0) {
|
|
OSReport_Error("モジュールリサイズ(縮小)失敗\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//lbl_80262E84
|
|
OSGetTime();
|
|
sAllocBytes = sAllocBytes + getModuleSize();
|
|
OSGetTime();
|
|
unk_24 = mModule->prolog();
|
|
OSGetTime();
|
|
return TRUE;
|
|
}
|
|
|
|
end: //lbl_80262ECC
|
|
unk_33 = 0;
|
|
if(mBss!=NULL) {
|
|
JKRHeap::free(mBss,NULL);
|
|
mBss = NULL;
|
|
}
|
|
if(mModule!=NULL) {
|
|
JKRHeap::free(mModule,NULL);
|
|
mModule = NULL;
|
|
}
|
|
return FALSE;
|
|
}
|
|
#else
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DEAD static char const* const stringBase_8039A6E2 = "BSSメモリ確保失敗\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A6F5 = "リンク失敗\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A701 = "モジュールリサイズ(縮小)失敗\n";
|
|
SECTION_DEAD static char const* const stringBase_8039A71F = "BSSメモリ確保失敗 [%x]\n";
|
|
#pragma pop
|
|
|
|
/* 80262C5C-80262F28 25D59C 02CC+00 1/0 0/0 0/0 .text do_link__20DynamicModuleControlFv
|
|
*/
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
asm BOOL DynamicModuleControl::do_link() {
|
|
nofralloc
|
|
#include "asm/DynamicLink/do_link__20DynamicModuleControlFv.s"
|
|
}
|
|
#pragma pop
|
|
#endif
|
|
|
|
/* 80262F28-80263000 25D868 00D8+00 1/0 0/0 0/0 .text do_unlink__20DynamicModuleControlFv
|
|
*/
|
|
bool DynamicModuleControl::do_unlink() {
|
|
OSTime time1 = OSGetTime();
|
|
mModule->epilog();
|
|
OSTime time2 = OSGetTime();
|
|
BOOL unklink = OSUnlink(mModule);
|
|
OSTime time3 = OSGetTime();
|
|
if (unklink==FALSE) {
|
|
OSReport_Error("アンリンク失敗 mModule=%08x mBss=%08x\n",mModule,mBss);
|
|
return false;
|
|
}
|
|
sAllocBytes = sAllocBytes - getModuleSize();
|
|
if (mBss!=NULL) {
|
|
JKRFree(mBss);
|
|
mBss = NULL;
|
|
}
|
|
do_unload();
|
|
return true;
|
|
}
|
|
|
|
/* 80263000-80263070 25D940 0070+00 1/0 0/0 0/0 .text getModuleSize__20DynamicModuleControlCFv */
|
|
int DynamicModuleControl::getModuleSize() const {
|
|
if (mModule!=NULL){
|
|
u32 size = JKRGetMemBlockSize(NULL,mModule);
|
|
if (mBss!=NULL) {
|
|
JKRGetMemBlockSize(NULL,mBss);
|
|
}
|
|
return size+mModule->mBssSize;
|
|
}else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* 80263070-80263088 25D9B0 0018+00 1/0 0/0 0/0 .text
|
|
* getModuleTypeString__20DynamicModuleControlCFv */
|
|
const char* DynamicModuleControl::getModuleTypeString() const {
|
|
static const char* strings[4] = {"????","MEM","ARAM","DVD"};
|
|
return strings[mResourceType&3];
|
|
}
|
|
|
|
/* 803C34C0-803C34F4 0205E0 0034+00 1/1 2/2 0/0 .data __vt__20DynamicModuleControl */
|
|
SECTION_DATA extern void* __vt__20DynamicModuleControl[13] = {
|
|
(void*)NULL /* RTTI */,
|
|
(void*)NULL,
|
|
(void*)__dt__20DynamicModuleControlFv,
|
|
(void*)getModuleName__20DynamicModuleControlCFv,
|
|
(void*)getModuleSize__20DynamicModuleControlCFv,
|
|
(void*)getModuleTypeString__20DynamicModuleControlCFv,
|
|
(void*)dump__24DynamicModuleControlBaseFv,
|
|
(void*)dump2__20DynamicModuleControlFv,
|
|
(void*)do_load__20DynamicModuleControlFv,
|
|
(void*)do_load_async__20DynamicModuleControlFv,
|
|
(void*)do_unload__20DynamicModuleControlFv,
|
|
(void*)do_link__20DynamicModuleControlFv,
|
|
(void*)do_unlink__20DynamicModuleControlFv,
|
|
};
|
|
|
|
/* 80263088-8026308C 25D9C8 0004+00 0/0 0/0 756/756 .text ModuleProlog */
|
|
extern "C" void ModuleProlog() {
|
|
/* empty function */
|
|
}
|
|
|
|
/* 8026308C-80263090 25D9CC 0004+00 0/0 0/0 756/756 .text ModuleEpilog */
|
|
extern "C" void ModuleEpilog() {
|
|
/* empty function */
|
|
}
|
|
|
|
/* 80263090-8026314C 25D9D0 00BC+00 0/0 0/0 757/757 .text ModuleUnresolved */
|
|
extern "C" void ModuleUnresolved() {
|
|
OSReport_Error("\nError: リンクされていない関数が呼び出されました.\n");
|
|
OSReport_Error("Address: Back Chain LR Save\n");
|
|
u32 i = 0;
|
|
u32* stackPtr = (u32*)OSGetStackPointer();
|
|
while(stackPtr!=NULL&&(u32)stackPtr!=0xFFFFFFFF&&i++<0x10) {
|
|
OSReport_Error("0x%08x: 0x%08x 0x%08x\n",stackPtr,*stackPtr,*(stackPtr+1));
|
|
stackPtr = (u32*)*stackPtr;
|
|
}
|
|
OSReport_Error("\n");
|
|
}
|
|
|
|
/* 8026314C-80263190 25DA8C 0044+00 0/0 0/0 757/757 .text ModuleConstructorsX */
|
|
extern "C" void ModuleConstructorsX(void(**ctors)()) {
|
|
while (*ctors!=0) {
|
|
(**ctors)();
|
|
ctors++;
|
|
}
|
|
}
|
|
|
|
/* 80263190-802631D4 25DAD0 0044+00 0/0 0/0 757/757 .text ModuleDestructorsX */
|
|
extern "C" void ModuleDestructorsX(void(**dtors)()) {
|
|
while (*dtors!=0) {
|
|
(**dtors)();
|
|
dtors++;
|
|
}
|
|
}
|
|
|
|
/* 802631D4-802631DC 25DB14 0008+00 1/0 0/0 0/0 .text do_link__24DynamicModuleControlBaseFv */
|
|
BOOL DynamicModuleControlBase::do_link() {
|
|
return TRUE;
|
|
}
|
|
|
|
/* 802631DC-802631E4 25DB1C 0008+00 1/0 0/0 0/0 .text do_load__24DynamicModuleControlBaseFv */
|
|
bool DynamicModuleControlBase::do_load() {
|
|
return true;
|
|
}
|
|
|
|
/* 802631E4-802631EC 25DB24 0008+00 1/0 0/0 0/0 .text do_unload__24DynamicModuleControlBaseFv */
|
|
bool DynamicModuleControlBase::do_unload() {
|
|
return true;
|
|
}
|
|
|
|
/* 802631EC-802631F4 25DB2C 0008+00 1/0 0/0 0/0 .text do_unlink__24DynamicModuleControlBaseFv */
|
|
bool DynamicModuleControlBase::do_unlink() {
|
|
return true;
|
|
}
|
|
|
|
/* 802631F4-802631FC 25DB34 0008+00 1/0 0/0 0/0 .text do_load_async__24DynamicModuleControlBaseFv
|
|
*/
|
|
bool DynamicModuleControlBase::do_load_async() {
|
|
return true;
|
|
}
|
|
|
|
/* 802631FC-80263200 25DB3C 0004+00 1/0 0/0 0/0 .text dump2__24DynamicModuleControlBaseFv
|
|
*/
|
|
void DynamicModuleControlBase::dump2() {
|
|
/* empty function */
|
|
}
|
|
|
|
/* 80263200-80263210 25DB40 0010+00 1/0 0/0 0/0 .text
|
|
* getModuleTypeString__24DynamicModuleControlBaseCFv */
|
|
const char* DynamicModuleControlBase::getModuleTypeString() const {
|
|
return "Base";
|
|
}
|
|
|
|
/* 80263210-80263218 25DB50 0008+00 1/0 0/0 0/0 .text getModuleSize__24DynamicModuleControlBaseCFv
|
|
*/
|
|
int DynamicModuleControlBase::getModuleSize() const {
|
|
return 0;
|
|
}
|
|
|
|
/* 80263218-80263220 25DB58 0008+00 1/0 0/0 0/0 .text getModuleName__20DynamicModuleControlCFv */
|
|
const char* DynamicModuleControl::getModuleName() const {
|
|
return mName;
|
|
}
|
|
|
|
/* 8039A4A0-8039A4A0 026B00 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
|