#include "d/d_sys.h" #include "c/c_counter.h" #include "c/c_math.h" #include "d/d_cursor_hit_check.h" #include "d/d_dvd.h" #include "d/d_dvd_unk.h" #include "d/d_gfx.h" #include "d/d_hbm.h" #include "d/d_heap.h" #include "d/d_heap_alloc.h" #include "d/d_pad.h" #include "d/d_reset.h" #include "d/d_scene.h" #include "d/d_state.h" #include "d/d_sys_init.h" #include "d/flag/flag_managers.h" #include "d/lyt/d_lyt_battery.h" #include "d/lyt/d_lyt_system_window.h" #include "d/snd/d_snd_mgr.h" #include "egg/core/eggAssertHeap.h" #include "egg/core/eggAsyncDisplay.h" #include "egg/core/eggController.h" #include "egg/core/eggDisplay.h" #include "egg/core/eggDvdFile.h" #include "egg/core/eggExpHeap.h" #include "egg/core/eggGraphicsFifo.h" #include "egg/core/eggSystem.h" #include "egg/core/eggVideo.h" #include "egg/core/eggXfbManager.h" #include "egg/gfx/eggStateGX.h" #include "f/f_manager.h" #include "m/m3d/m3d.h" #include "m/m_dvd.h" #include "m/m_heap.h" #include "m/m_pad.h" #include "m/m_video.h" #include "nw4r/ut/ut_Color.h" #include "toBeSorted/arc_callback_handler.h" #include "toBeSorted/arc_managers/current_stage_arc_manager.h" #include "toBeSorted/arc_managers/layout_arc_manager.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/d_d3d.h" #include "toBeSorted/d_exception.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/nand_request_thread.h" #include "toBeSorted/save_manager.h" #include "toBeSorted/unk_save_time.h" #include "rvl/GX.h" #include "rvl/OS.h" #include "rvl/WPAD.h" // TODO Replace with proper import + names extern u32 lbl_80574FA0; extern u32 lbl_80574FA4; System SysConfig; System *dSys_c::ms_configuration_p; EGG::Heap *dSys_c::ms_RootHeapMem1; EGG::Heap *dSys_c::ms_RootHeapMem2; namespace dSystem { void *s_OrgMEM1ArenaLo; void *s_NewMEM1ArenaLo; void *s_OrgMEM1ArenaHi; void *s_NewMEM1ArenaHi; } // namespace dSystem const GXRenderModeObj gRMO_Pal60_608x456Prog_16x9 = { 0, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Pal60_608x456IntDf_16x9 = { 2, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Pal50_608x456IntDf_16x9 = { 4, // tvInfo 608, // fbWidth 456, // efbHeight 542, // xfbHeight 27, // viXOrigin 16, // viYOrigin 666, // viWidth 542, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Ntsc_608x456Prog_16x9 = { 20, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Ntsc_608x456IntDf_16x9 = { 22, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Pal60_608x456Prog_4x3 = { 0, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Pal60_608x456IntDf_4x3 = { 2, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Pal50_608x456IntDf_4x3 = { 4, // tvInfo 608, // fbWidth 456, // efbHeight 542, // xfbHeight 19, // viXOrigin 16, // viYOrigin 682, // viWidth 542, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Ntsc_608x456Prog_4x3 = { 20, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Ntsc_608x456IntDf_4x3 = { 22, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const EGG::Video::RenderModeObjSet gSysRenderModeObjSet = { {&gRMO_Pal60_608x456Prog_16x9, &gRMO_Pal60_608x456IntDf_16x9, &gRMO_Pal50_608x456IntDf_16x9, &gRMO_Ntsc_608x456Prog_16x9, &gRMO_Ntsc_608x456IntDf_16x9, &gRMO_Pal60_608x456Prog_4x3, &gRMO_Pal60_608x456IntDf_4x3, &gRMO_Pal50_608x456IntDf_4x3, &gRMO_Ntsc_608x456Prog_4x3, &gRMO_Ntsc_608x456IntDf_4x3} }; template <> void System::initialize() { DVDInit(); SCInit(); initMemory(); Heap *heap = Heap::sCurrentHeap; GraphicsFifo::create(mGraphicsFifoSize, heap); mHeap::createAssertHeap(mRootHeapMem1); mVideo = new (heap) EGG::Video(&gSysRenderModeObjSet); mXfbMgr = new (heap) EGG::XfbManager(); for (int i = 0; i < 2; ++i) { mXfbMgr->attach(new (heap) Xfb(mRootHeapMem2)); } mDisplay = new (heap) EGG::AsyncDisplay(1); mDisplay->setClearColor(nw4r::ut::Color::BLACK); mDisplay->clearEFB(); Thread::initialize(); mSystemThread = new (heap) Thread(OSGetCurrentThread(), 4); DvdFile::initialize(); // TODO Determine significance of the constant CoreControllerMgr::setWPADWorkSize(WPADGetWorkMemorySize() + 228); CoreControllerMgr::createInstance(); exceptionCreate(heap); BaseSystem::mConfigData->getSystemHeap()->mFlag.setBit(0); mHeap::setCurrentHeap(mHeap::g_assertHeap); } dSndMgr_c *dSys_c::initAudioMgr(EGG::Heap *heap) { dSndMgr_c *audioMgr; EGG::FrmHeap *frmHeap = mHeap::createFrmHeap( 0x69400, heap, "オーディオヒープ", // "Audio heap" 32, mHeap::OPT_NONE ); { mHeap temp(frmHeap); audioMgr = new dSndMgr_c(); ms_configuration_p->mAudioMgr = audioMgr; frmHeap->adjust(); frmHeap->mFlag.setBit(0); } return audioMgr; } void dSys_c::beginRender() { m3d::calcMaterial(); ms_configuration_p->mDisplay->beginRender(); } void dSys_c::endRender() { ms_configuration_p->mDisplay->endRender(); } void dSys_c::beginFrame() { EGG::Display *pDisplay = ms_configuration_p->mDisplay; pDisplay->beginFrame(); GXSetCopyClear(pDisplay->getClearColor(), pDisplay->getClearZ()); ms_configuration_p->onBeginFrame(); } void dSys_c::endFrame() { ms_configuration_p->mDisplay->endFrame(); ms_configuration_p->onEndFrame(); } bool dSys_c::setBlack(bool on) { EGG::Display *pDisplay = ms_configuration_p->mDisplay; EGG::Video *pVideo = EGG::BaseSystem::getVideo(); if (pVideo->mFlag.onBit(0) != on && pDisplay->mScreenStateFlag.offBit(0)) { pDisplay->mScreenStateFlag.setBit(0); return true; } return false; } void dSys_c::setFrameRate(u8 maxRetraces) { ms_configuration_p->mDisplay->mMaxRetraces = maxRetraces; } u8 dSys_c::getFrameRate() { return ms_configuration_p->mDisplay->mMaxRetraces; } void dSys_c::setClearColor(nw4r::ut::Color clr) { EGG::Display *display = ms_configuration_p->mDisplay; display->setClearColor(clr); EGG::StateGX::s_clearEfb = clr; } nw4r::ut::Color dSys_c::getClearColor() { return ms_configuration_p->mDisplay->getClearColor(); } void dSys_c::create() { EGG::Heap *pRootHeapMem1; EGG::Heap *pRootHeapMem2; EGG::Heap *pCmdHeap; EGG::Heap *pExpHeap; dHeapAllocator::initCallbacks(); ms_configuration_p = &SysConfig; EGG::BaseSystem::mConfigData = &SysConfig; ms_configuration_p->doInitialize(); pRootHeapMem1 = EGG::BaseSystem::mConfigData->mRootHeapMem1; ms_RootHeapMem1 = mHeap::createExpHeap(-1, pRootHeapMem1, "dSys_c::RootHeapMEM1", 32, mHeap::OPT_4); pRootHeapMem1->mFlag.setBit(0); pRootHeapMem2 = EGG::BaseSystem::mConfigData->mRootHeapMem2; ms_RootHeapMem2 = mHeap::createExpHeap(-1, pRootHeapMem2, "dSys_c::RootHeapMEM2", 32, mHeap::OPT_4); pRootHeapMem2->mFlag.setBit(0); EGG::Heap *heapMem1 = ms_RootHeapMem1; EGG::Heap *heapMem2 = ms_RootHeapMem2; mVideo::create(); mHeap::createDylinkHeap(0x1c8000, heapMem1); mHeap::createGameHeap1(0x250000, heapMem1); dHeap::createLayoutHeap(0x1e0000, heapMem1); mHeap::createCommandHeap(0x8000, heapMem1); dHeap::createWork1Heap(0x4c8000, heapMem1); dHeap::createWorkExHeap(0x480000, heapMem1); dHeap::createLayoutExHeap(0xc8000, heapMem2); dHeap::createLayoutEx2Heap(0x38000, heapMem1); mHeap::createArchiveHeap(0xb85000, heapMem2); dHeap::createLayoutResHeap(0x4e7000, heapMem2); dHeap::createWork2Heap(0xb08000, heapMem2); pExpHeap = EGG::ExpHeap::create(0x40000, mHeap::g_gameHeaps[0], 0); pExpHeap->setName("システムcreateヒープ"); // "system create heap" mHeap::setCurrentHeap(mHeap::g_assertHeap); { mHeap heap(pExpHeap); dPad::create(); } dPad::fn_80059620(); mPad::beginPad(); mPad::g_currentCore->setPosParam(0.1f, 1.0f); mPad::endPad(); { mHeap heap(pExpHeap); for (int i = 0; i < WPAD_MAX_CONTROLLERS; i++) { mPad::g_padMg->getNthController(i)->createRumbleMgr(4); } } cM::initRnd(OSGetTick()); dGfx_c::create(pExpHeap); { mHeap heap(pExpHeap); dScene_c::getFader()->create(); } dDvdUnk::FontUnk::create(pExpHeap); FileManager::create(pExpHeap); SaveMgr::create(pExpHeap); setupFlagManagers(pExpHeap); dCsMgr_c::create(pExpHeap); lbl_80574FA0 = 0; lbl_80574FA4 = 0; cCounter_c::clear(); dDvd::create(OSGetThreadPriority(OSGetCurrentThread()) - 1, mHeap::g_commandHeap, mHeap::g_archiveHeap, pExpHeap); mDvd::unk_initDecompressors(); mDvd::setAutoStreamDecomp(true); void *p_buf = mHeap::g_gameHeaps[0]->alloc(0x4000, 32); pCmdHeap = mHeap::g_commandHeap; NandRequestThread::create( OSGetThreadPriority(OSGetCurrentThread()) - 2, pCmdHeap, p_buf, 0x4000, ArcCallbackHandlerCreate(2), pExpHeap ); dReset::Manage_c::CreateInstance(heapMem2); dHeap::createHBMHeap(0x180000, heapMem2); dHbm::Manage_c::CreateInstance(dHeap::HBMHeap.heap); initAudioMgr(heapMem1); dSndMgr_c::GetInstance()->setup(heapMem2, 0x1000000); dHeap::createFontHeap(0xfa000, heapMem2); heapMem1->mFlag.setBit(0); heapMem2->mFlag.setBit(0); dScene_c::staticCreate(); CurrentStageArcManager::create(pExpHeap); OarcManager::create(pExpHeap); LayoutArcManager::create(pExpHeap); setFrameRate(1); setClearColor(nw4r::ut::Color::BLACK); SaveTimeRelated::fn_80190780(pExpHeap); pExpHeap->mFlag.setBit(0); pExpHeap->adjust(); mHeap::setCurrentHeap(mHeap::g_gameHeaps[0]); } void dSys_c::execute() { beginFrame(); if (dState::fn_80062EC0()) { dPad::beginPad_BR(); dPad::fn_80059630(); } beginRender(); d3d::fn_80016860(); dDvdUnk::FontUnk::GetInstance()->preExecute(); bool isAnyError = dDvdUnk::FontUnk::GetInstance()->isAnyError(); if (isAnyError) { if (dState::fn_80062EC0()) { dHbm::Manage_c::GetInstance()->Calculate(); dReset::Manage_c::GetInstance()->Calculate(); dDvdUnk::FontUnk::GetInstance()->execute(); } dDvdUnk::FontUnk::GetInstance()->drawNonDriveError(); if (dLytSystemWindow_c::GetInstance()) { dLytSystemWindow_c::GetInstance()->fn_80152EF0(); } SaveMgr::GetInstance()->draw(); dDvdUnk::FontUnk::GetInstance()->drawDriveError(); dReset::Manage_c::GetInstance()->Draw(); dHbm::Manage_c::GetInstance()->DrawMenu(0); } else { dHbm::Manage_c::GetInstance()->DrawMenu(1); if (dHbm::Manage_c::GetInstance()->getState() == dHbm::Manage_c::HBM_MANAGE_ACTIVE) { if (dState::fn_80062EC0()) { dHbm::Manage_c::GetInstance()->Calculate(); } } else { dGfx_c::GetInstance()->drawBefore(); m3d::drawDone(0); dScene_c::getFader()->draw(); dGfx_c::GetInstance()->drawLetterbox(); dLytBattery_c::draw(); dDvdUnk::FontUnk::GetInstance()->execute(); if (dLytSystemWindow_c::GetInstance()) { dLytSystemWindow_c::GetInstance()->fn_80152EF0(); } SaveMgr::GetInstance()->draw(); if (dState::fn_80062EC0()) { dHbm::Manage_c::GetInstance()->Calculate(); } } if (dState::fn_80062EC0()) { dReset::Manage_c::GetInstance()->Calculate(); } dReset::Manage_c::GetInstance()->Draw(); } dHbm::Manage_c::GetInstance()->DrawIcon(); endRender(); dState::fn_80062EB0(); dState::fn_80062E40(); dState::fn_80062E50(); if (!isAnyError && dHbm::Manage_c::GetInstance()->getState() != dHbm::Manage_c::HBM_MANAGE_ACTIVE) { if (dSystem::myDylinkInitPhase.callMethod(nullptr) == 2) { if (dState::fn_80062EC0()) { dScene_c::staticExecute(); } fManager_c::mainLoop(); } if (dState::fn_80062EC0()) { dScene_c::getFader()->calc(); } } SaveMgr::GetInstance()->execute(); if (dLytSystemWindow_c::GetInstance()) { dLytSystemWindow_c::GetInstance()->fn_80152E20(); } dSndMgr_c::GetInstance()->calc(); SaveTimeRelated::GetInstance()->fn_801907C0(); if (dState::fn_80062EC0()) { cCounter_c::IncrementGameFrame(); cCounter_c::IncrementUnkCounter(); } m3d::calcWorld(0); d3d::fn_80017500(); d3d::clearList(); if (dState::fn_80062EC0()) { dPad::endPad_BR(); } endFrame(); } void dSystem::fixHeaps() { s_OrgMEM1ArenaLo = OSGetMEM1ArenaLo(); void *stack_addr = (void *)OSRoundUp32B(_stack_addr); void *arena_lo = (void *)OSRoundUp32B(__ArenaLo); if (s_OrgMEM1ArenaLo < (void *)0x80700000) { s_NewMEM1ArenaLo = (void *)0x80700000; } else { s_NewMEM1ArenaLo = (void *)ROUND_UP_4KB(arena_lo); if (s_OrgMEM1ArenaLo != stack_addr && s_OrgMEM1ArenaLo != arena_lo) { OSPanic("d_system.cpp", 1883, "Arena Error!\n"); } } OSSetMEM1ArenaLo(s_NewMEM1ArenaLo); s_OrgMEM1ArenaHi = OSGetMEM1ArenaHi(); s_NewMEM1ArenaHi = (void *)0x817E0000; if (s_OrgMEM1ArenaHi > s_NewMEM1ArenaHi) { OSSetMEM1ArenaHi(s_NewMEM1ArenaHi); } }