summaryrefslogtreecommitdiff
path: root/src/m_Do
diff options
context:
space:
mode:
authorTakaRikka <38417346+TakaRikka@users.noreply.github.com>2025-10-19 10:30:49 -0700
committerGitHub <noreply@github.com>2025-10-19 20:30:49 +0300
commit850fae1aa304f7703ef973cf2126f246048ca25d (patch)
treef00b1bc2a000fd33dcc10ea08e2d57b8887fac70 /src/m_Do
parent31c0f94a1052de4cd5cc9c829d41c4389b3fc7b7 (diff)
m_Do_main / f_ap_game / f_op_actor debug work and misc (#2744)
* m_Do_main / f_ap_game debug stuff * revolution sdk compatibility * f_op_actor debug work * rename fopAcM_SetupActor to fopAcM_ct * fix build * fix jp/pal splits
Diffstat (limited to 'src/m_Do')
-rw-r--r--src/m_Do/m_Do_DVDError.cpp3
-rw-r--r--src/m_Do/m_Do_Reset.cpp26
-rw-r--r--src/m_Do/m_Do_audio.cpp2
-rw-r--r--src/m_Do/m_Do_dvd_thread.cpp13
-rw-r--r--src/m_Do/m_Do_ext.cpp2
-rw-r--r--src/m_Do/m_Do_machine.cpp27
-rw-r--r--src/m_Do/m_Do_main.cpp411
-rw-r--r--src/m_Do/m_Do_printf.cpp84
8 files changed, 472 insertions, 96 deletions
diff --git a/src/m_Do/m_Do_DVDError.cpp b/src/m_Do/m_Do_DVDError.cpp
index eb6402a3c1..b6f2dd9508 100644
--- a/src/m_Do/m_Do_DVDError.cpp
+++ b/src/m_Do/m_Do_DVDError.cpp
@@ -10,6 +10,9 @@
#include "m_Do/m_Do_ext.h"
#include "m_Do/m_Do_Reset.h"
+/* 80450C88-80450C90 000188 0008+00 0/0 2/2 0/0 .sbss None */
+bool mDoDvdErr_initialized;
+
/* 803DECC0-803DEFE0 00B9E0 0318+08 4/4 0/0 0/0 .bss DvdErr_thread */
static OSThread DvdErr_thread;
diff --git a/src/m_Do/m_Do_Reset.cpp b/src/m_Do/m_Do_Reset.cpp
index c837645a43..8d3c8e67ec 100644
--- a/src/m_Do/m_Do_Reset.cpp
+++ b/src/m_Do/m_Do_Reset.cpp
@@ -109,29 +109,3 @@ void mDoRst_resetCallBack(int port, void*) {
mDoRst::onReset();
}
}
-
-/* ############################################################################################## */
-/* 80450C80-80450C88 -00001 0008+00 0/0 6/6 0/0 .sbss None */
-/* 80450C80 0001+00 data_80450C80 None */
-/* 80450C81 0007+00 data_80450C81 None */
-// most of these are probably fake
-#pragma push
-#pragma force_active on
-u8 struct_80450C7C;
-u8 struct_80450C7D;
-u8 struct_80450C7E;
-u8 struct_80450C7F;
-
-bool SyncWidthSound;
-u8 sDefaultDirection;
-
-u8 struct_80450C82;
-u8 struct_80450C83;
-u8 struct_80450C84;
-u8 struct_80450C85;
-u8 struct_80450C86;
-u8 struct_80450C87;
-#pragma pop
-
-/* 80450C88-80450C90 000188 0008+00 0/0 2/2 0/0 .sbss None */
-bool mDoDvdErr_initialized;
diff --git a/src/m_Do/m_Do_audio.cpp b/src/m_Do/m_Do_audio.cpp
index 5134ebabdd..2318a9d517 100644
--- a/src/m_Do/m_Do_audio.cpp
+++ b/src/m_Do/m_Do_audio.cpp
@@ -79,7 +79,7 @@ static void mDoAud_Create() {
l_arcCommand->destroy();
mDoAud_zelAudio_c::onInitFlag();
- SyncWidthSound = true;
+ mDoDvdThd::SyncWidthSound = true;
}
}
diff --git a/src/m_Do/m_Do_dvd_thread.cpp b/src/m_Do/m_Do_dvd_thread.cpp
index 23825d720d..68dd3c8ff6 100644
--- a/src/m_Do/m_Do_dvd_thread.cpp
+++ b/src/m_Do/m_Do_dvd_thread.cpp
@@ -30,6 +30,17 @@ mDoDvdThdStack mDoDvdThd::l_threadStack;
/* 803DEC60-803DECC0 00B980 0048+18 5/6 0/0 0/0 .bss l_param__9mDoDvdThd */
mDoDvdThd_param_c mDoDvdThd::l_param;
+#if DEBUG
+u8 mDoDvdThd::verbose;
+u8 mDoDvdThd::DVDLogoMode;
+bool mDoDvdThd::SyncWidthSound;
+u8 mDoDvdThd::Report_DVDRead;
+#else
+bool mDoDvdThd::SyncWidthSound;
+#endif
+
+u8 sDefaultDirection;
+
#pragma push
#pragma force_active on
static u8 padding[0x18];
@@ -111,7 +122,7 @@ void mDoDvdThd_param_c::mainLoop() {
while (this->waitForKick() != 0) {
while (mDoDvdThd_command_c* command = this->getFirstCommand()) {
this->cut(command);
- if (SyncWidthSound) {
+ if (mDoDvdThd::SyncWidthSound) {
JASDvd::getThreadPointer()->sendCmdMsg(cb, &command, 4);
} else {
cb(&command);
diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp
index 34a76f4ae8..1773e33767 100644
--- a/src/m_Do/m_Do_ext.cpp
+++ b/src/m_Do/m_Do_ext.cpp
@@ -3180,7 +3180,7 @@ J3DModel* mDoExt_J3DModel__create(J3DModelData* i_modelData, u32 i_modelFlag, u3
}
/* 80450C68-80450C70 000168 0004+04 1/1 0/0 0/0 .sbss aram_cache_size */
-static u32 aram_cache_size;
+u32 aram_cache_size;
/* 80014D5C-80014D64 00F69C 0008+00 0/0 1/1 0/0 .text mDoExt_setAraCacheSize__FUl */
void mDoExt_setAraCacheSize(u32 size) {
diff --git a/src/m_Do/m_Do_machine.cpp b/src/m_Do/m_Do_machine.cpp
index 989c5c28b3..cd54ce571f 100644
--- a/src/m_Do/m_Do_machine.cpp
+++ b/src/m_Do/m_Do_machine.cpp
@@ -26,12 +26,19 @@
#include "m_Do/m_Do_main.h"
/* 80450BF0-80450BF4 0000F0 0004+00 1/1 0/0 0/0 .sbss None */
-static u8 mDebugFill;
-
-#ifdef DEBUG
-static u8 mDebugFillNotuse;
-static u8 mDebugFillNew;
-static u8 mDebugFillDelete;
+#if DEBUG
+u8 mDoMch::mDebugFill = true;
+u8 mDoMch::mDebugFillNotuse = 0xDD;
+u8 mDoMch::mDebugFillNew = 0xF7;
+u8 mDoMch::mDebugFillDelete = 0xDD;
+
+u8 mDoMch::myHeapVerbose;
+u8 mDoMch::myHeapCallbackCheck;
+u8 mDoMch::FpscrEnableBits;
+u8 mDoMch::GXWarningLevel;
+u8 mDoMch::GXWarningExecuteFrame;
+#else
+u8 mDoMch::mDebugFill;
#endif
/* 80450BF4-80450BF8 0000F4 0004+00 1/1 0/0 0/0 .sbss solidHeapErrors */
@@ -543,11 +550,11 @@ int mDoMch_Create() {
OSReportDisable();
}
- JKRHeap::setDefaultDebugFill(mDebugFill);
+ JKRHeap::setDefaultDebugFill(mDoMch::mDebugFill);
#ifdef DEBUG
- JKRSetDebugFillNotuse(mDebugFillNotuse);
- JKRSetDebugFillNew(mDebugFillNew);
- JKRSetDebugFillDelete(mDebugFillDelete);
+ JKRSetDebugFillNotuse(mDoMch::mDebugFillNotuse);
+ JKRSetDebugFillNew(mDoMch::mDebugFillNew);
+ JKRSetDebugFillDelete(mDoMch::mDebugFillDelete);
#endif
JFWSystem::setMaxStdHeap(1);
diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp
index bba5adc0bf..0d90e64ebd 100644
--- a/src/m_Do/m_Do_main.cpp
+++ b/src/m_Do/m_Do_main.cpp
@@ -12,22 +12,39 @@
#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
@@ -83,6 +100,10 @@ static HeapCheck* HeapCheckTable[8] = {
&ArchiveHeapCheck, &J2dHeapCheck, &HostioHeapCheck, &CommandHeapCheck,
};
+#if DEBUG
+mDoMain_HIO_c mDoMain_HIO;
+#endif
+
void printFrameLine() {
OSCalendarTime calendar;
OSTime time = OSGetTime();
@@ -187,6 +208,10 @@ int mDoMain::e3menu_no = -1;
/* 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;
@@ -200,11 +225,20 @@ OSTime mDoMain::sHungUpTime;
/* 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 bool mCheckHeap;
+static u8 mCheckHeap;
/* 80005AD8-80005D4C 000418 0274+00 1/1 0/0 0/0 .text debugDisplay__Fv */
void debugDisplay() {
@@ -272,6 +306,210 @@ 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警告を1フレームだけ実行", 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();
@@ -395,6 +633,12 @@ s32 LOAD_COPYDATE(void*) {
/* 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);
@@ -410,68 +654,82 @@ static void debug() {
if ((mDoCPd_c::getGamePad(PAD_3)->getButton() & ~PAD_TRIGGER_Z) == PAD_TRIGGER_L &&
mDoCPd_c::getGamePad(PAD_3)->testTrigger(PAD_TRIGGER_Z))
{
- mHeapBriefType < 5 ? mHeapBriefType++ : mHeapBriefType = 1;
+ 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) {
- static u32 frame;
+ 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*)JKRHeap::getRootHeap());
- if (JKRHeap::getRootHeap()) {
- RootHeapCheck.setHeapSize(JKRHeap::getRootHeap()->getSize());
- }
-
- SystemHeapCheck.setHeap((JKRExpHeap*)JKRHeap::getSystemHeap());
- if (JKRHeap::getSystemHeap()) {
- SystemHeapCheck.setHeapSize(JKRHeap::getSystemHeap()->getSize());
- }
-
+ RootHeapCheck.setHeap((JKRExpHeap*)JKRGetRootHeap());
+ SystemHeapCheck.setHeap((JKRExpHeap*)JKRGetSystemHeap());
ZeldaHeapCheck.setHeap(mDoExt_getZeldaHeap());
- if (ZeldaHeapCheck.getHeap()) {
- ZeldaHeapCheck.setHeapSize(ZeldaHeapCheck.getHeap()->getSize());
- }
-
GameHeapCheck.setHeap(mDoExt_getGameHeap());
- if (GameHeapCheck.getHeap()) {
- GameHeapCheck.setHeapSize(GameHeapCheck.getHeap()->getSize());
- }
-
ArchiveHeapCheck.setHeap(mDoExt_getArchiveHeap());
- if (ArchiveHeapCheck.getHeap()) {
- ArchiveHeapCheck.setHeapSize(ArchiveHeapCheck.getHeap()->getSize());
- }
-
J2dHeapCheck.setHeap(mDoExt_getJ2dHeap());
- if (J2dHeapCheck.getHeap()) {
- J2dHeapCheck.setHeapSize(J2dHeapCheck.getHeap()->getSize());
- }
-
HostioHeapCheck.setHeap(mDoExt_getHostIOHeap());
- if (HostioHeapCheck.getHeap()) {
- HostioHeapCheck.setHeapSize(HostioHeapCheck.getHeap()->getSize());
- }
-
CommandHeapCheck.setHeap(mDoExt_getCommandHeap());
- if (CommandHeapCheck.getHeap()) {
- CommandHeapCheck.setHeapSize(CommandHeapCheck.getHeap()->getSize());
- }
+
+ #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 :
@@ -480,25 +738,70 @@ void main01(void) {
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
- g_mDoAud_audioHeap = JKRSolidHeap::create(0x14D800, JKRHeap::getCurrentHeap(), false);
+ #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 (SyncWidthSound) {
- g_mDoMemCd_control.update();
+ 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);
}
@@ -595,14 +898,18 @@ static u8 mainThreadStack[32768];
static OSThread mainThread;
/* 80006454-800065D8 000D94 0184+00 0/0 1/1 0/0 .text main */
-void main() {
+void main(int argc, const char* argv[]) {
OSThread* current_thread = OSGetCurrentThread();
u8* stack = mainThreadStack;
mDoMain::sPowerOnTime = OSGetTime();
OSReportInit();
version_check();
- mDoRstData* reset_data = (mDoRstData*)OSAllocFromArenaLo(0x18, 4);
- mDoRst::setResetData(reset_data);
+
+ #if PLATFORM_WII || PLATFORM_SHIELD
+ mDoRst::setResetData((mDoRstData*)OSAllocFromMEM1ArenaLo(0x18, 4));
+ #else
+ mDoRst::setResetData((mDoRstData*)OSAllocFromArenaLo(0x18, 4));
+ #endif
if (!mDoRst::getResetData()) {
do {
@@ -622,7 +929,23 @@ void main() {
mDoRst::offReturnToMenu();
}
- g_dComIfG_gameInfo.ct();
+ #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();
@@ -637,9 +960,11 @@ void main() {
}
}
+ 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);
}
diff --git a/src/m_Do/m_Do_printf.cpp b/src/m_Do/m_Do_printf.cpp
index 64adf2f620..e61eb7a2b5 100644
--- a/src/m_Do/m_Do_printf.cpp
+++ b/src/m_Do/m_Do_printf.cpp
@@ -5,7 +5,7 @@
#include "m_Do/m_Do_printf.h"
#include "stdio.h"
-#include "dolphin/base/PPCArch.h"
+#include <dolphin/base/PPCArch.h>
#include "m_Do/m_Do_ext.h"
/* 80450B98-80450B9C -00001 0004+00 0/0 6/6 0/0 .sbss None */
@@ -87,47 +87,66 @@ void OSReportForceEnableOff() {
__OSReport_enable = false;
}
-/* ############################################################################################## */
/* 80450BA0-80450BA4 0000A0 0004+00 1/1 0/0 0/0 .sbss __OSReport_MonopolyThread */
static OSThread* __OSReport_MonopolyThread;
+#if DEBUG
+OSMutex print_mutex;
+u8 print_mutex_initialized;
+u8 print_highPriority;
+u8 print_threadID;
+u8 print_callerPC;
+u8 print_callerPCLevel = 3;
+#endif
+
/* 80450BA4-80450BA8 0000A4 0004+00 1/1 0/0 0/0 .sbss print_counts */
-static u32 print_counts;
+u32 print_counts;
/* 80450BA8-80450BAC 0000A8 0004+00 2/2 0/0 0/0 .sbss print_errors */
-static u32 print_errors;
+u32 print_errors;
/* 80450BAC-80450BB0 0000AC 0004+00 1/1 0/0 0/0 .sbss print_warings */
-static u32 print_warings;
+u32 print_warings;
/* 80450BB0-80450BB4 0000B0 0004+00 1/1 0/0 0/0 .sbss print_systems */
-static u32 print_systems;
+u32 print_systems;
/* 80450BB4-80450BB8 -00001 0004+00 3/3 0/0 0/0 .sbss None */
-static bool print_initialized;
+u8 print_initialized;
static bool data_80450BB5;
/* 800068C4-800068DC 001204 0018+00 1/1 1/1 0/0 .text OSReportInit__Fv */
void OSReportInit() {
- if (print_initialized) {
- return;
+ BOOL enabled;
+
+ if (!print_initialized) {
+ #if DEBUG
+ enabled = OSDisableInterrupts();
+ if (!print_mutex_initialized) {
+ OSInitMutex(&print_mutex);
+ print_mutex_initialized = true;
+ my_PutString("\x1b[m\x1b[33m*** OSVReport - OSInitMutex ***\n\x1b[m");
+ }
+ OSRestoreInterrupts(enabled);
+ #endif
+
+ print_initialized = true;
}
- print_initialized = true;
}
-/* ############################################################################################## */
/* 803DB740-803DBF40 008460 0800+00 1/1 0/0 0/0 .bss mDoPrintf_FiberStack */
static u8 mDoPrintf_FiberStack[2048] ALIGN_DECL(32);
/* 800068DC-80006964 00121C 0088+00 1/1 0/0 0/0 .text
* mDoPrintf_vprintf_Interrupt__FPCcP16__va_list_struct */
void mDoPrintf_vprintf_Interrupt(char const* fmt, va_list args) {
- s32 interruptStatus = OSDisableInterrupts();
+ BOOL interruptStatus = OSDisableInterrupts();
if (!data_80450BB5) {
data_80450BB5 = true;
+ uintptr_t var_r29 = (uintptr_t)&mDoPrintf_FiberStack + sizeof(mDoPrintf_FiberStack);
OSSwitchFiberEx((uintptr_t)fmt, (uintptr_t)args, 0, 0, (uintptr_t)vprintf,
- (uintptr_t)&mDoPrintf_FiberStack + sizeof(mDoPrintf_FiberStack));
+ var_r29);
data_80450BB5 = false;
}
OSRestoreInterrupts(interruptStatus);
@@ -136,7 +155,26 @@ void mDoPrintf_vprintf_Interrupt(char const* fmt, va_list args) {
/* 80006964-80006984 0012A4 0020+00 1/1 0/0 0/0 .text
* mDoPrintf_vprintf_Thread__FPCcP16__va_list_struct */
void mDoPrintf_vprintf_Thread(char const* fmt, va_list args) {
+ #if DEBUG
+ OSLockMutex(&print_mutex);
+ OSThread* thread = NULL;
+ s32 priority;
+
+ if (print_highPriority) {
+ thread = OSGetCurrentThread();
+ priority = OSGetThreadPriority(thread);
+ OSSetThreadPriority(thread, 0);
+ }
+ #endif
+
vprintf(fmt, args);
+
+ #if DEBUG
+ if (thread != NULL) {
+ OSSetThreadPriority(thread, priority);
+ }
+ OSUnlockMutex(&print_mutex);
+ #endif
}
/* 80006984-80006A10 0012C4 008C+00 4/4 0/0 0/0 .text mDoPrintf_vprintf__FPCcP16__va_list_struct
@@ -146,12 +184,16 @@ void mDoPrintf_vprintf(char const* fmt, va_list args) {
if (currentThread == NULL) {
mDoPrintf_vprintf_Interrupt(fmt, args);
} else {
+ #if DEBUG
+ mDoPrintf_vprintf_Thread(fmt, args);
+ #else
u8* stackPtr = (u8*)OSGetStackPointer();
if (stackPtr < (u8*)currentThread->stackEnd + 0xA00 || stackPtr > currentThread->stackBase) {
mDoPrintf_vprintf_Interrupt(fmt, args);
} else {
mDoPrintf_vprintf_Thread(fmt, args);
}
+ #endif
}
}
@@ -202,6 +244,13 @@ void OSReport_FatalError(const char* fmt, ...) {
void OSReport_Error(const char* fmt, ...) {
print_errors++;
if (!__OSReport_Error_disable) {
+ #if DEBUG
+ OSThread* thread = mDoExt_GetCurrentRunningThread();
+ if (thread != NULL) {
+ OSLockMutex(&print_mutex);
+ }
+ #endif
+
va_list args;
va_start(args, fmt);
OSReportForceEnableOn();
@@ -211,6 +260,12 @@ void OSReport_Error(const char* fmt, ...) {
OSReportForceEnableOff();
fflush(stdout);
va_end(args);
+
+ #if DEBUG
+ if (thread != NULL) {
+ OSUnlockMutex(&print_mutex);
+ }
+ #endif
}
}
@@ -261,7 +316,8 @@ void OSPanic(const char* file, int line, const char* fmt, ...) {
OSAttention("0x%08x: 0x%08x 0x%08x\n", p, p[0], p[1]);
}
- tmp = (u32*)0x1234567; // ??????
+ // force a crash by writing to an invalid address
+ tmp = (u32*)0x1234567;
*tmp = 0x1234567;
PPCHalt();
}