diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2025-11-17 10:01:03 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-17 20:01:03 +0200 |
| commit | 540217c31b88246d5c3abd57bb3fbd97cff6d31c (patch) | |
| tree | cc08666dad6a7cd55539168a0d0e3f6bba188488 /src/c | |
| parent | 4350a38fe01fa57890eade52c7c5e3789cce83ac (diff) | |
wii building OK / m_Do_graphic debug work (#2815)
* wii building OK + m_Do_graphic debug work
* d_meter_HIO debug cleanup
* wii m_Do_graphic stuff
* tag_attack_item OK, mirror_chain almost
* fix build
* mg_fshop matching
Diffstat (limited to 'src/c')
| -rw-r--r-- | src/c/c_dylink.cpp | 201 |
1 files changed, 154 insertions, 47 deletions
diff --git a/src/c/c_dylink.cpp b/src/c/c_dylink.cpp index 17dd970f33..1670a38d51 100644 --- a/src/c/c_dylink.cpp +++ b/src/c/c_dylink.cpp @@ -10,6 +10,11 @@ #include "d/d_com_inf_game.h" #include "m_Do/m_Do_ext.h" +#if DEBUG +#include "f_pc/f_pc_debug_sv.h" +#include "m_Do/m_Do_ext2.h" +#endif + /* 80374640-80375DE8 -00001 17A8+00 1/1 0/0 0/0 .rodata DynamicNameTable */ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_ALLDIE, "d_a_alldie"}, @@ -17,6 +22,9 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_Obj_Swpush2, "d_a_obj_swpush2"}, {PROC_Obj_Swpush5, "d_a_obj_swpush5"}, {PROC_Tag_Gstart, "d_a_tag_gstart"}, + #if PLATFORM_WII || PLATFORM_SHIELD + {PROC_NO_CHG_ROOM, "d_a_no_chg_room"}, + #endif {PROC_Obj_Lv6ElevtA, "d_a_obj_lv6elevta"}, {PROC_OBJ_SO, "d_a_obj_so"}, {PROC_Obj_Movebox, "d_a_obj_movebox"}, @@ -91,7 +99,9 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_Obj_BkDoor, "d_a_obj_bkdoor"}, {PROC_Obj_Cboard, "d_a_obj_cboard"}, {PROC_Obj_MGate, "d_a_obj_mgate"}, + #if !PLATFORM_SHIELD {PROC_Obj_Ikada, "d_a_obj_ikada"}, + #endif {PROC_Obj_Ice_l, "d_a_obj_ice_l"}, {PROC_Obj_Ice_s, "d_a_obj_ice_s"}, {PROC_Obj_E_CREATE, "d_a_obj_enemy_create"}, @@ -530,14 +540,18 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_Obj_LifeContainer, "d_a_obj_life_container"}, {PROC_Obj_Shield, "d_a_obj_shield"}, {PROC_Demo_Item, "d_a_demo_item"}, + #if !PLATFORM_SHIELD {PROC_ShopItem, "d_a_shop_item"}, + #endif {PROC_Obj_Drop, "d_a_obj_drop"}, {PROC_OBJ_RW, "d_a_obj_rw"}, {PROC_NBOMB, "d_a_nbomb"}, {PROC_TAG_CSW, "d_a_tag_csw"}, {PROC_TAG_QS, "d_a_tag_qs"}, {PROC_HOZELDA, "d_a_hozelda"}, + #if !PLATFORM_SHIELD {PROC_SWC00, "d_a_swc00"}, + #endif {PROC_KNOB20, "d_a_door_knob00"}, {PROC_DBDOOR, "d_a_door_dbdoor00"}, {PROC_BOSS_DOOR, "d_a_door_boss"}, @@ -549,7 +563,9 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_Tag_ChgRestart, "d_a_tag_chgrestart"}, {PROC_Tag_Restart, "d_a_tag_setrestart"}, {PROC_ANDSW, "d_a_andsw"}, + #if !PLATFORM_SHIELD {PROC_ANDSW2, "d_a_andsw2"}, + #endif {PROC_MYNA, "d_a_myna"}, {PROC_NPC_GND, "d_a_npc_gnd"}, {PROC_NPC_GRA, "d_a_npc_gra"}, @@ -668,10 +684,14 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_NPC_CHIN, "d_a_npc_chin"}, {PROC_NPC_INS, "d_a_npc_ins"}, {PROC_NPC_SHOP0, "d_a_npc_shop0"}, + #if !PLATFORM_SHIELD {PROC_NPC_MK, "d_a_npc_mk"}, + #endif {PROC_NPC_P2, "d_a_npc_p2"}, {PROC_KYTAG00, "d_a_kytag00"}, + #if !PLATFORM_SHIELD {PROC_KYTAG01, "d_a_kytag01"}, + #endif {PROC_KYTAG02, "d_a_kytag02"}, {PROC_KYTAG03, "d_a_kytag03"}, {PROC_KYTAG04, "d_a_kytag04"}, @@ -709,11 +729,15 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_DEMO00, "d_a_demo00"}, {PROC_TAG_CAMERA, "d_a_tag_camera"}, {PROC_TAG_CHKPOINT, "d_a_tag_chkpoint"}, + #if !PLATFORM_SHIELD {PROC_TAG_EVENT, "d_a_tag_event"}, + #endif {PROC_TAG_EVT, "d_a_tag_evt"}, {PROC_TAG_TELOP, "d_a_tag_telop"}, {PROC_TAG_HOWL, "d_a_tag_howl"}, + #if !PLATFORM_SHIELD {PROC_TAG_MSG, "d_a_tag_msg"}, + #endif {PROC_TAG_LANTERN, "d_a_tag_lantern"}, {PROC_Tag_Mist, "d_a_tag_mist"}, {PROC_DMIDNA, "d_a_dmidna"}, @@ -724,7 +748,9 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_BG_OBJ, "d_a_bg_obj"}, {PROC_MIRROR, "d_a_mirror"}, {PROC_MOVIE_PLAYER, "d_a_movie_player"}, + #if !PLATFORM_SHIELD {PROC_TITLE, "d_a_title"}, + #endif {PROC_FR, "d_a_fr"}, {PROC_ECONT, "d_a_econt"}, {PROC_MG_ROD, "d_a_mg_rod"}, @@ -767,70 +793,134 @@ static DynamicNameTableEntry const DynamicNameTable[] = { {PROC_Obj_Timer, "d_a_obj_timer"}, {PROC_SCENE_EXIT, "d_a_scene_exit"}, {PROC_SUSPEND, "d_a_suspend"}, + #if !PLATFORM_SHIELD {PROC_GRASS, "d_a_grass"}, + #endif {0xFFFF, NULL}, }; /* 803F0F50-803F1BB0 01DC70 0C60+00 4/4 0/0 0/0 .bss DMC */ -static DynamicModuleControlBase* DMC[792]; +static DynamicModuleControlBase* DMC[PROC_MAX_NUM]; /* 80450CA8-80450CAC 0001A8 0004+00 1/1 0/0 0/0 .sbss None */ static bool DMC_initialized; +/* 80450CAC-80450CB0 0001AC 0004+00 2/2 0/0 0/0 .sbss cDyl_Initialized */ +static BOOL cDyl_Initialized; + /* 800183DC-80018544 012D1C 0168+00 1/1 0/0 0/0 .text cCc_Init__Fv */ -static int cCc_Init() { - JKRHeap* arcHeap = mDoExt_getArchiveHeap(); - JKRSolidHeap* heap = JKRSolidHeap::create(0x8820, arcHeap, false); - JKRHeap* prev = heap->becomeCurrentHeap(); +int cCc_Init() { + JUT_ASSERT(37, !DMC_initialized); + + #if PLATFORM_GCN + JKRHeap* parentHeap = mDoExt_getArchiveHeap(); + #else + JKRHeap* parentHeap = DynamicModuleControlBase::getHeap(); + #endif + u32 dmcHeapSize = sizeof(DynamicModuleControl) * PROC_MAX_NUM; + + JKRSolidHeap* dmcHeap = JKRCreateSolidHeap(dmcHeapSize, parentHeap, false); + JKRHeap* prevHeap = JKRSetCurrentHeap(dmcHeap); memset(&DMC, 0, sizeof(DMC)); + for (int i = 0; i < ARRAY_SIZEU(DynamicNameTable); i++) { - const DynamicNameTableEntry* d = &DynamicNameTable[i]; + const DynamicNameTableEntry& d = DynamicNameTable[i]; + + if (d.name != NULL) { + JUT_ASSERT(52, d.mKey < ARRAY_SIZEU(DMC)); + JUT_ASSERT(53, DMC[d.mKey] == NULL); - if (d->name != NULL) { for (int j = 0; j < ARRAY_SIZEU(DMC); j++) { if (DMC[j] != NULL) { - if (!strcmp(d->name, DMC[j]->getModuleName())) { - DMC[d->mKey] = DMC[j]; + if (!strcmp(d.name, DMC[j]->getModuleName())) { + DMC[d.mKey] = DMC[j]; break; } } } - if (DMC[d->mKey] == NULL) { - DMC[d->mKey] = new DynamicModuleControl(d->name); + if (DMC[d.mKey] == NULL) { + DMC[d.mKey] = new DynamicModuleControl(d.name); } } } - heap->adjustSize(); - prev->becomeCurrentHeap(); + dmcHeap->adjustSize(); + JKRSetCurrentHeap(prevHeap); + + #if DEBUG + FixedMemoryCheck* check = FixedMemoryCheck::easyCreate(DMC, sizeof(DMC)); + #endif + DMC_initialized = true; return 1; } +BOOL cCc_Check() { + BOOL rt = TRUE; + for (int i = 0; i < ARRAY_SIZEU(DynamicNameTable); i++) { + uintptr_t ptr = (uintptr_t)DMC[i]; + if (ptr != NULL) { + u32 ptr_hi_byte = ptr >> 0x18; + if (ptr_hi_byte < 0x80 || ptr_hi_byte > 0x83) { + // "cCc_Check invalid pointer detected" + OS_REPORT_ERROR("cCc_Check ポインタ破壊を発見 %d %08x\n", i, ptr); + rt = FALSE; + } + } + } + + return rt; +} + +BOOL cDyl_IsInitialized() { + return cDyl_Initialized; +} + /* 80018544-8001857C 012E84 0038+00 0/0 1/1 0/0 .text cDyl_IsLinked__Fs */ BOOL cDyl_IsLinked(s16 i_ProfName) { - if (DMC[i_ProfName] != NULL) { - return DMC[i_ProfName]->isLinked(); + JUT_ASSERT(183, cDyl_Initialized); + + + DynamicModuleControlBase* d = DMC[i_ProfName]; + BOOL rt; + if (d != NULL) { + rt = d->isLinked(); + } else { + rt = TRUE; } - return true; + + return rt; } /* 8001857C-800185C0 012EBC 0044+00 1/1 1/1 0/0 .text cDyl_Unlink__Fs */ BOOL cDyl_Unlink(s16 i_ProfName) { - if (DMC[i_ProfName] != NULL) { - return DMC[i_ProfName]->unlink(); + #if DEBUG + cCc_Check(); + #endif + + JUT_ASSERT(206, cDyl_Initialized); + JUT_ASSERT(207, i_ProfName < ARRAY_SIZEU(DMC)); + + DynamicModuleControlBase* d = DMC[i_ProfName]; + if (d != NULL) { + return d->unlink(); } - return false; -} -/* 80450CAC-80450CB0 0001AC 0004+00 2/2 0/0 0/0 .sbss cDyl_Initialized */ -static BOOL cDyl_Initialized; + return FALSE; +} /* 800185C0-80018688 012F00 00C8+00 1/1 1/1 0/0 .text cDyl_LinkASync__Fs */ int cDyl_LinkASync(s16 i_ProfName) { - if (cDyl_Initialized == false) { + #if DEBUG + cCc_Check(); + #endif + + JUT_ASSERT(266, DMC_initialized); + + if (!cDyl_Initialized) { + OS_REPORT_ERROR("初期化が終わってないのに呼んでもらっても困ります %d %s\n", i_ProfName, fpcDbSv_getNameString(i_ProfName)); return cPhs_INIT_e; } @@ -839,8 +929,12 @@ int cDyl_LinkASync(s16 i_ProfName) { return cPhs_ERROR_e; } + JUT_ASSERT(282, i_ProfName < ARRAY_SIZEU(DMC)); + DynamicModuleControlBase* d = DMC[i_ProfName]; if (d != NULL) { + JUT_ASSERT(286, cDyl_Initialized); + if (d->load_async()) { if (d->link()) { return cPhs_COMPLEATE_e; @@ -859,71 +953,85 @@ int cDyl_LinkASync(s16 i_ProfName) { /* 80018688-80018764 012FC8 00DC+00 1/1 0/0 0/0 .text cDyl_InitCallback__FPv */ static int cDyl_InitCallback(void* param_0) { - JKRExpHeap* heap = mDoExt_getArchiveHeap(); - JKRFileLoader* loader = JKRFileCache::mount("/", heap, NULL); + JUT_ASSERT(335, !cDyl_Initialized); + + #if PLATFORM_GCN + JKRHeap* parentHeap = mDoExt_getArchiveHeap(); + #else + JKRHeap* parentHeap = DynamicModuleControlBase::getHeap(); + #endif + + JKRFileCache* loader = JKRMountDvdDrive("/", parentHeap, NULL); DynamicModuleControl::initialize(); - void* strTbl = JKRFileLoader::getGlbResource("/dvd/str/Final/Release/frameworkF.str"); - JKRFileLoader::detachResource(strTbl, loader); - loader->unmount(); + #if PLATFORM_GCN + void* strTbl = JKRGetResource("/dvd/str/Final/Release/frameworkF.str"); + #elif PLATFORM_WII + void* strTbl = JKRGetResource("/dvd/str/Rfinal/Release/RframeworkF.str"); + #else + void* strTbl = JKRGetResource("/dvd/str/Final/Release/frameworkF.str"); + #endif + + JKRDetachResource(strTbl, loader); + JKRUnmountDvdDrive(loader); OSSetStringTable(strTbl); DynamicModuleControl dmc("f_pc_profile_lst"); dmc.link(); cDyl_Initialized = true; - fopScnM_CreateReq(PROC_LOGO_SCENE, 0x7FFF, 0, 0); + fopScnM_CreateReq(PROC_LOGO_SCENE, 0x7FFF, 0, 0); return 1; } -/* ############################################################################################## */ /* 80450CB0-80450CB8 0001B0 0004+04 2/2 0/0 0/0 .sbss cDyl_DVD */ static mDoDvdThd_callback_c* cDyl_DVD; /* 80018764-80018798 0130A4 0034+00 0/0 1/1 0/0 .text cDyl_InitAsync__Fv */ void cDyl_InitAsync() { cCc_Init(); + JUT_ASSERT(367, cDyl_DVD == NULL); cDyl_DVD = mDoDvdThd_callback_c::create((mDoDvdThd_callback_func)cDyl_InitCallback, NULL); } /* 80018798-80018804 0130D8 006C+00 0/0 2/1 0/0 .text cDyl_InitAsyncIsDone__Fv */ -int cDyl_InitAsyncIsDone() { +BOOL cDyl_InitAsyncIsDone() { if (cDyl_DVD == NULL) { - return 1; + return TRUE; } if (cDyl_DVD->sync()) { cDyl_DVD->destroy(); cDyl_DVD = NULL; - return 1; + return TRUE; } - return 0; + return FALSE; } /* 80018804-8001880C 013144 0008+00 1/0 0/0 0/0 .text phase_01__7cDylPhsFPv */ int cDylPhs::phase_01(void* param_0) { - return 2; + return cPhs_NEXT_e; } /* 8001880C-80018844 01314C 0038+00 1/0 0/0 0/0 .text phase_02__7cDylPhsFPs */ int cDylPhs::phase_02(s16* p_profName) { int ret = cDyl_LinkASync(*p_profName); - - if (ret != 4) { - return ret; + if (ret == cPhs_COMPLEATE_e) { + return cPhs_NEXT_e; } - return 2; + + return ret; } /* 80018844-8001884C 013184 0008+00 1/0 0/0 0/0 .text phase_03__7cDylPhsFPv */ int cDylPhs::phase_03(void* param_0) { - return 0; + return cPhs_INIT_e; } /* 8001884C-80018890 01318C 0044+00 0/0 2/2 0/0 .text * Link__7cDylPhsFP30request_of_phase_process_classs */ -int cDylPhs::Link(request_of_phase_process_class* i_phase, s16 param_1) { +int cDylPhs::Link(request_of_phase_process_class* i_phase, s16 i_ProfName) { static request_of_phase_process_fn l_method[3] = { (request_of_phase_process_fn)cDylPhs::phase_01, (request_of_phase_process_fn)cDylPhs::phase_02, @@ -934,20 +1042,19 @@ int cDylPhs::Link(request_of_phase_process_class* i_phase, s16 param_1) { return cPhs_COMPLEATE_e; } - return dComLbG_PhaseHandler(i_phase, l_method, ¶m_1); + return dComLbG_PhaseHandler(i_phase, l_method, &i_ProfName); } /* 80018890-800188DC 0131D0 004C+00 0/0 1/1 0/0 .text * Unlink__7cDylPhsFP30request_of_phase_process_classs */ int cDylPhs::Unlink(request_of_phase_process_class* i_phase, s16 i_ProfName) { - int ret; + JUT_ASSERT(460, i_phase->id != cPhs_LOADING_e); if (i_phase->id == cPhs_NEXT_e) { - ret = cDyl_Unlink(i_ProfName); + int ret = cDyl_Unlink(i_ProfName); i_phase->id = cPhs_INIT_e; - } else { - ret = 0; + return ret; } - return ret; + return 0; } |
