tp/src/m_Do/m_Do_main.cpp

1091 lines
40 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* m_Do_main.cpp
* Main Initialization
*/
#include "m_Do/m_Do_main.h"
#include "DynamicLink.h"
#include "JSystem/JAudio2/JASAudioThread.h"
#include "JSystem/JAudio2/JAUSoundTable.h"
#include "JSystem/JFramework/JFWSystem.h"
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "JSystem/JUtility/JUTConsole.h"
#include "JSystem/JUtility/JUTReport.h"
#include "JSystem/JUtility/JUTException.h"
#include "JSystem/JUtility/JUTProcBar.h"
#include "JSystem/JHostIO/JORServer.h"
#include "Z2AudioLib/Z2WolfHowlMgr.h"
#include "c/c_dylink.h"
#include "d/d_com_inf_game.h"
#include "d/d_s_logo.h"
#include "d/d_s_menu.h"
#include "d/d_s_play.h"
#include "d/d_debug_pad.h"
#include "f_ap/f_ap_game.h"
#include "f_op/f_op_msg.h"
#include "m_Do/m_Do_MemCard.h"
#include "m_Do/m_Do_Reset.h"
#include "m_Do/m_Do_controller_pad.h"
#include "m_Do/m_Do_dvd_thread.h"
#include "m_Do/m_Do_graphic.h"
#include "m_Do/m_Do_machine.h"
#include "m_Do/m_Do_printf.h"
#include "m_Do/m_Do_ext2.h"
#include "SSystem/SComponent/c_counter.h"
#include <cstring.h>
#if PLATFORM_WII || PLATFORM_SHIELD
#include <revolution/sc.h>
#endif
class mDoMain_HIO_c : public mDoHIO_entry_c {
public:
void listenPropertyEvent(const JORPropertyEvent*);
void genMessage(JORMContext*);
};
/* 800056C0-80005728 000000 0068+00 1/1 0/0 0/0 .text version_check__Fv */
void version_check() {
#if !PLATFORM_SHIELD
if (!strcmp("20Apr2004", "20Apr2004") && !strcmp("Patch2", "Patch2")) {
return;
}
// "SDK version doesn't match. Stopping\n"
OSReport_Error("SDKのバージョンが一致しません。停止します\n");
do {
} while (true);
#endif
}
/* 803A2EE0-803A2EF4 000000 0012+02 2/2 1/1 0/0 .data COPYDATE_STRING__7mDoMain */
char mDoMain::COPYDATE_STRING[18] = "??/??/?? ??:??:??";
/* 803D32E0-803D3308 000000 0028+00 3/2 0/0 0/0 .bss RootHeapCheck */
// static HeapCheck RootHeapCheck;
static HeapCheck RootHeapCheck = HeapCheck(0,"Root","ルート");
/* 803D3308-803D3330 000028 0028+00 1/2 0/0 0/0 .bss SystemHeapCheck */
// static HeapCheck SystemHeapCheck;
static HeapCheck SystemHeapCheck = HeapCheck(0,"System","システム");
/* 803D3330-803D3358 000050 0028+00 1/2 0/0 0/0 .bss ZeldaHeapCheck */
// static HeapCheck ZeldaHeapCheck;
static HeapCheck ZeldaHeapCheck = HeapCheck(0,"Zelda","ゼルダ");
/* 803D3358-803D3380 000078 0028+00 1/2 0/0 0/0 .bss GameHeapCheck */
// static HeapCheck GameHeapCheck;
static HeapCheck GameHeapCheck = HeapCheck(0,"Game","ゲーム");
/* 803D3380-803D33A8 0000A0 0028+00 1/2 0/0 0/0 .bss ArchiveHeapCheck */
// static HeapCheck ArchiveHeapCheck;
static HeapCheck ArchiveHeapCheck = HeapCheck(0,"Archive","アーカイブ");
/* 803D33A8-803D33D0 0000C8 0028+00 1/2 0/0 0/0 .bss J2dHeapCheck */
// static HeapCheck J2dHeapCheck;
static HeapCheck J2dHeapCheck = HeapCheck(0,"J2d","J2D");
/* 803D33D0-803D33F8 0000F0 0028+00 1/2 0/0 0/0 .bss HostioHeapCheck */
// static HeapCheck HostioHeapCheck;
static HeapCheck HostioHeapCheck = HeapCheck(0,"Hostio","ホストIO");
/* 803D33F8-803D3420 000118 0028+00 1/2 0/0 0/0 .bss CommandHeapCheck */
// static HeapCheck CommandHeapCheck;
static HeapCheck CommandHeapCheck = HeapCheck(0,"Command","コマンド");
/* 803A2EF4-803A2F14 -00001 0020+00 1/2 0/0 0/0 .data HeapCheckTable */
static HeapCheck* HeapCheckTable[8] = {
&RootHeapCheck, &SystemHeapCheck, &ZeldaHeapCheck, &GameHeapCheck,
&ArchiveHeapCheck, &J2dHeapCheck, &HostioHeapCheck, &CommandHeapCheck,
};
#if DEBUG
mDoMain_HIO_c mDoMain_HIO;
#endif
void printFrameLine() {
OSCalendarTime calendar;
OSTime time = OSGetTime();
u32 retrace = VIGetRetraceCount();
OSTicksToCalendarTime(time, &calendar);
OS_REPORT("\x1b[44m-- %5d - %5d - %3d %d %04d/%02d/%02d %02d:%02d:%02d\'%03d\'\'%03d\n\x1b[m",
g_Counter.mCounter0, retrace,
calendar.yday, calendar.wday, calendar.year, calendar.mon, calendar.mday,
calendar.hour, calendar.min, calendar.sec, calendar.msec, calendar.usec);
}
/* 80005728-8000578C 000068 0064+00 1/1 0/0 0/0 .text CheckHeap1__9HeapCheckFv */
void HeapCheck::CheckHeap1() {
s32 totalUsedSize = mHeap->getTotalUsedSize();
s32 freeSize = mHeap->getFreeSize();
if (mMaxTotalUsedSize < totalUsedSize)
mMaxTotalUsedSize = totalUsedSize;
if (mMaxTotalFreeSize > freeSize)
mMaxTotalFreeSize = freeSize;
}
/* 8000578C-80005848 0000CC 00BC+00 1/1 0/0 0/0 .text CheckHeap__FUl */
void CheckHeap(u32 i_padNo) {
mDoMch_HeapCheckAll();
OSCheckActiveThreads();
int saveRel = (mDoCPd_c::getHold(i_padNo) & ~PAD_TRIGGER_Z) == (PAD_TRIGGER_L + PAD_TRIGGER_R) && mDoCPd_c::getTrig(i_padNo) & PAD_TRIGGER_Z;
for (int i = 0; i < 8; i++) {
HeapCheckTable[i]->CheckHeap1();
if (saveRel) {
HeapCheckTable[i]->saveRelBase();
}
}
}
/* 80005848-800058A0 000188 0058+00 2/2 0/0 0/0 .text countUsed__FP10JKRExpHeap */
static int countUsed(JKRExpHeap* heap) {
OSDisableScheduler();
int counter = 0;
JKRExpHeap::CMemBlock* used_blocks_head = heap->getUsedFirst();
while (used_blocks_head) {
counter++;
used_blocks_head = used_blocks_head->getNextBlock();
}
OSEnableScheduler();
return counter;
}
/* 800058A0-800058C4 0001E0 0024+00 2/2 0/0 0/0 .text getUsedCount__9HeapCheckCFv */
s32 HeapCheck::getUsedCount() const {
return countUsed(mHeap);
}
/* 800058C4-80005AD8 000204 0214+00 1/1 0/0 0/0 .text heapDisplay__9HeapCheckCFv */
void HeapCheck::heapDisplay() const {
s32 heap_size = mHeap->getHeapSize();
s32 used_count = heap_size - getTargetHeapSize();
s32 total_used_size = mHeap->getTotalUsedSize();
s32 total_free_size = mHeap->getTotalFreeSize();
s32 heap_free_size = mHeap->getFreeSize();
JUTReport(100, 212, "[%sName]", mName);
JUTReport(100, 227, "HeapSize %8ld", heap_size);
JUTReport(100, 240, "TargetHeapSize %8ld", getTargetHeapSize());
JUTReport(100, 253, "TotalFree %8ld", total_free_size - used_count);
JUTReport(100, 266, "FreeSize %8ld", heap_free_size - used_count);
JUTReport(100, 279, "TotalUsedSize %8ld", total_used_size);
JUTReport(100, 292, "TotalUsedRate %3ld%%", (int)(total_used_size * 100) / (int)getTargetHeapSize());
JUTReport(100, 305, "MaxTotalUsedSize %8ld", mMaxTotalUsedSize);
JUTReport(100, 318, "MaxTotalUsedRate %3ld%%", (mMaxTotalUsedSize * 100) / (int)getTargetHeapSize());
JUTReport(100, 331, "MinFreeSize %8ld", mMaxTotalFreeSize - used_count);
JUTReport(100, 344, "MinFreeRate %3ld%%", ((mMaxTotalFreeSize - used_count) * 100) / (int)getTargetHeapSize());
JUTReport(100, 357, "UsedCount %3ld%", countUsed(mHeap));
}
#if DEBUG
int mDoMain::argument = -1;
#endif
/* 80450580-80450584 000000 0004+00 3/3 6/6 0/0 .sdata None */
s8 mDoMain::developmentMode = -1;
#ifdef DEBUG
u32 mDoMain::gameHeapSize = 0xFFFFFFFF;
u32 mDoMain::archiveHeapSize = 0xFFFFFFFF;
#endif
/* 80450584-80450588 000004 0004+00 0/0 1/1 0/0 .sdata memMargin__7mDoMain */
u32 mDoMain::memMargin = 0xFFFFFFFF;
#ifdef DEBUG
int mDoMain::e3menu_no = -1;
#endif
/* 80450588-80450590 000008 0008+00 2/2 0/0 0/0 .sdata None */
u8 mHeapBriefType = 4;
#if DEBUG
static u8 memorycheck_check_frame;
#endif
/* 80450B00-80450B08 000000 0008+00 1/1 0/0 0/0 .sbss None */
static u8 fillcheck_check_frame;
/* 80450B08-80450B0C 000008 0004+00 1/1 1/1 0/0 .sbss sPowerOnTime__7mDoMain */
OSTime mDoMain::sPowerOnTime;
/* 80450B10-80450B14 000010 0004+00 0/0 2/2 0/0 .sbss sHungUpTime__7mDoMain */
OSTime mDoMain::sHungUpTime;
/* 80450B18-80450B1C -00001 0004+00 3/3 0/0 0/0 .sbss None */
/* 80450B18 0001+00 data_80450B18 None */
static u8 mDisplayHeapSize;
#if DEBUG
static u8 mReportDisable;
#endif
/* 80450B19 0001+00 data_80450B19 None */
static u8 mSelectHeapBar;
#if DEBUG
static u8 mVisibleHeapBar;
static u8 mPrintFrameLine;
#endif
/* 80450B1A 0002+00 data_80450B1A None */
static u8 mCheckHeap;
/* 80005AD8-80005D4C 000418 0274+00 1/1 0/0 0/0 .text debugDisplay__Fv */
void debugDisplay() {
static const char* desc1[5] = {
"", "TotalFree", "MaxUsed ", "Used ", "RelUsed ",
};
static const char* desc2[5] = {
"", "/ MaxFree", "/HeapSize", "Blk/Bytes", "Blk/Bytes",
};
if (mSelectHeapBar >= 1 && mSelectHeapBar <= 6) {
HeapCheckTable[mSelectHeapBar - 1]->heapDisplay();
}
if (mHeapBriefType == 5) {
JKRAramHeap* heap = JKRAram::getAramHeap();
if (heap != NULL) {
JUTReport(475, 100, "ARAM Free");
JUTReport(475, 114, "%d", heap->getFreeSize());
JUTReport(475, 128, "TotalFree");
JUTReport(475, 142, "%d", heap->getTotalFreeSize());
}
return;
}
if (mHeapBriefType != 0) {
JUT_ASSERT(596, mHeapBriefType < HeapCheckTableNum);
JUTReport(475, 100, "%s", desc1[mHeapBriefType]);
JUTReport(475, 114, "%s", desc2[mHeapBriefType]);
for (int i = 0; i < 8; i++) {
HeapCheck* heap_check = HeapCheckTable[i];
JKRExpHeap* expHeap = heap_check->getHeap();
s32 check1;
s32 check2;
switch (mHeapBriefType) {
case 1:
check1 = expHeap->getTotalFreeSize();
check2 = expHeap->getFreeSize();
break;
case 2:
check1 = heap_check->getMaxTotalUsedSize();
check2 = expHeap->getHeapSize();
break;
case 3:
check1 = heap_check->getUsedCount();
check2 = expHeap->getTotalUsedSize();
break;
case 4:
check1 = heap_check->getRelUsedCount();
check2 = heap_check->getRelTotalUsedSize();
break;
}
JUTReport(475, (i * 44) + 150, " [%s]", heap_check->getName());
JUTReport(475, (i * 44) + 164, "%10d", check1);
JUTReport(475, (i * 44) + 178, "%10d", check2);
}
}
}
void my_genCheckBox(JORMContext* mctx, const char* label, u8* pSrc, u8 mask) {
mctx->genCheckBox(label, pSrc, mask, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
}
#if DEBUG
void mDoMain_HIO_c::genMessage(JORMContext* mctx) {
mctx->genSlider("コード破壊チェックフレーム", &memorycheck_check_frame, 0, 0xFF, 0, NULL, 0xFFFF,
0xFFFF, 0x200, 0x18);
mctx->genButton("コード破壊チェックcheck", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("コード破壊チェックsave", 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("コード破壊チェックdiff", 2, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("デバッグフィル", &mDoMch::mDebugFill, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genSlider("ヒープ破壊チェックフレーム", &fillcheck_check_frame, 0, 0xFF, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ヒープ破壊チェック", 3, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ヒープFree領域フィル", 4, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("浮動小数点例外を(再び)有効にする", 5, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("◎無効演算", &mDoMch::FpscrEnableBits, 0x80, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("○オーバー", &mDoMch::FpscrEnableBits, 0x40, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("△アンダー", &mDoMch::FpscrEnableBits, 0x20, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("○ゼロ除算", &mDoMch::FpscrEnableBits, 0x10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("▲不正確 ", &mDoMch::FpscrEnableBits, 0x8, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genLabel("ソースファイルm_Do_main.cpp", 0, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("OSReport 表示しない", &mReportDisable, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200,
0x18);
mctx->genCheckBox("OSReport 優先度最高", &print_highPriority, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200,
0x18);
mctx->genCheckBox("OSReport スレッド表示", &print_threadID, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("OSReport CallerPC表示", &print_callerPC, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genSlider("レベル", &print_callerPCLevel, 3, 10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->startComboBox("簡易ヒープ表示", &mHeapBriefType, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0x1a);
mctx->genComboBoxItem("なし", 0);
mctx->genComboBoxItem("合計空き・最大空き", 1);
mctx->genComboBoxItem("最大使用量・ヒープサイズ元使用量", 2);
mctx->genComboBoxItem("使用ブロック数・元使用量", 3);
mctx->genComboBoxItem("相対 使用ブロック数・元使用量", 4);
mctx->endComboBox();
my_genCheckBox(mctx, "ヒープサイズ表示を行う", &mDisplayHeapSize, 1);
mctx->genCheckBox("ヒープバーを表示する", &mVisibleHeapBar, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->startComboBox("ヒープバーの種類", &mSelectHeapBar, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0x1a);
mctx->genComboBoxItem("カレント", 0);
for (int i = 0; i < 8; i++) {
mctx->genComboBoxItem(HeapCheckTable[i]->getJName(), i + 1);
}
mctx->endComboBox();
mctx->genCheckBox("ヒープチェック", &mCheckHeap, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("フレームバー表示", &mPrintFrameLine, 1, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->startComboBox("GX警告レベル", &mDoMch::GXWarningLevel, 0, NULL, 0xFFFF, 0xFFFF, 0x100, 0x1a);
mctx->genComboBoxItem("エラー&警告なし", 0);
mctx->genComboBoxItem("致命的なエラー", 1);
mctx->genComboBoxItem("中警告と全エラー", 2);
mctx->genComboBoxItem("すべての警告", 3);
mctx->endComboBox();
mctx->genButton("GX警告をフレームだけ実行", 9, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ダイナミックリンク状況をダンプ", 7, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ダイナミックリンクカウンタをリセット", 8, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ARAMヒープをダンプ", 10, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ゲームリソースをダンプ", 11, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("RES_CONTROLをダンプ", 12, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ルートヒープをダンプ", 13, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("システムヒープをダンプ", 14, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ゼルダヒープをダンプ", 15, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ゲームヒープをダンプ", 16, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("アーカイブヒープをダンプ", 17, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("J2Dヒープをダンプ", 18, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("ホストIOヒープをダンプ", 19, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genButton("コマンドヒープをダンプ", 20, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 0x18);
mctx->genCheckBox("ダイナミックリンク冗長表示", &DynamicModuleControlBase::verbose, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("ヒープコールバック冗長表示", &mDoMch::myHeapVerbose, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("ヒープコールバックチェック", &mDoMch::myHeapCallbackCheck, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("mDoDvdThd::verbose冗長表示", &mDoDvdThd::verbose, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("mDoDvdThd::DVDRead冗長表示", &mDoDvdThd::Report_DVDRead, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("mDoDvdThd::DVDログモード", &mDoDvdThd::DVDLogoMode, 1, 0, NULL, 0xFFFF, 0xFFFF,
0x200, 0x18);
mctx->genCheckBox("fopMsg::MemCheck ヒープチェック", &fopMsg::MemCheck, 1, 0, NULL, 0xFFFF,
0xFFFF, 0x200, 0x18);
}
void mDoMain_HIO_c::listenPropertyEvent(const JORPropertyEvent* property) {
JORMContext* mctx = attachJORMContext(8);
JORReflexible::listenPropertyEvent(property);
if ((u32)property->id >= 13 && (u32)property->id <= 20) {
int sp14 = (u32)property->id - 13;
HeapCheck* heapCheck = HeapCheckTable[sp14];
JUTReportConsole_f("\n[%sHeap]\n", heapCheck->getName());
heapCheck->getHeap()->dump_sort();
} else {
switch ((u32)property->id) {
case 0:
FixedMemoryCheck::checkAll();
break;
case 1:
FixedMemoryCheck::saveAll();
break;
case 2:
FixedMemoryCheck::diffAll();
break;
case 3:
mDoMch_HeapCheckAll();
break;
case 4:
mDoMch_HeapFreeFillAll();
break;
case 5: {
u32 fpscr = PPCMffpscr();
JUTException::setFPException(0);
JUTException::setFPException(mDoMch::FpscrEnableBits);
PPCMtfpscr(fpscr);
break;
}
case 9:
GXSetVerifyLevel(GX_WARN_ALL);
mDoMch::GXWarningExecuteFrame = TRUE;
break;
case 7: {
int RoomId = dComIfGp_roomControl_getStayNo();
JUTReportConsole_f("\nRoomId = %d\n", RoomId);
JUTReportConsole_f("\nDynamicModule\n");
DynamicModuleControlBase::dump();
break;
}
case 8:
DynamicModuleControlBase::resetDoLinkCount();
break;
case 10: {
JUTReportConsole_f("\nAramHeap\n");
JKRAramHeap* aramHeap = JKRAram::getAramHeap();
if (aramHeap != NULL) {
aramHeap->dump();
}
break;
}
case 11:
JUTReportConsole_f("\nGameResource\n");
g_dComIfG_gameInfo.mResControl.dump();
break;
case 12:
JUTReportConsole_f("\nResControl\n");
dComIfG_dumpResControl();
break;
case 6:
default:
if ((u8*)property->id == &mDisplayHeapSize) {
mctx->startUpdateNode(this);
mctx->endUpdateNode();
}
if ((u8*)property->id == &mReportDisable) {
if (mReportDisable == 0) {
OSReportEnable();
} else {
OSReportDisable();
}
}
if ((u8*)property->id == &mSelectHeapBar) {
JKRHeap* heap = NULL;
u32 select_heap = mSelectHeapBar - 1;
if (select_heap < 8) {
heap = HeapCheckTable[select_heap]->getHeap();
}
JUTProcBar::getManager()->setWatchHeap(heap);
}
if ((u8*)property->id == &mVisibleHeapBar) {
JUTProcBar::getManager()->setVisibleHeapBar(mVisibleHeapBar);
}
if ((u8*)property->id == &mDoMch::GXWarningLevel) {
GXSetVerifyLevel((GXWarningLevel)mDoMch::GXWarningLevel);
}
if ((u8*)property->id == &mDoMch::mDebugFill) {
JKRHeap::setDefaultDebugFill(mDoMch::mDebugFill);
for (JSUTree<JKRHeap>* i = JKRGetRootHeap()->getHeapTree().getFirstChild(); i != NULL; i = i->getNextChild()) {
JKRHeap* heap = i->getObject();
heap->setDebugFill(mDoMch::mDebugFill);
}
}
JKRSetDebugFillNotuse(mDoMch::mDebugFillNotUse);
JKRSetDebugFillNew(mDoMch::mDebugFillNew);
JKRSetDebugFillDelete(mDoMch::mDebugFillDelete);
}
}
releaseJORMContext(mctx);
}
#endif
/* 80005D4C-8000614C 00068C 0400+00 1/1 0/0 0/0 .text Debug_console__FUl */
bool Debug_console(u32 i_padNo) {
JUTConsole* console = JFWSystem::getSystemConsole();
if (console != NULL) {
static f32 console_position_x = 20.0f;
static f32 console_position_y = 30.0f;
static f32 console_scroll = 0.0f;
if (mDoCPd_c::getTrig(i_padNo) & PAD_TRIGGER_Z && !(mDoCPd_c::getHold(i_padNo) & ~PAD_TRIGGER_Z)) {
console->setVisible(console->isVisible() == false);
JUTAssertion::setMessageCount(0);
}
if (console->isVisible()) {
if ((mDoCPd_c::getHold(i_padNo) & PAD_TRIGGER_L && mDoCPd_c::getHold(i_padNo) & PAD_TRIGGER_R) ||
((mDoCPd_c::getAnalogL(i_padNo) > 0.0f && mDoCPd_c::getAnalogR(i_padNo) > 0.0f)))
{
f32 stick_x = mDoCPd_c::getStickX(i_padNo);
f32 stick_y = mDoCPd_c::getStickY(i_padNo);
if (mDoCPd_c::getHold(i_padNo) & (PAD_BUTTON_Y | PAD_BUTTON_X) &&
mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_START)
{
console->clear();
}
if (!(mDoCPd_c::getHold(i_padNo) & (PAD_BUTTON_Y | PAD_BUTTON_X))) {
console_scroll -= stick_y;
int scrollAmount;
if (console_scroll > 1.0f) {
scrollAmount = console_scroll;
} else if (console_scroll < -1.0f) {
scrollAmount = -(int)-console_scroll;
} else {
scrollAmount = 0;
}
if (scrollAmount != 0) {
console_scroll -= scrollAmount;
console->scroll(scrollAmount);
}
} else {
if (mDoCPd_c::getHold(i_padNo) & PAD_BUTTON_X) {
console_position_x += stick_x;
}
if (mDoCPd_c::getHold(i_padNo) & PAD_BUTTON_Y) {
console_position_y -= stick_y;
}
}
if (mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_A) {
console->dumpToTerminal(0xFFFFFFFF);
console->setOutput(JUTConsole::OUTPUT_OSREPORT | JUTConsole::OUTPUT_CONSOLE);
}
JUTReport(30, 390, 1, "Press X+Y+START to CLEAR console.");
JUTReport(30, 400, 1, "3DStick UP/Down to scroll");
JUTReport(30, 410, 1, "Press A to output terminal from console.");
JUTReport(30, 420, 1, "SCROLL%3d %3d %3d Output=%1x", console->getLineOffset(),
console->getPositionX(), console->getPositionY(), console->getOutput());
} else {
if (mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_DOWN) {
g_HIO.mDisplayMeter ^= (u8)1;
}
if (mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_LEFT) {
JKRAramHeap* aram = JKRAram::getAramHeap();
if (aram != NULL) {
aram->dump();
}
DynamicModuleControlBase::dump();
g_dComIfG_gameInfo.mResControl.dump();
}
if (mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_RIGHT) {
JKRGetSystemHeap()->dump_sort();
}
if (mDoCPd_c::getTrig(i_padNo) & PAD_BUTTON_UP) {
zeldaHeap->dump_sort();
gameHeap->dump_sort();
archiveHeap->dump_sort();
}
JUTReport(30, 440, 1, "Press L+R trigger to control console.");
JUTReport(30, 450, 1, "Press [Z] trigger to close this window.");
}
console->setPosition(console_position_x, console_position_y);
return 1;
}
}
return 0;
}
#if PLATFORM_GCN
#define COPYDATE_PATH "/str/Final/Release/COPYDATE"
#else
#define COPYDATE_PATH "/str/RVL/Debug/COPYDATE"
#endif
/* 8000614C-800061C8 000A8C 007C+00 1/1 0/0 0/0 .text LOAD_COPYDATE__FPv */
s32 LOAD_COPYDATE(void*) {
DVDFileInfo ALIGN_DECL(32) fileInfo;
u8 buffer[32];
BOOL status = DVDOpen(COPYDATE_PATH, &fileInfo);
if (status) {
s32 rt = DVDReadPrio(&fileInfo, &buffer, sizeof(buffer), 0, 2);
memcpy(mDoMain::COPYDATE_STRING, buffer, sizeof(mDoMain::COPYDATE_STRING) - 1);
status = DVDClose(&fileInfo);
}
OS_REPORT("\x1b[36mCOPYDATE=[%s]\n\x1b[m", mDoMain::COPYDATE_STRING);
return status;
}
/* 800061C8-8000628C 000B08 00C4+00 1/1 0/0 0/0 .text debug__Fv */
static void debug() {
#if DEBUG
if (mPrintFrameLine) {
printFrameLine();
}
#endif
if (mDoMain::developmentMode) {
if (mCheckHeap) {
CheckHeap(PAD_3);
}
if ((mDoCPd_c::getGamePad(PAD_3)->getButton() & ~PAD_TRIGGER_Z) == PAD_TRIGGER_R &&
mDoCPd_c::getGamePad(PAD_3)->testTrigger(PAD_TRIGGER_Z))
{
mDisplayHeapSize ^= (u8)1;
}
if (mDisplayHeapSize) {
if ((mDoCPd_c::getGamePad(PAD_3)->getButton() & ~PAD_TRIGGER_Z) == PAD_TRIGGER_L &&
mDoCPd_c::getGamePad(PAD_3)->testTrigger(PAD_TRIGGER_Z))
{
if (mHeapBriefType < 5) {
mHeapBriefType++;
} else {
mHeapBriefType = 1;
}
}
debugDisplay();
}
#if DEBUG
if (!dDebugPad.Active()) {
Debug_console(PAD_3);
}
#else
Debug_console(PAD_3);
#endif
#if DEBUG
fapGm_HIO_c::startCpuTimer();
if (fapGmHIO_getHostIO()) {
JKRHeap* var_r30 = mDoExt_getHostIOHeap();
JKRHeap* var_r29 = mDoExt_setCurrentHeap(var_r30);
JOR_MESSAGELOOP();
mDoExt_setCurrentHeap(var_r29);
}
fapGm_HIO_c::printCpuTimer("");
fapGm_HIO_c::stopCpuTimer("ホストIO");
fapGm_HIO_c::printCpuTimer("\n↑↑↑↑↑↑↑↑↑↑ CPU時間計測終了 ↑↑↑↑↑↑↑↑↑↑\n");
fapGm_HIO_c::offCpuTimer();
#endif
}
}
/* 8000628C-80006454 000BCC 01C8+00 1/1 0/0 0/0 .text main01__Fv */
void main01(void) {
OS_REPORT("\x1b[m");
// Setup heaps, setup exception manager, set RNG seed, setup DVDError Thread, setup Memory card Thread
mDoMch_Create();
#if DEBUG
// not sure how this works. appears to be getting .text, .ctors, .dtors, and .rodata areas
FixedMemoryCheck::easyCreate((void*)0x80006880, (s32)0x628F40);
FixedMemoryCheck::easyCreate((void*)0x8062F7C0, (s32)0x224);
FixedMemoryCheck::easyCreate((void*)0x8062FA00, (s32)0xc);
FixedMemoryCheck::easyCreate((void*)0x8062FA20, (s32)0x30568);
#endif
// setup FrameBuffer and ZBuffer, init display lists
mDoGph_Create();
// Setup control pad
mDoCPd_c::create();
RootHeapCheck.setHeap((JKRExpHeap*)JKRGetRootHeap());
SystemHeapCheck.setHeap((JKRExpHeap*)JKRGetSystemHeap());
ZeldaHeapCheck.setHeap(mDoExt_getZeldaHeap());
GameHeapCheck.setHeap(mDoExt_getGameHeap());
ArchiveHeapCheck.setHeap(mDoExt_getArchiveHeap());
J2dHeapCheck.setHeap(mDoExt_getJ2dHeap());
HostioHeapCheck.setHeap(mDoExt_getHostIOHeap());
CommandHeapCheck.setHeap(mDoExt_getCommandHeap());
#if DEBUG
JKRHeap* var_r28 = mDoExt_getHostIOHeap();
JKRHeap* sp10 = mDoExt_setCurrentHeap(var_r28);
JOR_INIT();
JOR_SETROOTNODE("root", &mDoHIO_root, 4, 3);
mDoExt_setCurrentHeap(sp10);
var_r28->dump_sort();
OSReport("\x1b[36mHOSTIOヒープ残り %u Bytes\n\x1b[m", var_r28->getTotalFreeSize());
#endif
JUTConsole* console = JFWSystem::getSystemConsole();
console->setOutput(mDoMain::developmentMode ? JUTConsole::OUTPUT_OSR_AND_CONSOLE :
JUTConsole::OUTPUT_NONE);
console->setPosition(32, 42);
mDoDvdThd_callback_c::create((mDoDvdThd_callback_func)LOAD_COPYDATE, NULL);
fapGm_Create(); // init framework
#if DEBUG
mDoMain_HIO.entryHIO("メイン");
g_regHIO.id = mDoHIO_createChild("レジスタ", &g_regHIO);
g_presetHIO.field_0x4 = mDoHIO_createChild("状況ファイル", &g_presetHIO);
#endif
fopAcM_initManager();
mDisplayHeapSize = 0;
cDyl_InitAsync(); // init RELs
#if VERSION == VERSION_SHIELD_DEBUG
const int audioHeapSize = 0x169000;
#else
const int audioHeapSize = 0x14D800;
#endif
g_mDoAud_audioHeap = JKRCreateSolidHeap(audioHeapSize, JKRHeap::getCurrentHeap(), false);
do {
static u32 frame;
frame++;
#if DEBUG
if (memorycheck_check_frame != 0 && frame % memorycheck_check_frame == 0) {
FixedMemoryCheck::checkAll();
}
#endif
if (fillcheck_check_frame != 0 && frame % fillcheck_check_frame == 0) {
mDoMch_HeapCheckAll();
}
if (mDoDvdThd::SyncWidthSound) {
mDoMemCd_UpDate();
}
mDoCPd_c::read(); // read controller input
#if DEBUG
if (mDoMch::GXWarningExecuteFrame) {
GXSetVerifyLevel(GX_WARN_ALL);
}
#endif
fapGm_Execute(); // handle game execution
#if DEBUG
if (mDoMch::GXWarningExecuteFrame) {
mDoMch::GXWarningExecuteFrame = 0;
GXSetVerifyLevel((GXWarningLevel)mDoMch::GXWarningLevel);
}
#endif
#if DEBUG
fapGm_HIO_c::startCpuTimer();
#endif
mDoAud_Execute(); // handle audio execution
#if DEBUG
fapGm_HIO_c::printCpuTimer("");
fapGm_HIO_c::stopCpuTimer("オーディオ");
#endif
debug(); // run debugger
} while (true);
}
#if DEBUG
// NONMATCHING
void parse_args(int argc, const char* argv[]) {
int i;
OS_REPORT("argc = %d\n", argc);
for (i = 0; i < argc; i++) {
OS_REPORT("argv[%d] = %s\n", i, argv[i]);
}
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "--noopening") == 0) {
dScnLogo_c::onOpeningCut();
} else if (strcmp(argv[i], "--nobank") == 0) {
dStage_roomControl_c::onNoArcBank();
OS_REPORT("\x1b[33mアーカイブバンクを無効にしました\n\x1b[m");
} else if (strcmp(argv[i], "--particle254") == 0) {
// data_8074c494 = 1;
OSReport_Warning("パーティクル254固定にしました\n");
} else if (strncmp(argv[i], "--menu=", sizeof("--menu=") - 1) == 0) {
char* var_r27 = strchr(argv[i] + 7, ',');
if (var_r27 != NULL) {
*var_r27 = 0;
var_r27++;
char* var_r26 = std::strchr(var_r27, ',');
if (var_r26 != NULL) {
*var_r26 = 0;
var_r26++;
char* spC = std::strchr(var_r26, ',');
if (spC != NULL) {
*spC = 0;
spC++;
sscanf(spC, "%d", dScnMenu_c::cursolPoint);
dScnMenu_c::m_error_flags |= (u8)8;
}
sscanf(var_r26, "%d", dScnMenu_c::cursolLayer);
dScnMenu_c::m_error_flags |= (u8)4;
}
sscanf(var_r27, "%d", dScnMenu_c::cursolRoomNo);
dScnMenu_c::m_error_flags |= (u8)2;
}
strcpy(dScnMenu_c::cursolStageName, argv[i] + 7);
dScnMenu_c::m_error_flags |= (u8)1;
OS_REPORT("\n\n\ndScnMenu_c::cursolLayer=[%x]", dScnMenu_c::cursolLayer);
OS_REPORT("\ndScnMenu_c::cursolRoomNo=[%x]", dScnMenu_c::cursolRoomNo);
OS_REPORT("\ndScnMenu_c::cursolStageName=[%s]\n\n", dScnMenu_c::cursolStageName);
} else if (strncmp(argv[i], "--situation=", sizeof("--situation=") - 1) == 0) {
for (int j = 0; j < 100; j++) {
if (argv[i][12 + j] <= ' ') {
break;
}
g_presetHIO.filename_buf[j] = argv[i][12 + j];
}
OS_REPORT("\n11 g_presetHIO.filename_buf[0]=[%-100.100s]", g_presetHIO.filename_buf);
} else if (strcmp(argv[i], "--noprint") == 0) {
OSReportDisable();
} else if (strcmp(argv[i], "--develop") == 0) {
mDoMain::developmentMode = 1;
} else if (strcmp(argv[i], "--nodevelop") == 0) {
mDoMain::developmentMode = 0;
} else if (strncmp(argv[i], "--e3argument=", sizeof("--e3argument=") - 1) == 0) {
sscanf(argv[i] + sizeof("--e3argument=") - 1, "%d", &mDoMain::argument);
} else if (strncmp(argv[i], "--gameheapsize=0x", sizeof("--gameheapsize=0x") - 1) == 0) {
sscanf(argv[i] + sizeof("--gameheapsize=0x") - 1, "%x", &mDoMain::gameHeapSize);
} else if (strncmp(argv[i], "--archiveheapsize=0x", sizeof("--archiveheapsize=0x") - 1) == 0) {
sscanf(argv[i] + sizeof("--archiveheapsize=0x") - 1, "%x", &mDoMain::archiveHeapSize);
} else if (strncmp(argv[i], "--memmargin=0x", sizeof("--memmargin=0x") - 1) == 0) {
sscanf(argv[i] + sizeof("--memmargin=0x") - 1, "%x", &mDoMain::memMargin);
} else if (strncmp(argv[i], "--e3menu=0x", sizeof("--e3menu=0x") - 1) == 0) {
sscanf(argv[i] + sizeof("--e3menu=0x") - 1, "%x", &mDoMain::e3menu_no);
} else {
OSReport_Error("unknown argument %d, %s\n", i, argv[i]);
}
}
}
#endif
/* 803D3420-803DB420 000140 8000+00 1/1 0/0 0/0 .bss mainThreadStack */
static u8 mainThreadStack[32768];
/* 803DB420-803DB740 008140 0318+08 1/1 0/0 0/0 .bss mainThread */
static OSThread mainThread;
/* 80006454-800065D8 000D94 0184+00 0/0 1/1 0/0 .text main */
void main(int argc, const char* argv[]) {
OSThread* current_thread = OSGetCurrentThread();
u8* stack = mainThreadStack;
mDoMain::sPowerOnTime = OSGetTime();
OSReportInit();
version_check();
#if PLATFORM_WII || PLATFORM_SHIELD
mDoRst::setResetData((mDoRstData*)OSAllocFromMEM1ArenaLo(0x18, 4));
#else
mDoRst::setResetData((mDoRstData*)OSAllocFromArenaLo(0x18, 4));
#endif
if (!mDoRst::getResetData()) {
do {
} while (true);
}
if (!(OSGetResetCode() >> 0x1F)) {
mDoRst::offReset();
mDoRst::offResetPrepare();
mDoRst::off3ButtonReset();
mDoRst::set3ButtonResetPort(-1);
mDoRst::setLogoScnFlag(0);
mDoRst::setProgSeqFlag(0);
mDoRst::setProgChgFlag(0);
mDoRst::setWarningDispFlag(0);
mDoRst::offShutdown();
mDoRst::offReturnToMenu();
}
#if PLATFORM_WII || PLATFORM_SHIELD
SCInit();
#endif
dComIfG_ct();
#if PLATFORM_WII || PLATFORM_SHIELD
u32 status;
do {
status = SCCheckStatus();
} while (status != 0);
JUT_ASSERT(1785, status != 2);
#endif
#if DEBUG
parse_args(argc, argv);
#endif
if (mDoMain::developmentMode < 0) {
DVDDiskID* disk_id = DVDGetCurrentDiskID();
if (disk_id->gameVersion > 0x90) {
mDoMain::developmentMode = 1;
} else if (disk_id->gameVersion > 0x80) {
u32 consoleType = OSGetConsoleType();
mDoMain::developmentMode = (consoleType >> 0x1C) & 1;
} else {
mDoMain::developmentMode = 0;
}
}
OS_REPORT("メインスレッドを作成します\n");
s32 priority = OSGetThreadPriority(current_thread);
OSCreateThread(&mainThread, (void*(*)(void*))main01, 0, stack + sizeof(mainThreadStack), sizeof(mainThreadStack), priority, 0);
OSResumeThread(&mainThread);
OS_REPORT("メインスレッドを起動しました <%x>\n", &mainThread);
OSSetThreadPriority(current_thread, 0x1F);
OSSuspendThread(current_thread);
}
/* 800065D8-800065E0 000F18 0008+00 0/0 2/0 0/0 .text dump_sort__7JKRHeapFv */
bool JKRHeap::dump_sort() {
return true;
}
/* ############################################################################################## */
/* 80450B38-80450B3C 000038 0004+00 0/0 2/2 0/0 .sbss
* sInstance__34JASGlobalInstance<13Z2WolfHowlMgr> */
template<>
Z2WolfHowlMgr* JASGlobalInstance<Z2WolfHowlMgr>::sInstance;
/* 80450B3C-80450B40 00003C 0004+00 0/0 6/6 0/0 .sbss sInstance__31JASGlobalInstance<10Z2EnvSeMgr>
*/
template<>
Z2EnvSeMgr* JASGlobalInstance<Z2EnvSeMgr>::sInstance;
/* 80450B40-80450B44 000040 0004+00 0/0 6/6 0/0 .sbss
* sInstance__32JASGlobalInstance<11Z2FxLineMgr> */
template<>
Z2FxLineMgr* JASGlobalInstance<Z2FxLineMgr>::sInstance;
/* 80450B44-80450B48 000044 0004+00 0/0 18/18 0/0 .sbss
* sInstance__31JASGlobalInstance<10Z2Audience> */
template<>
Z2Audience* JASGlobalInstance<Z2Audience>::sInstance;
/* 80450B48-80450B4C 000048 0004+00 0/0 17/17 0/0 .sbss
* sInstance__34JASGlobalInstance<13Z2SoundObjMgr> */
template<>
Z2SoundObjMgr* JASGlobalInstance<Z2SoundObjMgr>::sInstance;
/* 80450B4C-80450B50 00004C 0004+00 0/0 10/10 0/0 .sbss
* sInstance__32JASGlobalInstance<11Z2SoundInfo> */
template<>
Z2SoundInfo* JASGlobalInstance<Z2SoundInfo>::sInstance;
/* 80450B50-80450B54 000050 0004+00 0/0 5/5 0/0 .sbss
* sInstance__33JASGlobalInstance<12JAUSoundInfo> */
template<>
JAUSoundInfo* JASGlobalInstance<JAUSoundInfo>::sInstance;
/* 80450B54-80450B58 000054 0004+00 0/0 2/2 0/0 .sbss
* sInstance__38JASGlobalInstance<17JAUSoundNameTable> */
template<>
JAUSoundNameTable* JASGlobalInstance<JAUSoundNameTable>::sInstance;
/* 80450B58-80450B5C 000058 0004+00 0/0 12/12 0/0 .sbss
* sInstance__34JASGlobalInstance<13JAUSoundTable> */
template<>
JAUSoundTable* JASGlobalInstance<JAUSoundTable>::sInstance;
/* 80450B5C-80450B60 00005C 0004+00 0/0 6/6 0/0 .sbss
* sInstance__33JASGlobalInstance<12JAISoundInfo> */
template<>
JAISoundInfo* JASGlobalInstance<JAISoundInfo>::sInstance;
/* 80450B60-80450B64 000060 0004+00 0/0 29/29 0/0 .sbss
* sInstance__31JASGlobalInstance<10Z2SoundMgr> */
template<>
Z2SoundMgr* JASGlobalInstance<Z2SoundMgr>::sInstance;
/* 80450B64-80450B68 000064 0004+00 0/0 2/2 0/0 .sbss
* sInstance__33JASGlobalInstance<12JAIStreamMgr> */
template<>
JAIStreamMgr* JASGlobalInstance<JAIStreamMgr>::sInstance;
/* 80450B68-80450B6C 000068 0004+00 0/0 3/3 0/0 .sbss sInstance__29JASGlobalInstance<9JAISeqMgr>
*/
template<>
JAISeqMgr* JASGlobalInstance<JAISeqMgr>::sInstance;
/* 80450B6C-80450B70 00006C 0004+00 0/0 4/4 0/0 .sbss sInstance__28JASGlobalInstance<8JAISeMgr> */
template<>
JAISeMgr* JASGlobalInstance<JAISeMgr>::sInstance;
/* 80450B70-80450B74 000070 0004+00 0/0 9/9 0/0 .sbss
* sInstance__33JASGlobalInstance<12Z2SpeechMgr2> */
template<>
Z2SpeechMgr2* JASGlobalInstance<Z2SpeechMgr2>::sInstance;
/* 80450B74-80450B78 000074 0004+00 0/0 22/22 0/0 .sbss
* sInstance__35JASGlobalInstance<14Z2SoundStarter> */
template<>
Z2SoundStarter* JASGlobalInstance<Z2SoundStarter>::sInstance;
/* 80450B78-80450B7C 000078 0004+00 0/0 2/2 0/0 .sbss
* sInstance__36JASGlobalInstance<15JAISoundStarter> */
template<>
JAISoundStarter* JASGlobalInstance<JAISoundStarter>::sInstance;
/* 80450B7C-80450B80 00007C 0004+00 0/0 34/34 0/0 .sbss
* sInstance__32JASGlobalInstance<11Z2StatusMgr> */
template<>
Z2StatusMgr* JASGlobalInstance<Z2StatusMgr>::sInstance;
/* 80450B80-80450B84 000080 0004+00 0/0 46/46 0/0 .sbss
* sInstance__31JASGlobalInstance<10Z2SceneMgr> */
template<>
Z2SceneMgr* JASGlobalInstance<Z2SceneMgr>::sInstance;
/* 80450B84-80450B88 000084 0004+00 0/0 38/38 0/0 .sbss sInstance__28JASGlobalInstance<8Z2SeqMgr>
*/
template<>
Z2SeqMgr* JASGlobalInstance<Z2SeqMgr>::sInstance;
/* 80450B88-80450B8C 000088 0004+00 0/0 25/25 0/0 .sbss sInstance__27JASGlobalInstance<7Z2SeMgr>
*/
template<>
Z2SeMgr* JASGlobalInstance<Z2SeMgr>::sInstance;
/* 80450B8C-80450B90 00008C 0004+00 0/0 6/6 0/0 .sbss
* sInstance__35JASGlobalInstance<14JASAudioThread> */
template<>
JASAudioThread* JASGlobalInstance<JASAudioThread>::sInstance;
/* 80450B90-80450B98 000090 0004+04 0/0 4/4 0/0 .sbss
* sInstance__40JASGlobalInstance<19JASDefaultBankTable> */
template<>
JASDefaultBankTable* JASGlobalInstance<JASDefaultBankTable>::sInstance;