From 87a3705039533b309a04baaaa0f99010b5d71c00 Mon Sep 17 00:00:00 2001 From: Jcw87 Date: Sun, 18 Jan 2026 17:59:57 -0800 Subject: m_Do debug (#3052) * m_Do debug * m_Do wii data --- src/m_Do/m_Do_dvd_thread.cpp | 220 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 202 insertions(+), 18 deletions(-) (limited to 'src/m_Do/m_Do_dvd_thread.cpp') diff --git a/src/m_Do/m_Do_dvd_thread.cpp b/src/m_Do/m_Do_dvd_thread.cpp index 3a17914eec..0d9eabfad9 100644 --- a/src/m_Do/m_Do_dvd_thread.cpp +++ b/src/m_Do/m_Do_dvd_thread.cpp @@ -5,17 +5,20 @@ #include "m_Do/m_Do_dvd_thread.h" #include "JSystem/JAudio2/JASDvdThread.h" +#include "JSystem/JKernel/JKRAramArchive.h" #include "JSystem/JKernel/JKRAssertHeap.h" #include "JSystem/JKernel/JKRDvdRipper.h" #include "JSystem/JKernel/JKRExpHeap.h" #include "JSystem/JKernel/JKRMemArchive.h" #include "m_Do/m_Do_Reset.h" +#include "m_Do/m_Do_controller_pad.h" #include "m_Do/m_Do_ext.h" s32 mDoDvdThd::main(void* param_0) { - { JKRThread jkrThread(OSGetCurrentThread(), 0); } - mDoExt_getAssertHeap()->becomeCurrentHeap(); - static_cast(param_0)->mainLoop(); + JKRThread(OSGetCurrentThread(), 0); + JKRSetCurrentHeap(mDoExt_getAssertHeap()); + mDoDvdThd_param_c* param = static_cast(param_0); + param->mainLoop(); return 0; } @@ -30,6 +33,11 @@ u8 mDoDvdThd::verbose; u8 mDoDvdThd::DVDLogoMode; bool mDoDvdThd::SyncWidthSound; u8 mDoDvdThd::Report_DVDRead; +OSBootInfo* mDoDvdHack::BootInfo; +mDoDvdHack::FSTEntry* mDoDvdHack::FstStart; +const char* mDoDvdHack::FstStringStart; +u32 mDoDvdHack::MaxEntryNum; +mDoDvdHack::Manager mDoDvdHack::Manager::sManager; #else bool mDoDvdThd::SyncWidthSound; #endif @@ -48,14 +56,61 @@ void mDoDvdThd::create(s32 param_0) { } void mDoDvdThd::suspend() { + OS_REPORT("DVD読み込みスレッドを停止しました\n"); OSSuspendThread(&l_thread); } -static s32 my_DVDConvertPathToEntrynum(char const* param_0) { - return DVDConvertPathToEntrynum(param_0); +#if DEBUG +void mDoDvdHack::__DVDFSInit() { + BootInfo = (OSBootInfo*)OSPhysicalToCached(0); + FstStart = (FSTEntry*)BootInfo->FSTLocation; + if (FstStart) { + MaxEntryNum = FstStart->nextEntryOrLength; + FstStringStart = (char*)FstStart + (MaxEntryNum* sizeof(FSTEntry)); + } +} + +const char* mDoDvdHack::EntryToName(s32 entry) { + if (entry < 0) { + return "*ERROR*"; + } + if (entry == 0) { + return "/"; + } + return FstStringStart + (FstStart[entry].isDirAndStringOff & ~0xff000000); +} + +const char* mDoDvdHack::ConvertEntrynumToName(s32 entry) { + __DVDFSInit(); + return EntryToName(entry); +} +#endif + +static void dummy1() { + OS_REPORT(__FILE__); + OS_REPORT("DVDConvertEntrynumToPath: specified entrynum(%d) is out of range "); + OS_REPORT("DVDConvertEntrynumToPath: maxlen should be more than 1 (%d is specified)"); } -mDoDvdThd_command_c::~mDoDvdThd_command_c() {} + +static s32 my_DVDConvertPathToEntrynum(char const* path) { + s32 entrynum = DVDConvertPathToEntrynum(path); +#if DEBUG + if (entrynum < 0) { + BOOL connected = mDoCPd_c::isConnect(2); + if (connected) { + JUT_WARN(437, "can\'t open:[%s]\n", path); + } + } +#endif + return entrynum; +} + +mDoDvdThd_command_c::~mDoDvdThd_command_c() { + if (!mIsDone) { + OS_REPORT_ERROR("mDoDvdThd_command_c::~mDoDvdThd_command_c() 完了していないコマンドがデストラクトされました\nきっとカタストロフィが発生することでしょう\n"); + } +} mDoDvdThd_param_c::mDoDvdThd_param_c() { OSInitMessageQueue(&mMessageQueue, &mMessageQueueMessages, 1); @@ -90,16 +145,17 @@ void mDoDvdThd_param_c::cut(mDoDvdThd_command_c* param_0) { } static void cb(void* param_0) { - mDoDvdThd_command_c** pCmd = (mDoDvdThd_command_c**)param_0; - s32 result = (*pCmd)->execute(); + mDoDvdThd_command_c* pCmd = *(mDoDvdThd_command_c**)param_0; + s32 result = pCmd->execute(); if (result != 1) { OSReport_Error("mDoDvdThd_param_c::mainLoop() コマンドの実行が失敗しました。\n"); } } void mDoDvdThd_param_c::mainLoop() { + mDoDvdThd_command_c* command; while (this->waitForKick() != 0) { - while (mDoDvdThd_command_c* command = this->getFirstCommand()) { + while (command = this->getFirstCommand()) { this->cut(command); if (mDoDvdThd::SyncWidthSound) { JASDvd::getThreadPointer()->sendCmdMsg(cb, &command, 4); @@ -128,6 +184,9 @@ mDoDvdThd_callback_c* mDoDvdThd_callback_c::create(mDoDvdThd_callback_func pFunc new (mDoExt_getCommandHeap(), -4) mDoDvdThd_callback_c(pFunc, pData); if (callCmd != NULL) { mDoDvdThd::l_param.addition(callCmd); + if (mDoDvdThd::DVDLogoMode) { + OS_REPORT("\x1b[34m callback %08x %08x %08x\n\x1b[m", callCmd, pFunc, pData); + } } return callCmd; } @@ -163,19 +222,28 @@ mDoDvdThd_mountArchive_c* mDoDvdThd_mountArchive_c::create(char const* pArchiveP } else { mountArcCmd->mHeap = pHeap; mDoDvdThd::l_param.addition(mountArcCmd); + if (mDoDvdThd::DVDLogoMode) { + OS_REPORT("\x1b[34m mountArchive(%d:%s)\n\x1b[m", mountArcCmd->mEntryNumber, pArchivePath); + } } } return mountArcCmd; } s32 mDoDvdThd_mountArchive_c::execute() { +#if PLATFORM_GCN bool isZeldaHeap = false; bool isGameHeap = false; bool isArcHeap = false; bool isJ2DHeap = false; +#endif JKRHeap* heap = mHeap != NULL ? mHeap : mDoExt_getArchiveHeap(); - JKRMemArchive* memArchive; + JKRMemArchive* memArchive = NULL; +#if DEBUG + OSTime time1 = OSGetTime(); +#endif while (true) { +#if PLATFORM_GCN if (heap == mDoExt_getArchiveHeapPtr()) { isArcHeap = true; } else if (heap == mDoExt_getZeldaHeap()) { @@ -185,6 +253,7 @@ s32 mDoDvdThd_mountArchive_c::execute() { } else if (heap == mDoExt_getJ2dHeap()) { isJ2DHeap = true; } +#endif if (mMountDirection == 0) { memArchive = new (heap, 0) JKRMemArchive(mEntryNumber, JKRArchive::MOUNT_DIRECTION_HEAD); @@ -194,12 +263,22 @@ s32 mDoDvdThd_mountArchive_c::execute() { } if (memArchive != NULL && memArchive->isMounted()) { mArchive = memArchive; +#if DEBUG + OSTime time2 = OSGetTime(); + u32 msec = OS_TICKS_TO_MSEC(time2 - time1); + if (mArchive && mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_mountArchive_c::execute: mArchive=%08x mArcHeader=%08x mMountDirection=%d Time=%4dms %s\n", mArchive, mArchive->mArcHeader, mMountDirection, msec, mDoDvdHack::ConvertEntrynumToName(mEntryNumber)); + } +#endif break; } OSReport_Error("mDoDvdThd_mountArchive_c::execute マウント失敗\n"); + OS_REPORT_ERROR("Name = %s\n", mDoDvdHack::ConvertEntrynumToName(mEntryNumber)); if (memArchive) { delete memArchive; } + memArchive = NULL; +#if PLATFORM_GCN if (!isZeldaHeap) { OSReport_Error("mDoDvdThd_mountArchive_c::execute ゼルダヒープで再チャレンジ!\n"); heap = mDoExt_getZeldaHeap(); @@ -216,11 +295,60 @@ s32 mDoDvdThd_mountArchive_c::execute() { OSReport_FatalError("mDoDvdThd_mountArchive_c::execute ヒープが致命的に足りません!\n"); break; } +#else + if (heap != mDoExt_getZeldaHeap()) { + OSReport_Error("mDoDvdThd_mountArchive_c::execute システムヒープで再チャレンジ!\n"); + heap = mDoExt_getZeldaHeap(); + } else { + OSReport_FatalError("mDoDvdThd_mountArchive_c::execute ヒープが致命的に足りません!\n"); + break; + } +#endif } mIsDone = true; return mArchive != NULL; } +mDoDvdThd_mountAramArchive_c::~mDoDvdThd_mountAramArchive_c() {} + +static void dummy_mDoDvdThd_mountAramArchive_c__create() { + OS_REPORT(" mountAramArchive(%d:%s)\n"); +} + +s32 mDoDvdThd_mountAramArchive_c::execute() { + JKRHeap* heap = mDoExt_getArchiveHeap(); + BOOL result = FALSE; + if (!mArchive) { + if (mMountDirection == 0) { + mArchive = new (heap, 0x20) JKRAramArchive(); + } else { + mArchive = new (heap, -0x20) JKRAramArchive(); + } +#if DEBUG + if (mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_mountAramArchive_c::execute mArchive=%08x size=%08x\n", mArchive, JKRGetMemBlockSize(heap, mArchive)); + } +#endif + JUT_ASSERT(880, mArchive != NULL); + } + if (mArchive) { + JKRArchive::EMountDirection mountDirection = mMountDirection == 0 ? JKRArchive::MOUNT_DIRECTION_HEAD : JKRArchive::MOUNT_DIRECTION_TAIL; +#if DEBUG + OSTime time1 = OSGetTime(); +#endif + result = mArchive->mountFixed(mEntryNum, mountDirection); +#if DEBUG + OSTime time2 = OSGetTime(); + u32 msec = OS_TICKS_TO_MSEC(time2 - time1); + if (mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_mountAramArchive_c::execute: mArchive=%08x ->mAramCache=%08x ->mFileSystem=%08x %s\n", mArchive, mArchive->mBlock, mArchive->mDvdFile, mDoDvdHack::ConvertEntrynumToName(mEntryNum)); + } +#endif + } + mIsDone = true; + return result; +} + mDoDvdThd_mountXArchive_c::~mDoDvdThd_mountXArchive_c() {} mDoDvdThd_mountXArchive_c::mDoDvdThd_mountXArchive_c(u8 mountDirection, JKRArchive::EMountMode mountMode) { @@ -249,21 +377,70 @@ mDoDvdThd_mountXArchive_c* mDoDvdThd_mountXArchive_c::create(char const* pArchiv } else { mountXArcCmd->mHeap = pHeap; mDoDvdThd::l_param.addition(mountXArcCmd); + if (mDoDvdThd::DVDLogoMode) { + OS_WARNING(" mountXArchive(%d:%s)\n", mountXArcCmd->mEntryNum, pArchivePath); + } } } return mountXArcCmd; } s32 mDoDvdThd_mountXArchive_c::execute() { +#if DEBUG + OSTime time1 = OSGetTime(); +#endif JKRArchive::EMountDirection mountDirection = mMountDirection == 0 ? JKRArchive::MOUNT_DIRECTION_HEAD : JKRArchive::MOUNT_DIRECTION_TAIL; JKRHeap* heap = mHeap != NULL ? mHeap : mDoExt_getArchiveHeap(); + s32 result = 0; mArchive = JKRArchive::mount(mEntryNum, mMountMode, heap, mountDirection); - s32 result = mArchive != NULL; + result = mArchive != NULL; +#if DEBUG + if (result) { + OSTime time2 = OSGetTime(); + u32 msec = OS_TICKS_TO_MSEC(time2 - time1); + if (mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_mountXArchive_c::execute: mArchive=%08x %s\n", mArchive, mDoDvdHack::ConvertEntrynumToName(mEntryNum)); + } + } +#endif mIsDone = true; return result; } +mDoDvdThd_getResource_c::~mDoDvdThd_getResource_c() {} + +static void dummy_mDoDvdThd_getResource_c__create() { + OS_REPORT(" getResource(%x,%d)\n"); + OSReport("mDoDvdThd_getResource_c::create() クラス生成に失敗\n"); + OSReport("mDoDvdThd_getResource_c::create() リソース取得に失敗\n"); +} + +s32 mDoDvdThd_getResource_c::execute() { +#if DEBUG + OSTime time1 = OSGetTime(); +#endif + JUT_ASSERT(1080, mArchive); + mResource = mArchive->getResource(mResourceId); +#if DEBUG + OSTime time2 = OSGetTime(); + u32 msec = OS_TICKS_TO_MSEC(time2 - time1); + if (mArchive && mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_getResource_c::execute: mResouce=%08x Time=%4dms\n", mResource, msec); + } +#endif + if (!mResource) { + OSReport_Error("mDoDvdThd_getResource_c::execute() リソース取得に失敗\n"); + } + mIsDone = true; + return mResource != NULL; +} + +static void dummy2() { + OS_REPORT("mEntryNum != -1"); + OS_REPORT("mDoDvdThd_toMainRam_c(%d:%s)\n"); +} + mDoDvdThd_toMainRam_c::mDoDvdThd_toMainRam_c(u8 param_0) { mMountDirection = param_0; if (param_0 == 0) { @@ -284,6 +461,9 @@ mDoDvdThd_toMainRam_c* mDoDvdThd_toMainRam_c::create(char const* pArchivePath, u } else { toMainRAMCmd->mHeap = pHeap; mDoDvdThd::l_param.addition(toMainRAMCmd); + if (mDoDvdThd::DVDLogoMode) { + OS_WARNING(" toMainRam(%d:%s)\n", toMainRAMCmd->mEntryNum, pArchivePath); + } } } return toMainRAMCmd; @@ -292,6 +472,9 @@ mDoDvdThd_toMainRam_c* mDoDvdThd_toMainRam_c::create(char const* pArchivePath, u mDoDvdThd_toMainRam_c::~mDoDvdThd_toMainRam_c() {} s32 mDoDvdThd_toMainRam_c::execute() { +#if DEBUG + OSTime time1 = OSGetTime(); +#endif JKRHeap* heap; if (mHeap != NULL) { heap = mHeap; @@ -301,17 +484,18 @@ s32 mDoDvdThd_toMainRam_c::execute() { JKRDvdRipper::EAllocDirection allocDir = mMountDirection == 0 ? JKRDvdRipper::ALLOC_DIRECTION_FORWARD : JKRDvdRipper::ALLOC_DIRECTION_BACKWARD; - mData = JKRDvdRipper::loadToMainRAM(mEntryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, heap, allocDir, + mData = JKRDvdToMainRam(mEntryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, heap, allocDir, 0, NULL, NULL); if (mData != NULL) { mDataSize = heap->getSize(mData); } +#if DEBUG + OSTime time2 = OSGetTime(); + u32 msec = OS_TICKS_TO_MSEC(time2 - time1); + if (mDoDvdThd::verbose) { + OS_REPORT("mDoDvdThd_toMainRam_c::execute: mMemAddress=%08x mMemSize=%08x %s\n", mData, mDataSize, mDoDvdHack::ConvertEntrynumToName(mEntryNum)); + } +#endif mIsDone = true; return mData != NULL; } - -static void dummy() { - OSReport("mDoDvdThd_getResource_c::create() クラス生成に失敗\n"); - OSReport("mDoDvdThd_getResource_c::create() リソース取得に失敗\n"); - OSReport("mDoDvdThd_getResource_c::execute() リソース取得に失敗\n"); -} -- cgit v1.2.3