diff --git a/config/RSBE01_02/splits.txt b/config/RSBE01_02/splits.txt index c1a7b8325..1db3c0c4c 100644 --- a/config/RSBE01_02/splits.txt +++ b/config/RSBE01_02/splits.txt @@ -302,6 +302,10 @@ sora/nt/nt_etc_dwc.cpp: .bss start:0x8049ECE0 end:0x8049ECF8 .sdata start:0x8059E7E8 end:0x8059E7F0 +sora/nt/nt_etc_so.cpp: + .text start:0x80150CE4 end:0x801510F4 + .data start:0x804610F8 end:0x80461108 + sora/ad/ad_static_data.cpp: .text start:0x8015B09C end:0x8015B0E0 .data start:0x804621C0 end:0x804629C8 diff --git a/config/RSBE01_02/symbols.txt b/config/RSBE01_02/symbols.txt index a99b26f69..c1dc6061a 100644 --- a/config/RSBE01_02/symbols.txt +++ b/config/RSBE01_02/symbols.txt @@ -6313,7 +6313,7 @@ fn_801505DC = .text:0x801505DC; // type:function size:0x10 fn_801505EC = .text:0x801505EC; // type:function size:0x10 fn_801505FC = .text:0x801505FC; // type:function size:0x18 __ct__6nteDWCFv = .text:0x80150614; // type:function size:0x9C -notifyDoneSOProc__6nteDWCFll = .text:0x801506B0; // type:function size:0xE0 +notifyDoneSOProc__6nteDWCFQ29nteSODone9NotifTypel = .text:0x801506B0; // type:function size:0xE0 startupDWC__6nteDWCFv = .text:0x80150790; // type:function size:0x74 finishDWC__6nteDWCFv = .text:0x80150804; // type:function size:0x58 login__6nteDWCFllll = .text:0x8015085C; // type:function size:0xC8 @@ -6323,17 +6323,17 @@ processDefault__6nteDWCFv = .text:0x801509D4; // type:function size:0xA0 getTime__6nteDWCCFv = .text:0x80150A74; // type:function size:0xAC callbackLogin__6nteDWCFllPv = .text:0x80150B20; // type:function size:0x88 AllocEx__6nteDWCFiUli = .text:0x80150BA8; // type:function size:0x78 -FreeEx__6nteDWCFiPv = .text:0x80150C20; // type:function size:0x54 +FreeEx__6nteDWCFiPvi = .text:0x80150C20; // type:function size:0x54 __dt__6nteDWCFv = .text:0x80150C74; // type:function size:0x68 -@64@notifyDoneSOProc__6nteDWCFll = .text:0x80150CDC; // type:function size:0x8 +@64@notifyDoneSOProc__6nteDWCFQ29nteSODone9NotifTypel = .text:0x80150CDC; // type:function size:0x8 __ct__5nteSOFv = .text:0x80150CE4; // type:function size:0x8C __dt__5nteSOFv = .text:0x80150D70; // type:function size:0xE0 -fn_80150E50 = .text:0x80150E50; // type:function size:0x144 +run__5nteSOFv = .text:0x80150E50; // type:function size:0x144 startup__5nteSOFP9nteSODoneUl = .text:0x80150F94; // type:function size:0x88 finish__5nteSOFP9nteSODone = .text:0x8015101C; // type:function size:0x7C -SOAlloc = .text:0x80151098; // type:function size:0x2C -SOFree = .text:0x801510C4; // type:function size:0x2C -showError__6nteDWCFl = .text:0x801510F0; // type:function size:0x4 +SOAlloc__5nteSOFiUl = .text:0x80151098; // type:function size:0x2C +SOFree__5nteSOFiPv = .text:0x801510C4; // type:function size:0x2C +showError__5nteSOFl = .text:0x801510F0; // type:function size:0x4 fn_801510F4 = .text:0x801510F4; // type:function size:0x8C fn_80151180 = .text:0x80151180; // type:function size:0xD8 fn_80151258 = .text:0x80151258; // type:function size:0x35C @@ -8918,7 +8918,7 @@ fn_801E0480 = .text:0x801E0480; // type:function size:0x284 fn_801E0704 = .text:0x801E0704; // type:function size:0x10 fn_801E0714 = .text:0x801E0714; // type:function size:0xC fn_801E0720 = .text:0x801E0720; // type:function size:0x14 -fn_801E0734 = .text:0x801E0734; // type:function size:0x2C +OSIsThreadTerminated = .text:0x801E0734; // type:function size:0x2C fn_801E0760 = .text:0x801E0760; // type:function size:0x3C OSEnableScheduler = .text:0x801E079C; // type:function size:0x3C scope:global fn_801E07D8 = .text:0x801E07D8; // type:function size:0x68 @@ -26201,7 +26201,7 @@ lbl_80461030 = .data:0x80461030; // type:object size:0x17 data:string lbl_80461048 = .data:0x80461048; // type:object size:0x28 lbl_80461070 = .data:0x80461070; // type:object size:0xE data:string __vt__6nteDWC = .data:0x80461080; // type:object size:0x78 -lbl_804610F8 = .data:0x804610F8; // type:object size:0x10 +__vt__5nteSO = .data:0x804610F8; // type:object size:0xC lbl_80461108 = .data:0x80461108; // type:object size:0x1FC lbl_80461304 = .data:0x80461304; // type:object size:0x48 lbl_8046134C = .data:0x8046134C; // type:object size:0x1C diff --git a/configure.py b/configure.py index f45733120..e92af7a61 100755 --- a/configure.py +++ b/configure.py @@ -354,6 +354,7 @@ def MatchingFor(*versions): Object(Matching, "sora/nt/nt_offline.cpp", extra_cflags=["-RTTI off"]), Object(Matching, "sora/nt/d_net_connect.cpp"), Object(Matching, "sora/nt/nt_etc_dwc.cpp", extra_cflags=["-RTTI off"]), + Object(Matching, "sora/nt/nt_etc_so.cpp", extra_cflags=["-O0", "-opt peephole", "-opt schedule", "-RTTI off"]), Object(Matching, "sora/ad/ad_static_data.cpp"), Object(Matching, "sora/st/st_data_container.cpp"), Object(Matching, "sora/st/st_data_container_multi.cpp"), diff --git a/include/lib/BrawlHeaders b/include/lib/BrawlHeaders index 79429a10b..83e136db2 160000 --- a/include/lib/BrawlHeaders +++ b/include/lib/BrawlHeaders @@ -1 +1 @@ -Subproject commit 79429a10b5ca88ae4af79673f439c61d97a77e2f +Subproject commit 83e136db2c55d2ccd424cd0f042a56ac18194866 diff --git a/src/mo_melee/sora_melee/so/so_common_data_accesser.cpp b/src/mo_melee/sora_melee/so/so_common_data_accesser.cpp index 0c17b5f42..46687b98b 100644 --- a/src/mo_melee/sora_melee/so/so_common_data_accesser.cpp +++ b/src/mo_melee/sora_melee/so/so_common_data_accesser.cpp @@ -7,71 +7,66 @@ void soCommonDataAccesser::setupCommonParam(soCommonParam** p1) { for (u32 i = 0; i < 2; i++) { u32 j = 0; u32 k = 0; - paramFloats[i].m_0[j++] = p1[i]->m_0; - paramFloats[i].m_0[j++] = p1[i]->m_4; - paramFloats[i].m_0[j++] = p1[i]->m_8; - paramFloats[i].m_0[j++] = p1[i]->m_C; - paramFloats[i].m_0[j++] = p1[i]->m_18; - paramFloats[i].m_0[j++] = p1[i]->m_1C; - paramFloats[i].m_0[j++] = p1[i]->m_20; - paramFloats[i].m_0[j++] = p1[i]->m_24; - paramFloats[i].m_0[j++] = p1[i]->m_28; - paramFloats[i].m_0[j++] = p1[i]->m_2C; - paramFloats[i].m_0[j++] = p1[i]->m_30; - paramFloats[i].m_0[j++] = p1[i]->m_34; - paramFloats[i].m_0[j++] = p1[i]->m_38; - paramFloats[i].m_0[j++] = p1[i]->m_3C; - paramFloats[i].m_0[j++] = p1[i]->m_40; - paramFloats[i].m_0[j++] = p1[i]->m_48; - paramFloats[i].m_0[j++] = p1[i]->m_4C; - paramFloats[i].m_0[j++] = p1[i]->m_50; - paramFloats[i].m_0[j++] = p1[i]->m_54; - paramFloats[i].m_0[j++] = p1[i]->m_5C; - paramFloats[i].m_0[j++] = p1[i]->m_60; - paramFloats[i].m_0[j++] = p1[i]->m_6C; - paramFloats[i].m_0[j++] = p1[i]->m_70; - paramFloats[i].m_0[j++] = p1[i]->m_74; - paramFloats[i].m_0[j++] = p1[i]->m_78; - paramFloats[i].m_0[j++] = p1[i]->m_7C; - paramFloats[i].m_0[j++] = p1[i]->m_80; - paramFloats[i].m_0[j++] = p1[i]->m_84; - paramFloats[i].m_0[j++] = p1[i]->m_88; - paramFloats[i].m_0[j++] = p1[i]->m_8C; - paramFloats[i].m_0[j++] = p1[i]->m_90; - paramFloats[i].m_0[j++] = p1[i]->m_94; - paramFloats[i].m_0[j++] = p1[i]->m_98; - paramFloats[i].m_0[j++] = p1[i]->m_9C; - paramFloats[i].m_0[j++] = p1[i]->m_A0; - paramFloats[i].m_0[j++] = p1[i]->m_A4; - paramFloats[i].m_0[j++] = p1[i]->m_A8; - paramFloats[i].m_0[j++] = p1[i]->m_AC; - paramFloats[i].m_0[j++] = p1[i]->m_B0; - paramFloats[i].m_0[j++] = p1[i]->m_B4; + paramFloats[i].data[j++] = p1[i]->m_0; + paramFloats[i].data[j++] = p1[i]->m_4; + paramFloats[i].data[j++] = p1[i]->m_8; + paramFloats[i].data[j++] = p1[i]->m_C; + paramFloats[i].data[j++] = p1[i]->m_18; + paramFloats[i].data[j++] = p1[i]->m_1C; + paramFloats[i].data[j++] = p1[i]->m_20; + paramFloats[i].data[j++] = p1[i]->m_24; + paramFloats[i].data[j++] = p1[i]->m_28; + paramFloats[i].data[j++] = p1[i]->m_2C; + paramFloats[i].data[j++] = p1[i]->m_30; + paramFloats[i].data[j++] = p1[i]->m_34; + paramFloats[i].data[j++] = p1[i]->m_38; + paramFloats[i].data[j++] = p1[i]->m_3C; + paramFloats[i].data[j++] = p1[i]->m_40; + paramFloats[i].data[j++] = p1[i]->m_48; + paramFloats[i].data[j++] = p1[i]->m_4C; + paramFloats[i].data[j++] = p1[i]->m_50; + paramFloats[i].data[j++] = p1[i]->m_54; + paramFloats[i].data[j++] = p1[i]->m_5C; + paramFloats[i].data[j++] = p1[i]->m_60; + paramFloats[i].data[j++] = p1[i]->m_6C; + paramFloats[i].data[j++] = p1[i]->m_70; + paramFloats[i].data[j++] = p1[i]->m_74; + paramFloats[i].data[j++] = p1[i]->m_78; + paramFloats[i].data[j++] = p1[i]->m_7C; + paramFloats[i].data[j++] = p1[i]->m_80; + paramFloats[i].data[j++] = p1[i]->m_84; + paramFloats[i].data[j++] = p1[i]->m_88; + paramFloats[i].data[j++] = p1[i]->m_8C; + paramFloats[i].data[j++] = p1[i]->m_90; + paramFloats[i].data[j++] = p1[i]->m_94; + paramFloats[i].data[j++] = p1[i]->m_98; + paramFloats[i].data[j++] = p1[i]->m_9C; + paramFloats[i].data[j++] = p1[i]->m_A0; + paramFloats[i].data[j++] = p1[i]->m_A4; + paramFloats[i].data[j++] = p1[i]->m_A8; + paramFloats[i].data[j++] = p1[i]->m_AC; + paramFloats[i].data[j++] = p1[i]->m_B0; + paramFloats[i].data[j++] = p1[i]->m_B4; - paramInts[i].m_0[k++] = p1[i]->m_10; - paramInts[i].m_0[k++] = p1[i]->m_14; - paramInts[i].m_0[k++] = p1[i]->m_44; - paramInts[i].m_0[k++] = p1[i]->m_58; - paramInts[i].m_0[k++] = p1[i]->m_B8; + paramInts[i].data[k++] = p1[i]->m_10; + paramInts[i].data[k++] = p1[i]->m_14; + paramInts[i].data[k++] = p1[i]->m_44; + paramInts[i].data[k++] = p1[i]->m_58; + paramInts[i].data[k++] = p1[i]->m_B8; - paramIndefinites[i].m_0 = &p1[i]->m_64; + paramIndefinites[i].data[0] = &p1[i]->m_64; } commonData = p1; } -// TODO: UBFIX match without casting - float soCommonDataAccesser::getParamCommonFloat(u32 p1, u32 p2) { - return ((soCommonDataAccesser*)(((u8*)(this)) - 0x1F48)) - ->paramFloats[p1].m_0[p2]; + return paramFloats[p1 - 50].data[p2 - 2]; } s32 soCommonDataAccesser::getParamCommonInt(u32 p1, u32 p2) { - return ((soCommonDataAccesser*)(((u8*)(this)) - 0x157C4)) - ->paramInts[p1].m_0[p2]; + return paramInts[p1 - 4400].data[p2 - 1]; } s32* soCommonDataAccesser::getParamCommonIndefinite(u32 p1, u32 p2) { - return ((soCommonDataAccesser*)(((u8*)(this)) - 0x29044 + p1*4 + p2*4)) - ->paramIndefinites[0].m_0; + return paramIndefinites[p1 - 42000].data[p2 - 1]; } diff --git a/src/sora/nt/nt_etc_dwc.cpp b/src/sora/nt/nt_etc_dwc.cpp index 00f44066a..4c2344b94 100644 --- a/src/sora/nt/nt_etc_dwc.cpp +++ b/src/sora/nt/nt_etc_dwc.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -24,16 +25,15 @@ nteDWC::nteDWC() : gfTask("nteDWC", Category_Network, 14, 13, true) { unk2C_b1 = false; } -void nteDWC::notifyDoneSOProc(s32 p1, s32 p2) { - switch (p2) { +void nteDWC::notifyDoneSOProc(nteSODone::NotifType notifType, s32 code) { + switch (code) { case 0: - switch (p1) { - case 0: - if (!DWC_Init(unk6C, m_name, m_appCode, AllocEx, FreeEx)) { + switch (notifType) { + case nteSODone::Startup: + if (!DWC_Init(unk6C, m_name, m_appCode, AllocEx, FreeEx)) m_initialized = true; - } break; - case 1: + case nteSODone::Finish: m_initialized = false; break; default: @@ -43,19 +43,17 @@ void nteDWC::notifyDoneSOProc(s32 p1, s32 p2) { case 0x80000000: break; default: - showError(p2); - s32 err = -NETGetStartupErrorCode(p2); - if (unk60) { + nteSO::showError(code); + s32 err = -NETGetStartupErrorCode(code); + if (unk60) unk60->func0(err); - } break; } } bool nteDWC::startupDWC() { - if (m_initialized) { + if (m_initialized) return true; - } unk6C = 1; m_name = "smashbrosxwii"; m_appCode = srGetAppInitialCode(); @@ -71,27 +69,22 @@ bool nteDWC::finishDWC() { } bool nteDWC::login(s32 p1, s32 p2, s32 p3, s32 p4) { - if (!m_initialized) { + if (!m_initialized) return false; - } - if (DWC_GetState()) { + if (DWC_GetState()) return true; - } DWC_InitFriendsMatch(0, p1, 0x2B1E, p3, p4, 0, 0, 0, 0); - if (!DWC_LoginAsync(p2, 0, callbackLogin, this)) { + if (!DWC_LoginAsync(p2, 0, callbackLogin, this)) return false; - } m_loggedIn = true; return true; } bool nteDWC::logout() { - if (!m_initialized) { + if (!m_initialized) return false; - } - if (!DWC_GetState()) { + if (!DWC_GetState()) return true; - } OSLockMutex(&m_mutex); m_loggedIn = false; DWC_ShutdownFriendsMatch(); @@ -118,13 +111,12 @@ void nteDWC::processDefault() { break; case true: DWC_ProcessFriendsMatch(); - s32 err2, err1; - if (DWC_GetLastErrorEx(&err1, &err2)) { + s32 err, nType; + if (DWC_GetLastErrorEx(&nType, &err)) { if (unk64) { - if (err1 < 0) { - err1 = -err1; - } - unk64->notifyDoneSOProc(err1, err2); + if (nType < 0) + nType = -nType; + unk64->notifyDoneSOProc(nteSODone::NotifType(nType), err); } DWC_ClearError(); } @@ -156,37 +148,32 @@ s64 nteDWC::getTime() const { return ticks; } -void nteDWC::callbackLogin(s32 p1, s32 p2, void* p3) { - (void)p2; +void nteDWC::callbackLogin(s32 p1, s32 _unused, void* p3) { nteDWC* dwc = static_cast(p3); if (p1) { dwc->m_loggedIn = false; - s32 err1, err2; - if (DWC_GetLastErrorEx(&err1, &err2)) { + s32 nType, err; + if (DWC_GetLastErrorEx(&nType, &err)) { if (dwc->unk64) { - if (err1 < 0) { - err1 = -err1; - } - dwc->unk64->notifyDoneSOProc(err1, err2); + if (nType < 0) + nType = -nType; + dwc->unk64->notifyDoneSOProc(nteSODone::NotifType(nType), err); } DWC_ClearError(); } } } -void* nteDWC::AllocEx(int heap, size_t size, int align) { - (void)heap; - if (!size) { +void* nteDWC::AllocEx(int _heap, size_t size, int align) { + if (!size) return nullptr; - } OSLockMutex(&NteDWCMutex); void* ptr = gfHeapManager::alloc(Heaps::Network, size, align); OSUnlockMutex(&NteDWCMutex); return ptr; } -void nteDWC::FreeEx(int heap, void* ptr) { - (void)heap; +void nteDWC::FreeEx(int _heap, void* ptr, int unused) { if (ptr) { OSLockMutex(&NteDWCMutex); gfHeapManager::free(ptr); diff --git a/src/sora/nt/nt_etc_so.cpp b/src/sora/nt/nt_etc_so.cpp new file mode 100644 index 000000000..25e6de7f9 --- /dev/null +++ b/src/sora/nt/nt_etc_so.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +nteSO::nteSO() { + m_actionDoneNotifier = nullptr; + m_isAlive = true; + m_action = NoAction; +} + +nteSO::~nteSO() { + m_isAlive = false; + int _ret, isTerminated; + while (!(isTerminated = OSIsThreadTerminated(&m_thread) == true)) { + _ret = OSResumeThread(&m_thread); + OSSleepTicks((s64)((OS_BUS_CLOCK_SPEED / 4) / 1000) * 10); + } +} + +void nteSO::run() { + while (m_isAlive) { + if (m_action == DoStartup) { + SOInitInfo initInfo; + memset(&initInfo, 0, sizeof(SOInitInfo)); + initInfo.allocator = nteSO::SOAlloc; + initInfo.dealloc = nteSO::SOFree; + int code = SOInit(&initInfo); + if (code == -7) + code = 0; + if (code == 0) { + code = SOStartupEx(m_startupParam); + if (code == -7) + code = 0; + } + if (m_actionDoneNotifier) + m_actionDoneNotifier->notifyDoneSOProc(nteSODone::Startup, code); + } else if (m_action == DoFinish) { + SOCleanup(); + s32 code = SOFinish(); + if (code == -7) + code = 0; + if (m_actionDoneNotifier) + m_actionDoneNotifier->notifyDoneSOProc(nteSODone::Finish, code); + } + m_action = NoAction; + s32 ret = OSSuspendThread(&m_thread); + } +} + +bool nteSO::startup(nteSODone* doneNotifier, u32 startupParam) { + if (m_action != NoAction) + return false; + if (!doneNotifier) + return false; + m_startupParam = startupParam; + m_action = DoStartup; + m_actionDoneNotifier = doneNotifier; + s32 _ret = OSResumeThread(&m_thread); + return true; +} + +bool nteSO::finish(nteSODone* doneNotifier) { + if (m_action != NoAction) + return false; + if (!doneNotifier) + return false; + m_action = DoFinish; + m_actionDoneNotifier = doneNotifier; + s32 _ret = OSResumeThread(&m_thread); + return true; +} + +void* nteSO::SOAlloc(int _unused, u32 size) { + return nteDWC::AllocEx(0, size, 0x20); +} + +void nteSO::SOFree(int _unused, void* ptr) { + nteDWC::FreeEx(0, ptr, 0); +} + +void nteSO::showError(s32 code) { }