1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
|
//
// 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("RELS.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/*rels*/,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 */
|