tp/src/m_Do/m_Do_main.cpp

612 lines
19 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.

#include "m_Do/m_Do_main/m_Do_main.h"
#include "JSystem/JKernel/JKRAram/JKRAram.h"
#include "JSystem/JKernel/JKRAramHeap/JKRAramHeap.h"
#include "JSystem/JUtility/JUTAssert/JUTAssert.h"
#include "JSystem/JUtility/JUTReport/JUTReport.h"
#include "SComponent/c_API_controller_pad.h"
#include "d/d_com/d_com_inf_game/d_com_inf_game.h"
#include "dvd/dvd.h"
#include "global.h"
#include "m_Do/m_Do_audio/m_Do_audio.h"
#include "m_Do/m_Do_controller_pad/m_Do_controller_pad.h"
#include "m_Do/m_Do_dvd_thread/m_Do_dvd_thread.h"
#include "m_Do/m_Do_ext/m_Do_ext.h"
#include "m_Do/m_Do_graphic/m_Do_graphic.h"
#include "m_Do/m_Do_machine/m_Do_machine.h"
#include "m_Do/m_Do_reset/m_Do_reset.h"
extern float lbl_80451A00;
extern float lbl_80451A04;
extern float lbl_80451A08;
extern u8 lbl_80451A0C;
extern u8 lbl_80451A10;
extern u8 lbl_80451A18;
extern u8 lbl_803D0000;
extern float lbl_80450B2C;
extern float lbl_80450B1C;
extern JKRExpHeap* sSystemHeap__7JKRHeap;
extern JKRExpHeap* lbl_80450C2C;
extern JKRExpHeap* lbl_80450C28;
extern JKRExpHeap* lbl_80450C34;
extern s8 lbl_80450B20;
extern s8 lbl_80450B28;
extern float lbl_80450B24;
extern s8 lbl_80450B30;
extern char lbl_803739A0[0x310];
extern "C" {
int strcmp(const char*, const char*);
void cDyl_InitAsync(void);
void CheckHeap1__9HeapCheckFv(void);
void create__12JKRSolidHeapFUlP7JKRHeapb(void);
void create__8mDoCPd_cFv(void);
void dComIfG_inf_c_NS_ct(void);
void debug__Fv(void);
void dRes_control_c_NS_dump(void);
void dump__11JKRAramHeapFv(void);
void DynamicModuleControlBase_NS_dump(void);
void fapGm_Create(void);
void fapGm_Execute(void);
void fopAcM_initManager(void);
void getFreeSize__11JKRAramHeapFv(void);
void getFreeSize__7JKRHeapCFv(void);
void getTotalFreeSize__11JKRAramHeapFv(void);
void getTotalFreeSize__7JKRHeapCFv(void);
void getTotalUsedSize__10JKRExpHeapCFv(void);
void getUsedCount__9HeapCheckCFv(void);
void heapDisplay__9HeapCheckCFv(void);
void JUTReport__FiiPCce(int, int, const char*, ...);
void JUTReport__FiiiPCce(void);
void mDoDvdThd_callback_c_NS_create(void);
void mDoMch_HeapCheckAll(void);
void mDoMemCd_Ctrl_c_NS_update(void);
void memcpy(void*, const void*, int);
void read__8mDoCPd_cFv(void);
void version_check__Fv(void);
void main01__Fv(void);
void ct__13dComIfG_inf_cFv(void);
int getLineOffset__10JUTConsoleCFv(void);
void dumpToTerminal__10JUTConsoleFUi(void);
void scroll__10JUTConsoleFi(void);
void clear__10JUTConsoleFv(void);
void setMessageCount__12JUTAssertionFi(void);
}
extern char* lbl_803A2F14[5];
extern char* lbl_803A2F28[5];
void version_check(void) {
if ((!strcmp("20Apr2004", "20Apr2004")) && (!strcmp("Patch2", "Patch2"))) {
return;
}
OSReport_Error("SDK<EFBFBD>̃o<EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD>܂<EFBFBD><DC82><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>~<7E><><EFBFBD>܂<EFBFBD>\n");
do {
} while (true);
}
void HeapCheck::CheckHeap1(void) {
s32 totalUsedSize = heap->getTotalUsedSize();
s32 freeSize = heap->getFreeSize();
if (max_total_used_size < totalUsedSize) {
max_total_used_size = totalUsedSize;
}
if (max_total_free_size > freeSize) {
max_total_free_size = freeSize;
}
}
#ifdef NONMATCHING
void CheckHeap(u32 controller_pad_no) {
mDoMch_HeapCheckAll();
OSCheckActiveThreads();
bool unk = false;
// if L + R + Z is pressed...
if (((m_cpadInfo[controller_pad_no].mButtonFlags & ~0x10) == 0x60) &&
m_cpadInfo[controller_pad_no].mPressedButtonFlags & 0x10) {
unk = true;
}
for (int i = 0; i < 8; i++) {
HeapCheckTable[i]->CheckHeap1();
if (unk) {
HeapCheck* currentHeap = HeapCheckTable[i];
s32 used_count = currentHeap->getUsedCount();
currentHeap->getUsedCountRef() = used_count;
used_count = currentHeap->getHeap()->getTotalUsedSize();
currentHeap->getTotalUsedSizeRef() = used_count;
}
}
}
#else
asm void CheckHeap(u32 param_1) {
nofralloc
#include "m_Do/m_Do_main/asm/func_8000578C.s"
}
#endif
int countUsed(JKRExpHeap* heap) {
OSDisableScheduler();
int counter = 0;
JKRExpHeap::CMemBlock* used_blocks_head = heap->getHeadUsedList();
while (used_blocks_head) {
used_blocks_head = used_blocks_head->getNextBlock();
counter++;
};
OSEnableScheduler();
return counter;
}
s32 HeapCheck::getUsedCount(void) const {
return countUsed(heap);
}
void HeapCheck::heapDisplay(void) const {
s32 heap_size1 = heap->getSize();
s32 heap_size2 = heap_size1 - heap_size;
s32 heap_total_used_size = heap->getTotalUsedSize();
s32 heap_total_free_size = heap->getTotalFreeSize();
s32 heap_free_size = heap->getFreeSize();
JUTReport(0x64, 0xd4, "[%sName]", names[0]);
JUTReport(0x64, 0xe3, "HeapSize %8ld", heap_size1);
JUTReport(0x64, 0xf0, "TargetHeapSize %8ld", heap_size);
JUTReport(0x64, 0xfd, "TotalFree %8ld", heap_total_free_size - heap_size2);
JUTReport(0x64, 0x10a, "FreeSize %8ld", heap_free_size - heap_size2);
JUTReport(0x64, 0x117, "TotalUsedSize %8ld", heap_total_used_size);
JUTReport(0x64, 0x124, "TotalUsedRate %3ld%%",
(int)(heap_total_used_size * 0x64) / (int)heap_size);
JUTReport(0x64, 0x131, "MaxTotalUsedSize %8ld", max_total_used_size);
JUTReport(0x64, 0x13e, "MaxTotalUsedRate %3ld%%",
(max_total_used_size * 0x64) / (int)heap_size);
JUTReport(0x64, 0x14b, "MinFreeSize %8ld", max_total_free_size - heap_size2);
JUTReport(0x64, 0x158, "MinFreeRate %3ld%%",
((max_total_free_size - heap_size2) * 0x64) / (int)heap_size);
heap_size2 = countUsed(heap);
JUTReport(0x64, 0x165, "UsedCount %3ld%", heap_size2);
}
const char* lbl_80373AEF = "";
const char* lbl_80373AF0 = "TotalFree";
const char* lbl_80373AFA = "MaxUsed ";
const char* lbl_80373B04 = "Used ";
const char* lbl_80373B0E = "RelUsed ";
const char* lbl_80373B18 = "/ MaxFree";
const char* lbl_80373B22 = "/HeapSize";
const char* lbl_80373B2C = "Blk/Bytes";
const char* lbl_80373B36 = "ARAM Free";
const char* lbl_80373B40 = "%d";
const char* lbl_80373B43 = "%s";
const char* lbl_80373B46 = " [%s]";
const char* lbl_80373B4C = "%10d";
const char* lbl_80373B51 = "Press X+Y+START to CLEAR console.";
const char* lbl_80373B73 = "3DStick UP/Down to scroll";
const char* lbl_80373B8D = "Press A to output terminal from console.";
const char* lbl_80373BB6 = "SCROLL<EFBFBD>F%3d %3d %3d Output=%1x";
const char* lbl_80373BD5 = "Press L+R trigger to control console.";
const char* lbl_80373BFB = "Press [Z] trigger to close this window.";
#ifdef NONMATCHING
void debugDisplay(void) {
int tmp1;
int tmp2;
HeapCheck** hct = (HeapCheck**)lbl_803A2EE0;
if (lbl_80450B19 >= 1 && lbl_80450B19 <= 6) {
hct[lbl_80450B19 - 1]->heapDisplay();
}
if (lbl_80450588 == 5) {
JKRAramHeap* heap = sAramObject__7JKRAram->getAramHeap();
if (heap) {
JUTReport(0x1db, 100, lbl_803739A0 + 0x196);
JUTReport(0x1db, 0x72, lbl_803739A0 + 0x1A0, heap->getFreeSize());
JUTReport(0x1db, 0x80, lbl_803739A0 + 0x150);
JUTReport(0x1db, 0x8e, lbl_803739A0 + 0x1A0, heap->getTotalFreeSize());
}
} else {
if (lbl_80450588) {
JUTReport(0x1db, 100, lbl_803739A0 + 0x1A3, lbl_803A2F14[lbl_80450588]);
JUTReport(0x1db, 0x72, lbl_803739A0 + 0x1A3, lbl_803A2F28[lbl_80450588]);
int k = 0;
for (int i = 0; i < 8; i++, k += 0x2c) {
// heap check table stuff
HeapCheck* heap_check;
heap_check = HeapCheckTable[i];
switch (lbl_80450588) {
case 3: {
tmp1 = heap_check->getUsedCount();
tmp2 = heap_check->getHeap()->getTotalUsedSize();
break;
}
case 1: {
tmp1 = heap_check->getHeap()->getTotalFreeSize();
tmp2 = heap_check->getHeap()->getFreeSize();
break;
}
case 2: {
tmp1 = heap_check->getMaxTotalUsedSize();
tmp2 = heap_check->getHeap()->getSize();
break;
}
case 4: {
tmp1 = heap_check->getUsedCount() - heap_check->getUsedCountRef();
tmp2 = heap_check->getHeap()->getTotalUsedSize() -
heap_check->getTotalUsedSizeRef();
break;
}
JUTReport(0x1db, k + 0x96, lbl_80373B46, heap_check->getNames()[0]);
JUTReport(0x1db, k + 0xA4, lbl_80373B4C, tmp1);
JUTReport(0x1db, k + 0xB2, lbl_80373B4C, tmp2);
}
}
}
}
}
#else
asm void debugDisplay(void) {
nofralloc
#include "m_Do\m_Do_main\asm\func_80005AD8.s"
}
#endif
#ifdef NONMATCHING
void Debug_console(u32 controller_no) {
float tmp2;
float tmp3;
int tmp6;
// systemConsole
if (lbl_804511B8) {
if (!lbl_80450B20) {
lbl_80450B1C = lbl_80451A00;
lbl_80450B20 = 1;
}
if (!lbl_80450B28) {
lbl_80450B24 = lbl_80451A04;
lbl_80450B28 = 1;
}
if (!lbl_80450B30) {
lbl_80450B2C = lbl_80451A08;
lbl_80450B30 = 1;
}
u32 tmp5 = m_cpadInfo[controller_no].mPressedButtonFlags;
if ((m_cpadInfo[controller_no].mPressedButtonFlags & 0x10) &&
!(m_cpadInfo[controller_no].mButtonFlags & 0xFFFFFFEF)) {
lbl_804511B8->field_0x68 = !lbl_804511B8->field_0x68;
JUTAssertion::setMessageCount(0);
}
if (lbl_804511B8->field_0x68) {
u32 tmp = m_cpadInfo[controller_no].mButtonFlags;
// if R and L are pressed
if ((tmp & 0x40 && tmp & 0x20) ||
((lbl_80451A08 > m_cpadInfo[controller_no].mTriggerLeft) &&
(lbl_80451A08 > m_cpadInfo[controller_no].mTriggerRight))) {
tmp2 = m_cpadInfo[controller_no].mMainStickPosX;
tmp3 = m_cpadInfo[controller_no].mMainStickPosY;
// if x buttons are pressed, clear the console
if (tmp & 0xC00 && tmp5 & 0x1000) {
lbl_804511B8->clear();
}
u32 tmp = m_cpadInfo[controller_no].mButtonFlags;
if (!(tmp & 0xC00)) {
// subtract console scroll value from stick Y
float tmp4 = lbl_80450B2C;
lbl_80450B2C = tmp4 - tmp3;
if (lbl_80450B2C <= lbl_80451A0C) {
lbl_80451A10 <= lbl_80450B2C ? tmp = 0 : tmp = lbl_80451A0C;
} else {
tmp = (tmp4 - tmp3);
}
if (tmp) {
lbl_80450B2C -= (tmp ^ 0x80000000) - 4503601774854144.00000000;
lbl_804511B8->scroll(tmp);
}
} else {
if (tmp & 0x400) {
lbl_80450B2C += tmp2;
}
if (tmp & 0x800) {
lbl_80450B2C -= tmp3;
}
}
if (tmp5 & 0x100) {
lbl_804511B8->dumpToTerminal(0xFFFFFFFF);
lbl_804511B8->field_0x58 = 3;
}
JUTReport(0x1E, 0x186, 1, lbl_80373B51);
JUTReport(0x1E, 400, 1, lbl_80373B73);
JUTReport(0x1E, 0x19A, 1, lbl_80373B8D);
tmp6 = lbl_804511B8->getLineOffset();
JUTReport(0x1E, 0x1A4, 1, lbl_80373BB6, tmp6, lbl_804511B8->field_0x40,
lbl_804511B8->field_0x44, lbl_804511B8->field_0x58);
}
} else {
if (tmp5 & 4) {
g_HIO.field_0x15 ^= 1;
}
if (tmp5 & 1) {
if (sAramObject__7JKRAram->getAramHeap()) {
sAramObject__7JKRAram->getAramHeap()->dump();
}
DynamicModuleControlBase_NS_dump();
dRes_control_c_NS_dump();
}
if (tmp5 & 2) {
sSystemHeap__7JKRHeap->dump_sort();
}
if (tmp5 & 8) {
lbl_80450C2C->dump_sort();
lbl_80450C28->dump_sort();
lbl_80450C34->dump_sort();
}
JUTReport(0x1E, 0x1B8, 1, lbl_80373BD5);
JUTReport(0x1E, 0x1C2, 1, lbl_80373BFB);
}
lbl_804511B8->field_0x40 = lbl_80450B1C;
lbl_804511B8->field_0x44 = lbl_80450B24;
tmp6 = 1;
}
}
#else
asm void Debug_console(u32) {
nofralloc
#include "m_Do\m_Do_main\asm\func_80005D4C.s"
}
#endif
#ifdef NONMATCHING
void LOAD_COPYDATE(void*) {
DVDFileInfo file_info;
s32 dvd_status = DVDOpen("/str/Final/Release/COPYDATE", &file_info);
if (dvd_status) {
char buffer[32];
DVDReadPrio(&file_info, buffer, 32, 0, 2);
memcpy(lbl_803A2EE0, buffer, 17);
DVDClose(&file_info);
}
}
#else
const char* lbl_80373C23 = "/str/Final/Release/COPYDATE";
asm void LOAD_COPYDATE(void*) {
nofralloc
#include "m_Do\m_Do_main\asm\func_8000614C.s"
}
#endif
const char* lbl_80373C3F = "Root";
const char* lbl_80373C44 = "<EFBFBD><EFBFBD><EFBFBD>[<5B>g";
const char* lbl_80373C4B = "System";
const char* lbl_80373C52 = "<EFBFBD>V<EFBFBD>X<EFBFBD>e<EFBFBD><EFBFBD>";
const char* lbl_80373C5B = "Zelda";
const char* lbl_80373C61 = "<EFBFBD>[<5B><><EFBFBD>_";
const char* lbl_80373C68 = "Game";
const char* lbl_80373C6D = "<EFBFBD>Q<EFBFBD>[<5B><>";
const char* lbl_80373C74 = "Archive";
const char* lbl_80373C7C = "<EFBFBD>A<EFBFBD>[<5B>J<EFBFBD>C<EFBFBD>u";
const char* lbl_80373C87 = "J2d";
const char* lbl_80373C8B = "J2D";
const char* lbl_80373C8F = "Hostio";
const char* lbl_80373C96 = "<EFBFBD>z<EFBFBD>X<EFBFBD>gIO";
const char* lbl_80373C9F = "Command";
const char* lbl_80373CA7 = "<EFBFBD>R<EFBFBD>}<7D><><EFBFBD>h";
void debug(void) {
if (lbl_80450580) {
if (lbl_80450B1A[0]) {
CheckHeap(2);
}
if (((m_gamePad[2]->buttons.mButtonFlags & ~0x10) == 0x20) &&
(m_gamePad[2]->buttons.mPressedButtonFlags & 0x10)) {
lbl_80450B18 ^= 0x1;
}
if (lbl_80450B18) {
if (((m_gamePad[2]->buttons.mButtonFlags & ~0x10) == 0x40) &&
(m_gamePad[2]->buttons.mPressedButtonFlags & 0x10)) {
lbl_80450588 < 0x5 ? lbl_80450588++ : lbl_80450588 = 0x1;
}
debugDisplay();
}
Debug_console(2);
}
}
#ifdef NONMATCHING
void main01(void) {
HeapCheck* heaps = lbl_803D32E0;
mDoMch_Create();
mDoGph_Create();
create__8mDoCPd_cFv();
mDoDVDThd_callback_c thread_callback;
// JKRSolidHeap audio_heap;
// Root Heap
heaps[0].setHeap((JKRExpHeap*)JKRHeap::getRootHeap());
if (JKRHeap::getRootHeap()) {
heaps[0].setHeapSize(JKRHeap::getRootHeap()->getSize());
}
// System Heap
heaps[1].setHeap((JKRExpHeap*)JKRHeap::getSystemHeap());
if (JKRHeap::getSystemHeap()) {
heaps[1].setHeapSize(JKRHeap::getSystemHeap()->getSize());
}
// Zelda Heap
heaps[2].setHeap(mDoExt_getZeldaHeap());
if (heaps[2].getHeap()) {
heaps[2].setHeapSize(heaps[2].getHeap()->getSize());
}
// Game Heap
heaps[3].setHeap(mDoExt_getGameHeap());
if (heaps[3].getHeap()) {
heaps[3].setHeapSize(heaps[3].getHeap()->getSize());
}
// Archive Heap
heaps[4].setHeap(mDoExt_getArchiveHeap());
if (heaps[4].getHeap()) {
heaps[4].setHeapSize(heaps[4].getHeap()->getSize());
}
// J2D Heap
heaps[5].setHeap(mDoExt_getJ2dHeap());
if (heaps[5].getHeap()) {
heaps[5].setHeapSize(heaps[5].getHeap()->getSize());
}
// HostIO Heap
heaps[6].setHeap(mDoExt_getHostIOHeap());
if (heaps[6].getHeap()) {
heaps[6].setHeapSize(heaps[6].getHeap()->getSize());
}
// Command Heap
heaps[7].setHeap(mDoExt_getCommandHeap());
u8* systemConsole = lbl_804511B8;
if (heaps[7].getHeap()) {
heaps[7].setHeapSize(heaps[7].getHeap()->getSize());
}
int unk = 0;
if (lbl_80450580) {
unk = 3;
}
*(lbl_804511B8 + 0x58) = unk;
*(systemConsole + 0x40) = 0x20;
*(systemConsole + 0x44) = 0x2a;
// lol
thread_callback.create((void* (*)(void*))LOAD_COPYDATE, 0);
fapGm_Create();
fopAcM_initManager();
lbl_80450B18 = 0;
cDyl_InitAsync();
// g_mDoAud_audioHeap
lbl_80450BBC = JKRSolidHeap_NS_create(0x14d800, JKRHeap::getCurrentHeap(), false);
// main loop
do {
// global frame counter?
lbl_80450B34++;
if (lbl_80450B00 && (lbl_80450B34 == ((lbl_80450B34 / lbl_80450B00) * lbl_80450B00))) {
mDoMch_HeapCheckAll();
}
if (lbl_80450C80) {
mDoMemCd_Ctrl_c_NS_update();
}
mDoCPd_c_NS_read();
fapGm_Execute();
mDoAud_Execute();
debug();
} while (true);
}
#else
asm void main01(void) {
nofralloc
#include "m_Do\m_Do_main\asm\func_8000628C.s"
}
#endif
#ifdef NONMATCHING
void main(void) {
s32 current_thread_priority;
u32 test;
u32 resetCode;
OSThread* current_thread = OSGetCurrentThread();
test = lbl_803D3420[0];
OSTime current_time = OSGetTime();
lbl_80450B0C = (current_time >> 0x20);
lbl_80450B08 = test;
OSReportInit__Fv();
version_check__Fv();
m_Do_Reset_NS_mDoRst_NS_mResetData = (ResetData*)OSAllocFromArenaLo(0x18, 4);
if (!m_Do_Reset_NS_mDoRst_NS_mResetData) {
do {
} while (true);
}
resetCode = OSGetResetCode();
if (!resetCode) {
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x0 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x4 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x4 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x8 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->pad_index = -1;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x12 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x13 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x14 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x15 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x10 = 0;
m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x11 = 0;
}
g_dComIfG_gameInfo.ct();
if (lbl_80450580 < 0) {
DVDDiskID* disk_id = DVDGetCurrentDiskID();
if (disk_id->game_version > 0x90) {
lbl_80450580 = 0;
} else {
if (disk_id->game_version > 0x80) {
resetCode = OSGetConsoleType();
lbl_80450580 = (resetCode >> 0x1C) & 1;
}
lbl_80450580 = 1;
}
}
current_thread_priority = OSGetThreadPriority(current_thread);
OSCreateThread(&lbl_803DB420, main01__Fv, 0, &lbl_803DB420, 0x8000, current_thread_priority, 0);
OSResumeThread(&lbl_803DB420);
OSSetThreadPriority(current_thread, 0x1F);
OSSuspendThread(current_thread);
}
#else
asm void main(void) {
nofralloc
#include "m_Do\m_Do_main\asm\func_80006454.s"
}
#endif