diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/help_system.c | 60 | ||||
-rw-r--r-- | src/help_system_812B1E0.c | 423 | ||||
-rw-r--r-- | src/librfu_intr.c | 402 | ||||
-rw-r--r-- | src/librfu_rfu.c | 1712 | ||||
-rw-r--r-- | src/librfu_sio32id.c | 142 | ||||
-rw-r--r-- | src/librfu_stwi.c | 81 | ||||
-rw-r--r-- | src/link.c | 10 | ||||
-rw-r--r-- | src/link_rfu.c | 1413 | ||||
-rw-r--r-- | src/link_rfu_2.c | 716 | ||||
-rw-r--r-- | src/link_rfu_3.c | 189 | ||||
-rw-r--r-- | src/party_menu.c | 4 | ||||
-rw-r--r-- | src/rfu_union_tool.c | 40 | ||||
-rw-r--r-- | src/union_room.c | 470 | ||||
-rw-r--r-- | src/union_room_chat.c | 8 | ||||
-rw-r--r-- | src/wireless_communication_status_screen.c | 4 |
15 files changed, 3078 insertions, 2596 deletions
diff --git a/src/help_system.c b/src/help_system.c index 4a4d927c5..bb3135260 100644 --- a/src/help_system.c +++ b/src/help_system.c @@ -33,7 +33,7 @@ struct HelpSystemVideoState static EWRAM_DATA u8 sMapTilesBackup[BG_CHAR_SIZE] = {0}; EWRAM_DATA u8 gUnknown_203F174 = 0; -EWRAM_DATA u8 gUnknown_203F175 = 0; +EWRAM_DATA bool8 gHelpSystemToggleWithRButtonDisabled = FALSE; static EWRAM_DATA u8 sDelayTimer = 0; static EWRAM_DATA u8 sInHelpSystem = 0; static EWRAM_DATA struct HelpSystemVideoState sVideoState = {0}; @@ -53,7 +53,7 @@ u8 RunHelpSystemCallback(void) sInHelpSystem = 0; if (gSaveBlock2Ptr->optionsButtonMode != OPTIONS_BUTTON_MODE_HELP) return 0; - if (JOY_NEW(R_BUTTON) && gUnknown_203F175 == 1) + if (JOY_NEW(R_BUTTON) && gHelpSystemToggleWithRButtonDisabled == TRUE) return 0; if (JOY_NEW(L_BUTTON | R_BUTTON)) { @@ -93,9 +93,9 @@ u8 RunHelpSystemCallback(void) HelpSystem_PrintText_Row61(gString_Help); sub_813BD14(1); if (sub_812B40C() == TRUE) - sub_812BC54(&gHelpSystemListMenu, gHelpSystemListMenuItems); + HelpSystemSubroutine_PrintWelcomeMessage(&gHelpSystemListMenu, gHelpSystemListMenuItems); else - sub_812BCA8(&gHelpSystemListMenu, gHelpSystemListMenuItems); + HelpSystemSubroutine_WelcomeEndGotoMenu(&gHelpSystemListMenu, gHelpSystemListMenuItems); sub_813BE78(1); sub_813BF50(1); CommitTilemap(); @@ -110,7 +110,7 @@ u8 RunHelpSystemCallback(void) sVideoState.state = 5; break; case 5: - if (!sub_812BB9C(&gHelpSystemListMenu, gHelpSystemListMenuItems)) + if (!RunHelpMenuSubroutine(&gHelpSystemListMenu, gHelpSystemListMenuItems)) { PlaySE(SE_HELP_CL); sVideoState.state = 6; @@ -981,9 +981,9 @@ void HelpSystem_FillPanel1(void) void HelpSystem_InitListMenuController(struct HelpSystemListMenu * a0, u8 a1, u8 a2) { gHelpSystemListMenu.sub = a0->sub; - gHelpSystemListMenu.field_0C = a1; - gHelpSystemListMenu.field_0D = a2; - gHelpSystemListMenu.field_0E = 0; + gHelpSystemListMenu.itemsAbove = a1; + gHelpSystemListMenu.cursorPos = a2; + gHelpSystemListMenu.state = 0; if (gHelpSystemListMenu.sub.totalItems < gHelpSystemListMenu.sub.maxShowed) gHelpSystemListMenu.sub.maxShowed = gHelpSystemListMenu.sub.totalItems; sub_813BDA4(0); @@ -1007,7 +1007,7 @@ s32 HelpSystem_GetMenuInput(void) else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D].index; + return gHelpSystemListMenu.sub.items[gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos].index; } else if (JOY_NEW(B_BUTTON)) { @@ -1051,15 +1051,15 @@ void sub_813C75C(void) u8 r6 = gHelpSystemListMenu.sub.totalItems - 7; if (gHelpSystemListMenu.sub.totalItems > 7) { - s32 r4 = gHelpSystemListMenu.field_0C + gHelpSystemListMenu.field_0D; + s32 r4 = gHelpSystemListMenu.itemsAbove + gHelpSystemListMenu.cursorPos; sub_813C004(0, 0); if (r4 == 0) sub_813C004(1, 1); - else if (gHelpSystemListMenu.field_0C == 0 && gHelpSystemListMenu.field_0D != 0) + else if (gHelpSystemListMenu.itemsAbove == 0 && gHelpSystemListMenu.cursorPos != 0) sub_813C004(1, 1); - else if (gHelpSystemListMenu.field_0C == r6) + else if (gHelpSystemListMenu.itemsAbove == r6) sub_813C004(0, 1); - else if (gHelpSystemListMenu.field_0C != 0) + else if (gHelpSystemListMenu.itemsAbove != 0) { sub_813C004(0, 1); sub_813C004(1, 1); @@ -1071,7 +1071,7 @@ void PrintListMenuItems(void) { u8 glyphHeight = GetFontAttribute(2, 1) + 1; s32 i; - s32 r5 = gHelpSystemListMenu.field_0C; + s32 r5 = gHelpSystemListMenu.itemsAbove; for (i = 0; i < gHelpSystemListMenu.sub.maxShowed; i++) { @@ -1086,7 +1086,7 @@ void PlaceListMenuCursor(void) { u8 glyphHeight = GetFontAttribute(2, 1) + 1; u8 x = gHelpSystemListMenu.sub.left; - u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.field_0D; + u8 y = gHelpSystemListMenu.sub.top + glyphHeight * gHelpSystemListMenu.cursorPos; HelpSystem_PrintTextAt(gFameCheckerText_ListMenuCursor, x, y); } @@ -1107,24 +1107,24 @@ u8 TryMoveCursor1(u8 dirn) r4 = 0; else r4 = gHelpSystemListMenu.sub.maxShowed - (gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1)) - 1; - if (gHelpSystemListMenu.field_0C == 0) + if (gHelpSystemListMenu.itemsAbove == 0) { - if (gHelpSystemListMenu.field_0D != 0) + if (gHelpSystemListMenu.cursorPos != 0) { - gHelpSystemListMenu.field_0D--; + gHelpSystemListMenu.cursorPos--; return 1; } else return 0; } - if (gHelpSystemListMenu.field_0D > r4) + if (gHelpSystemListMenu.cursorPos > r4) { - gHelpSystemListMenu.field_0D--; + gHelpSystemListMenu.cursorPos--; return 1; } else { - gHelpSystemListMenu.field_0C--; + gHelpSystemListMenu.itemsAbove--; return 2; } } @@ -1134,24 +1134,24 @@ u8 TryMoveCursor1(u8 dirn) r4 = 0; else r4 = gHelpSystemListMenu.sub.maxShowed / 2 + (gHelpSystemListMenu.sub.maxShowed & 1); - if (gHelpSystemListMenu.field_0C == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) + if (gHelpSystemListMenu.itemsAbove == gHelpSystemListMenu.sub.totalItems - gHelpSystemListMenu.sub.maxShowed) { - if (gHelpSystemListMenu.field_0D < gHelpSystemListMenu.sub.maxShowed - 1) + if (gHelpSystemListMenu.cursorPos < gHelpSystemListMenu.sub.maxShowed - 1) { - gHelpSystemListMenu.field_0D++; + gHelpSystemListMenu.cursorPos++; return 1; } else return 0; } - else if (gHelpSystemListMenu.field_0D < r4) + else if (gHelpSystemListMenu.cursorPos < r4) { - gHelpSystemListMenu.field_0D++; + gHelpSystemListMenu.cursorPos++; return 1; } else { - gHelpSystemListMenu.field_0C++; + gHelpSystemListMenu.itemsAbove++; return 2; } } @@ -1159,7 +1159,7 @@ u8 TryMoveCursor1(u8 dirn) bool8 MoveCursor(u8 by, u8 dirn) { - u8 r7 = gHelpSystemListMenu.field_0D; + u8 r7 = gHelpSystemListMenu.cursorPos; u8 flags = 0; s32 i; for (i = 0; i < by; i++) @@ -1172,14 +1172,14 @@ bool8 MoveCursor(u8 by, u8 dirn) // neither changed return TRUE; case 1: - // changed field_0D only + // changed cursorPos only sub_813C860(r7); PlaceListMenuCursor(); CommitTilemap(); break; case 2: case 3: - // changed field_0C + // changed itemsAbove if (sub_812BF88() == TRUE) { HelpSystem_SetInputDelay(2); diff --git a/src/help_system_812B1E0.c b/src/help_system_812B1E0.c index df892152a..5b634a273 100644 --- a/src/help_system_812B1E0.c +++ b/src/help_system_812B1E0.c @@ -19,22 +19,22 @@ static EWRAM_DATA u16 sSomeVariable = 0; static EWRAM_DATA u8 gUnknown_203B0EE = 0; -u8 gUnknown_3005E9C[4]; +u8 sHelpSystemState[4]; u16 gSomeVariableBackup; static bool32 IsCurrentMapInArray(const u16 * mapIdxs); -static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); -static bool8 sub_812B754(void); -static bool8 sub_812B780(u8); -static bool8 sub_812BB10(void); - -static void sub_812BF5C(void); -static void sub_812BF74(const u8 *); -static void sub_812BF94(struct HelpSystemListMenu * a0); -static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); - -static const u8 *const gUnknown_845B080[] = { +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); +static bool8 HelpSystem_HasDefeatedBrock(void); +static bool8 HelpSystemSubmenuIndexIsActive(u8); +static bool8 HasGottenAtLeastOneHM(void); + +static void PrintWelcomeMessageOnPanel1(void); +static void PrintTextOnPanel2Row52RightAlign(const u8 *); +static void ResetHelpSystemCursor(struct HelpSystemListMenu * a0); +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * a0, struct ListMenuItem * a1); + +static const u8 *const sHelpSystemTopicPtrs[] = { gUnknown_81B2DF8, gUnknown_81B2E1C, gUnknown_81B2E2E, @@ -43,7 +43,7 @@ static const u8 *const gUnknown_845B080[] = { gUnknown_81B2E6A }; -static const u8 *const gUnknown_845B098[] = { +static const u8 *const sHelpSystemTopicMouseoverDescriptionPtrs[] = { gUnknown_81B2E88, gUnknown_81B2EC8, gUnknown_81B2F00, @@ -52,7 +52,7 @@ static const u8 *const gUnknown_845B098[] = { gUnknown_81B2FA9 }; -static const u8 *const gUnknown_845B0B0[] = { +static const u8 *const sHelpSystemSpecializedQuestionTextPtrs[] = { NULL, gUnknown_81B3083, gUnknown_81B30A9, @@ -100,7 +100,7 @@ static const u8 *const gUnknown_845B0B0[] = { gUnknown_81B3516 }; -static const u8 *const gUnknown_845B164[] = { +static const u8 *const sHelpSystemSpecializedAnswerTextPtrs[] = { NULL, gUnknown_81B3525, gUnknown_81B35E6, @@ -148,7 +148,7 @@ static const u8 *const gUnknown_845B164[] = { gUnknown_81B55F4 }; -static const u8 *const gUnknown_845B218[] = { +static const u8 *const sHelpSystemMenuTopicTextPtrs[] = { NULL, gUnknown_81B56E3, gUnknown_81B56F4, @@ -200,7 +200,7 @@ static const u8 *const gUnknown_845B218[] = { gUnknown_81B5A37 }; -static const u8 *const gUnknown_845B2DC[] = { +static const u8 *const sHelpSystemSpecializedControlsTextPtrs[] = { NULL, gUnknown_81B5A4D, gUnknown_81B5B0C, @@ -252,7 +252,7 @@ static const u8 *const gUnknown_845B2DC[] = { gUnknown_81B7C57 }; -static const u8 *const gUnknown_845B3A0[] = { +static const u8 *const sHelpSystemSpecializedStringsTextPtrs[] = { NULL, gUnknown_81B7CC1, gUnknown_81B7CC4, @@ -299,7 +299,7 @@ static const u8 *const gUnknown_845B3A0[] = { gUnknown_81B7E0F }; -static const u8 *const gUnknown_845B450[] = { +static const u8 *const sHelpSystemSpecializedStringDefinitionsTextPtrs[] = { NULL, gUnknown_81B7E16, gUnknown_81B7F0A, @@ -346,7 +346,7 @@ static const u8 *const gUnknown_845B450[] = { gUnknown_81B9B2F }; -static const u8 *const gUnknown_845B500[] = { +static const u8 *const sHelpSystemGeneralTopicTextPtrs[] = { NULL, gUnknown_81B9BB7, gUnknown_81B9BC7, @@ -357,7 +357,7 @@ static const u8 *const gUnknown_845B500[] = { gUnknown_81B9C1D }; -static const u8 *const gUnknown_845B520[] = { +static const u8 *const sHelpSystemGeneralTopicDescriptionTextPtrs[] = { NULL, gUnknown_81B9C2F, gUnknown_81B9D04, @@ -368,7 +368,7 @@ static const u8 *const gUnknown_845B520[] = { gUnknown_81BA027 }; -static const u8 *const gUnknown_845B540[] = { +static const u8 *const sHelpSystemTypeMatchupTextPtrs[] = { NULL, gUnknown_81BA0F1, gUnknown_81BA10D, @@ -407,7 +407,7 @@ static const u8 *const gUnknown_845B540[] = { gUnknown_81BA400 }; -static const u8 *const gUnknown_845B5D0[] = { +static const u8 *const sHelpSystemTypeMatchupDescriptionTextPtrs[] = { NULL, gUnknown_81BA416, gUnknown_81BA4E6, @@ -446,7 +446,6 @@ static const u8 *const gUnknown_845B5D0[] = { gUnknown_81BB156 }; - static const u8 gUnknown_845B660[] = { 0x01, 0x02, 0x03, 0xff }; @@ -739,7 +738,7 @@ static const u8 gUnknown_845B9BE[] = { 0x09, 0x01, 0x02, 0x03, 0x23, 0x25, 0x24, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x27, 0x15, 0x26, 0x16, 0x17, 0x18, 0x1a, 0x0e, 0x1b, 0xff }; -static const u8 *const gUnknown_845B9E0[] = { +static const u8 *const sHelpSystemSubmenuIndexPointers[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gUnknown_845B660, NULL, NULL, NULL, NULL, gUnknown_845B664, NULL, @@ -780,48 +779,48 @@ static const u8 *const gUnknown_845B9E0[] = { static const u16 unref_845BCB0[] = INCBIN_U16("graphics/help_system/unk_845BCB0.bin"); -static const u8 gUnknown_845C4B0[] = { +static const u8 sHelpSystemContextTopicOrder[] = { 3, 0, 1, 2, 4, 5 }; -static const u8 gUnknown_845C4B6[][6] = { - {0, 0, 0, 0, 0, 1}, - {0, 0, 0, 1, 0, 1}, - {0, 0, 0, 1, 0, 1}, - {0, 1, 0, 1, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 0, 1, 0, 0, 1}, - {0, 0, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {0, 1, 1, 0, 0, 1}, - {1, 0, 0, 1, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 1, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 0, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {1, 1, 1, 0, 1, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 1, 0, 0, 0, 1}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0} +static const bool8 sHelpSystemContextTopicFlags[][6] = { + {FALSE, FALSE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, TRUE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, FALSE, FALSE, TRUE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, TRUE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, FALSE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {TRUE, TRUE, TRUE, FALSE, TRUE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, TRUE, FALSE, FALSE, FALSE, TRUE }, + {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE}, + {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE} }; static const u16 sMartMaps[] = { @@ -961,12 +960,12 @@ static bool8 IsInDungeonMap(void) void sub_812B35C(void) { - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) HelpSystem_SetSomeVariable2(0x16); else if (IsInDungeonMap()) HelpSystem_SetSomeVariable2(0x15); - else if (is_light_level_8_or_9(gMapHeader.mapType)) + else if (IsMapTypeIndoors(gMapHeader.mapType)) { if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_2F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_2F))) HelpSystem_SetSomeVariable2(0x0E); @@ -1015,126 +1014,126 @@ void HelpSystem_Enable(void) if (gQuestLogState != 2 && gQuestLogState != 3) { gHelpSystemEnabled = TRUE; - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); } } -void sub_812B4AC(void) +void HelpSystem_DisableToggleWithRButton(void) { - gUnknown_203F175 = 1; + gHelpSystemToggleWithRButtonDisabled = TRUE; } -void sub_812B4B8(void) +void HelpSystem_EnableToggleWithRButton(void) { - gUnknown_203F175 = 0; + gHelpSystemToggleWithRButtonDisabled = FALSE; } -static void sub_812B4C4(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void ResetHelpSystemListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - a0->sub.items = a1; - a0->sub.totalItems = 1; - a0->sub.maxShowed = 1; - a0->sub.left = 1; - a0->sub.top = 4; + helpListMenu->sub.items = listMenuItemsBuffer; + helpListMenu->sub.totalItems = 1; + helpListMenu->sub.maxShowed = 1; + helpListMenu->sub.left = 1; + helpListMenu->sub.top = 4; } -static void sub_812B4D8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildAndPrintMainTopicsListMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - sub_812B4C4(a0, a1); - sub_812B520(a0, a1); - sub_812BF74(gUnknown_841DFAC); - HelpSystem_InitListMenuController(a0, 0, gUnknown_3005E9C[2]); - sub_812BF9C(a0, a1); + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + BuildMainTopicsListAndMoveToH00(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFAC); + HelpSystem_InitListMenuController(helpListMenu, 0, sHelpSystemState[2]); + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); sub_813BDA4(1); sub_813BD5C(1); } -static void sub_812B520(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildMainTopicsListAndMoveToH00(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { u8 i; - u8 r4 = 0; + u8 totalItems = 0; for (i = 0; i < 6; i++) { - if (gUnknown_845C4B6[sSomeVariable][gUnknown_845C4B0[i]] == 1) + if (sHelpSystemContextTopicFlags[sSomeVariable][sHelpSystemContextTopicOrder[i]] == TRUE) { - a1[r4].label = gUnknown_845B080[gUnknown_845C4B0[i]]; - a1[r4].index = gUnknown_845C4B0[i]; - r4++; + listMenuItemsBuffer[totalItems].label = sHelpSystemTopicPtrs[sHelpSystemContextTopicOrder[i]]; + listMenuItemsBuffer[totalItems].index = sHelpSystemContextTopicOrder[i]; + totalItems++; } } - a1[r4 - 1].index = -2; - a0->sub.totalItems = r4; - a0->sub.maxShowed = r4; - a0->sub.left = 0; + listMenuItemsBuffer[totalItems - 1].index = -2; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = totalItems; + helpListMenu->sub.left = 0; } -static void sub_812B5A8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void BuildAndPrintSubmenuList(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813BDE8(0); sub_813BFC0(0); sub_813BE78(1); - sub_812B4C4(a0, a1); - sub_812B614(a0, a1); - sub_812BF74(gUnknown_841DFC9); - HelpSystem_InitListMenuController(a0, a0->field_0C, a0->field_0D); - HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0); + ResetHelpSystemListMenu(helpListMenu, listMenuItemsBuffer); + SetHelpSystemSubmenuItems(helpListMenu, listMenuItemsBuffer); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFC9); + HelpSystem_InitListMenuController(helpListMenu, helpListMenu->itemsAbove, helpListMenu->cursorPos); + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); sub_813BDA4(1); sub_813BD5C(1); } -static void sub_812B614(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void SetHelpSystemSubmenuItems(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - u8 r6 = 0; - const u8 * r3 = gUnknown_845B9E0[sSomeVariable * 5 + gUnknown_3005E9C[1]]; + u8 totalItems = 0; + const u8 * indexPtr = sHelpSystemSubmenuIndexPointers[sSomeVariable * 5 + sHelpSystemState[1]]; u8 i; - for (i = 0; r3[i] != 0xFF; i++) + for (i = 0; indexPtr[i] != 0xFF; i++) { - if (sub_812B780(r3[i]) == TRUE) + if (HelpSystemSubmenuIndexIsActive(indexPtr[i]) == TRUE) { - if (gUnknown_3005E9C[1] == 0) - a1[r6].label = gUnknown_845B0B0[r3[i]]; - else if (gUnknown_3005E9C[1] == 1) - a1[r6].label = gUnknown_845B218[r3[i]]; - else if (gUnknown_3005E9C[1] == 2) - a1[r6].label = gUnknown_845B3A0[r3[i]]; - else if (gUnknown_3005E9C[1] == 3) - a1[r6].label = gUnknown_845B500[r3[i]]; + if (sHelpSystemState[1] == 0) + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedQuestionTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 1) + listMenuItemsBuffer[totalItems].label = sHelpSystemMenuTopicTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 2) + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; + else if (sHelpSystemState[1] == 3) + listMenuItemsBuffer[totalItems].label = sHelpSystemGeneralTopicTextPtrs[indexPtr[i]]; else - a1[r6].label = gUnknown_845B540[r3[i]]; - a1[r6].index = r3[i]; - r6++; + listMenuItemsBuffer[totalItems].label = sHelpSystemTypeMatchupTextPtrs[indexPtr[i]]; + listMenuItemsBuffer[totalItems].index = indexPtr[i]; + totalItems++; } } - if (sub_812B754() == TRUE) + if (HelpSystem_HasDefeatedBrock() == TRUE) { - for (i = 0, r3 = gUnknown_845B9BE; r3[i] != 0xFF; i++) + for (i = 0, indexPtr = gUnknown_845B9BE; indexPtr[i] != 0xFF; i++) { - a1[r6].label = gUnknown_845B3A0[r3[i]]; - a1[r6].index = r3[i]; - r6++; + listMenuItemsBuffer[totalItems].label = sHelpSystemSpecializedStringsTextPtrs[indexPtr[i]]; + listMenuItemsBuffer[totalItems].index = indexPtr[i]; + totalItems++; } } - a1[r6].label = gUnknown_81B2E6F; - a1[r6].index = -2; - r6++; - a0->sub.totalItems = r6; - a0->sub.maxShowed = 7; - a0->sub.left = 0; - a0->sub.top = 21; + listMenuItemsBuffer[totalItems].label = gUnknown_81B2E6F; + listMenuItemsBuffer[totalItems].index = -2; + totalItems++; + helpListMenu->sub.totalItems = totalItems; + helpListMenu->sub.maxShowed = 7; + helpListMenu->sub.left = 0; + helpListMenu->sub.top = 21; } -static bool8 sub_812B754(void) +static bool8 HelpSystem_HasDefeatedBrock(void) { - if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && gUnknown_3005E9C[1] == 2) + if (FlagGet(FLAG_DEFEATED_BROCK) == TRUE && sHelpSystemState[1] == 2) return TRUE; return FALSE; } -static bool8 sub_812B780(u8 id) +static bool8 HelpSystemSubmenuIndexIsActive(u8 id) { u8 i = 0; - if (gUnknown_3005E9C[1] == 0) + if (sHelpSystemState[1] == 0) { switch (id) { @@ -1188,7 +1187,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_BADGE01_GET); case 28: case 40: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 39: return FlagGet(FLAG_GOT_FAME_CHECKER); case 44: @@ -1196,7 +1195,7 @@ static bool8 sub_812B780(u8 id) } return FALSE; } - if (gUnknown_3005E9C[1] == 1) + if (sHelpSystemState[1] == 1) { switch (id) { @@ -1254,7 +1253,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_BADGE01_GET); case 16: case 17: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 18: return FlagGet(FLAG_GOT_BICYCLE); case 48: @@ -1262,9 +1261,9 @@ static bool8 sub_812B780(u8 id) } return FALSE; } - if (gUnknown_3005E9C[1] == 2) + if (sHelpSystemState[1] == 2) { - if (sub_812B754() == TRUE) + if (HelpSystem_HasDefeatedBrock() == TRUE) { for (i = 0; gUnknown_845B9BE[i] != 0xFF; i++) { @@ -1311,7 +1310,7 @@ static bool8 sub_812B780(u8 id) return FlagGet(FLAG_SYS_POKEMON_GET); case 36: case 37: - return sub_812BB10(); + return HasGottenAtLeastOneHM(); case 3: case 15: case 18: @@ -1320,7 +1319,7 @@ static bool8 sub_812B780(u8 id) } return TRUE; } - if (gUnknown_3005E9C[1] == 3) + if (sHelpSystemState[1] == 3) { switch (id) { @@ -1331,7 +1330,7 @@ static bool8 sub_812B780(u8 id) } return TRUE; } - if (gUnknown_3005E9C[1] == 4) + if (sHelpSystemState[1] == 4) { return TRUE; } @@ -1339,7 +1338,7 @@ static bool8 sub_812B780(u8 id) return FALSE; } -static bool8 sub_812BB10(void) +static bool8 HasGottenAtLeastOneHM(void) { if (FlagGet(FLAG_GOT_HM01) == TRUE) return TRUE; @@ -1358,64 +1357,64 @@ static bool8 sub_812BB10(void) return FALSE; } -bool8 sub_812BB9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 RunHelpMenuSubroutine(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - switch (a0->field_0E) + switch (helpListMenu->state) { case 8: - return sub_812BC54(a0, a1); + return HelpSystemSubroutine_PrintWelcomeMessage(helpListMenu, listMenuItemsBuffer); case 9: - return sub_812BC80(a0, a1); + return HelpSystemSubroutine_WelcomeWaitButton(helpListMenu, listMenuItemsBuffer); case 10: - return sub_812BCA8(a0, a1); + return HelpSystemSubroutine_WelcomeEndGotoMenu(helpListMenu, listMenuItemsBuffer); case 0: - return sub_812BCD0(a0, a1); + return HelpSystemSubroutine_MenuInputHandlerMain(helpListMenu, listMenuItemsBuffer); case 1: - return sub_812BD2C(a0, a1); + return HelpMenuSubroutine_InitSubmenu(helpListMenu, listMenuItemsBuffer); case 2: - return sub_812BD64(a0, a1); + return HelpMenuSubroutine_ReturnFromSubmenu(helpListMenu, listMenuItemsBuffer); case 3: - return sub_812BD98(a0, a1); + return HelpMenuSubroutine_SubmenuInputHandler(helpListMenu, listMenuItemsBuffer); case 4: - return sub_812BE10(a0, a1); + return HelpMenuSubroutine_HelpItemPrint(helpListMenu, listMenuItemsBuffer); case 5: - return sub_812BEEC(a0, a1); + return HelpMenuSubroutine_ReturnFromHelpItem(helpListMenu, listMenuItemsBuffer); case 6: - return sub_812BF18(a0, a1); + return HelpMenuSubroutine_HelpItemWaitButton(helpListMenu, listMenuItemsBuffer); } return FALSE; } -bool8 sub_812BC54(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_PrintWelcomeMessage(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - sub_812BF74(gUnknown_841DFA5); - sub_812BF5C(); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFA5); + PrintWelcomeMessageOnPanel1(); sub_813BDA4(1); sub_813BD5C(1); - a0->field_0E = 9; + helpListMenu->state = 9; return TRUE; } -bool8 sub_812BC80(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_WelcomeWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - a0->field_0E = 10; + helpListMenu->state = 10; } return TRUE; } -bool8 sub_812BCA8(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_WelcomeEndGotoMenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[2] = 0; - sub_812BF94(a0); - sub_812B4D8(a0, a1); - a0->field_0E = 0; + sHelpSystemState[2] = 0; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; return TRUE; } -bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpSystemSubroutine_MenuInputHandlerMain(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) @@ -1425,42 +1424,42 @@ bool8 sub_812BCD0(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) return FALSE; case -5: case -4: - sub_812BF9C(a0, a1); + PrintHelpSystemTopicMouseoverDescription(helpListMenu, listMenuItemsBuffer); break; case -3: case -1: break; default: - gUnknown_3005E9C[1] = v0; - a0->field_0E = 1; + sHelpSystemState[1] = v0; + helpListMenu->state = 1; break; } return TRUE; } -bool8 sub_812BD2C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_InitSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 1; - gUnknown_3005E9C[2] = a0->field_0D; - sub_812BF94(a0); - sub_812B5A8(a0, a1); + sHelpSystemState[0] = 1; + sHelpSystemState[2] = helpListMenu->cursorPos; + ResetHelpSystemCursor(helpListMenu); + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); - a0->field_0E = 3; + helpListMenu->state = 3; return TRUE; } -bool8 sub_812BD64(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_ReturnFromSubmenu(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { sub_813C004(0, 0); sub_813C004(1, 0); - gUnknown_3005E9C[0] = 0; - sub_812B4D8(a0, a1); - a0->field_0E = 0; + sHelpSystemState[0] = 0; + BuildAndPrintMainTopicsListMenu(helpListMenu, listMenuItemsBuffer); + helpListMenu->state = 0; return TRUE; } -bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_SubmenuInputHandler(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { s32 v0 = HelpSystem_GetMenuInput(); switch (v0) @@ -1468,7 +1467,7 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) case -6: return FALSE; case -2: - a0->field_0E = 2; + helpListMenu->state = 2; break; case -5: case -4: @@ -1476,8 +1475,8 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) case -1: break; default: - gUnknown_3005E9C[3] = v0; - a0->field_0E = 4; + sHelpSystemState[3] = v0; + helpListMenu->state = 4; break; } return TRUE; @@ -1485,60 +1484,60 @@ bool8 sub_812BD98(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) void sub_812BDEC(void) { - HelpSystem_PrintTextAt(gUnknown_845B080[gUnknown_3005E9C[1]], 0, 0); + HelpSystem_PrintTextAt(sHelpSystemTopicPtrs[sHelpSystemState[1]], 0, 0); } -bool8 sub_812BE10(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_HelpItemPrint(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 2; + sHelpSystemState[0] = 2; sub_813BDA4(0); HelpSystem_FillPanel1(); - sub_812BF74(gUnknown_841DFBE); + PrintTextOnPanel2Row52RightAlign(gUnknown_841DFBE); sub_813BDE8(1); sub_813BEE4(1); - if (gUnknown_3005E9C[1] == 0) + if (sHelpSystemState[1] == 0) { - HelpSystem_PrintTwoStrings(gUnknown_845B0B0[gUnknown_3005E9C[3]], gUnknown_845B164[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemSpecializedQuestionTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedAnswerTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 1) + else if (sHelpSystemState[1] == 1) { - HelpSystem_PrintTwoStrings(gUnknown_845B218[gUnknown_3005E9C[3]], gUnknown_845B2DC[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemMenuTopicTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedControlsTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 2) + else if (sHelpSystemState[1] == 2) { - HelpSystem_PrintTwoStrings(gUnknown_845B3A0[gUnknown_3005E9C[3]], gUnknown_845B450[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemSpecializedStringsTextPtrs[sHelpSystemState[3]], sHelpSystemSpecializedStringDefinitionsTextPtrs[sHelpSystemState[3]]); } - else if (gUnknown_3005E9C[1] == 3) + else if (sHelpSystemState[1] == 3) { - HelpSystem_PrintTwoStrings(gUnknown_845B500[gUnknown_3005E9C[3]], gUnknown_845B520[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemGeneralTopicTextPtrs[sHelpSystemState[3]], sHelpSystemGeneralTopicDescriptionTextPtrs[sHelpSystemState[3]]); } else { - HelpSystem_PrintTwoStrings(gUnknown_845B540[gUnknown_3005E9C[3]], gUnknown_845B5D0[gUnknown_3005E9C[3]]); + HelpSystem_PrintTwoStrings(sHelpSystemTypeMatchupTextPtrs[sHelpSystemState[3]], sHelpSystemTypeMatchupDescriptionTextPtrs[sHelpSystemState[3]]); } sub_813BDA4(1); sub_813BD5C(1); - a0->field_0E = 6; + helpListMenu->state = 6; return TRUE; } -bool8 sub_812BEEC(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_ReturnFromHelpItem(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - gUnknown_3005E9C[0] = 1; - sub_812B5A8(a0, a1); + sHelpSystemState[0] = 1; + BuildAndPrintSubmenuList(helpListMenu, listMenuItemsBuffer); sub_813C75C(); HelpSystem_SetInputDelay(2); - a0->field_0E = 3; + helpListMenu->state = 3; return TRUE; } -bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +bool8 HelpMenuSubroutine_HelpItemWaitButton(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - a0->field_0E = 5; + helpListMenu->state = 5; return TRUE; } if (JOY_NEW(L_BUTTON | R_BUTTON)) @@ -1546,13 +1545,13 @@ bool8 sub_812BF18(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) return TRUE; } -static void sub_812BF5C(void) +static void PrintWelcomeMessageOnPanel1(void) { HelpSystem_FillPanel1(); HelpSystem_PrintTextAt(gUnknown_81B2FC9, 0, 0); } -static void sub_812BF74(const u8 * str) +static void PrintTextOnPanel2Row52RightAlign(const u8 * str) { HelpSystem_FillPanel2(); HelpSystem_PrintTextRightAlign_Row52(str); @@ -1560,21 +1559,21 @@ static void sub_812BF74(const u8 * str) u8 sub_812BF88(void) { - return gUnknown_3005E9C[0]; + return sHelpSystemState[0]; } -static void sub_812BF94(struct HelpSystemListMenu * a0) +static void ResetHelpSystemCursor(struct HelpSystemListMenu * helpListMenu) { - a0->field_0C = 0; - a0->field_0D = 0; + helpListMenu->itemsAbove = 0; + helpListMenu->cursorPos = 0; } -static void sub_812BF9C(struct HelpSystemListMenu * a0, struct ListMenuItem * a1) +static void PrintHelpSystemTopicMouseoverDescription(struct HelpSystemListMenu * helpListMenu, struct ListMenuItem * listMenuItemsBuffer) { - s32 index = a1[a0->field_0C + a0->field_0D].index; + s32 index = listMenuItemsBuffer[helpListMenu->itemsAbove + helpListMenu->cursorPos].index; if (index == -2) - HelpSystem_PrintText_813C584(gUnknown_845B098[5]); + HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[5]); else - HelpSystem_PrintText_813C584(gUnknown_845B098[index]); + HelpSystem_PrintText_813C584(sHelpSystemTopicMouseoverDescriptionPtrs[index]); sub_813BE30(1); } diff --git a/src/librfu_intr.c b/src/librfu_intr.c new file mode 100644 index 000000000..23962a937 --- /dev/null +++ b/src/librfu_intr.c @@ -0,0 +1,402 @@ +#include "global.h" +#include "librfu.h" + +static void sio32intr_clock_master(void); +static void sio32intr_clock_slave(void); +static u16 handshake_wait(u16 slot); +static void STWI_set_timer_in_RAM(u8 count); +static void STWI_stop_timer_in_RAM(void); +static void STWI_init_slave(void); +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()); +static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)); +static void Callback_Dummy_ID(void (*callbackId)(void)); + +void IntrSIO32(void) +{ + if (gSTWIStatus->state == 10) + { + if (gSTWIStatus->callbackID != NULL) + Callback_Dummy_ID(gSTWIStatus->callbackID); + } + else + { + if (gSTWIStatus->msMode == AGB_CLK_MASTER) + sio32intr_clock_master(); + else + sio32intr_clock_slave(); + } +} + +static void sio32intr_clock_master(void) +{ + u32 regSIODATA32; + u32 ackLen; + + STWI_set_timer_in_RAM(80); + regSIODATA32 = REG_SIODATA32; + + if (gSTWIStatus->state == 0) // master send req + { + if (regSIODATA32 == 0x80000000) + { + if (gSTWIStatus->reqNext <= gSTWIStatus->reqLength) + { + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket->rfuPacket8.data)[gSTWIStatus->reqNext]; + gSTWIStatus->reqNext++; + } + else + { + gSTWIStatus->state = 1; // master wait ack + REG_SIODATA32 = 0x80000000; + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(130); + return; + } + } + else if (gSTWIStatus->state == 1) // master wait ack + { + if ((regSIODATA32 & 0xFFFF0000) == 0x99660000) + { + gSTWIStatus->ackNext = 0; + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; + gSTWIStatus->ackNext++; + gSTWIStatus->ackActiveCommand = regSIODATA32; + gSTWIStatus->ackLength = ackLen = regSIODATA32 >> 8; + if ((ackLen = gSTWIStatus->ackLength) >= gSTWIStatus->ackNext) + { + gSTWIStatus->state = 2; // master receive ack + REG_SIODATA32 = 0x80000000; + } + else + { + gSTWIStatus->state = 3; // master done ack + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(130); + return; + } + } + else if (gSTWIStatus->state == 2) // master receive ack + { + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->ackNext] = regSIODATA32; + gSTWIStatus->ackNext++; + if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) + gSTWIStatus->state = 3; // master done ack + else + REG_SIODATA32 = 0x80000000; + } + + if (handshake_wait(1) == 1) + return; + + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_MULTI_SD; + + if (handshake_wait(0) == 1) + return; + + STWI_stop_timer_in_RAM(); + + if (gSTWIStatus->state == 3) // master done ack + { + if ( + gSTWIStatus->ackActiveCommand == (0x80 | ID_MS_CHANGE_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_DATA_TX_AND_CHANGE_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_UNK35_REQ) + || gSTWIStatus->ackActiveCommand == (0x80 | ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) + ) + { + + gSTWIStatus->msMode = AGB_CLK_SLAVE; + REG_SIODATA32 = 0x80000000; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; + gSTWIStatus->state = 5; // slave receive req init + } + else + { + if (gSTWIStatus->ackActiveCommand == 0xEE) + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->state = 4; // error + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + else + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->state = 4; // error + } + } + gSTWIStatus->sending = 0; + if (gSTWIStatus->callbackM != NULL) + Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM); + } + else + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS | SIO_ENABLE; + } +} + +static void sio32intr_clock_slave(void) +{ + u32 regSIODATA32; + u32 r0; + register u32 reqLen asm("r2"); + + gSTWIStatus->timerActive = 0; + STWI_set_timer_in_RAM(100); + if (handshake_wait(0) == 1) + return; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_MULTI_SD; + regSIODATA32 = REG_SIODATA32; + if (gSTWIStatus->state == 5) // slave receive req init + { + ((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32; + gSTWIStatus->reqNext = 1; + r0 = 0x99660000; + if ((regSIODATA32 >> 16) == (r0 >> 16)) + { + gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8; + gSTWIStatus->reqActiveCommand = regSIODATA32; + if (gSTWIStatus->reqLength == 0) + { + if ( + gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ + ) + { + gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; + ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 + gSTWIStatus->ackActiveCommand; + gSTWIStatus->ackLength = 0; + } + else + { + ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE; + if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) + { + ((u32*)gSTWIStatus->txPacket)[1] = 1; + } + else + { + ((u32*)gSTWIStatus->txPacket)[1] = 2; + } + gSTWIStatus->ackLength = 1; + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0]; + gSTWIStatus->ackNext = 1; + gSTWIStatus->state = 7; // slave send ack + } + else + { + REG_SIODATA32 = 0x80000000; + gSTWIStatus->reqNext = 1; + gSTWIStatus->state = 6; // slave receive req + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(100); + return; + } + } + else if (gSTWIStatus->state == 6) // slave receive req + { + ((u32*)gSTWIStatus->rxPacket)[gSTWIStatus->reqNext] = regSIODATA32; + gSTWIStatus->reqNext++; + if (gSTWIStatus->reqLength < gSTWIStatus->reqNext) + { + if ( + gSTWIStatus->reqActiveCommand == ID_DATA_READY_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DISCONNECTED_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_UNK36_REQ + ) + { + gSTWIStatus->ackActiveCommand = gSTWIStatus->reqActiveCommand + 0x80; + ((u32*)gSTWIStatus->txPacket)[0] = 0x99660000 | gSTWIStatus->ackActiveCommand; + gSTWIStatus->ackLength = 0; + } + else + { + ((u32*)gSTWIStatus->txPacket)[0] = 0x996601EE; + if (gSTWIStatus->reqActiveCommand >= 0x10 && gSTWIStatus->reqActiveCommand <= 0x3D) + { + ((u32*)gSTWIStatus->txPacket)[1] = 1; + } + else + { + ((u32*)gSTWIStatus->txPacket)[1] = 2; + } + gSTWIStatus->ackLength = 1; + gSTWIStatus->error = ERR_REQ_CMD_ACK_REJECTION; + } + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[0]; + gSTWIStatus->ackNext = 1; + gSTWIStatus->state = 7; // slave send ack + } + else + { + REG_SIODATA32 = 0x80000000; + } + } + else if (gSTWIStatus->state == 7) // slave send ack + { + if (regSIODATA32 == 0x80000000) + { + if (gSTWIStatus->ackLength < gSTWIStatus->ackNext) + { + gSTWIStatus->state = 8; // slave done ack + } + else + { + REG_SIODATA32 = ((u32*)gSTWIStatus->txPacket)[gSTWIStatus->ackNext]; + gSTWIStatus->ackNext++; + } + } + else + { + STWI_stop_timer_in_RAM(); + STWI_set_timer_in_RAM(100); + return; + } + } + if (handshake_wait(1) == 1) + return; + if (gSTWIStatus->state == 8) // slave done ack + { + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + STWI_stop_timer_in_RAM(); + if (gSTWIStatus->error == ERR_REQ_CMD_ACK_REJECTION) + { + STWI_init_slave(); + if (gSTWIStatus->callbackS != NULL) + { + Callback_Dummy_S(0x1EE, gSTWIStatus->callbackS); + } + } + else + { + REG_SIODATA32 = 0; + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + gSTWIStatus->msMode = AGB_CLK_MASTER; + gSTWIStatus->state = 0; // master send req + if (gSTWIStatus->callbackS != NULL) + { + Callback_Dummy_S((gSTWIStatus->reqLength << 8) | (gSTWIStatus->reqActiveCommand), gSTWIStatus->callbackS); + } + } + } + else + { + REG_IME = 0; + if (REG_TM0CNT_H & TIMER_ENABLE) + { + if ((REG_TM0CNT_H & 0x03) == TIMER_1CLK) + { + while (REG_TM0CNT_L > 0xFF9B); + } + else + { + while (REG_TM0CNT_L > 0xFFFE); + } + } + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; + REG_IME = 1; + } +} + +static u16 handshake_wait(u16 slot) +{ + do + { + if ((gSTWIStatus->timerActive & 0xFF) == 1) + { + gSTWIStatus->timerActive = 0; + return 1; + } + } while ((REG_SIOCNT & SIO_MULTI_SI) != (slot << SIO_MULTI_SI_SHIFT)); + return 0; +} + +static void STWI_set_timer_in_RAM(u8 count) +{ + vu16* regTMCNTL = (vu16*)(REG_ADDR_TMCNT_L + gSTWIStatus->timerSelect * 4); + vu16* regTMCNTH = (vu16*)(REG_ADDR_TMCNT_H + gSTWIStatus->timerSelect * 4); + REG_IME = 0; + switch (count) + { + case 50: + *regTMCNTL = 0xFCCB; + gSTWIStatus->timerState = 1; + break; + case 80: + *regTMCNTL = 0xFAE0; + gSTWIStatus->timerState = 2; + break; + case 100: + *regTMCNTL = 0xF996; + gSTWIStatus->timerState = 3; + break; + case 130: + *regTMCNTL = 0xF7AD; + gSTWIStatus->timerState = 4; + break; + } + *regTMCNTH = TIMER_ENABLE | TIMER_64CLK | TIMER_256CLK | TIMER_INTR_ENABLE; + REG_IF = INTR_FLAG_TIMER0 << gSTWIStatus->timerSelect; + REG_IME = 1; +} + +static void STWI_stop_timer_in_RAM(void) +{ + gSTWIStatus->timerState = 0; + REG_TMCNT_L(gSTWIStatus->timerSelect) = 0; + REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; +} + +static void STWI_init_slave(void) +{ + gSTWIStatus->state = 5; // slave receive req init + gSTWIStatus->msMode = AGB_CLK_SLAVE; + gSTWIStatus->reqLength = 0; + gSTWIStatus->reqNext = 0; + gSTWIStatus->reqActiveCommand = 0; + gSTWIStatus->ackLength = 0; + gSTWIStatus->ackNext = 0; + gSTWIStatus->ackActiveCommand = 0; + gSTWIStatus->timerState = 0; + gSTWIStatus->timerActive = 0; + gSTWIStatus->error = 0; + gSTWIStatus->recoveryCount = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_57600_BPS | SIO_ENABLE; +} + +NAKED +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()) +{ + asm("bx r2"); +} + +NAKED +static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)) +{ + asm("bx r1"); +} + +NAKED +static void Callback_Dummy_ID(void (*callbackId)(void)) +{ + asm("bx r0"); +} diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index dccd342f2..85f3ef3a9 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -2,54 +2,54 @@ struct LLSFStruct { - u8 unk00; + u8 frameSize; u8 unk01; u8 unk02; - u8 unk03; - u8 unk04; - u8 unk05; - u8 unk06; + u8 slotStateShift; + u8 ackShift; + u8 phaseShit; + u8 nShift; u8 unk07; u8 unk08; - u8 unk09; - u8 unk0A; - u8 unk0B; - u8 unk0C; + u8 slotStateMask; + u8 ackMask; + u8 phaseMask; + u8 nMask; u16 unk0E; }; struct RfuLocalStruct { - u8 unk00; - u8 unk01; - u8 unk02; - u8 unk03; - u8 unk04; - u8 unk05; - u16 unk06; + u8 unk0; + u8 unk1; + u8 slotState; + u8 ack; + u8 phase; + u8 n; + u16 unk6; }; -static void rfu_CB_defaultCallback(u8, u16); -static void rfu_CB_reset(u8, u16); -static void rfu_CB_configGameData(u8, u16); -static void rfu_CB_stopMode(u8, u16); -static void rfu_CB_startSearchChild(u8, u16); -static void rfu_CB_pollAndEndSearchChild(u8, u16); -static void rfu_CB_startSearchParent(u8, u16); -static void rfu_CB_pollSearchParent(u8, u16); -static void rfu_CB_pollConnectParent(u8, u16); -static void rfu_CB_pollConnectParent(u8, u16); -static void rfu_CB_disconnect(u8, u16); -static void rfu_CB_CHILD_pollConnectRecovery(u8, u16); -static void rfu_CB_sendData(UNUSED u8, u16); -static void rfu_CB_sendData2(UNUSED u8, u16); -static void rfu_CB_sendData3(u8, u16); -static void rfu_CB_recvData(u8, u16); -static void rfu_enableREQCallback(bool8); +static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult); +static void rfu_CB_reset(u8 reqCommand, u16 reqResult); +static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult); +static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult); +static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult); +static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult); +static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult); +static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult); +static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult); +static void rfu_CB_recvData(u8 reqCommand, u16 reqResult); +static void rfu_enableREQCallback(bool8 enable); static void rfu_STC_clearAPIVariables(void); static void rfu_STC_readChildList(void); static void rfu_STC_readParentCandidateList(void); -static void rfu_STC_REQ_callback(u8, u16); +static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult); static void rfu_STC_removeLinkData(u8, u8); static void rfu_STC_fastCopy(const u8 **, u8 **, s32); static void rfu_STC_clearLinkStatus(u8); @@ -74,13 +74,38 @@ struct RfuStatic *gRfuStatic; struct RfuFixed *gRfuFixed; static const struct LLSFStruct llsf_struct[2] = { - { - 2, 14, 0, 10, 9, 5, 7, 2, - 0, 15, 1, 3, 3, 0x1f - }, { - 3, 22, 18, 14, 13, 9, 11, 3, - 15, 15, 1, 3, 3, 0x7f - } + [MODE_CHILD] = { + .frameSize = 2, + .unk01 = 14, + .unk02 = 0, + .slotStateShift = 10, + .ackShift = 9, + .phaseShit = 5, + .nShift = 7, + .unk07 = 2, + .unk08 = 0, + .slotStateMask = 15, + .ackMask = 1, + .phaseMask = 3, + .nMask = 3, + .unk0E = 0x1f + }, + [MODE_PARENT] = { + .frameSize = 3, + .unk01 = 22, + .unk02 = 18, + .slotStateShift = 14, + .ackShift = 13, + .phaseShit = 9, + .nShift = 11, + .unk07 = 3, + .unk08 = 15, + .slotStateMask = 15, + .ackMask = 1, + .phaseMask = 3, + .nMask = 3, + .unk0E = 0x7f + } }; #ifdef EMERALD @@ -91,46 +116,46 @@ static const char lib_ver[] = "RFU_V1024"; static const char str_checkMbootLL[] = "RFU-MBOOT"; -u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) +u16 rfu_initializeAPI(u32 *APIBuffer, u16 buffByteSize, IntrFunc *sioIntrTable_p, bool8 copyInterruptToRam) { u16 i; u16 *dst; const u16 *src; - u16 r3; + u16 buffByteSizeMax; - // is in EWRAM? - if (((u32)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) + // is in EWRAM? + if (((uintptr_t)APIBuffer & 0xF000000) == 0x2000000 && copyInterruptToRam) return ERR_RFU_API_BUFF_ADR; - // is not 4-byte aligned? + // is not 4-byte aligned? if ((u32)APIBuffer & 3) return ERR_RFU_API_BUFF_ADR; if (copyInterruptToRam) { // An assert/debug print may have existed before, ie // printf("%s %u < %u", "somefile.c:12345", buffByteSize, num) - // to push this into r3? - r3 = sizeof(struct RfuAPIBuffer); - if (buffByteSize < r3) + // to push this into buffByteSizeMax? + buffByteSizeMax = RFU_API_BUFF_SIZE_RAM; + if (buffByteSize < buffByteSizeMax) return ERR_RFU_API_BUFF_SIZE; } if (!copyInterruptToRam) { - r3 = 0x504; // same issue as above - if (buffByteSize < r3) + buffByteSizeMax = RFU_API_BUFF_SIZE_ROM; // same issue as above + if (buffByteSize < buffByteSizeMax) return ERR_RFU_API_BUFF_SIZE; } - gRfuLinkStatus = &APIBuffer->linkStatus; - gRfuStatic = &APIBuffer->static_; - gRfuFixed = &APIBuffer->fixed; - gRfuSlotStatusNI[0] = &APIBuffer->NI[0]; - gRfuSlotStatusUNI[0] = &APIBuffer->UNI[0]; + gRfuLinkStatus = (void *)APIBuffer + 0; + gRfuStatic = (void *)APIBuffer + 0xb4; + gRfuFixed = (void *)APIBuffer + 0xdc; + gRfuSlotStatusNI[0] = (void *)APIBuffer + 0x1bc; + gRfuSlotStatusUNI[0] = (void *)APIBuffer + 0x37c; for (i = 1; i < RFU_CHILD_MAX; ++i) { gRfuSlotStatusNI[i] = &gRfuSlotStatusNI[i - 1][1]; gRfuSlotStatusUNI[i] = &gRfuSlotStatusUNI[i - 1][1]; } - // TODO: Is it possible to fix the following 2 statements? - // It's equivalent to: + // TODO: Is it possible to fix the following 2 statements? + // It's equivalent to: // gRfuFixed->STWIBuffer = &APIBuffer->intr; // STWI_init_all(&APIBuffer->intr, sioIntrTable_p, copyInterruptToRam); gRfuFixed->STWIBuffer = (struct RfuIntrStruct *)&gRfuSlotStatusUNI[3][1]; @@ -143,10 +168,10 @@ u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc gRfuSlotStatusUNI[i]->recvBuffer = NULL; gRfuSlotStatusUNI[i]->recvBufferSize = 0; } - src = (const u16 *)((u32)&rfu_STC_fastCopy & ~1); + src = (const u16 *)((uintptr_t)&rfu_STC_fastCopy & ~1); dst = gRfuFixed->fastCopyBuffer; // rfu_REQ_changeMasterSlave is the function next to rfu_STC_fastCopy - for (r3 = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --r3; r3 != 0xFFFF; --r3) + for (buffByteSizeMax = ((void *)rfu_REQ_changeMasterSlave - (void *)rfu_STC_fastCopy) / sizeof(u16), --buffByteSizeMax; buffByteSizeMax != 0xFFFF; --buffByteSizeMax) *dst++ = *src++; gRfuFixed->fastCopyPtr = (void *)gRfuFixed->fastCopyBuffer + 1; return 0; @@ -155,19 +180,19 @@ u16 rfu_initializeAPI(struct RfuAPIBuffer *APIBuffer, u16 buffByteSize, IntrFunc static void rfu_STC_clearAPIVariables(void) { u16 IMEBackup = REG_IME; - u8 i, r4; + u8 i, flags; REG_IME = 0; - r4 = gRfuStatic->flags; + flags = gRfuStatic->flags; CpuFill16(0, gRfuStatic, sizeof(struct RfuStatic)); - gRfuStatic->flags = r4 & 8; + gRfuStatic->flags = flags & 8; CpuFill16(0, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); gRfuLinkStatus->watchInterval = 4; gRfuStatic->nowWatchInterval = 0; gRfuLinkStatus->parentChild = MODE_NEUTRAL; rfu_clearAllSlot(); gRfuStatic->SCStartFlag = 0; - for (i = 0; i < NELEMS(gRfuStatic->cidBak); ++i) + for (i = 0; i < RFU_CHILD_MAX; ++i) gRfuStatic->cidBak[i] = 0; REG_IME = IMEBackup; } @@ -180,20 +205,20 @@ void rfu_REQ_PARENT_resumeRetransmitAndChange(void) u16 rfu_UNI_PARENT_getDRAC_ACK(u8 *ackFlag) { - struct RfuIntrStruct *buf; + u8 *buf; *ackFlag = 0; if (gRfuLinkStatus->parentChild != MODE_PARENT) return ERR_MODE_NOT_PARENT; buf = rfu_getSTWIRecvBuffer(); - switch (buf->rxPacketAlloc.rfuPacket8.data[0]) + switch (*buf) { case 40: case 54: - if (buf->rxPacketAlloc.rfuPacket8.data[1] == 0) + if (buf[1] == 0) *ackFlag = gRfuLinkStatus->connSlotFlag; else - *ackFlag = buf->rxPacketAlloc.rfuPacket8.data[4]; + *ackFlag = buf[4]; return 0; default: return ERR_REQ_CMD_ID; @@ -205,9 +230,9 @@ void rfu_setTimerInterrupt(u8 timerNo, IntrFunc *timerIntrTable_p) STWI_init_timer(timerIntrTable_p, timerNo); } -struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void) +u8 *rfu_getSTWIRecvBuffer(void) { - return gRfuFixed->STWIBuffer; + return (u8 *)gRfuFixed->STWIBuffer; } void rfu_setMSCCallback(void (*callback)(u16 reqCommandId)) @@ -229,26 +254,26 @@ static void rfu_enableREQCallback(bool8 enable) gRfuStatic->flags &= 0xF7; } -static void rfu_STC_REQ_callback(u8 r5, u16 reqResult) +static void rfu_STC_REQ_callback(u8 reqCommand, u16 reqResult) { STWI_set_Callback_M(rfu_CB_defaultCallback); gRfuStatic->reqResult = reqResult; if (gRfuStatic->flags & 8) - gRfuFixed->reqCallback(r5, reqResult); + gRfuFixed->reqCallback(reqCommand, reqResult); } -static void rfu_CB_defaultCallback(u8 r0, u16 reqResult) +static void rfu_CB_defaultCallback(u8 reqCommand, u16 reqResult) { - s32 r5; + s32 bmSlotFlags; u8 i; - if (r0 == 0xFF) + if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { if (gRfuStatic->flags & 8) - gRfuFixed->reqCallback(r0, reqResult); - r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + gRfuFixed->reqCallback(reqCommand, reqResult); + bmSlotFlags = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; for (i = 0; i < RFU_CHILD_MAX; ++i) - if ((r5 >> i) & 1) + if ((bmSlotFlags >> i) & 1) rfu_STC_removeLinkData(i, 1); gRfuLinkStatus->parentChild = MODE_NEUTRAL; } @@ -277,25 +302,39 @@ u16 rfu_getRFUStatus(u8 *rfuState) return 0; } +/* + * RFU Multiboot images are loaded into IWRAM + * struct RfuMbootLL + * { + * struct RfuLinkStatus status; + * u8 filler_B4[0x3C]; + * char name[10]; + * u16 checksum; + * } + * Returns 1 if the packet to inherit is malformed. + */ u16 rfu_MBOOT_CHILD_inheritanceLinkStatus(void) { const char *s1 = str_checkMbootLL; char *s2 = (char *)0x30000F0; u16 checksum; - u16 *r2; + u16 *mb_buff_iwram_p; u8 i; + // if (strcmp(s1, s2) != 0) return 1; while (*s1 != '\0') if (*s1++ != *s2++) return 1; - r2 = (u16 *)0x3000000; + mb_buff_iwram_p = (u16 *)0x3000000; + + // The size of struct RfuLinkStatus is 180 checksum = 0; - for (i = 0; i < 90; ++i) - checksum += *r2++; + for (i = 0; i < 180/2; ++i) + checksum += *mb_buff_iwram_p++; if (checksum != *(u16 *)0x30000FA) return 1; CpuCopy16((u16 *)0x3000000, gRfuLinkStatus, sizeof(struct RfuLinkStatus)); - gRfuStatic->flags |= 0x80; + gRfuStatic->flags |= 0x80; // mboot return 0; } @@ -305,14 +344,14 @@ void rfu_REQ_stopMode(void) if (REG_IME == 0) { - rfu_STC_REQ_callback(61, 6); + rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 6); gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; } else { AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); - if (AgbRFU_checkID(8) == 0x8001) + if (AgbRFU_checkID(8) == RFU_ID) { timerReg = ®_TMCNT(gSTWIStatus->timerSelect); *timerReg = 0; @@ -326,29 +365,29 @@ void rfu_REQ_stopMode(void) else { REG_SIOCNT = SIO_MULTI_MODE; - rfu_STC_REQ_callback(61, 0); + rfu_STC_REQ_callback(ID_STOP_MODE_REQ, 0); } } } -static void rfu_CB_stopMode(u8 a1, u16 reqResult) +static void rfu_CB_stopMode(u8 reqCommand, u16 reqResult) { if (reqResult == 0) REG_SIOCNT = SIO_MULTI_MODE; - rfu_STC_REQ_callback(a1, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } u32 rfu_REQBN_softReset_and_checkID(void) { - u32 r2; + u32 id; if (REG_IME == 0) return ERR_ID_CHECK_IME_DISABLE; AgbRFU_SoftReset(); rfu_STC_clearAPIVariables(); - if ((r2 = AgbRFU_checkID(30)) == 0) + if ((id = AgbRFU_checkID(30)) == 0) REG_SIOCNT = SIO_MULTI_MODE; - return r2; + return id; } void rfu_REQ_reset(void) @@ -357,11 +396,11 @@ void rfu_REQ_reset(void) STWI_send_ResetREQ(); } -static void rfu_CB_reset(u8 a1, u16 reqResult) +static void rfu_CB_reset(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_clearAPIVariables(); - rfu_STC_REQ_callback(a1, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) @@ -370,59 +409,59 @@ void rfu_REQ_configSystem(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) STWI_send_SystemConfigREQ((availSlotFlag & AVAIL_SLOT1) | 0x3C, maxMFrame, mcTimer); if (mcTimer == 0) { - gRfuStatic->unk_1a = 1; + gRfuStatic->linkEmergencyLimit = 1; } else { u16 IMEBackup = REG_IME; REG_IME = 0; - gRfuStatic->unk_1a = Div(600, mcTimer); + gRfuStatic->linkEmergencyLimit = Div(600, mcTimer); REG_IME = IMEBackup; } } void rfu_REQ_configGameData(u8 mbootFlag, u16 serialNo, const u8 *gname, const u8 *uname) { - u8 sp[16]; + u8 packet[16]; u8 i; - u8 r3; + u8 check_sum; const u8 *gnameBackup = gname; const u8 *unameBackup; - sp[0] = serialNo; - sp[1] = serialNo >> 8; + packet[0] = serialNo; + packet[1] = serialNo >> 8; if (mbootFlag != 0) - sp[1] = (serialNo >> 8) | 0x80; + packet[1] = (serialNo >> 8) | 0x80; for (i = 2; i < 15; ++i) - sp[i] = *gname++; - r3 = 0; + packet[i] = *gname++; + check_sum = 0; unameBackup = uname; for (i = 0; i < 8; ++i) { - r3 += *unameBackup++; - r3 += *gnameBackup++; + check_sum += *unameBackup++; + check_sum += *gnameBackup++; } - sp[15] = ~r3; + packet[15] = ~check_sum; if (mbootFlag != 0) - sp[14] = 0; + packet[14] = 0; STWI_set_Callback_M(rfu_CB_configGameData); - STWI_send_GameConfigREQ(sp, uname); + STWI_send_GameConfigREQ(packet, uname); } -static void rfu_CB_configGameData(u8 ip, u16 r7) +static void rfu_CB_configGameData(u8 reqCommand, u16 reqResult) { - s32 r2, r3; - u8 *r4; + s32 serialNo; + u8 *gname_uname_p; u8 i; - u8 *r1; + u8 *packet_p; - if (r7 == 0) + if (reqResult == 0) { - r1 = gSTWIStatus->txPacket->rfuPacket8.data; - r2 = gRfuLinkStatus->my.serialNo = r1[4]; - gRfuLinkStatus->my.serialNo = (r1[5] << 8) | r2; - r4 = &r1[6]; + packet_p = gSTWIStatus->txPacket->rfuPacket8.data; + serialNo = gRfuLinkStatus->my.serialNo = packet_p[4]; + gRfuLinkStatus->my.serialNo = (packet_p[5] << 8) | serialNo; + gname_uname_p = &packet_p[6]; if (gRfuLinkStatus->my.serialNo & 0x8000) { gRfuLinkStatus->my.serialNo = gRfuLinkStatus->my.serialNo ^ 0x8000; @@ -433,47 +472,47 @@ static void rfu_CB_configGameData(u8 ip, u16 r7) gRfuLinkStatus->my.mbootFlag = 0; } for (i = 0; i < RFU_GAME_NAME_LENGTH; ++i) - gRfuLinkStatus->my.gname[i] = *r4++; - ++r4; + gRfuLinkStatus->my.gname[i] = *gname_uname_p++; + ++gname_uname_p; for (i = 0; i < RFU_USER_NAME_LENGTH; ++i) - gRfuLinkStatus->my.uname[i] = *r4++; + gRfuLinkStatus->my.uname[i] = *gname_uname_p++; } - rfu_STC_REQ_callback(ip, r7); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_startSearchChild(void) { - u16 r1; - + u16 result; + STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); - r1 = STWI_poll_CommandEnd(); - if (r1 == 0) + result = STWI_poll_CommandEnd(); + if (result == 0) { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) - rfu_STC_clearLinkStatus(1); + rfu_STC_clearLinkStatus(MODE_PARENT); } else { - rfu_STC_REQ_callback(25, r1); + rfu_STC_REQ_callback(ID_SC_START_REQ, result); } STWI_set_Callback_M(rfu_CB_startSearchChild); STWI_send_SC_StartREQ(); } -static void rfu_CB_startSearchChild(u8 r3, u16 reqResult) +static void rfu_CB_startSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) gRfuStatic->SCStartFlag = 1; - rfu_STC_REQ_callback(r3, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } -static void rfu_STC_clearLinkStatus(u8 r4) +static void rfu_STC_clearLinkStatus(u8 parentChild) { u8 i; - + rfu_clearAllSlot(); - if (r4 != 0) + if (parentChild != MODE_CHILD) { CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; @@ -498,11 +537,11 @@ void rfu_REQ_endSearchChild(void) STWI_send_SC_EndREQ(); } -static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) +static void rfu_CB_pollAndEndSearchChild(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readChildList(); - if (r4 == 26) + if (reqCommand == ID_SC_POLL_REQ) { if (gRfuLinkStatus->my.id == 0) { @@ -512,60 +551,60 @@ static void rfu_CB_pollAndEndSearchChild(u8 r4, u16 reqResult) gRfuLinkStatus->my.id = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; } } - else if (r4 == 27) + else if (reqCommand == ID_SC_END_REQ) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) gRfuLinkStatus->my.id = 0; gRfuStatic->SCStartFlag = 0; } - rfu_STC_REQ_callback(r4, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_readChildList(void) { - u32 r5; - u8 r8 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; - u8 *r4; + u32 stwiParam; + u8 numSlots = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]; + u8 *data_p; u8 i; - u8 sp[4]; - u8 r2; + u8 true_slots[RFU_CHILD_MAX]; + u8 bm_slot_id; - if (r8 != 0) + if (numSlots != 0) { - r5 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_LinkStatusREQ(); if (STWI_poll_CommandEnd() == 0) { - r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; - for (i = 0; i < NELEMS(sp); ++i) - sp[i] = *r4++; + data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + for (i = 0; i < RFU_CHILD_MAX; ++i) + true_slots[i] = *data_p++; } - gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = r5; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam; } - for (r4 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; - r8 != 0; - r4 += 4) + for (data_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + numSlots != 0; + data_p += 4) { - r2 = r4[2]; - if (r2 < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> r2) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> r2) & 1)) + bm_slot_id = data_p[2]; + if (bm_slot_id < RFU_CHILD_MAX && !((gRfuLinkStatus->connSlotFlag >> bm_slot_id) & 1) && !((gRfuLinkStatus->linkLossSlotFlag >> bm_slot_id) & 1)) { - if (sp[r2] != 0) - ++gRfuStatic->lsFixedCount[r2]; - if (gRfuStatic->lsFixedCount[r2] >= 4) + if (true_slots[bm_slot_id] != 0) + ++gRfuStatic->lsFixedCount[bm_slot_id]; + if (gRfuStatic->lsFixedCount[bm_slot_id] >= 4) { - gRfuStatic->lsFixedCount[r2] = 0; - gRfuLinkStatus->strength[r2] = 0xFF; - gRfuLinkStatus->connSlotFlag |= 1 << r2; + gRfuStatic->lsFixedCount[bm_slot_id] = 0; + gRfuLinkStatus->strength[bm_slot_id] = 255; + gRfuLinkStatus->connSlotFlag |= 1 << bm_slot_id; ++gRfuLinkStatus->connCount; - gRfuLinkStatus->partner[r2].id = *(u16 *)r4; - gRfuLinkStatus->partner[r2].slot = r2; + gRfuLinkStatus->partner[bm_slot_id].id = *(u16 *)data_p; + gRfuLinkStatus->partner[bm_slot_id].slot = bm_slot_id; gRfuLinkStatus->parentChild = MODE_PARENT; gRfuStatic->flags &= 0x7F; - gRfuStatic->cidBak[r2] = gRfuLinkStatus->partner[r2].id; + gRfuStatic->cidBak[bm_slot_id] = gRfuLinkStatus->partner[bm_slot_id].id; } } - --r8; + --numSlots; } } @@ -575,11 +614,11 @@ void rfu_REQ_startSearchParent(void) STWI_send_SP_StartREQ(); } -static void rfu_CB_startSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_startSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) - rfu_STC_clearLinkStatus(0); - rfu_STC_REQ_callback(r5, reqResult); + rfu_STC_clearLinkStatus(MODE_CHILD); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_pollSearchParent(void) @@ -588,11 +627,11 @@ void rfu_REQ_pollSearchParent(void) STWI_send_SP_PollingREQ(); } -static void rfu_CB_pollSearchParent(u8 r5, u16 reqResult) +static void rfu_CB_pollSearchParent(u8 reqCommand, u16 reqResult) { if (reqResult == 0) rfu_STC_readParentCandidateList(); - rfu_STC_REQ_callback(r5, reqResult); + rfu_STC_REQ_callback(reqCommand, reqResult); } void rfu_REQ_endSearchParent(void) @@ -603,47 +642,47 @@ void rfu_REQ_endSearchParent(void) static void rfu_STC_readParentCandidateList(void) { - u8 r7, r6, r5, r4, r3; - u8 *r1, *r2; - struct RfuTgtData *r4_; + u8 numSlots, i, check_sum, my_check_sum, j; + u8 *uname_p, *packet_p; + struct RfuTgtData *target; CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); - r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; - r7 = r2[1]; - r2 += 4; + packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0]; + numSlots = packet_p[1]; + packet_p += 4; gRfuLinkStatus->findParentCount = 0; - for (r6 = 0; r6 < 4 && r7 != 0; ++r6) - { - r7 -= 7; - r1 = r2 + 6; - r2 += 19; - r5 = ~*r2; - ++r2; - r4 = 0; - for (r3 = 0; r3 < 8; ++r3) + for (i = 0; i < RFU_CHILD_MAX && numSlots != 0; ++i) + { + numSlots -= 7; + uname_p = packet_p + 6; + packet_p += 19; + check_sum = ~*packet_p; + ++packet_p; + my_check_sum = 0; + for (j = 0; j < 8; ++j) { - r4 += *r2++; - r4 += *r1++; + my_check_sum += *packet_p++; + my_check_sum += *uname_p++; } - if (r4 == r5) + if (my_check_sum == check_sum) { - r2 -= 28; - r4_ = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; - r4_->id = *(u16 *)r2; - r2 += 2; - r4_->slot = *r2; - r2 += 2; - r4_->serialNo = *(u16 *)r2 & 0x7FFF; - if (*(u16 *)r2 & 0x8000) - r4_->mbootFlag = 1; + packet_p -= 28; + target = &gRfuLinkStatus->partner[gRfuLinkStatus->findParentCount]; + target->id = *(u16 *)packet_p; + packet_p += 2; + target->slot = *packet_p; + packet_p += 2; + target->serialNo = *(u16 *)packet_p & 0x7FFF; + if (*(u16 *)packet_p & 0x8000) + target->mbootFlag = 1; else - r4_->mbootFlag = 0; - r2 += 2; - for (r3 = 0; r3 < RFU_GAME_NAME_LENGTH; ++r3) - r4_->gname[r3] = *r2++; - ++r2; - for (r3 = 0; r3 < RFU_USER_NAME_LENGTH; ++r3) - r4_->uname[r3] = *r2++; + target->mbootFlag = 0; + packet_p += 2; + for (j = 0; j < RFU_GAME_NAME_LENGTH; ++j) + target->gname[j] = *packet_p++; + ++packet_p; + for (j = 0; j < RFU_USER_NAME_LENGTH; ++j) + target->uname[j] = *packet_p++; ++gRfuLinkStatus->findParentCount; } } @@ -651,13 +690,13 @@ static void rfu_STC_readParentCandidateList(void) void rfu_REQ_startConnectParent(u16 pid) { - u16 r3 = 0; + u16 result = 0; u8 i; for (i = 0; i < RFU_CHILD_MAX && gRfuLinkStatus->partner[i].id != pid; ++i) ; - if (i == 4) - r3 = 256; - if (r3 == 0) + if (i == RFU_CHILD_MAX) + result = ERR_PID_NOT_FOUND; + if (result == 0) { gRfuStatic->tryPid = pid; STWI_set_Callback_M(rfu_STC_REQ_callback); @@ -665,7 +704,7 @@ void rfu_REQ_startConnectParent(u16 pid) } else { - rfu_STC_REQ_callback(31, r3); + rfu_STC_REQ_callback(ID_CP_START_REQ, result); } } @@ -675,70 +714,69 @@ void rfu_REQ_pollConnectParent(void) STWI_send_CP_PollingREQ(); } -static void rfu_CB_pollConnectParent(u8 sp24, u16 sp28) +static void rfu_CB_pollConnectParent(u8 reqCommand, u16 reqResult) { u16 id; u8 slot; - u8 r2, r5; - struct RfuTgtData *r9; - struct RfuTgtData sp; + u8 bm_slot_flag, i; + struct RfuTgtData *target_p; + struct RfuTgtData target_local; - if (sp28 == 0) + if (reqResult == 0) { id = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; slot = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[6]; if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { - r2 = 1 << slot; - if (!(r2 & gRfuLinkStatus->connSlotFlag)) + bm_slot_flag = 1 << slot; + if (!(bm_slot_flag & gRfuLinkStatus->connSlotFlag)) { - gRfuLinkStatus->connSlotFlag |= r2; - gRfuLinkStatus->linkLossSlotFlag &= ~r2; + gRfuLinkStatus->connSlotFlag |= bm_slot_flag; + gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag; gRfuLinkStatus->my.id = id; ++gRfuLinkStatus->connCount; gRfuLinkStatus->parentChild = MODE_CHILD; gRfuStatic->flags |= 0x80; - for (r5 = 0; r5 < RFU_CHILD_MAX; ++r5) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - if (gRfuLinkStatus->partner[r5].id == gRfuStatic->tryPid) + if (gRfuLinkStatus->partner[i].id == gRfuStatic->tryPid) { if (gRfuLinkStatus->findParentCount != 0) { - r9 = &sp; - CpuCopy16(&gRfuLinkStatus->partner[r5], &sp, sizeof(struct RfuTgtData)); + target_p = &target_local; + CpuCopy16(&gRfuLinkStatus->partner[i], &target_local, sizeof(struct RfuTgtData)); CpuFill16(0, gRfuLinkStatus->partner, sizeof(gRfuLinkStatus->partner)); gRfuLinkStatus->findParentCount = 0; } else { - r9 = &gRfuLinkStatus->partner[r5]; + target_p = &gRfuLinkStatus->partner[i]; } break; } } - if (r5 < RFU_CHILD_MAX) + if (i < RFU_CHILD_MAX) { - CpuCopy16(r9, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); + CpuCopy16(target_p, &gRfuLinkStatus->partner[slot], sizeof(struct RfuTgtData)); gRfuLinkStatus->partner[slot].slot = slot; } } } } - rfu_STC_REQ_callback(sp24, sp28); + rfu_STC_REQ_callback(reqCommand, reqResult); } u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo) { - u8 r0, *r2; + u8 *packet_p; *status = 0xFF; - r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - r0 = r2[0] + 96; - if (r0 <= 1) + packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + if (packet_p[0] == 0xa0 || packet_p[0] == 0xa1) { - r2 += 6; - *connectSlotNo = r2[0]; - *status = r2[1]; + packet_p += 6; + *connectSlotNo = packet_p[0]; + *status = packet_p[1]; return 0; } return ERR_REQ_CMD_ID; @@ -754,28 +792,28 @@ void rfu_REQ_endConnectParent(void) u16 rfu_syncVBlank(void) { - u8 r3, r4; - s32 r5; + u8 masterSlave, i; + s32 bmSlotFlag; rfu_NI_checkCommFailCounter(); if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) return 0; if (gRfuStatic->nowWatchInterval != 0) --gRfuStatic->nowWatchInterval; - r3 = rfu_getMasterSlave(); + masterSlave = rfu_getMasterSlave(); if (!(gRfuStatic->flags & 2)) { - if (r3 == 0) + if (masterSlave == AGB_CLK_SLAVE) { gRfuStatic->flags |= 4; gRfuStatic->watchdogTimer = 360; } } - else if (r3 != 0) + else if (masterSlave != AGB_CLK_SLAVE) { gRfuStatic->flags &= 0xFB; } - if (r3 != 0) + if (masterSlave != AGB_CLK_SLAVE) gRfuStatic->flags &= 0xFD; else gRfuStatic->flags |= 2; @@ -784,10 +822,10 @@ u16 rfu_syncVBlank(void) if (gRfuStatic->watchdogTimer == 0) { gRfuStatic->flags &= 0xFB; - r5 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; - for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) - if ((r5 >> r4) & 1) - rfu_STC_removeLinkData(r4, 1); + bmSlotFlag = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + for (i = 0; i < RFU_CHILD_MAX; ++i) + if ((bmSlotFlag >> i) & 1) + rfu_STC_removeLinkData(i, 1); gRfuLinkStatus->parentChild = MODE_NEUTRAL; return 1; } @@ -797,13 +835,13 @@ u16 rfu_syncVBlank(void) u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason, u8 *parentBmLinkRecoverySlot) { - u8 sp08 = 0; - u8 sp0C = 0; + u8 reasonMaybe = 0; + u8 reqResult = 0; u8 i; - s32 sp10, sp14; - u8 *r2; - u8 r9, r6, r3, connSlotFlag, r0; - + s32 stwiCommand, stwiParam; + u8 *packet_p; + u8 to_req_disconnect, newLinkLossFlag, num_packets, connSlotFlag, to_disconnect; + *bmLinkLossSlot = 0; *linkLossReason = REASON_DISCONNECTED; *parentBmLinkRecoverySlot = 0; @@ -814,25 +852,25 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason if (gRfuStatic->nowWatchInterval == 0) { gRfuStatic->nowWatchInterval = gRfuLinkStatus->watchInterval; - sp08 = 1; + reasonMaybe = 1; } - if ((u8)reqCommandId == 41) + if ((u8)reqCommandId == ID_DISCONNECTED_AND_CHANGE_REQ) { - u8 *r1 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - - *bmLinkLossSlot = r1[4]; - *linkLossReason = r1[5]; + u8 *packet_p_2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + + *bmLinkLossSlot = packet_p_2[4]; + *linkLossReason = packet_p_2[5]; if (*linkLossReason == REASON_LINK_LOSS) *bmLinkLossSlot = gRfuLinkStatus->connSlotFlag; - sp08 = 2; + reasonMaybe = 2; } else { - if (reqCommandId == 310) + if (reqCommandId == 0x0136) { - r6 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; - r6 ^= gRfuLinkStatus->connSlotFlag; - *bmLinkLossSlot = r6 & gRfuLinkStatus->connSlotFlag; + newLinkLossFlag = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[5]; + newLinkLossFlag ^= gRfuLinkStatus->connSlotFlag; + *bmLinkLossSlot = newLinkLossFlag & gRfuLinkStatus->connSlotFlag; *linkLossReason = REASON_LINK_LOSS; for (i = 0; i < RFU_CHILD_MAX; ++i) { @@ -843,33 +881,33 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } } } - if (sp08 == 0) + if (reasonMaybe == 0) return 0; } - sp10 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; - sp14 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; + stwiCommand = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command; + stwiParam = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0]; STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_LinkStatusREQ(); - sp0C = STWI_poll_CommandEnd(); - if (sp0C == 0) + reqResult = STWI_poll_CommandEnd(); + if (reqResult == 0) { - r2 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; + packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; for (i = 0; i < RFU_CHILD_MAX; ++i) - gRfuLinkStatus->strength[i] = *r2++; - r9 = 0; + gRfuLinkStatus->strength[i] = *packet_p++; + to_req_disconnect = 0; i = 0; } else { - rfu_STC_REQ_callback(17, sp0C); - return sp0C; + rfu_STC_REQ_callback(ID_LINK_STATUS_REQ, reqResult); + return reqResult; } for (; i < RFU_CHILD_MAX; ++i) { - r6 = 1 << i; - if (sp0C == 0) + newLinkLossFlag = 1 << i; + if (reqResult == 0) { - if (sp08 == 1 && (gRfuLinkStatus->connSlotFlag & r6)) + if (reasonMaybe == 1 && (gRfuLinkStatus->connSlotFlag & newLinkLossFlag)) { if (gRfuLinkStatus->strength[i] == 0) { @@ -878,8 +916,8 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason ++gRfuStatic->linkEmergencyFlag[i]; if (gRfuStatic->linkEmergencyFlag[i] > 3) { - *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *bmLinkLossSlot |= newLinkLossFlag; + *linkLossReason = REASON_LINK_LOSS; } } else @@ -889,18 +927,18 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason { if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) { - *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *bmLinkLossSlot |= newLinkLossFlag; + *linkLossReason = REASON_LINK_LOSS; } else { - if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->unk_1a) + if (++gRfuStatic->linkEmergencyFlag[i] > gRfuStatic->linkEmergencyLimit) { gRfuStatic->linkEmergencyFlag[i] = 0; STWI_send_DisconnectREQ(gRfuLinkStatus->connSlotFlag); STWI_poll_CommandEnd(); - *bmLinkLossSlot |= r6; - *linkLossReason = sp08; // why not directly use REASON_LINK_LOSS? + *bmLinkLossSlot |= newLinkLossFlag; + *linkLossReason = REASON_LINK_LOSS; } } } @@ -908,18 +946,18 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } else { - gRfuStatic->linkEmergencyFlag[i] = sp0C; // why not directly use 0? + gRfuStatic->linkEmergencyFlag[i] = 0; } } if (gRfuLinkStatus->parentChild == MODE_PARENT && gRfuLinkStatus->strength[i] != 0) { - if (r6 & gRfuLinkStatus->linkLossSlotFlag) + if (newLinkLossFlag & gRfuLinkStatus->linkLossSlotFlag) { if (gRfuLinkStatus->strength[i] > 10) { - *parentBmLinkRecoverySlot |= r6; - gRfuLinkStatus->connSlotFlag |= r6; - gRfuLinkStatus->linkLossSlotFlag &= ~r6; + *parentBmLinkRecoverySlot |= newLinkLossFlag; + gRfuLinkStatus->connSlotFlag |= newLinkLossFlag; + gRfuLinkStatus->linkLossSlotFlag &= ~newLinkLossFlag; ++gRfuLinkStatus->connCount; gRfuStatic->linkEmergencyFlag[i] = 0; } @@ -930,19 +968,19 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } else { - if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & r6)) + if (!((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & newLinkLossFlag)) { STWI_send_SlotStatusREQ(); STWI_poll_CommandEnd(); - r2 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; - r3 = r2[1] - 1; - for (r2 += 8; r3 != 0; r2 += 4, --r3) + packet_p = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data; + num_packets = packet_p[1] - 1; + for (packet_p += 8; num_packets != 0; packet_p += 4, --num_packets) { - u16 r4 = *(u16 *)r2; + u16 cid = *(u16 *)packet_p; - if (r2[2] == i && r4 == gRfuStatic->cidBak[i]) + if (packet_p[2] == i && cid == gRfuStatic->cidBak[i]) { - r9 |= 1 << i; + to_req_disconnect |= 1 << i; break; } } @@ -951,46 +989,46 @@ u16 rfu_REQBN_watchLink(u16 reqCommandId, u8 *bmLinkLossSlot, u8 *linkLossReason } } connSlotFlag = gRfuLinkStatus->connSlotFlag; - r0 = *bmLinkLossSlot; - r0 &= connSlotFlag; - if (r6 & r0) + to_disconnect = *bmLinkLossSlot; + to_disconnect &= connSlotFlag; + if (newLinkLossFlag & to_disconnect) rfu_STC_removeLinkData(i, 0); } - if (r9 != 0) + if (to_req_disconnect != 0) { - STWI_send_DisconnectREQ(r9); + STWI_send_DisconnectREQ(to_req_disconnect); STWI_poll_CommandEnd(); } // equivalent to: - // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = sp10; - *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = sp10; - gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = sp14; + // gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.command = stwiCommand; + *(u32 *)gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data = stwiCommand; + gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] = stwiParam; return 0; } -static void rfu_STC_removeLinkData(u8 r7, u8 r12) +static void rfu_STC_removeLinkData(u8 bmConnectedPartnerId, u8 bmDisconnect) { - u8 r5 = 1 << r7; - s32 r6; + u8 bmLinkLossFlag = 1 << bmConnectedPartnerId; + s32 bmLinkRetainedFlag; - if ((gRfuLinkStatus->connSlotFlag & r5) && gRfuLinkStatus->connCount != 0) + if ((gRfuLinkStatus->connSlotFlag & bmLinkLossFlag) && gRfuLinkStatus->connCount != 0) --gRfuLinkStatus->connCount; - gRfuLinkStatus->connSlotFlag &= r6 = ~r5; - gRfuLinkStatus->linkLossSlotFlag |= r5; - if ((*(u32 *)gRfuLinkStatus & 0xFF00FF) == 0) + gRfuLinkStatus->connSlotFlag &= bmLinkRetainedFlag = ~bmLinkLossFlag; + gRfuLinkStatus->linkLossSlotFlag |= bmLinkLossFlag; + if (gRfuLinkStatus->parentChild == MODE_CHILD && gRfuLinkStatus->connSlotFlag == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; - if (r12 != 0) + if (bmDisconnect) { - CpuFill16(0, &gRfuLinkStatus->partner[r7], sizeof(struct RfuTgtData)); - gRfuLinkStatus->linkLossSlotFlag &= r6; - gRfuLinkStatus->getNameFlag &= r6; - gRfuLinkStatus->strength[r7] = 0; + CpuFill16(0, &gRfuLinkStatus->partner[bmConnectedPartnerId], sizeof(struct RfuTgtData)); + gRfuLinkStatus->linkLossSlotFlag &= bmLinkRetainedFlag; + gRfuLinkStatus->getNameFlag &= bmLinkRetainedFlag; + gRfuLinkStatus->strength[bmConnectedPartnerId] = 0; } } void rfu_REQ_disconnect(u8 bmDisconnectSlot) { - u16 r1; + u16 result; if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmDisconnectSlot) { @@ -1003,9 +1041,9 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot) else if (gRfuStatic->SCStartFlag && (STWI_set_Callback_M(rfu_CB_defaultCallback), STWI_send_SC_EndREQ(), - (r1 = STWI_poll_CommandEnd()) != 0)) + (result = STWI_poll_CommandEnd()) != 0)) { - rfu_STC_REQ_callback(27, r1); + rfu_STC_REQ_callback(ID_SC_END_REQ, result); } else { @@ -1015,38 +1053,38 @@ void rfu_REQ_disconnect(u8 bmDisconnectSlot) } } -static void rfu_CB_disconnect(u8 r6, u16 r5) +static void rfu_CB_disconnect(u8 reqCommand, u16 reqResult) { - u8 r4, r0; + u8 i, bm_slot_flag; - if (r5 == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) + if (reqResult == 3 && gRfuLinkStatus->parentChild == MODE_CHILD) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SystemStatusREQ(); if (STWI_poll_CommandEnd() == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[7] == 0) - r5 = 0; + reqResult = 0; } gRfuStatic->recoveryBmSlot &= gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8] = gRfuStatic->recoveryBmSlot; - if (r5 == 0) + if (reqResult == 0) { - for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - r0 = 1 << r4; - if (r0 & gRfuStatic->recoveryBmSlot) - rfu_STC_removeLinkData(r4, 1); + bm_slot_flag = 1 << i; + if (bm_slot_flag & gRfuStatic->recoveryBmSlot) + rfu_STC_removeLinkData(i, 1); } } if ((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) == 0) gRfuLinkStatus->parentChild = MODE_NEUTRAL; - rfu_STC_REQ_callback(r6, r5); + rfu_STC_REQ_callback(reqCommand, reqResult); if (gRfuStatic->SCStartFlag) { STWI_set_Callback_M(rfu_CB_defaultCallback); STWI_send_SC_StartREQ(); - r5 = STWI_poll_CommandEnd(); - if (r5 != 0) - rfu_STC_REQ_callback(25, r5); + reqResult = STWI_poll_CommandEnd(); + if (reqResult != 0) + rfu_STC_REQ_callback(ID_SC_START_REQ, reqResult); } } @@ -1068,38 +1106,35 @@ void rfu_REQ_CHILD_pollConnectRecovery(void) STWI_send_CPR_PollingREQ(); } -static void rfu_CB_CHILD_pollConnectRecovery(u8 r8, u16 r7) +static void rfu_CB_CHILD_pollConnectRecovery(u8 reqCommand, u16 reqResult) { - u8 r3, r4; - struct RfuLinkStatus *r2; + u8 bm_slot_flag, i; + struct RfuLinkStatus *rfuLinkStatus; - if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) + if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] == 0 && gRfuStatic->recoveryBmSlot) { gRfuLinkStatus->parentChild = MODE_CHILD; - for (r4 = 0; r4 < NELEMS(gRfuStatic->linkEmergencyFlag); ++r4) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - r3 = 1 << r4; - r2 = gRfuLinkStatus; // ??? - if (gRfuStatic->recoveryBmSlot & r3 & r2->linkLossSlotFlag) + bm_slot_flag = 1 << i; + rfuLinkStatus = gRfuLinkStatus; // ??? + if (gRfuStatic->recoveryBmSlot & bm_slot_flag & rfuLinkStatus->linkLossSlotFlag) { - gRfuLinkStatus->connSlotFlag |= r3; - gRfuLinkStatus->linkLossSlotFlag &= ~r3; + gRfuLinkStatus->connSlotFlag |= bm_slot_flag; + gRfuLinkStatus->linkLossSlotFlag &= ~bm_slot_flag; ++gRfuLinkStatus->connCount; - gRfuStatic->linkEmergencyFlag[r4] = 0; + gRfuStatic->linkEmergencyFlag[i] = 0; } } gRfuStatic->recoveryBmSlot = 0; } - rfu_STC_REQ_callback(r8, r7); + rfu_STC_REQ_callback(reqCommand, reqResult); } u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status) { - u8 r0; - *status = 0xFF; - r0 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] + 77; - if (r0 <= 1) + if (gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB3 || gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[0] == 0xB4) { *status = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4]; return 0; @@ -1127,14 +1162,14 @@ static void rfu_STC_fastCopy(const u8 **src_p, u8 **dst_p, s32 size) void rfu_REQ_changeMasterSlave(void) { - if (STWI_read_status(1) == 1) + if (STWI_read_status(1) == AGB_CLK_MASTER) { STWI_set_Callback_M(rfu_STC_REQ_callback); STWI_send_MS_ChangeREQ(); } else { - rfu_STC_REQ_callback(39, 0); + rfu_STC_REQ_callback(ID_MS_CHANGE_REQ, 0); } } @@ -1144,11 +1179,11 @@ bool8 rfu_getMasterSlave(void) if (masterSlave == AGB_CLK_MASTER) { - if (gSTWIStatus->unk_2c) + if (gSTWIStatus->sending) { - if (gSTWIStatus->reqActiveCommand == 39 - || gSTWIStatus->reqActiveCommand == 37 - || gSTWIStatus->reqActiveCommand == 55) + if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ + || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) masterSlave = AGB_CLK_SLAVE; } } @@ -1159,7 +1194,7 @@ void rfu_clearAllSlot(void) { u16 i; u16 IMEBackup = REG_IME; - + REG_IME = 0; for (i = 0; i < RFU_CHILD_MAX; ++i) { @@ -1175,87 +1210,87 @@ void rfu_clearAllSlot(void) REG_IME = IMEBackup; } -static void rfu_STC_releaseFrame(u8 r5, u8 r3, struct NIComm *r4) +static void rfu_STC_releaseFrame(u8 bm_slot_id, u8 send_recv, struct NIComm *NI_comm) { if (!(gRfuStatic->flags & 0x80)) { - if (r3 == 0) - gRfuLinkStatus->remainLLFrameSizeParent += r4->payloadSize; + if (send_recv == 0) + gRfuLinkStatus->remainLLFrameSizeParent += NI_comm->payloadSize; gRfuLinkStatus->remainLLFrameSizeParent += 3; } else { - if (r3 == 0) - gRfuLinkStatus->remainLLFrameSizeChild[r5] += r4->payloadSize; - gRfuLinkStatus->remainLLFrameSizeChild[r5] += 2; + if (send_recv == 0) + gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += NI_comm->payloadSize; + gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id] += 2; } } u16 rfu_clearSlot(u8 connTypeFlag, u8 slotStatusIndex) { - u16 r10, r3, r1; - struct NIComm *r4; + u16 imeBak, send_recv, i; + struct NIComm *NI_comm; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; if (!(connTypeFlag & (TYPE_UNI_SEND | TYPE_UNI_RECV | TYPE_NI_SEND | TYPE_NI_RECV))) return ERR_COMM_TYPE; - r10 = REG_IME; + imeBak = REG_IME; REG_IME = 0; if (connTypeFlag & (TYPE_NI_SEND | TYPE_NI_RECV)) { - for (r3 = 0; r3 < 2; ++r3) + for (send_recv = 0; send_recv < 2; ++send_recv) { - r4 = NULL; - if (r3 == 0) + NI_comm = NULL; + if (send_recv == 0) { if (connTypeFlag & TYPE_NI_SEND) { - r4 = &gRfuSlotStatusNI[slotStatusIndex]->send; - gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlotOrg; + NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->send; + gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlotOrg; } } else { if (connTypeFlag & TYPE_NI_RECV) { - r4 = &gRfuSlotStatusNI[slotStatusIndex]->recv; + NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); } } - if (r4 != NULL) + if (NI_comm != NULL) { - if (r4->state & SLOT_BUSY_FLAG) + if (NI_comm->state & SLOT_BUSY_FLAG) { - rfu_STC_releaseFrame(slotStatusIndex, r3, r4); - for (r1 = 0; r1 < RFU_CHILD_MAX; ++r1) - if ((r4->bmSlotOrg >> r1) & 1) - r4->failCounter = 0; + rfu_STC_releaseFrame(slotStatusIndex, send_recv, NI_comm); + for (i = 0; i < RFU_CHILD_MAX; ++i) + if ((NI_comm->bmSlotOrg >> i) & 1) + NI_comm->failCounter = 0; } - CpuFill16(0, r4, sizeof(struct NIComm)); + CpuFill16(0, NI_comm, sizeof(struct NIComm)); } } } if (connTypeFlag & TYPE_UNI_SEND) { - struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[slotStatusIndex]; + struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[slotStatusIndex]; - if (r3->send.state & SLOT_BUSY_FLAG) + if (slotStatusUNI->send.state & SLOT_BUSY_FLAG) { if (!(gRfuStatic->flags & 0x80)) - gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)r3->send.payloadSize; + gRfuLinkStatus->remainLLFrameSizeParent += 3 + (u8)slotStatusUNI->send.payloadSize; else - gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)r3->send.payloadSize; - gRfuLinkStatus->sendSlotUNIFlag &= ~r3->send.bmSlot; + gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] += 2 + (u8)slotStatusUNI->send.payloadSize; + gRfuLinkStatus->sendSlotUNIFlag &= ~slotStatusUNI->send.bmSlot; } - CpuFill16(0, &r3->send, sizeof(struct UNISend)); + CpuFill16(0, &slotStatusUNI->send, sizeof(struct UNISend)); } if (connTypeFlag & TYPE_UNI_RECV) { CpuFill16(0, &gRfuSlotStatusUNI[slotStatusIndex]->recv, sizeof(struct UNIRecv)); } - REG_IME = r10; + REG_IME = imeBak; return 0; } @@ -1301,16 +1336,16 @@ u16 rfu_NI_CHILD_setSendGameName(u8 slotNo, u8 subFrameSize) return rfu_STC_setSendData_org(64, 1 << slotNo, subFrameSize, &gRfuLinkStatus->my.serialNo, 26); } -static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 sp28) +static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, const void *src, u32 dataSize) { - u8 r2, r0; - u8 r4; - u8 *r9; - u8 r5; + u8 bm_slot_id, sendSlotFlag; + u8 frameSize; + u8 *llFrameSize_p; + u8 sending; u8 i; - u16 sp04; - struct RfuSlotStatusUNI *r1; - struct RfuSlotStatusNI *r12; + u16 imeBak; + struct RfuSlotStatusUNI *slotStatus_UNI; + struct RfuSlotStatusNI *slotStatus_NI; if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) return ERR_MODE_NOT_CONNECTED; @@ -1318,108 +1353,108 @@ static u16 rfu_STC_setSendData_org(u8 r6, u8 bmSendSlot, u8 subFrameSize, const return ERR_SLOT_NO; if (((gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag) & bmSendSlot) != bmSendSlot) return ERR_SLOT_NOT_CONNECTED; - if (r6 & 0x10) - r0 = gRfuLinkStatus->sendSlotUNIFlag; + if (ni_or_uni & 0x10) + sendSlotFlag = gRfuLinkStatus->sendSlotUNIFlag; else - r0 = gRfuLinkStatus->sendSlotNIFlag; - if (r0 & bmSendSlot) + sendSlotFlag = gRfuLinkStatus->sendSlotNIFlag; + if (sendSlotFlag & bmSendSlot) return ERR_SLOT_BUSY; - for (r2 = 0; r2 < RFU_CHILD_MAX && !((bmSendSlot >> r2) & 1); ++r2) + for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX && !((bmSendSlot >> bm_slot_id) & 1); ++bm_slot_id) ; if (gRfuLinkStatus->parentChild == MODE_PARENT) - r9 = &gRfuLinkStatus->remainLLFrameSizeParent; + llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent; else if (gRfuLinkStatus->parentChild == MODE_CHILD) - r9 = &gRfuLinkStatus->remainLLFrameSizeChild[r2]; - r4 = llsf_struct[gRfuLinkStatus->parentChild].unk00; - if (subFrameSize > *r9 || subFrameSize <= r4) + llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id]; + frameSize = llsf_struct[gRfuLinkStatus->parentChild].frameSize; + if (subFrameSize > *llFrameSize_p || subFrameSize <= frameSize) return ERR_SUBFRAME_SIZE; - sp04 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - r5 = r6 & 0x20; - if (r5 || r6 == 0x40) - { - u8 *r1; // a hack to swap instructions - - r12 = gRfuSlotStatusNI[r2]; - r1 = NULL; - r12->send.errorCode = 0; - *r12->send.now_p = r1 = &r12->send.dataType; - r12->send.remainSize = 7; - r12->send.bmSlotOrg = bmSendSlot; - r12->send.bmSlot = bmSendSlot; - r12->send.payloadSize = subFrameSize - r4; - if (r5 != 0) - *r1 = 0; + sending = ni_or_uni & 0x20; + if (sending || ni_or_uni == 0x40) + { + u8 *dataType_p; // a hack to swap instructions + + slotStatus_NI = gRfuSlotStatusNI[bm_slot_id]; + slotStatus_UNI = NULL; + slotStatus_NI->send.errorCode = 0; + *slotStatus_NI->send.now_p = dataType_p = &slotStatus_NI->send.dataType; + slotStatus_NI->send.remainSize = 7; + slotStatus_NI->send.bmSlotOrg = bmSendSlot; + slotStatus_NI->send.bmSlot = bmSendSlot; + slotStatus_NI->send.payloadSize = subFrameSize - frameSize; + if (sending != 0) + *dataType_p = 0; else - *r1 = 1; - r12->send.dataSize = sp28; - r12->send.src = src; - r12->send.ack = 0; - r12->send.phase = 0; - #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette + *dataType_p = 1; + slotStatus_NI->send.dataSize = dataSize; + slotStatus_NI->send.src = src; + slotStatus_NI->send.ack = 0; + slotStatus_NI->send.phase = 0; + #ifndef NONMATCHING // to fix bm_slot_id, r3, frameSize, sending register roulette asm("":::"r2"); #endif for (i = 0; i < WINDOW_COUNT; ++i) { - r12->send.recvAckFlag[i] = 0; - r12->send.n[i] = 1; + slotStatus_NI->send.recvAckFlag[i] = 0; + slotStatus_NI->send.n[i] = 1; } - for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) - if ((bmSendSlot >> r2) & 1) - gRfuSlotStatusNI[r2]->send.failCounter = 0; + for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) + if ((bmSendSlot >> bm_slot_id) & 1) + gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0; gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; - *r9 -= subFrameSize; - r12->send.state = SLOT_STATE_SEND_START; + *llFrameSize_p -= subFrameSize; + slotStatus_NI->send.state = SLOT_STATE_SEND_START; } - else if (r6 & 0x10) + else if (ni_or_uni & 0x10) { - r1 = gRfuSlotStatusUNI[r2]; - r1->send.bmSlot = bmSendSlot; - r1->send.src = src; - r1->send.payloadSize = subFrameSize - r4; - *r9 -= subFrameSize; - r1->send.state = SLOT_STATE_SEND_UNI; + slotStatus_UNI = gRfuSlotStatusUNI[bm_slot_id]; + slotStatus_UNI->send.bmSlot = bmSendSlot; + slotStatus_UNI->send.src = src; + slotStatus_UNI->send.payloadSize = subFrameSize - frameSize; + *llFrameSize_p -= subFrameSize; + slotStatus_UNI->send.state = SLOT_STATE_SEND_UNI; gRfuLinkStatus->sendSlotUNIFlag |= bmSendSlot; } - REG_IME = sp04; + REG_IME = imeBak; return 0; } u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) { - struct RfuSlotStatusNI *r5; - u16 r8; - u8 r2; + struct RfuSlotStatusNI *slotStatusNI; + u16 imeBak; + u8 i; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; if (connType == 0x20) { - r5 = gRfuSlotStatusNI[slotStatusIndex]; - if ((r5->send.state & SLOT_BUSY_FLAG) - && (r5->send.state & SLOT_SEND_FLAG)) + slotStatusNI = gRfuSlotStatusNI[slotStatusIndex]; + if ((slotStatusNI->send.state & SLOT_BUSY_FLAG) + && (slotStatusNI->send.state & SLOT_SEND_FLAG)) { - connType = bmNewTgtSlot ^ r5->send.bmSlot; - + connType = bmNewTgtSlot ^ slotStatusNI->send.bmSlot; + if (!(connType & bmNewTgtSlot)) { if (connType) { - r8 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - for (r2 = 0; r2 < RFU_CHILD_MAX; ++r2) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - if ((connType >> r2) & 1) - gRfuSlotStatusNI[r2]->send.failCounter = 0; + if ((connType >> i) & 1) + gRfuSlotStatusNI[i]->send.failCounter = 0; } gRfuLinkStatus->sendSlotNIFlag &= ~connType; - r5->send.bmSlot = bmNewTgtSlot; - if (r5->send.bmSlot == 0) + slotStatusNI->send.bmSlot = bmNewTgtSlot; + if (slotStatusNI->send.bmSlot == 0) { - rfu_STC_releaseFrame(slotStatusIndex, 0, &r5->send); - r5->send.state = SLOT_STATE_SEND_FAILED; + rfu_STC_releaseFrame(slotStatusIndex, 0, &slotStatusNI->send); + slotStatusNI->send.state = SLOT_STATE_SEND_FAILED; } - REG_IME = r8; + REG_IME = imeBak; } } else @@ -1436,21 +1471,21 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) { if (connType == 16) { - s32 r3; + s32 bmSlot; if (gRfuSlotStatusUNI[slotStatusIndex]->send.state != SLOT_STATE_SEND_UNI) return ERR_SLOT_NOT_SENDING; - for (r3 = 0, r2 = 0; r2 < RFU_CHILD_MAX; ++r2) - if (r2 != slotStatusIndex) - r3 |= gRfuSlotStatusUNI[r2]->send.bmSlot; - if (bmNewTgtSlot & r3) + for (bmSlot = 0, i = 0; i < RFU_CHILD_MAX; ++i) + if (i != slotStatusIndex) + bmSlot |= gRfuSlotStatusUNI[i]->send.bmSlot; + if (bmNewTgtSlot & bmSlot) return ERR_SLOT_TARGET; - r8 = REG_IME; + imeBak = REG_IME; REG_IME = 0; gRfuLinkStatus->sendSlotUNIFlag &= ~gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot; gRfuLinkStatus->sendSlotUNIFlag |= bmNewTgtSlot; gRfuSlotStatusUNI[slotStatusIndex]->send.bmSlot = bmNewTgtSlot; - REG_IME = r8; + REG_IME = imeBak; } else { @@ -1462,14 +1497,14 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) { - struct NIComm *r5; - u16 r4, r1; + struct NIComm *NI_comm; + u16 imeBak; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; - r5 = &gRfuSlotStatusNI[slotStatusIndex]->recv; - r4 = REG_IME; - ++r4; --r4; // fix r4, r5 register swap + NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv; + imeBak = REG_IME; + ++imeBak; --imeBak; // fix imeBak, NI_comm register swap REG_IME = 0; if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG) { @@ -1478,43 +1513,43 @@ u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) else gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); - rfu_STC_releaseFrame(slotStatusIndex, 1, r5); + rfu_STC_releaseFrame(slotStatusIndex, 1, NI_comm); } - REG_IME = r4; + REG_IME = imeBak; return 0; } u16 rfu_UNI_changeAndReadySendData(u8 slotStatusIndex, const void *src, u8 size) { - struct UNISend *r4; - u8 *r6; - u16 r1; - u8 r3_; + struct UNISend *UNI_send; + u8 *frame_p; + u16 imeBak; + u8 frameEnd; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; - r4 = &gRfuSlotStatusUNI[slotStatusIndex]->send; - if (r4->state != SLOT_STATE_SEND_UNI) + UNI_send = &gRfuSlotStatusUNI[slotStatusIndex]->send; + if (UNI_send->state != SLOT_STATE_SEND_UNI) return ERR_SLOT_NOT_SENDING; if (gRfuLinkStatus->parentChild == MODE_PARENT) { - r6 = &gRfuLinkStatus->remainLLFrameSizeParent; - r3_ = gRfuLinkStatus->remainLLFrameSizeParent + (u8)r4->payloadSize; + frame_p = &gRfuLinkStatus->remainLLFrameSizeParent; + frameEnd = gRfuLinkStatus->remainLLFrameSizeParent + (u8)UNI_send->payloadSize; } else { - r6 = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex]; - r3_ = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)r4->payloadSize; + frame_p = &gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex]; + frameEnd = gRfuLinkStatus->remainLLFrameSizeChild[slotStatusIndex] + (u8)UNI_send->payloadSize; } - if (r3_ < size) + if (frameEnd < size) return ERR_SUBFRAME_SIZE; - r1 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - r4->src = src; - *r6 = r3_ - size; - r4->payloadSize = size; - r4->dataReadyFlag = 1; - REG_IME = r1; + UNI_send->src = src; + *frame_p = frameEnd - size; + UNI_send->payloadSize = size; + UNI_send->dataReadyFlag = 1; + REG_IME = imeBak; return 0; } @@ -1593,184 +1628,184 @@ void rfu_REQ_sendData(bool8 clockChangeFlag) } } -static void rfu_CB_sendData(UNUSED u8 r0, u16 r7) +static void rfu_CB_sendData(UNUSED u8 reqCommand, u16 reqResult) { - u8 r6; - struct NIComm *r4; + u8 i; + struct NIComm *NI_comm; - if (r7 == 0) + if (reqResult == 0) { - for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - if (gRfuSlotStatusUNI[r6]->send.dataReadyFlag) - gRfuSlotStatusUNI[r6]->send.dataReadyFlag = 0; - r4 = &gRfuSlotStatusNI[r6]->send; - if (r4->state == SLOT_STATE_SEND_NULL) + if (gRfuSlotStatusUNI[i]->send.dataReadyFlag) + gRfuSlotStatusUNI[i]->send.dataReadyFlag = 0; + NI_comm = &gRfuSlotStatusNI[i]->send; + if (NI_comm->state == SLOT_STATE_SEND_NULL) { - rfu_STC_releaseFrame(r6, 0, r4); - gRfuLinkStatus->sendSlotNIFlag &= ~r4->bmSlot; - if (r4->dataType == 1) - gRfuLinkStatus->getNameFlag |= 1 << r6; - r4->state = SLOT_STATE_SEND_SUCCESS; + rfu_STC_releaseFrame(i, 0, NI_comm); + gRfuLinkStatus->sendSlotNIFlag &= ~NI_comm->bmSlot; + if (NI_comm->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << i; + NI_comm->state = SLOT_STATE_SEND_SUCCESS; } } } gRfuLinkStatus->LLFReadyFlag = 0; - rfu_STC_REQ_callback(36, r7); + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } -static void rfu_CB_sendData2(UNUSED u8 r0, u16 r1) +static void rfu_CB_sendData2(UNUSED u8 reqCommand, u16 reqResult) { - rfu_STC_REQ_callback(36, r1); + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); } -static void rfu_CB_sendData3(u8 r0, u16 r1) +static void rfu_CB_sendData3(u8 reqCommand, u16 reqResult) { - if (r1 != 0) - rfu_STC_REQ_callback(36, r1); - else if (r0 == 0xFF) - rfu_STC_REQ_callback(0xFF, 0); + if (reqResult != 0) + rfu_STC_REQ_callback(ID_DATA_TX_REQ, reqResult); + else if (reqCommand == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) + rfu_STC_REQ_callback(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); } static void rfu_constructSendLLFrame(void) { - u32 r8, r5; - u8 r6; - u8 *sp00; - struct RfuSlotStatusNI *r2; + u32 pakcketSize, currSize; + u8 i; + u8 *llf_p; + struct RfuSlotStatusNI *slotStatusNI; if (gRfuLinkStatus->parentChild != MODE_NEUTRAL && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) { gRfuLinkStatus->LLFReadyFlag = 0; - r8 = 0; - sp00 = (u8 *)&gRfuFixed->LLFBuffer[1]; - for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + pakcketSize = 0; + llf_p = (u8 *)&gRfuFixed->LLFBuffer[1]; + for (i = 0; i < RFU_CHILD_MAX; ++i) { - r5 = 0; - if (gRfuSlotStatusNI[r6]->send.state & SLOT_BUSY_FLAG) - r5 = rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->send); - if (gRfuSlotStatusNI[r6]->recv.state & SLOT_BUSY_FLAG) - r5 += rfu_STC_NI_constructLLSF(r6, &sp00, &gRfuSlotStatusNI[r6]->recv); - if (gRfuSlotStatusUNI[r6]->send.state == SLOT_STATE_SEND_UNI) - r5 += rfu_STC_UNI_constructLLSF(r6, &sp00); - if (r5 != 0) + currSize = 0; + if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG) + currSize = rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->send); + if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG) + currSize += rfu_STC_NI_constructLLSF(i, &llf_p, &gRfuSlotStatusNI[i]->recv); + if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI) + currSize += rfu_STC_UNI_constructLLSF(i, &llf_p); + if (currSize != 0) { if (gRfuLinkStatus->parentChild == MODE_PARENT) - r8 += r5; + pakcketSize += currSize; else - r8 |= r5 << (5 * r6 + 8); + pakcketSize |= currSize << (5 * i + 8); } } - if (r8 != 0) + if (pakcketSize != 0) { - while ((u32)sp00 & 3) - *sp00++ = 0; - gRfuFixed->LLFBuffer[0] = r8; + while ((u32)llf_p & 3) + *llf_p++ = 0; + gRfuFixed->LLFBuffer[0] = pakcketSize; if (gRfuLinkStatus->parentChild == MODE_CHILD) { - u8 *r0 = sp00 - offsetof(struct RfuFixed, LLFBuffer[1]); - - // Does the volatile qualifier make sense? - // It's the same as: + u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]); + + // Does the volatile qualifier make sense? + // It's the same as: // asm("":::"memory"); - r8 = r0 - *(u8 *volatile *)&gRfuFixed; + pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed; } } - gRfuStatic->totalPacketSize = r8; + gRfuStatic->totalPacketSize = pakcketSize; } } -static u16 rfu_STC_NI_constructLLSF(u8 r10, u8 **r12, struct NIComm *r4) +static u16 rfu_STC_NI_constructLLSF(u8 bm_slot_id, u8 **dest_pp, struct NIComm *NI_comm) { - u16 r5; - u32 sp00; + u16 size; + u32 frame; u8 i; - u8 *r2; - const struct LLSFStruct *r8 = &llsf_struct[gRfuLinkStatus->parentChild]; + u8 *frame8_p; + const struct LLSFStruct *llsf = &llsf_struct[gRfuLinkStatus->parentChild]; - if (r4->state == SLOT_STATE_SENDING) + if (NI_comm->state == SLOT_STATE_SENDING) { - while (r4->now_p[r4->phase] >= (const u8 *)r4->src + r4->dataSize) + while (NI_comm->now_p[NI_comm->phase] >= (const u8 *)NI_comm->src + NI_comm->dataSize) { - ++r4->phase; - if (r4->phase == 4) - r4->phase = 0; + ++NI_comm->phase; + if (NI_comm->phase == 4) + NI_comm->phase = 0; } } - if (r4->state & SLOT_RECV_FLAG) + if (NI_comm->state & SLOT_RECV_FLAG) { - r5 = 0; + size = 0; } - else if (r4->state == SLOT_STATE_SENDING) + else if (NI_comm->state == SLOT_STATE_SENDING) { - if (r4->now_p[r4->phase] + r4->payloadSize > (const u8 *)r4->src + r4->dataSize) - r5 = (const u8 *)r4->src + r4->dataSize - r4->now_p[r4->phase]; + if (NI_comm->now_p[NI_comm->phase] + NI_comm->payloadSize > (const u8 *)NI_comm->src + NI_comm->dataSize) + size = (const u8 *)NI_comm->src + NI_comm->dataSize - NI_comm->now_p[NI_comm->phase]; else - r5 = r4->payloadSize; + size = NI_comm->payloadSize; } else { - if ((u32)r4->remainSize >= r4->payloadSize) - r5 = r4->payloadSize; + if ((u32)NI_comm->remainSize >= NI_comm->payloadSize) + size = NI_comm->payloadSize; else - r5 = r4->remainSize; + size = NI_comm->remainSize; } - sp00 = (r4->state & 0xF) << r8->unk03 - | r4->ack << r8->unk04 - | r4->phase << r8->unk05 - | r4->n[r4->phase] << r8->unk06 - | r5; + frame = (NI_comm->state & 0xF) << llsf->slotStateShift + | NI_comm->ack << llsf->ackShift + | NI_comm->phase << llsf->phaseShit + | NI_comm->n[NI_comm->phase] << llsf->nShift + | size; if (gRfuLinkStatus->parentChild == MODE_PARENT) - sp00 |= r4->bmSlot << 18; - r2 = (u8 *)&sp00; - for (i = 0; i < r8->unk00; ++i) - *(*r12)++ = *r2++; - if (r5 != 0) + frame |= NI_comm->bmSlot << 18; + frame8_p = (u8 *)&frame; + for (i = 0; i < llsf->frameSize; ++i) + *(*dest_pp)++ = *frame8_p++; + if (size != 0) { - const u8 *sp04 = r4->now_p[r4->phase]; + const u8 *src = NI_comm->now_p[NI_comm->phase]; - gRfuFixed->fastCopyPtr(&sp04, r12, r5); + gRfuFixed->fastCopyPtr(&src, dest_pp, size); } - if (r4->state == SLOT_STATE_SENDING) + if (NI_comm->state == SLOT_STATE_SENDING) { - ++r4->phase; - if (r4->phase == 4) - r4->phase = 0; + ++NI_comm->phase; + if (NI_comm->phase == 4) + NI_comm->phase = 0; } if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 1; else - gRfuLinkStatus->LLFReadyFlag |= 1 << r10; - return r5 + r8->unk00; + gRfuLinkStatus->LLFReadyFlag |= 1 << bm_slot_id; + return size + llsf->frameSize; } -static u16 rfu_STC_UNI_constructLLSF(u8 r8, u8 **r6) +static u16 rfu_STC_UNI_constructLLSF(u8 bm_slot_id, u8 **dest_p) { - const struct LLSFStruct *r5; - const u8 *sp04; - u32 sp00; - u8 *r2; + const struct LLSFStruct *llsf; + const u8 *src_p; + u32 frame; + u8 *frame8_p; u8 i; - struct UNISend *r4 = &gRfuSlotStatusUNI[r8]->send; + struct UNISend *UNI_send = &gRfuSlotStatusUNI[bm_slot_id]->send; - if (!r4->dataReadyFlag || !r4->bmSlot) + if (!UNI_send->dataReadyFlag || !UNI_send->bmSlot) return 0; - r5 = &llsf_struct[gRfuLinkStatus->parentChild]; - sp00 = (r4->state & 0xF) << r5->unk03 - | r4->payloadSize; + llsf = &llsf_struct[gRfuLinkStatus->parentChild]; + frame = (UNI_send->state & 0xF) << llsf->slotStateShift + | UNI_send->payloadSize; if (gRfuLinkStatus->parentChild == MODE_PARENT) - sp00 |= r4->bmSlot << 18; - r2 = (u8 *)&sp00; - for (i = 0; i < r5->unk00; ++i) - *(*r6)++ = *r2++; - sp04 = r4->src; - gRfuFixed->fastCopyPtr(&sp04, r6, r4->payloadSize); + frame |= UNI_send->bmSlot << 18; + frame8_p = (u8 *)&frame; + for (i = 0; i < llsf->frameSize; ++i) + *(*dest_p)++ = *frame8_p++; + src_p = UNI_send->src; + gRfuFixed->fastCopyPtr(&src_p, dest_p, UNI_send->payloadSize); if (gRfuLinkStatus->parentChild == MODE_PARENT) gRfuLinkStatus->LLFReadyFlag = 16; else - gRfuLinkStatus->LLFReadyFlag |= 16 << r8; - return r5->unk00 + r4->payloadSize; + gRfuLinkStatus->LLFReadyFlag |= 16 << bm_slot_id; + return llsf->frameSize + UNI_send->payloadSize; } void rfu_REQ_recvData(void) @@ -1784,434 +1819,433 @@ void rfu_REQ_recvData(void) } } -static void rfu_CB_recvData(u8 r9, u16 r7) +static void rfu_CB_recvData(u8 reqCommand, u16 reqResult) { - u8 r6; - struct RfuSlotStatusNI *r4; - struct NIComm *r5; + u8 i; + struct RfuSlotStatusNI *slotStatusNI; + struct NIComm *NI_comm; - if (r7 == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) + if (reqResult == 0 && gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[1]) { gRfuStatic->NIEndRecvFlag = 0; if (gRfuLinkStatus->parentChild == MODE_PARENT) rfu_STC_PARENT_analyzeRecvPacket(); else rfu_STC_CHILD_analyzeRecvPacket(); - for (r6 = 0; r6 < RFU_CHILD_MAX; ++r6) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - r4 = gRfuSlotStatusNI[r6]; - if (r4->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> r6) & 1)) + slotStatusNI = gRfuSlotStatusNI[i]; + if (slotStatusNI->recv.state == SLOT_STATE_RECV_LAST && !((gRfuStatic->NIEndRecvFlag >> i) & 1)) { - r5 = &r4->recv; - if (r5->dataType == 1) - gRfuLinkStatus->getNameFlag |= 1 << r6; - rfu_STC_releaseFrame(r6, 1, r5); - gRfuLinkStatus->recvSlotNIFlag &= ~r5->bmSlot; - r4->recv.state = SLOT_STATE_RECV_SUCCESS; + NI_comm = &slotStatusNI->recv; + if (NI_comm->dataType == 1) + gRfuLinkStatus->getNameFlag |= 1 << i; + rfu_STC_releaseFrame(i, 1, NI_comm); + gRfuLinkStatus->recvSlotNIFlag &= ~NI_comm->bmSlot; + slotStatusNI->recv.state = SLOT_STATE_RECV_SUCCESS; } } if (gRfuStatic->recvErrorFlag) - r7 = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; + reqResult = gRfuStatic->recvErrorFlag | ERR_DATA_RECV; } - rfu_STC_REQ_callback(r9, r7); + rfu_STC_REQ_callback(reqCommand, reqResult); } static void rfu_STC_PARENT_analyzeRecvPacket(void) { - u32 r3; - u8 r5; - u8 sp[4]; - u8 *r6; + u32 frames32; + u8 bm_slot_id; + u8 frame_counts[RFU_CHILD_MAX]; + u8 *packet_p; - r3 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; - for (r5 = 0; r5 < NELEMS(sp); ++r5) + frames32 = gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket32.data[0] >> 8; + for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { - sp[r5] = r3 & 0x1F; - r3 >>= 5; - if (sp[r5] == 0) - gRfuStatic->NIEndRecvFlag |= 1 << r5; + frame_counts[bm_slot_id] = frames32 & 0x1F; + frames32 >>= 5; + if (frame_counts[bm_slot_id] == 0) + gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id; } - r6 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; - for (r5 = 0; r5 < NELEMS(sp); ++r5) + packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { - if (sp[r5]) + if (frame_counts[bm_slot_id]) { - u8 *r4 = &sp[r5]; + u8 *frames_p = &frame_counts[bm_slot_id]; do { - u8 r0 = rfu_STC_analyzeLLSF(r5, r6, *r4); + u8 analyzed_frames = rfu_STC_analyzeLLSF(bm_slot_id, packet_p, *frames_p); - r6 += r0; - *r4 -= r0; - } while (!(*r4 & 0x80) && (*r4)); + packet_p += analyzed_frames; + *frames_p -= analyzed_frames; + } while (!(*frames_p & 0x80) && (*frames_p)); } } } static void rfu_STC_CHILD_analyzeRecvPacket(void) { - u16 r4; - u8 *r5; - u16 r0; + u16 frames_remaining; + u8 *packet_p; + u16 analyzed_frames; - r4 = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; - r5 = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; - if (r4 == 0) + frames_remaining = *(u16 *)&gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[4] & 0x7F; + packet_p = &gRfuFixed->STWIBuffer->rxPacketAlloc.rfuPacket8.data[8]; + if (frames_remaining == 0) gRfuStatic->NIEndRecvFlag = 15; do { - if (r4 == 0) + if (frames_remaining == 0) break; - r0 = rfu_STC_analyzeLLSF(0, r5, r4); - r5 += r0; - r4 -= r0; - } while (!(r4 & 0x8000)); -} - -static u16 rfu_STC_analyzeLLSF(u8 r12, const u8 *r7, u16 r3) -{ - struct RfuLocalStruct sp00; - const struct LLSFStruct *r6; - u32 r5; - u8 r4; - u32 r0; - u16 r10; - - r6 = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; - if (r3 < r6->unk00) - return r3; - r5 = 0; - for (r4 = 0; r4 < r6->unk00; ++r4) - r5 |= *r7++ << 8 * r4; - sp00.unk00 = (r5 >> r6->unk01) & r6->unk07; - sp00.unk01 = (r5 >> r6->unk02) & r6->unk08; - sp00.unk02 = (r5 >> r6->unk03) & r6->unk09; - sp00.unk03 = (r5 >> r6->unk04) & r6->unk0A; - sp00.unk04 = (r5 >> r6->unk05) & r6->unk0B; - sp00.unk05 = (r5 >> r6->unk06) & r6->unk0C; - sp00.unk06 = (r5 & r6->unk0E) & r5; - r10 = sp00.unk06 + r6->unk00; - if (sp00.unk00 == 0) + analyzed_frames = rfu_STC_analyzeLLSF(0, packet_p, frames_remaining); + packet_p += analyzed_frames; + frames_remaining -= analyzed_frames; + } while (!(frames_remaining & 0x8000)); +} + +static u16 rfu_STC_analyzeLLSF(u8 bm_slot_id, const u8 *src, u16 last_frame) +{ + struct RfuLocalStruct llsf_NI; + const struct LLSFStruct *llsf_p; + u32 frames; + u8 i; + u16 retVal; + + llsf_p = &llsf_struct[~gRfuLinkStatus->parentChild & (MODE_NEUTRAL & MODE_PARENT)]; + if (last_frame < llsf_p->frameSize) + return last_frame; + frames = 0; + for (i = 0; i < llsf_p->frameSize; ++i) + frames |= *src++ << 8 * i; + llsf_NI.unk0 = (frames >> llsf_p->unk01) & llsf_p->unk07; + llsf_NI.unk1 = (frames >> llsf_p->unk02) & llsf_p->unk08; + llsf_NI.slotState = (frames >> llsf_p->slotStateShift) & llsf_p->slotStateMask; + llsf_NI.ack = (frames >> llsf_p->ackShift) & llsf_p->ackMask; + llsf_NI.phase = (frames >> llsf_p->phaseShit) & llsf_p->phaseMask; + llsf_NI.n = (frames >> llsf_p->nShift) & llsf_p->nMask; + llsf_NI.unk6 = (frames & llsf_p->unk0E) & frames; + retVal = llsf_NI.unk6 + llsf_p->frameSize; + if (llsf_NI.unk0 == 0) { if (gRfuLinkStatus->parentChild == MODE_PARENT) { - if ((gRfuLinkStatus->connSlotFlag >> r12) & 1) + if ((gRfuLinkStatus->connSlotFlag >> bm_slot_id) & 1) { - if (sp00.unk02 == 4) + if (llsf_NI.slotState == LCOM_UNI) { - rfu_STC_UNI_receive(r12, &sp00, r7); + rfu_STC_UNI_receive(bm_slot_id, &llsf_NI, src); } - else if (sp00.unk03 == 0) + else if (llsf_NI.ack == 0) { - rfu_STC_NI_receive_Receiver(r12, &sp00, r7); + rfu_STC_NI_receive_Receiver(bm_slot_id, &llsf_NI, src); } else { - for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) - if (((gRfuSlotStatusNI[r4]->send.bmSlot >> r12) & 1) - && ((gRfuLinkStatus->sendSlotNIFlag >> r12) & 1)) + for (i = 0; i < RFU_CHILD_MAX; ++i) + if (((gRfuSlotStatusNI[i]->send.bmSlot >> bm_slot_id) & 1) + && ((gRfuLinkStatus->sendSlotNIFlag >> bm_slot_id) & 1)) break; - if (r4 <= 3) - rfu_STC_NI_receive_Sender(r4, r12, &sp00, r7); + if (i < RFU_CHILD_MAX) + rfu_STC_NI_receive_Sender(i, bm_slot_id, &llsf_NI, src); } } } else { - s32 r5 = gRfuLinkStatus->connSlotFlag & sp00.unk01; + s32 conSlots = gRfuLinkStatus->connSlotFlag & llsf_NI.unk1; - if (r5) + if (conSlots) { - for (r4 = 0; r4 < RFU_CHILD_MAX; ++r4) + for (i = 0; i < RFU_CHILD_MAX; ++i) { - if ((r5 >> r4) & 1) + if ((conSlots >> i) & 1) { - if (sp00.unk02 == 4) - rfu_STC_UNI_receive(r4, &sp00, r7); - else if (sp00.unk03 == 0) - rfu_STC_NI_receive_Receiver(r4, &sp00, r7); - else if ((gRfuLinkStatus->sendSlotNIFlag >> r4) & 1) - rfu_STC_NI_receive_Sender(r4, r4, &sp00, r7); + if (llsf_NI.slotState == LCOM_UNI) + rfu_STC_UNI_receive(i, &llsf_NI, src); + else if (llsf_NI.ack == 0) + rfu_STC_NI_receive_Receiver(i, &llsf_NI, src); + else if ((gRfuLinkStatus->sendSlotNIFlag >> i) & 1) + rfu_STC_NI_receive_Sender(i, i, &llsf_NI, src); } } } } } - return r10; + return retVal; } -static void rfu_STC_UNI_receive(u8 r7, const struct RfuLocalStruct *r6, const u8 *sp00) +static void rfu_STC_UNI_receive(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *src) { - u8 *sp04; - u32 r2; - struct RfuSlotStatusUNI *r3 = gRfuSlotStatusUNI[r7]; - struct UNIRecv *r5 = &r3->recv; + u8 *dest; + u32 size; + struct RfuSlotStatusUNI *slotStatusUNI = gRfuSlotStatusUNI[bm_slot_id]; + struct UNIRecv *UNI_recv = &slotStatusUNI->recv; - r5->errorCode = 0; - if (gRfuSlotStatusUNI[r7]->recvBufferSize < r6->unk06) + UNI_recv->errorCode = 0; + if (gRfuSlotStatusUNI[bm_slot_id]->recvBufferSize < llsf_NI->unk6) { - r3->recv.state = SLOT_STATE_RECV_IGNORE; - r5->errorCode = ERR_RECV_BUFF_OVER; + slotStatusUNI->recv.state = SLOT_STATE_RECV_IGNORE; + UNI_recv->errorCode = ERR_RECV_BUFF_OVER; } else - { - if (r5->dataBlockFlag) + { + if (UNI_recv->dataBlockFlag) { - if (r5->newDataFlag) + if (UNI_recv->newDataFlag) { - r5->errorCode = ERR_RECV_UNK; + UNI_recv->errorCode = ERR_RECV_UNK; goto _081E2F0E; } } else { - if (r5->newDataFlag) - r5->errorCode = ERR_RECV_DATA_OVERWRITED; + if (UNI_recv->newDataFlag) + UNI_recv->errorCode = ERR_RECV_DATA_OVERWRITED; } - r5->state = SLOT_STATE_RECEIVING; - r2 = r5->dataSize = r6->unk06; - sp04 = gRfuSlotStatusUNI[r7]->recvBuffer; - gRfuFixed->fastCopyPtr(&sp00, &sp04, r2); - r5->newDataFlag = 1; - r5->state = 0; + UNI_recv->state = SLOT_STATE_RECEIVING; + size = UNI_recv->dataSize = llsf_NI->unk6; + dest = gRfuSlotStatusUNI[bm_slot_id]->recvBuffer; + gRfuFixed->fastCopyPtr(&src, &dest, size); + UNI_recv->newDataFlag = 1; + UNI_recv->state = 0; } _081E2F0E: - if (r5->errorCode) - gRfuStatic->recvErrorFlag |= 16 << r7; + if (UNI_recv->errorCode) + gRfuStatic->recvErrorFlag |= 16 << bm_slot_id; } -static void rfu_STC_NI_receive_Sender(u8 r0, u8 r10, const struct RfuLocalStruct *r6, const u8 *r3) +static void rfu_STC_NI_receive_Sender(u8 NI_slot, u8 bm_flag, const struct RfuLocalStruct *llsf_NI, const u8 *data_p) { - struct NIComm *r12 = &gRfuSlotStatusNI[r0]->send; - u16 r9 = r12->state; - u8 sp00 = r12->n[r6->unk04]; - u8 *r8; - u8 r4; - u16 r2; + struct NIComm *NI_comm = &gRfuSlotStatusNI[NI_slot]->send; + u16 state = NI_comm->state; + u8 n = NI_comm->n[llsf_NI->phase]; + u8 i; + u16 imeBak; - if ((r6->unk02 == 2 && r9 == SLOT_STATE_SENDING) - || (r6->unk02 == 1 && r9 == SLOT_STATE_SEND_START) - || (r6->unk02 == 3 && r9 == SLOT_STATE_SEND_LAST)) + if ((llsf_NI->slotState == LCOM_NI && state == SLOT_STATE_SENDING) + || (llsf_NI->slotState == LCOM_NI_START && state == SLOT_STATE_SEND_START) + || (llsf_NI->slotState == LCOM_NI_END && state == SLOT_STATE_SEND_LAST)) { - if (r12->n[r6->unk04] == r6->unk05) - r12->recvAckFlag[r6->unk04] |= 1 << r10; + if (NI_comm->n[llsf_NI->phase] == llsf_NI->n) + NI_comm->recvAckFlag[llsf_NI->phase] |= 1 << bm_flag; } - if ((r12->recvAckFlag[r6->unk04] & r12->bmSlot) == r12->bmSlot) + if ((NI_comm->recvAckFlag[llsf_NI->phase] & NI_comm->bmSlot) == NI_comm->bmSlot) { - r12->n[r6->unk04] = (r12->n[r6->unk04] + 1) & 3; - r12->recvAckFlag[r6->unk04] = 0; - if ((u16)(r12->state + ~SLOT_STATE_SEND_NULL) <= 1) + NI_comm->n[llsf_NI->phase] = (NI_comm->n[llsf_NI->phase] + 1) & 3; + NI_comm->recvAckFlag[llsf_NI->phase] = 0; + if ((u16)(NI_comm->state + ~SLOT_STATE_SEND_NULL) <= 1) { - if (r12->state == SLOT_STATE_SEND_START) - r12->now_p[r6->unk04] += r12->payloadSize; + if (NI_comm->state == SLOT_STATE_SEND_START) + NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize; else - r12->now_p[r6->unk04] += r12->payloadSize << 2; - r12->remainSize -= r12->payloadSize; - if (r12->remainSize != 0) - if (r12->remainSize >= 0) + NI_comm->now_p[llsf_NI->phase] += NI_comm->payloadSize << 2; + NI_comm->remainSize -= NI_comm->payloadSize; + if (NI_comm->remainSize != 0) + if (NI_comm->remainSize >= 0) goto _081E30AE; - // Above is a hack to avoid optimization over comparison. - // rfu_STC_NI_constructLLSF uses this field as u32. - // It's equivalent to the following condition: - // if (r12->remainSize == 0 || r12->remainSize < 0) - { - r12->phase = 0; - if (r12->state == SLOT_STATE_SEND_START) + // Above is a hack to avoid optimization over comparison. + // rfu_STC_NI_constructLLSF uses this field as u32. + // It's equivalent to the following condition: + // if (NI_comm->remainSize == 0 || NI_comm->remainSize < 0) { - for (r4 = 0; r4 < WINDOW_COUNT; ++r4) + NI_comm->phase = 0; + if (NI_comm->state == SLOT_STATE_SEND_START) { - r12->n[r4] = 1; - r12->now_p[r4] = r12->src + r12->payloadSize * r4; + for (i = 0; i < WINDOW_COUNT; ++i) + { + NI_comm->n[i] = 1; + NI_comm->now_p[i] = NI_comm->src + NI_comm->payloadSize * i; + } + NI_comm->remainSize = NI_comm->dataSize; + NI_comm->state = SLOT_STATE_SENDING; + } + else + { + NI_comm->n[0] = 0; + NI_comm->remainSize = 0; + NI_comm->state = SLOT_STATE_SEND_LAST; } - r12->remainSize = r12->dataSize; - r12->state = SLOT_STATE_SENDING; - } - else - { - r12->n[0] = 0; - r12->remainSize = 0; - r12->state = SLOT_STATE_SEND_LAST; } - } _081E30AE: + ; } - else if (r12->state == SLOT_STATE_SEND_LAST) + else if (NI_comm->state == SLOT_STATE_SEND_LAST) { - r12->state = SLOT_STATE_SEND_NULL; + NI_comm->state = SLOT_STATE_SEND_NULL; } } - if (r12->state != r9 - || r12->n[r6->unk04] != sp00 - || (r12->recvAckFlag[r6->unk04] >> r10) & 1) + if (NI_comm->state != state + || NI_comm->n[llsf_NI->phase] != n + || (NI_comm->recvAckFlag[llsf_NI->phase] >> bm_flag) & 1) { - r2 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - gRfuStatic->recvRenewalFlag |= 16 << r10; - gRfuSlotStatusNI[r10]->send.failCounter = 0; - REG_IME = r2; + gRfuStatic->recvRenewalFlag |= 16 << bm_flag; + gRfuSlotStatusNI[bm_flag]->send.failCounter = 0; + REG_IME = imeBak; } } -static void rfu_STC_NI_receive_Receiver(u8 r8, const struct RfuLocalStruct *r6, const u8 *sp00) +static void rfu_STC_NI_receive_Receiver(u8 bm_slot_id, const struct RfuLocalStruct *llsf_NI, const u8 *data_p) { - u16 r2; - u32 r7 = 0; - struct RfuSlotStatusNI *r4 = gRfuSlotStatusNI[r8]; - struct NIComm *r5 = &r4->recv; - u16 r9 = r4->recv.state; - u8 r10 = r4->recv.n[r6->unk04]; + u16 imeBak; + u32 state_check = 0; + struct RfuSlotStatusNI *slotStatus_NI = gRfuSlotStatusNI[bm_slot_id]; + struct NIComm *recvSlot = &slotStatus_NI->recv; + u16 state = slotStatus_NI->recv.state; + u8 n = slotStatus_NI->recv.n[llsf_NI->phase]; - if (r6->unk02 == 3) + if (llsf_NI->slotState == LCOM_NI_END) { - gRfuStatic->NIEndRecvFlag |= 1 << r8; - if (r4->recv.state == SLOT_STATE_RECEIVING) + gRfuStatic->NIEndRecvFlag |= 1 << bm_slot_id; + if (slotStatus_NI->recv.state == SLOT_STATE_RECEIVING) { - r4->recv.phase = 0; - r4->recv.n[0] = 0; - r4->recv.state = SLOT_STATE_RECV_LAST; + slotStatus_NI->recv.phase = 0; + slotStatus_NI->recv.n[0] = 0; + slotStatus_NI->recv.state = SLOT_STATE_RECV_LAST; } } - else if (r6->unk02 == 2) + else if (llsf_NI->slotState == LCOM_NI) { - if (r9 == SLOT_STATE_RECV_START && !r5->remainSize) - rfu_STC_NI_initSlot_asRecvDataEntity(r8, r5); - if (r5->state == SLOT_STATE_RECEIVING) - r7 = 1; + if (state == SLOT_STATE_RECV_START && !recvSlot->remainSize) + rfu_STC_NI_initSlot_asRecvDataEntity(bm_slot_id, recvSlot); + if (recvSlot->state == SLOT_STATE_RECEIVING) + state_check = 1; } - else if (r6->unk02 == 1) + else if (llsf_NI->slotState == LCOM_NI_START) { - if (r9 == SLOT_STATE_RECV_START) + if (state == SLOT_STATE_RECV_START) { - r7 = 1; + state_check = 1; } else { - rfu_STC_NI_initSlot_asRecvControllData(r8, r5); - if (r4->recv.state != SLOT_STATE_RECV_START) + rfu_STC_NI_initSlot_asRecvControllData(bm_slot_id, recvSlot); + if (slotStatus_NI->recv.state != SLOT_STATE_RECV_START) return; - r7 = 1; + state_check = 1; } } - if (r7 != 0) + if (state_check != 0) { - if (r6->unk05 == ((r5->n[r6->unk04] + 1) & 3)) + if (llsf_NI->n == ((recvSlot->n[llsf_NI->phase] + 1) & 3)) { - gRfuFixed->fastCopyPtr(&sp00, (u8 **)&r5->now_p[r6->unk04], r6->unk06); - if (r5->state == SLOT_STATE_RECEIVING) - r5->now_p[r6->unk04] += 3 * r5->payloadSize; - r5->remainSize -= r6->unk06; - r5->n[r6->unk04] = r6->unk05; + gRfuFixed->fastCopyPtr(&data_p, (u8 **)&recvSlot->now_p[llsf_NI->phase], llsf_NI->unk6); + if (recvSlot->state == SLOT_STATE_RECEIVING) + recvSlot->now_p[llsf_NI->phase] += 3 * recvSlot->payloadSize; + recvSlot->remainSize -= llsf_NI->unk6; + recvSlot->n[llsf_NI->phase] = llsf_NI->n; } } - if (r5->errorCode == 0) + if (recvSlot->errorCode == 0) { - r5->phase = r6->unk04; - if (r5->state != r9 || r5->n[r6->unk04] != r10 || r5->n[r6->unk04] == r6->unk05) + recvSlot->phase = llsf_NI->phase; + if (recvSlot->state != state || recvSlot->n[llsf_NI->phase] != n || recvSlot->n[llsf_NI->phase] == llsf_NI->n) { - r2 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - gRfuStatic->recvRenewalFlag |= 1 << r8; - r5->failCounter = 0; - REG_IME = r2; + gRfuStatic->recvRenewalFlag |= 1 << bm_slot_id; + recvSlot->failCounter = 0; + REG_IME = imeBak; } } } -static void rfu_STC_NI_initSlot_asRecvControllData(u8 r4, struct NIComm *r2) +static void rfu_STC_NI_initSlot_asRecvControllData(u8 bm_slot_id, struct NIComm *NI_comm) { - u8 *r1; - u32 r5; - u8 r6; + u8 *llFrameSize_p; + u32 llFrameSize; + u8 bm_slot_flag; if (gRfuLinkStatus->parentChild == MODE_PARENT) { - r5 = 3; - r1 = &gRfuLinkStatus->remainLLFrameSizeParent; + llFrameSize = 3; + llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeParent; } else { - r5 = 2; - r1 = &gRfuLinkStatus->remainLLFrameSizeChild[r4]; + llFrameSize = 2; + llFrameSize_p = &gRfuLinkStatus->remainLLFrameSizeChild[bm_slot_id]; } - r6 = 1 << r4; - if (r2->state == 0) + bm_slot_flag = 1 << bm_slot_id; + if (NI_comm->state == 0) { - if (*r1 < r5) + if (*llFrameSize_p < llFrameSize) { - r2->state = SLOT_STATE_RECV_IGNORE; - r2->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE; - gRfuStatic->recvErrorFlag |= r6; + NI_comm->state = SLOT_STATE_RECV_IGNORE; + NI_comm->errorCode = ERR_RECV_REPLY_SUBFRAME_SIZE; + gRfuStatic->recvErrorFlag |= bm_slot_flag; } else { - r2->errorCode = 0; - *r1 -= r5; - r2->now_p[0] = &r2->dataType; - r2->remainSize = 7; - r2->ack = 1; - r2->payloadSize = 0; - r2->bmSlot = r6; - r2->state = SLOT_STATE_RECV_START; - gRfuLinkStatus->recvSlotNIFlag |= r6; + NI_comm->errorCode = 0; + *llFrameSize_p -= llFrameSize; + NI_comm->now_p[0] = &NI_comm->dataType; + NI_comm->remainSize = 7; + NI_comm->ack = 1; + NI_comm->payloadSize = 0; + NI_comm->bmSlot = bm_slot_flag; + NI_comm->state = SLOT_STATE_RECV_START; + gRfuLinkStatus->recvSlotNIFlag |= bm_slot_flag; } } } -static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 r5, struct NIComm *r4) +static void rfu_STC_NI_initSlot_asRecvDataEntity(u8 bm_slot_id, struct NIComm *NI_comm) { - u8 r1, r3; + u8 bm_slot_flag, win_id; - if (r4->dataType == 1) + if (NI_comm->dataType == 1) { - r4->now_p[0] = (void *)&gRfuLinkStatus->partner[r5].serialNo; + NI_comm->now_p[0] = (void *)&gRfuLinkStatus->partner[bm_slot_id].serialNo; } else { - if (r4->dataSize > gRfuSlotStatusNI[r5]->recvBufferSize) + if (NI_comm->dataSize > gRfuSlotStatusNI[bm_slot_id]->recvBufferSize) { - r1 = 1 << r5; - gRfuStatic->recvErrorFlag |= r1; - gRfuLinkStatus->recvSlotNIFlag &= ~r1; - r4->errorCode = ERR_RECV_BUFF_OVER; - r4->state = SLOT_STATE_RECV_FAILED; - rfu_STC_releaseFrame(r5, 1, r4); + bm_slot_flag = 1 << bm_slot_id; + gRfuStatic->recvErrorFlag |= bm_slot_flag; + gRfuLinkStatus->recvSlotNIFlag &= ~bm_slot_flag; + NI_comm->errorCode = ERR_RECV_BUFF_OVER; + NI_comm->state = SLOT_STATE_RECV_FAILED; + rfu_STC_releaseFrame(bm_slot_id, 1, NI_comm); return; } - r4->now_p[0] = gRfuSlotStatusNI[r5]->recvBuffer; + NI_comm->now_p[0] = gRfuSlotStatusNI[bm_slot_id]->recvBuffer; } - for (r3 = 0; r3 < WINDOW_COUNT; ++r3) + for (win_id = 0; win_id < WINDOW_COUNT; ++win_id) { - r4->n[r3] = 0; - r4->now_p[r3] = &r4->now_p[0][r4->payloadSize * r3]; + NI_comm->n[win_id] = 0; + NI_comm->now_p[win_id] = &NI_comm->now_p[0][NI_comm->payloadSize * win_id]; } - r4->remainSize = r4->dataSize; - r4->state = SLOT_STATE_RECEIVING; + NI_comm->remainSize = NI_comm->dataSize; + NI_comm->state = SLOT_STATE_RECEIVING; } static void rfu_NI_checkCommFailCounter(void) { - u16 r12; - u32 r7; - u8 r2, r3; + u16 imeBak; + u32 recvRenewalFlag; + u8 bm_slot_flag, bm_slot_id; if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { - r12 = REG_IME; + imeBak = REG_IME; REG_IME = 0; - r7 = gRfuStatic->recvRenewalFlag >> 4; - for (r3 = 0; r3 < RFU_CHILD_MAX; ++r3) + recvRenewalFlag = gRfuStatic->recvRenewalFlag >> 4; + for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) { - r2 = 1 << r3; - if (gRfuLinkStatus->sendSlotNIFlag & r2 - && !(gRfuStatic->recvRenewalFlag & r2)) - ++gRfuSlotStatusNI[r3]->send.failCounter; - if (gRfuLinkStatus->recvSlotNIFlag & r2 - && !(r7 & r2)) - ++gRfuSlotStatusNI[r3]->recv.failCounter; + bm_slot_flag = 1 << bm_slot_id; + if (gRfuLinkStatus->sendSlotNIFlag & bm_slot_flag + && !(gRfuStatic->recvRenewalFlag & bm_slot_flag)) + ++gRfuSlotStatusNI[bm_slot_id]->send.failCounter; + if (gRfuLinkStatus->recvSlotNIFlag & bm_slot_flag + && !(recvRenewalFlag & bm_slot_flag)) + ++gRfuSlotStatusNI[bm_slot_id]->recv.failCounter; } gRfuStatic->recvRenewalFlag = 0; - REG_IME = r12; + REG_IME = imeBak; } } diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c index fc5701986..b6623540f 100644 --- a/src/librfu_sio32id.c +++ b/src/librfu_sio32id.c @@ -4,44 +4,56 @@ static void Sio32IDIntr(void); static void Sio32IDInit(void); static s32 Sio32IDMain(void); +struct RfuSIO32Id +{ + u8 MS_mode; + u8 state; + u16 count; + u16 send_id; + u16 recv_id; + u16 unk8; // unused + u16 lastId; +}; + struct RfuSIO32Id gRfuSIO32Id; static const u16 Sio32ConnectionData[] = { 0x494e, 0x544e, 0x4e45, 0x4f44 }; // NINTENDO static const char Sio32IDLib_Var[] = "Sio32ID_030820"; -s32 AgbRFU_checkID(u8 r5) +s32 AgbRFU_checkID(u8 maxTries) { - u16 r8; - vu16 *r4; - s32 r6; + u16 ieBak; + vu16 *regTMCNTL; + s32 id; + // Interrupts must be enabled if (REG_IME == 0) return -1; - r8 = REG_IE; + ieBak = REG_IE; gSTWIStatus->state = 10; STWI_set_Callback_ID(Sio32IDIntr); Sio32IDInit(); - r4 = ®_TMCNT_L(gSTWIStatus->timerSelect); - r5 *= 8; - while (--r5 != 0xFF) + regTMCNTL = ®_TMCNT_L(gSTWIStatus->timerSelect); + maxTries *= 8; + while (--maxTries != 0xFF) { - r6 = Sio32IDMain(); - if (r6 != 0) + id = Sio32IDMain(); + if (id != 0) break; - r4[1] = 0; - r4[0] = 0; - r4[1] = TIMER_1024CLK | TIMER_ENABLE; - while (r4[0] < 32) + regTMCNTL[1] = 0; + regTMCNTL[0] = 0; + regTMCNTL[1] = TIMER_1024CLK | TIMER_ENABLE; + while (regTMCNTL[0] < 32) ; - r4[1] = 0; - r4[0] = 0; + regTMCNTL[1] = 0; + regTMCNTL[0] = 0; } REG_IME = 0; - REG_IE = r8; + REG_IE = ieBak; REG_IME = 1; gSTWIStatus->state = 0; STWI_set_Callback_ID(NULL); - return r6; + return id; } static void Sio32IDInit(void) @@ -58,107 +70,105 @@ static void Sio32IDInit(void) static s32 Sio32IDMain(void) { - u8 r12; - - switch (r12 = gRfuSIO32Id.unk1) + switch (gRfuSIO32Id.state) { case 0: - gRfuSIO32Id.unk0 = 1; + gRfuSIO32Id.MS_mode = AGB_CLK_MASTER; REG_SIOCNT |= SIO_38400_BPS; - REG_IME = r12; + REG_IME = 0; REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; - gRfuSIO32Id.unk1 = 1; + gRfuSIO32Id.state = 1; *(vu8 *)®_SIOCNT |= SIO_ENABLE; break; case 1: - if (gRfuSIO32Id.unkA == 0) + if (gRfuSIO32Id.lastId == 0) { - if (gRfuSIO32Id.unk0 == 1) + if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER) { - if (gRfuSIO32Id.unk2 == 0) + if (gRfuSIO32Id.count == 0) { - REG_IME = gRfuSIO32Id.unk2; + REG_IME = 0; REG_SIOCNT |= SIO_ENABLE; - REG_IME = r12; + REG_IME = 1; } } - else if (gRfuSIO32Id.unk4 != 0x8001 && !gRfuSIO32Id.unk2) + else if (gRfuSIO32Id.send_id != RFU_ID && !gRfuSIO32Id.count) { - REG_IME = gRfuSIO32Id.unk2; + REG_IME = 0; REG_IE &= ~INTR_FLAG_SERIAL; - REG_IME = r12; - REG_SIOCNT = gRfuSIO32Id.unk2; + REG_IME = 1; + REG_SIOCNT = 0; REG_SIOCNT = SIO_32BIT_MODE; REG_IF = INTR_FLAG_SERIAL; REG_SIOCNT |= SIO_INTR_ENABLE | SIO_ENABLE; - REG_IME = gRfuSIO32Id.unk2; + REG_IME = 0; REG_IE |= INTR_FLAG_SERIAL; - REG_IME = r12; + REG_IME = 1; } break; } else { - gRfuSIO32Id.unk1 = 2; + gRfuSIO32Id.state = 2; // fallthrough } default: - return gRfuSIO32Id.unkA; + return gRfuSIO32Id.lastId; } return 0; } static void Sio32IDIntr(void) { - u32 r5; - u16 r0; + u32 regSIODATA32; + u16 delay; #ifndef NONMATCHING - register u32 r1 asm("r1"); - register u16 r0_ asm("r0"); + register u32 rfuSIO32IdUnk0_times_16 asm("r1"); + register u16 negRfuSIO32IdUnk6 asm("r0"); #else - u32 r1; - u16 r0_; + u32 rfuSIO32IdUnk0_times_16; + u16 negRfuSIO32IdUnk6; #endif - r5 = REG_SIODATA32; - if (gRfuSIO32Id.unk0 != 1) + regSIODATA32 = REG_SIODATA32; + if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER) REG_SIOCNT |= SIO_ENABLE; - r1 = 16 * gRfuSIO32Id.unk0; // to handle side effect of inline asm - r1 = (r5 << r1) >> 16; - r5 = (r5 << 16 * (1 - gRfuSIO32Id.unk0)) >> 16; - if (gRfuSIO32Id.unkA == 0) + rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm + rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16; + regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16; + if (gRfuSIO32Id.lastId == 0) { - if (r1 == gRfuSIO32Id.unk6) + if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id) { - if (gRfuSIO32Id.unk2 > 3) + if (gRfuSIO32Id.count > 3) { - gRfuSIO32Id.unkA = r5; + gRfuSIO32Id.lastId = regSIODATA32; } - else if (r1 == (u16)~gRfuSIO32Id.unk4) + else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id) { - r0_ = ~gRfuSIO32Id.unk6; - if (r5 == r0_) - ++gRfuSIO32Id.unk2; + negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id; + if (regSIODATA32 == negRfuSIO32IdUnk6) + ++gRfuSIO32Id.count; } } else { - gRfuSIO32Id.unk2 = gRfuSIO32Id.unkA; + gRfuSIO32Id.count = 0; } } - if (gRfuSIO32Id.unk2 < 4) - gRfuSIO32Id.unk4 = *(gRfuSIO32Id.unk2 + Sio32ConnectionData); + if (gRfuSIO32Id.count < 4) + gRfuSIO32Id.send_id = *(gRfuSIO32Id.count + Sio32ConnectionData); else - gRfuSIO32Id.unk4 = 0x8001; - gRfuSIO32Id.unk6 = ~r5; - REG_SIODATA32 = (gRfuSIO32Id.unk4 << 16 * (1 - gRfuSIO32Id.unk0)) - + (gRfuSIO32Id.unk6 << 16 * gRfuSIO32Id.unk0); - if (gRfuSIO32Id.unk0 == 1 && (gRfuSIO32Id.unk2 || r5 == 0x494E)) + gRfuSIO32Id.send_id = RFU_ID; + gRfuSIO32Id.recv_id = ~regSIODATA32; + REG_SIODATA32 = (gRfuSIO32Id.send_id << 16 * (1 - gRfuSIO32Id.MS_mode)) + + (gRfuSIO32Id.recv_id << 16 * gRfuSIO32Id.MS_mode); + if (gRfuSIO32Id.MS_mode == AGB_CLK_MASTER && (gRfuSIO32Id.count != 0 || regSIODATA32 == 0x494e)) { - for (r0 = 0; r0 < 600; ++r0) + for (delay = 0; delay < 600; ++delay) ; - if (gRfuSIO32Id.unkA == 0) + if (gRfuSIO32Id.lastId == 0) REG_SIOCNT |= SIO_ENABLE; } } diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c index b88f21737..0287b358a 100644 --- a/src/librfu_stwi.c +++ b/src/librfu_stwi.c @@ -28,8 +28,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b } gSTWIStatus->rxPacket = &interruptStruct->rxPacketAlloc; gSTWIStatus->txPacket = &interruptStruct->txPacketAlloc; - gSTWIStatus->msMode = 1; - gSTWIStatus->state = 0; + gSTWIStatus->msMode = AGB_CLK_MASTER; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; @@ -39,7 +39,7 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; gSTWIStatus->recoveryCount = 0; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; REG_RCNT = 0x100; // TODO: mystery bit? REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; STWI_init_Callback_M(); @@ -71,7 +71,7 @@ void AgbRFU_SoftReset(void) *timerH = 3; REG_RCNT = 0x80A0; REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->reqActiveCommand = 0; @@ -81,9 +81,9 @@ void AgbRFU_SoftReset(void) gSTWIStatus->timerState = 0; gSTWIStatus->timerActive = 0; gSTWIStatus->error = 0; - gSTWIStatus->msMode = 1; + gSTWIStatus->msMode = AGB_CLK_MASTER; gSTWIStatus->recoveryCount = 0; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; } void STWI_set_MS_mode(u8 mode) @@ -131,12 +131,12 @@ void STWI_set_Callback_S(void (*callbackS)(u16)) void STWI_set_Callback_ID(void (*func)(void)) // name in SDK, but is actually setting a function pointer { - gSTWIStatus->unk_20 = func; + gSTWIStatus->callbackID = func; } u16 STWI_poll_CommandEnd(void) { - while (gSTWIStatus->unk_2c == TRUE) + while (gSTWIStatus->sending == 1) ; return gSTWIStatus->error; } @@ -195,7 +195,7 @@ void STWI_send_ConfigStatusREQ(void) } } -void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) +void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname) { u8 *packetBytes; s32 i; @@ -203,29 +203,28 @@ void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data) if (!STWI_init(ID_GAME_CONFIG_REQ)) { gSTWIStatus->reqLength = 6; - // TODO: what is unk1 packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *(u16 *)packetBytes = *(u16 *)unk1; + *(u16 *)packetBytes = *(u16 *)serial_gname; packetBytes += sizeof(u16); - unk1 += sizeof(u16); + serial_gname += sizeof(u16); for (i = 0; i < 14; ++i) { - *packetBytes = *unk1; + *packetBytes = *serial_gname; ++packetBytes; - ++unk1; + ++serial_gname; } for (i = 0; i < 8; ++i) { - *packetBytes = *data; + *packetBytes = *uname; ++packetBytes; - ++data; + ++uname; } STWI_start_Command(); } } -void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +void STWI_send_SystemConfigREQ(u16 availSlotFlag, u8 maxMFrame, u8 mcTimer) { if (!STWI_init(ID_SYSTEM_CONFIG_REQ)) { @@ -234,9 +233,9 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) gSTWIStatus->reqLength = 1; packetBytes = gSTWIStatus->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); - *packetBytes++ = unk3; - *packetBytes++ = unk2; - *(u16*)packetBytes = unk1; + *packetBytes++ = mcTimer; + *packetBytes++ = maxMFrame; + *(u16*)packetBytes = availSlotFlag; STWI_start_Command(); } } @@ -499,20 +498,17 @@ static void STWI_intr_timer(void) STWI_stop_timer(); STWI_reset_ClockCounter(); if (gSTWIStatus->callbackM != NULL) - gSTWIStatus->callbackM(255, 0); + gSTWIStatus->callbackM(ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ, 0); break; } } -static void STWI_set_timer(u8 unk) +static void STWI_set_timer(u8 count) { - vu16 *timerL; - vu16 *timerH; - - timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); - timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); + vu16 *timerL = ®_TMCNT_L(gSTWIStatus->timerSelect); + vu16 *timerH = ®_TMCNT_H(gSTWIStatus->timerSelect); REG_IME = 0; - switch (unk) + switch (count) { case 50: *timerL = 0xFCCB; @@ -543,25 +539,31 @@ static void STWI_stop_timer(void) REG_TMCNT_H(gSTWIStatus->timerSelect) = 0; } +/* + * Set up STWI to send REQ. Returns 1 if error (see below). + */ static u16 STWI_init(u8 request) { if (!REG_IME) { + // Can't start sending if IME is disabled. gSTWIStatus->error = ERR_REQ_CMD_IME_DISABLE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if (gSTWIStatus->unk_2c == TRUE) + else if (gSTWIStatus->sending == 1) { + // Already sending something. Cancel and error. gSTWIStatus->error = ERR_REQ_CMD_SENDING; - gSTWIStatus->unk_2c = FALSE; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error); return TRUE; } - else if(!gSTWIStatus->msMode) + else if (gSTWIStatus->msMode == AGB_CLK_SLAVE) { + // Can't send if clock slave gSTWIStatus->error = ERR_REQ_CMD_CLOCK_SLAVE; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(request, gSTWIStatus->error, gSTWIStatus); @@ -569,9 +571,10 @@ static u16 STWI_init(u8 request) } else { - gSTWIStatus->unk_2c = TRUE; + // Good to go, start sending + gSTWIStatus->sending = 1; gSTWIStatus->reqActiveCommand = request; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; gSTWIStatus->ackLength = 0; @@ -595,7 +598,7 @@ static s32 STWI_start_Command(void) // but the cast here is required to avoid register issue *(u32 *)gSTWIStatus->txPacket->rfuPacket8.data = 0x99660000 | (gSTWIStatus->reqLength << 8) | gSTWIStatus->reqActiveCommand; REG_SIODATA32 = gSTWIStatus->txPacket->rfuPacket32.command; - gSTWIStatus->state = 0; + gSTWIStatus->state = 0; // master send req gSTWIStatus->reqNext = 1; imeTemp = REG_IME; REG_IME = 0; @@ -608,7 +611,7 @@ static s32 STWI_start_Command(void) static s32 STWI_restart_Command(void) { - if (gSTWIStatus->recoveryCount <= 1) + if (gSTWIStatus->recoveryCount < 2) { ++gSTWIStatus->recoveryCount; STWI_start_Command(); @@ -618,17 +621,17 @@ static s32 STWI_restart_Command(void) if (gSTWIStatus->reqActiveCommand == ID_MS_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_DATA_TX_AND_CHANGE_REQ || gSTWIStatus->reqActiveCommand == ID_UNK35_REQ || gSTWIStatus->reqActiveCommand == ID_RESUME_RETRANSMIT_AND_CHANGE_REQ) { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); } else { gSTWIStatus->error = ERR_REQ_CMD_CLOCK_DRIFT; - gSTWIStatus->unk_2c = 0; + gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) gSTWIStatus->callbackM(gSTWIStatus->reqActiveCommand, gSTWIStatus->error); - gSTWIStatus->state = 4; // TODO: what's 4 + gSTWIStatus->state = 4; // error } } return 0; @@ -636,7 +639,7 @@ static s32 STWI_restart_Command(void) static s32 STWI_reset_ClockCounter(void) { - gSTWIStatus->state = 5; // TODO: what is 5 + gSTWIStatus->state = 5; // slave receive req init gSTWIStatus->reqLength = 0; gSTWIStatus->reqNext = 0; REG_SIODATA32 = (1 << 31); diff --git a/src/link.c b/src/link.c index dfb21f126..f5c850d63 100644 --- a/src/link.c +++ b/src/link.c @@ -235,7 +235,7 @@ bool8 IsWirelessAdapterConnected(void) sub_800B1F4(); sub_80F86F4(); sub_80FB128(TRUE); - if (sub_80FD3A4() == RFU_ID) + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { rfu_REQ_stopMode(); rfu_waitREQComplete(); @@ -721,7 +721,7 @@ void sub_8009FE8(void) { if (gWirelessCommType) { - sub_80F9828(); + StartSendingKeysToRfu(); } gLinkCallback = sub_800A040; } @@ -1448,7 +1448,7 @@ static void CheckErrorStatus(void) } } -void sub_800ACBC(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) +void SetLinkErrorFromRfu(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, u8 unk_06) { sLinkErrorBuffer.status = status; sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; @@ -1670,8 +1670,8 @@ bool8 HandleLinkConnection(void) } else { - r4 = sub_80FAE94(); - r5 = sub_80FAEF0(); + r4 = LinkRfuMain1(); + r5 = LinkRfuMain2(); if (sub_8058318() == TRUE) { if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5) diff --git a/src/link_rfu.c b/src/link_rfu.c index 8ab76ffd5..89245398d 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -2,190 +2,188 @@ #include "librfu.h" #include "link_rfu.h" -struct UnkRfuStruct_1 gUnknown_3005E10; +LINK_MANAGER lman; -static void sub_80FD4E4(void); -static void sub_80FDC28(u32 a0); -static void sub_80FDC98(u16 reqCommandId, u16 reqResult); -static void sub_80FE394(u16 reqCommandId); -static void sub_80FE418(void); -static void sub_80FE63C(void); -static void sub_80FE6F0(void); -static void sub_80FE74C(void); -static u8 sub_80FE778(void); -static void sub_80FE7F0(u8 a0, u8 a1); -static void sub_80FE818(u8 bmDisconnectSlot); -static void sub_80FE83C(u8 a0); -static void sub_80FE918(void); -static void sub_80FEAF4(void); +static void rfu_LMAN_clearVariables(void); +static void rfu_LMAN_settingPCSWITCH(u32 rand); +static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult); +static void rfu_LMAN_MSC_callback(u16 reqCommandId); +static void rfu_LMAN_PARENT_checkRecvChildName(void); +static void rfu_LMAN_CHILD_checkSendChildName(void); +static void rfu_LMAN_CHILD_checkSendChildName2(void); +static void rfu_LMAN_CHILD_linkRecoveryProcess(void); +static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void); +static void rfu_LMAN_occureCallback(u8 msg, u8 param_count); +static void rfu_LMAN_disconnect(u8 bmDisconnectSlot); +static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot); +static void rfu_LMAN_checkNICommunicateStatus(void); +static void rfu_LMAN_managerChangeAgbClockMaster(void); -u32 sub_80FD3A4(void) +u32 rfu_LMAN_REQBN_softReset_and_checkID(void) { u32 id = rfu_REQBN_softReset_and_checkID(); if (id == RFU_ID) - gUnknown_3005E10.unk_08 = 1; - if (gUnknown_3005E10.unk_04 != 0x17 && gUnknown_3005E10.unk_04 != 0x01) + lman.RFU_powerOn_flag = 1; + if (lman.state != LMAN_FORCED_STOP_AND_RFU_RESET && lman.state != LMAN_STATE_SOFT_RESET_AND_CHECK_ID) { - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } - gUnknown_3005E10.unk_07 = 0; - gUnknown_3005E10.unk_0d = 0; - gUnknown_3005E10.unk_01 = 0; - gUnknown_3005E10.unk_00 = 0; - gUnknown_3005E10.unk_06 = -1; - sub_80FEAF4(); + lman.pcswitch_flag = 0; + lman.reserveDisconnectSlot_flag = 0; + lman.acceptCount = 0; + lman.acceptSlot_flag = 0; + lman.parent_child = MODE_NEUTRAL; + rfu_LMAN_managerChangeAgbClockMaster(); return id; } -void LinkRfu_REQ_SendData_HandleParentRelationship(u8 clockChangeFlag) +void rfu_LMAN_REQ_sendData(u8 clockChangeFlag) { if (gRfuLinkStatus->parentChild == MODE_CHILD) { - if (gUnknown_3005E10.unk_02 == TRUE) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) clockChangeFlag = TRUE; else clockChangeFlag = FALSE; } else - gUnknown_3005E10.unk_03 = 0; + lman.parentAck_flag = 0; rfu_REQ_sendData(clockChangeFlag); } -s32 sub_80FD430(void (*func1)(u8, u8), void (*func2)(u16)) +u8 rfu_LMAN_initializeManager(void (*LMAN_callback_p)(u8, u8), void (*MSC_callback_p)(u16)) { - if (func1 == NULL) + if (LMAN_callback_p == NULL) { - return 4; + return LMAN_ERROR_ILLEGAL_PARAMETER; } - CpuFill16(0, &gUnknown_3005E10, sizeof(struct UnkRfuStruct_1)); - gUnknown_3005E10.unk_06 = -1; - gUnknown_3005E10.unk_40 = func1; - gUnknown_3005E10.unk_44 = func2; - rfu_setMSCCallback(sub_80FE394); - rfu_setREQCallback(sub_80FDC98); + CpuFill16(0, &lman, sizeof(struct linkManagerTag)); + lman.parent_child = MODE_NEUTRAL; + lman.LMAN_callback = LMAN_callback_p; + lman.MSC_callback = MSC_callback_p; + rfu_setMSCCallback(rfu_LMAN_MSC_callback); + rfu_setREQCallback(rfu_LMAN_REQ_callback); return 0; } -static void sub_80FD484(void) +static void rfu_LMAN_endManager(void) { - CpuFill16(0, &gUnknown_3005E10, offsetof(struct UnkRfuStruct_1, unk_40)); - gUnknown_3005E10.unk_06 = -1; + CpuFill16(0, &lman, sizeof(struct linkManagerTag) - 8); + lman.parent_child = MODE_NEUTRAL; } -void sub_80FD4B0(const struct UnkLinkRfuStruct_02022B2C *unk0) +void rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters) { - sub_80FD4E4(); - gUnknown_3005E10.unk_04 = 1; - gUnknown_3005E10.unk_05 = 2; - gUnknown_3005E10.unk_3c = unk0; - gUnknown_3005E10.unk_09 = unk0->unk_11; - gUnknown_3005E10.unk_32 = unk0->unk_12; - gUnknown_3005E10.unk_18 = unk0->unk_14; - if (unk0->unk_10) + rfu_LMAN_clearVariables(); + lman.state = LMAN_STATE_SOFT_RESET_AND_CHECK_ID; + lman.next_state = LMAN_STATE_RESET; + lman.init_param = init_parameters; + lman.linkRecovery_enable = init_parameters->linkRecovery_enable; + lman.linkRecoveryTimer.count_max = init_parameters->linkRecovery_period; + lman.NI_failCounter_limit = init_parameters->NI_failCounter_limit; + if (init_parameters->fastSearchParent_flag) { - gUnknown_3005E10.unk_0b = 1; + lman.fastSearchParent_flag = 1; } } -static void sub_80FD4E4(void) +static void rfu_LMAN_clearVariables(void) { u8 i; - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - gUnknown_3005E10.unk_06 = -1; - gUnknown_3005E10.unk_07 = 0; - gUnknown_3005E10.unk_10 = 0; - gUnknown_3005E10.unk_0c = 0; - gUnknown_3005E10.unk_24 = 0; - gUnknown_3005E10.unk_30 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; + lman.parent_child = MODE_NEUTRAL; + lman.pcswitch_flag = 0; + lman.child_slot = 0; + lman.connectSlot_flag_old = 0; + lman.nameAcceptTimer.active = 0; + lman.linkRecoveryTimer.active = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { - gUnknown_3005E10.unk_28[i] = 0; - gUnknown_3005E10.unk_34[i] = 0; + lman.nameAcceptTimer.count[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } -void sub_80FD52C(void) +void rfu_LMAN_powerDownRFU(void) { - gUnknown_3005E10.unk_04 = 0x15; + lman.state = LMAN_STATE_STOP_MODE; } -u8 sub_80FD538(u8 r5, u16 r7, u16 r8, const u16 *r6) +u8 rfu_LMAN_establishConnection(u8 parent_child, u16 connect_period, u16 name_accept_period, u16 *acceptable_serialNo_list) { u8 i; - const u16 *buffer; + u16 *serial_list; - if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 != 0x08 || r5 != 1)) + if (lman.state != LMAN_STATE_READY && (lman.state != LMAN_STATE_WAIT_RECV_CHILD_NAME || parent_child != 1)) { - gUnknown_3005E10.unk_14 = 1; - sub_80FE7F0(0xf3, 0x01); - return 1; + lman.param[0] = 1; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { - gUnknown_3005E10.unk_14 = 2; - sub_80FE7F0(0xf3, 0x01); - return 2; + lman.param[0] = 2; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_AGB_CLK_SLAVE; } - for (i = 0, buffer = r6; i < 16; i++) + for (i = 0, serial_list = acceptable_serialNo_list; i < 16; i++) { - if (*buffer++ == 0xFFFF) + if (*serial_list++ == 0xFFFF) { break; } } if (i == 16) { - gUnknown_3005E10.unk_14 = 4; - sub_80FE7F0(0xf3, 0x01); - return 4; + lman.param[0] = 4; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_ILLEGAL_PARAMETER; } - if (r5 > 1) + if (parent_child > 1) { - gUnknown_3005E10.unk_07 = 1; - r5 = 1; - r7 = 0; + lman.pcswitch_flag = 1; + parent_child = 1; + connect_period = 0; } else { - gUnknown_3005E10.unk_07 = 0; + lman.pcswitch_flag = 0; } - if (r5 != 0) + if (parent_child != 0) { - gUnknown_3005E10.unk_04 = 5; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } else { - gUnknown_3005E10.unk_04 = 9; - if (gUnknown_3005E10.unk_0b) + lman.state = LMAN_STATE_START_SEARCH_PARENT; + if (lman.fastSearchParent_flag) { - gUnknown_3005E10.unk_0b = 2; + lman.fastSearchParent_flag = 2; } } - gUnknown_3005E10.unk_06 = r5; - gUnknown_3005E10.unk_1a = r7; - gUnknown_3005E10.unk_26 = r8; - gUnknown_3005E10.unk_20 = r6; + lman.parent_child = parent_child; + lman.connect_period = connect_period; + lman.nameAcceptTimer.count_max = name_accept_period; + lman.acceptable_serialNo_list = acceptable_serialNo_list; return 0; } -u8 sub_80FD610(u16 parentId, u16 unk_1a) +u8 rfu_LMAN_CHILD_connectParent(u16 parentId, u16 connect_period) { u8 i; - if (gUnknown_3005E10.unk_04 != 0 && (gUnknown_3005E10.unk_04 < 9 || gUnknown_3005E10.unk_04 > 11)) + if (lman.state != LMAN_STATE_READY && (lman.state < 9 || lman.state > 11)) { - gUnknown_3005E10.unk_14 = 1; - sub_80FE7F0(0xF3, 0x01); - return 1; + lman.param[0] = 1; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_MANAGER_BUSY; } if (rfu_getMasterSlave() == AGB_CLK_SLAVE) { - gUnknown_3005E10.unk_14 = 2; - sub_80FE7F0(0xF3, 0x01); - return 2; + lman.param[0] = 2; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_AGB_CLK_SLAVE; } for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { @@ -196,546 +194,549 @@ u8 sub_80FD610(u16 parentId, u16 unk_1a) } if (gRfuLinkStatus->findParentCount == 0 || i == gRfuLinkStatus->findParentCount) { - gUnknown_3005E10.unk_14 = 3; - sub_80FE7F0(0xF3, 0x01); - return 3; + lman.param[0] = 3; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_PID_NOT_FOUND; } - if (gUnknown_3005E10.unk_04 == 0 || gUnknown_3005E10.unk_04 == 9) + if (lman.state == LMAN_STATE_READY || lman.state == LMAN_STATE_START_SEARCH_PARENT) { - gUnknown_3005E10.unk_04 = 12; - gUnknown_3005E10.unk_05 = 13; + lman.state = LMAN_STATE_START_CONNECT_PARENT; + lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } else { - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 12; + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_START_CONNECT_PARENT; } - gUnknown_3005E10.unk_1e = parentId; - gUnknown_3005E10.unk_1a = unk_1a; - if (gUnknown_3005E10.unk_07 != 0) + lman.work = parentId; + lman.connect_period = connect_period; + if (lman.pcswitch_flag != 0) { - gUnknown_3005E10.unk_07 = 7; + lman.pcswitch_flag = 7; } return 0; } -static void sub_80FD6F4(u8 lossSlot) +static void rfu_LMAN_PARENT_stopWaitLinkRecoveryAndDisconnect(u8 bm_targetSlot) { u8 i; - if (lossSlot & gUnknown_3005E10.unk_30) + if ((bm_targetSlot & lman.linkRecoveryTimer.active) == 0) + return; + lman.linkRecoveryTimer.active &= ~bm_targetSlot; + for (i = 0; i < RFU_CHILD_MAX; i++) { - gUnknown_3005E10.unk_30 &= ~lossSlot; - for (i = 0; i < RFU_CHILD_MAX; i++) - { - if ((lossSlot >> i) & 1) - { - gUnknown_3005E10.unk_34[i] = 0; - } - } - i = gRfuLinkStatus->linkLossSlotFlag & lossSlot; - if (i) + if ((bm_targetSlot >> i) & 1) { - sub_80FE818(i); + lman.linkRecoveryTimer.count[i] = 0; } - gUnknown_3005E10.unk_14 = i; - sub_80FE7F0(0x33, i); } + i = gRfuLinkStatus->linkLossSlotFlag & bm_targetSlot; + if (i) + { + rfu_LMAN_disconnect(i); + } + lman.param[0] = i; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, i); } -void sub_80FD760(bool8 a0) +void rfu_LMAN_stopManager(bool8 forced_stop_and_RFU_reset_flag) { - u8 r2; - - r2 = 0; - gUnknown_3005E10.unk_07 = 0; - if (a0) + u8 msg = 0; + lman.pcswitch_flag = 0; + if (forced_stop_and_RFU_reset_flag) { - sub_80FD4E4(); - gUnknown_3005E10.unk_04 = 23; + rfu_LMAN_clearVariables(); + lman.state = LMAN_FORCED_STOP_AND_RFU_RESET; + return; } - else + switch (lman.state) { - switch (gUnknown_3005E10.unk_04) - { - case 5: - gUnknown_3005E10.unk_04 = 8; - gUnknown_3005E10.unk_05 = 0; - r2 = 0x13; - break; - case 6: - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; - break; - case 7: - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; - break; - case 8: - break; - case 9: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x21; - break; - case 10: - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; - break; - case 11: - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; - break; - case 12: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x23; - break; - case 13: - gUnknown_3005E10.unk_04 = 14; - break; - case 14: - gUnknown_3005E10.unk_04 = 14; - break; - case 15: - break; - case 16: - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11; - gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12; - sub_80FE818(gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag; - sub_80FE7F0(0x33, 0x01); - return; - case 17: - gUnknown_3005E10.unk_04 = 18; - break; - case 18: - gUnknown_3005E10.unk_04 = 18; - break; - default: - gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_04 = 0; - r2 = 0x43; - break; - } - if (gUnknown_3005E10.unk_04 == 0) - { - sub_80FE7F0(r2, 0); - } + case LMAN_STATE_START_SEARCH_CHILD: + lman.state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED; + break; + case LMAN_STATE_POLL_SEARCH_CHILD: + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + break; + case LMAN_STATE_END_SEARCH_CHILD: + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; + break; + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + break; + case LMAN_STATE_START_SEARCH_PARENT: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED; + break; + case LMAN_STATE_POLL_SEARCH_PARENT: + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; + break; + case LMAN_STATE_END_SEARCH_PARENT: + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; + break; + case LMAN_STATE_START_CONNECT_PARENT: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_CONNECT_PARENT_FAILED; + break; + case LMAN_STATE_POLL_CONNECT_PARENT: + lman.state = LMAN_STATE_END_CONNECT_PARENT; + break; + case LMAN_STATE_END_CONNECT_PARENT: + lman.state = LMAN_STATE_END_CONNECT_PARENT; + break; + case LMAN_STATE_SEND_CHILD_NAME: + break; + case LMAN_STATE_START_LINK_RECOVERY: + lman.state = lman.state_bak[0]; + lman.next_state = lman.state_bak[1]; + rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); + return; + case LMAN_STATE_POLL_LINK_RECOVERY: + lman.state = LMAN_STATE_END_LINK_RECOVERY; + break; + case LMAN_STATE_END_LINK_RECOVERY: + lman.state = LMAN_STATE_END_LINK_RECOVERY; + break; + default: + lman.state = lman.next_state = LMAN_STATE_READY; + msg = LMAN_MSG_MANAGER_STOPPED; + break; + } + if (lman.state == LMAN_STATE_READY) + { + rfu_LMAN_occureCallback(msg, 0); } } -static bool8 sub_80FD850(u16 reqCommandId) +static bool8 rfu_LMAN_linkWatcher(u16 REQ_commandID) { - bool8 retVal; u8 i; - u8 bmLinkLossSlot; - u8 linkLossReason; - u8 parentBmLinkRecoverySlot; - u8 flags; + u8 bm_linkLossSlot; + u8 reason; + u8 bm_linkRecoverySlot; + u8 bm_disconnectSlot; - retVal = FALSE; - rfu_REQBN_watchLink(reqCommandId, &bmLinkLossSlot, &linkLossReason, &parentBmLinkRecoverySlot); - if (bmLinkLossSlot) + bool8 disconnect_occure_flag = FALSE; + rfu_REQBN_watchLink(REQ_commandID, &bm_linkLossSlot, &reason, &bm_linkRecoverySlot); + if (bm_linkLossSlot) { - gUnknown_3005E10.unk_14 = bmLinkLossSlot; - gUnknown_3005E10.unk_16 = linkLossReason; - if (gUnknown_3005E10.unk_09) + lman.param[0] = bm_linkLossSlot; + lman.param[1] = reason; + if (lman.linkRecovery_enable) { - gUnknown_3005E10.unk_0a = 1; - if (gUnknown_3005E10.unk_06 == 0 && linkLossReason == REASON_DISCONNECTED) + lman.linkRecovery_start_flag = 1; + if (lman.parent_child == 0 && reason == REASON_DISCONNECTED) { - gUnknown_3005E10.unk_0a = 4; + lman.linkRecovery_start_flag = 4; } - if (gUnknown_3005E10.unk_0a == 1) + if (lman.linkRecovery_start_flag == 1) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((bmLinkLossSlot >> i) & 1) + if ((bm_linkLossSlot >> i) & 1) { - gUnknown_3005E10.unk_30 |= (1 << i); - gUnknown_3005E10.unk_34[i] = gUnknown_3005E10.unk_32; + lman.linkRecoveryTimer.active |= (1 << i); + lman.linkRecoveryTimer.count[i] = lman.linkRecoveryTimer.count_max; } } - sub_80FE7F0(0x31, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY, 1); } else { - gUnknown_3005E10.unk_0a = 0; - sub_80FE818(bmLinkLossSlot); - retVal = TRUE; - sub_80FE7F0(0x33, 0x01); + lman.linkRecovery_start_flag = 0; + rfu_LMAN_disconnect(bm_linkLossSlot); + disconnect_occure_flag = TRUE; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } else { - sub_80FE818(bmLinkLossSlot); - retVal = TRUE; - sub_80FE7F0(0x30, 0x02); + rfu_LMAN_disconnect(bm_linkLossSlot); + disconnect_occure_flag = TRUE; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED, 2); } - sub_80FEAF4(); + rfu_LMAN_managerChangeAgbClockMaster(); } if (gRfuLinkStatus->parentChild == MODE_PARENT) { - if (parentBmLinkRecoverySlot) + if (bm_linkRecoverySlot) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_30 >> i) & 1 && (parentBmLinkRecoverySlot >> i) & 1) + if ((lman.linkRecoveryTimer.active >> i) & 1 && (bm_linkRecoverySlot >> i) & 1) { - gUnknown_3005E10.unk_34[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } - gUnknown_3005E10.unk_30 &= ~parentBmLinkRecoverySlot; - gUnknown_3005E10.unk_14 = parentBmLinkRecoverySlot; - sub_80FE7F0(0x32, 0x01); + lman.linkRecoveryTimer.active &= ~bm_linkRecoverySlot; + lman.param[0] = bm_linkRecoverySlot; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_SUCCESSED, 1); } - if (gUnknown_3005E10.unk_30) + if (lman.linkRecoveryTimer.active) { - flags = 0; + bm_disconnectSlot = 0; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_30 >> i) & 1 && gUnknown_3005E10.unk_34[i] && --gUnknown_3005E10.unk_34[i] == 0) + if ((lman.linkRecoveryTimer.active >> i) & 1 && lman.linkRecoveryTimer.count[i] && --lman.linkRecoveryTimer.count[i] == 0) { - gUnknown_3005E10.unk_30 &= ~(1 << i); - flags |= (1 << i); + lman.linkRecoveryTimer.active &= ~(1 << i); + bm_disconnectSlot |= (1 << i); } } - if (flags) + if (bm_disconnectSlot) { - sub_80FE818(flags); - retVal = TRUE; - gUnknown_3005E10.unk_14 = flags; - sub_80FE7F0(0x33, 0x01); + rfu_LMAN_disconnect(bm_disconnectSlot); + disconnect_occure_flag = TRUE; + lman.param[0] = bm_disconnectSlot; + rfu_LMAN_occureCallback(LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED, 1); } } - if (!gUnknown_3005E10.unk_30) + if (!lman.linkRecoveryTimer.active) { - gUnknown_3005E10.unk_0a = 0; + lman.linkRecovery_start_flag = 0; } } - return retVal; + return disconnect_occure_flag; } -void LinkRfu_syncVBlank_(void) +void rfu_LMAN_syncVBlank(void) { if (rfu_syncVBlank()) { - sub_80FE7F0(0xF1, 0x00); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_WATCH_DOG_TIMER_ERROR, 0); + rfu_LMAN_managerChangeAgbClockMaster(); } } -void sub_80FDA30(u32 a0) +void rfu_LMAN_manager_entity(u32 rand) { - u8 r2; + u8 msg; - if (gUnknown_3005E10.unk_40 == NULL && gUnknown_3005E10.unk_04 != 0) + if (lman.LMAN_callback == NULL && lman.state != LMAN_STATE_READY) { - gUnknown_3005E10.unk_04 = 0; + lman.state = LMAN_STATE_READY; + return; } - else + if (lman.pcswitch_flag) { - if (gUnknown_3005E10.unk_07 != 0) - { - sub_80FDC28(a0); - } - do + rfu_LMAN_settingPCSWITCH(rand); + } + while (1) + { + if (lman.state != LMAN_STATE_READY) { - if (gUnknown_3005E10.unk_04 != 0) + rfu_waitREQComplete(); + lman.active = 1; + switch (lman.state) { - rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = 1; - switch (gUnknown_3005E10.unk_04) + case LMAN_FORCED_STOP_AND_RFU_RESET: + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { - case 23: - r2 = sub_80FD3A4() == RFU_ID ? 0x44 : 0xFF; - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(r2, 0); - break; - case 1: - if (sub_80FD3A4() == RFU_ID) - { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 3; - } - else - { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0xFF, 0); - } - break; - case 2: - rfu_REQ_reset(); - break; - case 3: - rfu_REQ_configSystem(gUnknown_3005E10.unk_3c->availSlotFlag, gUnknown_3005E10.unk_3c->maxMFrame, gUnknown_3005E10.unk_3c->mcTimer); - break; - case 4: - rfu_REQ_configGameData(gUnknown_3005E10.unk_3c->mbootFlag, gUnknown_3005E10.unk_3c->serialNo, (const u8 *)gUnknown_3005E10.unk_3c->gname, gUnknown_3005E10.unk_3c->uname); - break; - case 5: - rfu_REQ_startSearchChild(); - break; - case 6: - rfu_REQ_pollSearchChild(); - break; - case 7: - rfu_REQ_endSearchChild(); - break; - case 8: - break; - case 9: - rfu_REQ_startSearchParent(); - break; - case 10: - rfu_REQ_pollSearchParent(); - break; - case 11: - rfu_REQ_endSearchParent(); - break; - case 12: - rfu_REQ_startConnectParent(gUnknown_3005E10.unk_1e); - break; - case 13: - rfu_REQ_pollConnectParent(); - break; - case 14: - rfu_REQ_endConnectParent(); - break; - case 15: - break; - case 16: - rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); - break; - case 17: - rfu_REQ_CHILD_pollConnectRecovery(); - break; - case 18: - rfu_REQ_CHILD_endConnectRecovery(); - break; - case 19: - rfu_REQ_changeMasterSlave(); - break; - case 20: - break; - case 21: - rfu_REQ_stopMode(); - break; - case 22: - break; + msg=LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET; } - rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = 0; + else + { + msg=LMAN_MSG_RFU_FATAL_ERROR; + } + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(msg, 0); + break; + case LMAN_STATE_SOFT_RESET_AND_CHECK_ID: + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) + { + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_CONFIG_SYSTEM; + } + else + { + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_RFU_FATAL_ERROR, 0); + } + break; + case LMAN_STATE_RESET: + rfu_REQ_reset(); + break; + case LMAN_STATE_CONFIG_SYSTEM: + rfu_REQ_configSystem(lman.init_param->availSlot_flag, lman.init_param->maxMFrame, lman.init_param->MC_TimerCount); + break; + case LMAN_STATE_CONFIG_GAME_DATA: + rfu_REQ_configGameData(lman.init_param->mboot_flag, lman.init_param->serialNo, (const u8 *)lman.init_param->gameName, lman.init_param->userName); + break; + case LMAN_STATE_START_SEARCH_CHILD: + rfu_REQ_startSearchChild(); + break; + case LMAN_STATE_POLL_SEARCH_CHILD: + rfu_REQ_pollSearchChild(); + break; + case LMAN_STATE_END_SEARCH_CHILD: + rfu_REQ_endSearchChild(); + break; + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + break; + case LMAN_STATE_START_SEARCH_PARENT: + rfu_REQ_startSearchParent(); + break; + case LMAN_STATE_POLL_SEARCH_PARENT: + rfu_REQ_pollSearchParent(); + break; + case LMAN_STATE_END_SEARCH_PARENT: + rfu_REQ_endSearchParent(); + break; + case LMAN_STATE_START_CONNECT_PARENT: + rfu_REQ_startConnectParent(lman.work); + break; + case LMAN_STATE_POLL_CONNECT_PARENT: + rfu_REQ_pollConnectParent(); + break; + case LMAN_STATE_END_CONNECT_PARENT: + rfu_REQ_endConnectParent(); + break; + case LMAN_STATE_SEND_CHILD_NAME: + break; + case LMAN_STATE_START_LINK_RECOVERY: + rfu_REQ_CHILD_startConnectRecovery(gRfuLinkStatus->linkLossSlotFlag); + break; + case LMAN_STATE_POLL_LINK_RECOVERY: + rfu_REQ_CHILD_pollConnectRecovery(); + break; + case LMAN_STATE_END_LINK_RECOVERY: + rfu_REQ_CHILD_endConnectRecovery(); + break; + case LMAN_STATE_MS_CHANGE: + rfu_REQ_changeMasterSlave(); + break; + case LMAN_STATE_WAIT_CLOCK_MASTER: + break; + case LMAN_STATE_STOP_MODE: + rfu_REQ_stopMode(); + break; + case LMAN_STATE_BACK_STATE: + break; + default: + break; } - } while (gUnknown_3005E10.unk_04 == 18 || gUnknown_3005E10.unk_04 == 19); - if (gRfuLinkStatus->parentChild != MODE_PARENT || !sub_80FD850(0)) - { - sub_80FE418(); - sub_80FE63C(); - sub_80FE74C(); - sub_80FE918(); + rfu_waitREQComplete(); + lman.active = 0; } + if (lman.state == LMAN_STATE_END_LINK_RECOVERY || lman.state == LMAN_STATE_MS_CHANGE) + ; + else + break; + } + if (gRfuLinkStatus->parentChild == MODE_PARENT) + { + if (rfu_LMAN_linkWatcher(0)) + return; } + rfu_LMAN_PARENT_checkRecvChildName(); + rfu_LMAN_CHILD_checkSendChildName(); + rfu_LMAN_CHILD_linkRecoveryProcess(); + rfu_LMAN_checkNICommunicateStatus(); } -static void sub_80FDC28(u32 a0) +static void rfu_LMAN_settingPCSWITCH(u32 rand) { - if (gUnknown_3005E10.unk_07 == 5) + if (lman.pcswitch_flag == 5) { - gUnknown_3005E10.unk_06 = 1; - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c; - if (gUnknown_3005E10.unk_1a) + lman.parent_child = MODE_PARENT; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.connect_period = lman.pcswitch_period_bak; + if (lman.connect_period) { - gUnknown_3005E10.unk_07 = 6; + lman.pcswitch_flag = 6; } else { - gUnknown_3005E10.unk_07 = 1; + lman.pcswitch_flag = 1; } } - if (gUnknown_3005E10.unk_07 == 1) + if (lman.pcswitch_flag == 1) { - gUnknown_3005E10.unk_06 = 1; - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_1a = a0 % 140; - gUnknown_3005E10.unk_1c = 140 - gUnknown_3005E10.unk_1a; - if (gUnknown_3005E10.unk_1a) + lman.parent_child = MODE_PARENT; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.connect_period = rand % 140; + lman.pcswitch_period_bak = 140 - lman.connect_period; + if (lman.connect_period) { - gUnknown_3005E10.unk_07 = 2; + lman.pcswitch_flag = 2; } else { - gUnknown_3005E10.unk_07 = 3; + lman.pcswitch_flag = 3; } } - if (gUnknown_3005E10.unk_07 == 3) + if (lman.pcswitch_flag == 3) { - gUnknown_3005E10.unk_06 = 0; - gUnknown_3005E10.unk_1a = 40; - gUnknown_3005E10.unk_07 = 4; - gUnknown_3005E10.unk_04 = 9; + lman.parent_child = MODE_CHILD; + lman.connect_period = 40; + lman.pcswitch_flag = 4; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } } -static void sub_80FDC98(u16 reqCommandId, u16 reqResult) +static void rfu_LMAN_REQ_callback(u16 reqCommandId, u16 reqResult) { - u8 sp0; - register u8 *stwiRecvBuffer asm("r0"); - u8 *tmp; + u8 status; + u8 *stwiRecvBuffer; u8 i; - if (gUnknown_3005E10.unk_0e != 0) + if (lman.active != 0) { - gUnknown_3005E10.unk_0e = 0; + lman.active = 0; switch (reqCommandId) { case ID_RESET_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 4; + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_CONFIG_GAME_DATA; } break; case ID_SYSTEM_CONFIG_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_READY; } break; case ID_GAME_CONFIG_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x00, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_INITIALIZE_COMPLETED, 0); } break; case ID_SC_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 6; + lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_CHILD; } break; case ID_SC_POLL_REQ: - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 7; - gUnknown_3005E10.unk_05 = 8; + lman.state = LMAN_STATE_END_SEARCH_CHILD; + lman.next_state = LMAN_STATE_WAIT_RECV_CHILD_NAME; } break; case ID_SC_END_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_05 = 0; - if (gUnknown_3005E10.unk_07 == 0) + lman.state = lman.next_state; + lman.next_state = LMAN_STATE_READY; + if (lman.pcswitch_flag == 0) { - sub_80FE7F0(0x13, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED, 0); } } break; case ID_SP_START_REQ: if (reqResult == 0) { - if (gUnknown_3005E10.unk_0b == 1 && gUnknown_3005E10.unk_1a > 1) + if (lman.fastSearchParent_flag == 1 && lman.connect_period > 1) { - gUnknown_3005E10.unk_1a--; + lman.connect_period--; } - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 10; + lman.state = lman.next_state = LMAN_STATE_POLL_SEARCH_PARENT; } break; case ID_SP_POLL_REQ: if (reqResult == 0) { - sp0 = sub_80FE778(); - gUnknown_3005E10.unk_14 = sp0; - if (sp0) + status = rfu_LMAN_CHILD_checkEnableParentCandidate(); + lman.param[0] = status; + if (status) { - sub_80FE7F0(0x20, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_PARENT_FOUND, 1); } - if (gUnknown_3005E10.unk_0b && gUnknown_3005E10.unk_1a != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX) + if (lman.fastSearchParent_flag && lman.connect_period != 1 && gRfuLinkStatus->findParentCount == RFU_CHILD_MAX) { rfu_REQ_endSearchParent(); rfu_waitREQComplete(); - gUnknown_3005E10.unk_04 = 9; - gUnknown_3005E10.unk_0b = 1; + lman.state = LMAN_STATE_START_SEARCH_PARENT; + lman.fastSearchParent_flag = 1; } } - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 11; - gUnknown_3005E10.unk_05 = 0; + lman.state = LMAN_STATE_END_SEARCH_PARENT; + lman.next_state = LMAN_STATE_READY; } break; case ID_SP_END_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - if (gUnknown_3005E10.unk_07 == 0) + lman.state = lman.next_state; + if (lman.pcswitch_flag == 0) { - if (gUnknown_3005E10.unk_04 == 0) + if (lman.state == LMAN_STATE_READY) { - sub_80FE7F0(0x21, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED, 0); } } - else if (gUnknown_3005E10.unk_07 != 7) + else if (lman.pcswitch_flag != 7) { - gUnknown_3005E10.unk_04 = 5; - gUnknown_3005E10.unk_07 = 5; + lman.state = LMAN_STATE_START_SEARCH_CHILD; + lman.pcswitch_flag = 5; } } break; case ID_CP_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 13; + lman.state = lman.next_state = LMAN_STATE_POLL_CONNECT_PARENT; } break; case ID_CP_POLL_REQ: - if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10) && !sp0) + if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot) && !status) { - gUnknown_3005E10.unk_04 = 14; + lman.state = LMAN_STATE_END_CONNECT_PARENT; } - if (gUnknown_3005E10.unk_1a && --gUnknown_3005E10.unk_1a == 0) + if (lman.connect_period && --lman.connect_period == 0) { - gUnknown_3005E10.unk_04 = 14; + lman.state = LMAN_STATE_END_CONNECT_PARENT; } break; case ID_CP_END_REQ: - if (reqResult == 0 && !rfu_getConnectParentStatus(&sp0, &gUnknown_3005E10.unk_10)) + if (reqResult == 0 && !rfu_getConnectParentStatus(&status, &lman.child_slot)) { - if (!sp0) + if (!status) { - gUnknown_3005E10.unk_04 = 19; - gUnknown_3005E10.unk_05 = 15; - gUnknown_3005E10.unk_1e = 0x22; - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_10; + lman.state = LMAN_STATE_MS_CHANGE; + lman.next_state = LMAN_STATE_SEND_CHILD_NAME; + lman.work = 0x22; + lman.param[0] = lman.child_slot; } else { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - gUnknown_3005E10.unk_1e = 0x23; - gUnknown_3005E10.unk_14 = sp0; - if (gUnknown_3005E10.unk_07) + lman.state = lman.next_state = LMAN_STATE_READY; + lman.work = 0x23; + lman.param[0] = status; + if (lman.pcswitch_flag) { - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } } - sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01); - gUnknown_3005E10.unk_1e = 0; + rfu_LMAN_occureCallback(lman.work, 0x01); + lman.work = 0; } break; case ID_CPR_START_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_14 = gRfuLinkStatus->linkLossSlotFlag; - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 17; - for (gUnknown_3005E10.unk_10 = 0; gUnknown_3005E10.unk_10 < RFU_CHILD_MAX; gUnknown_3005E10.unk_10++) + lman.param[0] = gRfuLinkStatus->linkLossSlotFlag; + lman.state = lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; + for (lman.child_slot = 0; lman.child_slot < RFU_CHILD_MAX; lman.child_slot++) { - if ((gRfuLinkStatus->linkLossSlotFlag >> gUnknown_3005E10.unk_10) & 1) + if ((gRfuLinkStatus->linkLossSlotFlag >> lman.child_slot) & 1) { break; } @@ -743,64 +744,63 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) } break; case ID_CPR_POLL_REQ: - if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0) && sp0 < 2) + if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status) && status < 2) { - gUnknown_3005E10.unk_04 = 18; + lman.state = LMAN_STATE_END_LINK_RECOVERY; } - if (gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] && --gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] == 0) + if (lman.linkRecoveryTimer.count[lman.child_slot] && --lman.linkRecoveryTimer.count[lman.child_slot] == 0) { - gUnknown_3005E10.unk_04 = 18; + lman.state = LMAN_STATE_END_LINK_RECOVERY; } break; case ID_CPR_END_REQ: - if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&sp0)) + if (reqResult == 0 && !rfu_CHILD_getConnectRecoveryStatus(&status)) { - if (!sp0) + if (!status) { - gUnknown_3005E10.unk_04 = 19; - gUnknown_3005E10.unk_05 = 22; - gUnknown_3005E10.unk_1e = 0x32; + lman.state = LMAN_STATE_MS_CHANGE; + lman.next_state = LMAN_STATE_BACK_STATE; + lman.work = 0x32; } else { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE818(gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_1e = 0x33; + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_disconnect(gRfuLinkStatus->linkLossSlotFlag); + lman.work = 0x33; } - gUnknown_3005E10.unk_34[gUnknown_3005E10.unk_10] = 0; - gUnknown_3005E10.unk_30 = 0; - gUnknown_3005E10.unk_0a = 0; - sub_80FE7F0(gUnknown_3005E10.unk_1e, 0x01); - gUnknown_3005E10.unk_1e = 0; + lman.linkRecoveryTimer.count[lman.child_slot] = 0; + lman.linkRecoveryTimer.active = 0; + lman.linkRecovery_start_flag = 0; + rfu_LMAN_occureCallback(lman.work, 0x01); + lman.work = 0; } break; case ID_MS_CHANGE_REQ: if (reqResult == 0) { - if (gUnknown_3005E10.unk_05 == 22) + if (lman.next_state == LMAN_STATE_BACK_STATE) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_11; - gUnknown_3005E10.unk_05 = gUnknown_3005E10.unk_12; - gUnknown_3005E10.unk_02 = 1; - sub_80FE7F0(0x41, 0x00); + lman.state = lman.state_bak[0]; + lman.next_state = lman.state_bak[1]; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); } - else if (gUnknown_3005E10.unk_05 == 15) + else if (lman.next_state == LMAN_STATE_SEND_CHILD_NAME) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_02 = 1; - sub_80FE7F0(0x41, 0x00); - gUnknown_3005E10.unk_24 |= 1 << gUnknown_3005E10.unk_10; - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = gUnknown_3005E10.unk_26; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - tmp = &sp0; - *tmp = rfu_NI_CHILD_setSendGameName(gUnknown_3005E10.unk_10, 0x0e); - if (*tmp) + lman.state = lman.next_state; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_ON; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_SLAVE, 0); + lman.nameAcceptTimer.active |= 1 << lman.child_slot; + lman.nameAcceptTimer.count[lman.child_slot] = lman.nameAcceptTimer.count_max; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + status = rfu_NI_CHILD_setSendGameName(lman.child_slot, 0x0e); + if (status) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FEAF4(); - sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = sp0; - sub_80FE7F0(0x25, 0x01); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_managerChangeAgbClockMaster(); + rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = status; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } @@ -808,24 +808,24 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) case ID_STOP_MODE_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x42, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_RFU_POWER_DOWN, 0); } break; } - gUnknown_3005E10.unk_0e = 1; + lman.active = 1; } - else if (reqResult == 3 && gUnknown_3005E10.unk_0f && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ)) + else if (reqResult == 3 && lman.msc_exe_flag && (reqCommandId == ID_DATA_TX_REQ || reqCommandId == ID_DATA_RX_REQ || reqCommandId == ID_MS_CHANGE_REQ)) { rfu_REQ_RFUStatus(); rfu_waitREQComplete(); - rfu_getRFUStatus(&sp0); - if (sp0 == 0 && gRfuLinkStatus->parentChild == MODE_CHILD) + rfu_getRFUStatus(&status); + if (status == 0 && gRfuLinkStatus->parentChild == MODE_CHILD) { - stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data; - stwiRecvBuffer[4] = gRfuLinkStatus->connSlotFlag; - stwiRecvBuffer[5] = 1; - sub_80FD850(0x29); + stwiRecvBuffer = rfu_getSTWIRecvBuffer() + 4; + *stwiRecvBuffer++ = gRfuLinkStatus->connSlotFlag; + *stwiRecvBuffer = REASON_LINK_LOSS; + rfu_LMAN_linkWatcher(ID_DISCONNECTED_AND_CHANGE_REQ); reqResult = 0; } } @@ -834,339 +834,338 @@ static void sub_80FDC98(u16 reqCommandId, u16 reqResult) case ID_DISCONNECT_REQ: if (reqResult == 0) { - stwiRecvBuffer = rfu_getSTWIRecvBuffer()->rxPacketAlloc.rfuPacket8.data; - gUnknown_3005E10.unk_14 = stwiRecvBuffer[8]; - sub_80FE83C(gUnknown_3005E10.unk_14); - if (gUnknown_3005E10.unk_30) + lman.param[0] = *(rfu_getSTWIRecvBuffer() + 8); + rfu_LMAN_reflectCommunicationStatus(lman.param[0]); + if (lman.linkRecoveryTimer.active) { - gUnknown_3005E10.unk_30 &= ~gUnknown_3005E10.unk_14; + lman.linkRecoveryTimer.active &= ~lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_14 >> i) & 1) + if ((lman.param[0] >> i) & 1) { - gUnknown_3005E10.unk_34[i] = 0; + lman.linkRecoveryTimer.count[i] = 0; } } - if (gUnknown_3005E10.unk_06 == 0) + if (lman.parent_child == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } } - sp0 = gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14; + status = lman.acceptSlot_flag & lman.param[0]; for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((sp0 >> i) & 1 && gUnknown_3005E10.unk_01) + if ((status >> i) & 1 && lman.acceptCount) { - gUnknown_3005E10.unk_01--; + lman.acceptCount--; } } - gUnknown_3005E10.unk_00 &= ~gUnknown_3005E10.unk_14; - if (gUnknown_3005E10.unk_07) + lman.acceptSlot_flag &= ~lman.param[0]; + if (lman.pcswitch_flag) { if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { - if (gUnknown_3005E10.unk_07 == 8) + if (lman.pcswitch_flag == 8) { - gUnknown_3005E10.unk_1a = gUnknown_3005E10.unk_1c; - gUnknown_3005E10.unk_07 = 6; - gUnknown_3005E10.unk_04 = 6; + lman.connect_period = lman.pcswitch_period_bak; + lman.pcswitch_flag = 6; + lman.state = LMAN_STATE_POLL_SEARCH_CHILD; } - else if (gUnknown_3005E10.unk_04 != 6 && gUnknown_3005E10.unk_04 != 7) + else if (lman.state != LMAN_STATE_POLL_SEARCH_CHILD && lman.state != LMAN_STATE_END_SEARCH_CHILD) { - gUnknown_3005E10.unk_07 = 1; - gUnknown_3005E10.unk_04 = 5; + lman.pcswitch_flag = 1; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } if (gRfuLinkStatus->parentChild == MODE_NEUTRAL) { - if (gUnknown_3005E10.unk_04 == 0) + if (lman.state == LMAN_STATE_READY) { - gUnknown_3005E10.unk_06 = -1; + lman.parent_child = MODE_NEUTRAL; } } - if (gUnknown_3005E10.unk_0e == 0) + if (lman.active == 0) { - sub_80FE7F0(0x40, 0x01); + rfu_LMAN_occureCallback(LMAN_MSG_LINK_DISCONNECTED_BY_USER, 1); } } break; case ID_DATA_RX_REQ: - sub_80FE6F0(); + rfu_LMAN_CHILD_checkSendChildName2(); if (gRfuLinkStatus->parentChild != MODE_NEUTRAL) { - sub_80FE7F0(0x50, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_RECV_DATA_REQ_COMPLETED, 0); } break; case ID_RESET_REQ: case ID_STOP_MODE_REQ: if (reqResult == 0) { - gUnknown_3005E10.unk_0d = 0; - gUnknown_3005E10.unk_01 = 0; - gUnknown_3005E10.unk_00 = 0;; - gUnknown_3005E10.unk_06 = -1; - sub_80FEAF4(); - if (reqCommandId == 61) + lman.reserveDisconnectSlot_flag = 0; + lman.acceptCount = 0; + lman.acceptSlot_flag = 0;; + lman.parent_child = MODE_NEUTRAL; + rfu_LMAN_managerChangeAgbClockMaster(); + if (reqCommandId == ID_STOP_MODE_REQ) { - sub_80FD484(); + rfu_LMAN_endManager(); } } break; } if (reqResult != 0) { - if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && gUnknown_3005E10.unk_07 == 4) + if (reqCommandId == ID_SP_START_REQ && reqResult != 0 && lman.pcswitch_flag == 4) { gRfuLinkStatus->parentChild = MODE_PARENT; gRfuLinkStatus->connSlotFlag = 0xF; - sub_80FE818(15); + rfu_LMAN_disconnect(15); rfu_waitREQComplete(); return; } else { - gUnknown_3005E10.unk_14 = reqCommandId; - gUnknown_3005E10.unk_16 = reqResult; - if (gUnknown_3005E10.unk_0e) + lman.param[0] = reqCommandId; + lman.param[1] = reqResult; + if (lman.active) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = LMAN_STATE_READY; } - sub_80FE7F0(0xf0, 0x02); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_REQ_API_ERROR, 2); + rfu_LMAN_managerChangeAgbClockMaster(); } } if (reqCommandId == ID_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA_REQ) { - sub_80FE7F0(0xf2, 0x00); - sub_80FEAF4(); + rfu_LMAN_occureCallback(LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA, 0); + rfu_LMAN_managerChangeAgbClockMaster(); } } -static void sub_80FE394(u16 reqCommandId) +static void rfu_LMAN_MSC_callback(u16 reqCommandId) { - u8 r7; - u8 ackFlag; + u8 active_bak; + u8 thisAck_flag; - r7 = gUnknown_3005E10.unk_0e; - gUnknown_3005E10.unk_0e = 0; - gUnknown_3005E10.unk_0f = 1; + active_bak = lman.active; + lman.active = 0; + lman.msc_exe_flag = 1; if (gRfuLinkStatus->parentChild == MODE_CHILD) { - sub_80FD850(reqCommandId); - if (gUnknown_3005E10.unk_02 != 1) + rfu_LMAN_linkWatcher(reqCommandId); + if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_ON) { - sub_80FEAF4(); - gUnknown_3005E10.unk_0f = 0; - gUnknown_3005E10.unk_0e = r7; + rfu_LMAN_managerChangeAgbClockMaster(); + lman.msc_exe_flag = 0; + lman.active = active_bak; return; } } else { - if (!rfu_UNI_PARENT_getDRAC_ACK(&ackFlag)) + if (!rfu_UNI_PARENT_getDRAC_ACK(&thisAck_flag)) { - gUnknown_3005E10.unk_03 |= ackFlag; + lman.parentAck_flag |= thisAck_flag; } } - if (gUnknown_3005E10.unk_44 != NULL) + if (lman.MSC_callback != NULL) { - gUnknown_3005E10.unk_44(reqCommandId); + lman.MSC_callback(reqCommandId); rfu_waitREQComplete(); - if (gUnknown_3005E10.unk_02 == 2) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF_REQ) { - sub_80FEAF4(); + rfu_LMAN_managerChangeAgbClockMaster(); } } - gUnknown_3005E10.unk_0f = 0; - gUnknown_3005E10.unk_0e = r7; + lman.msc_exe_flag = 0; + lman.active = active_bak; } -static void sub_80FE418(void) +static void rfu_LMAN_PARENT_checkRecvChildName(void) { - u8 flags; - u8 sp0; + u8 newSlot; + u8 newAcceptSlot; u8 i; - u8 r5; - u8 r4; + u8 flags; + u8 tgtSlot; const u16 *ptr; - if (gUnknown_3005E10.unk_04 == 5 || gUnknown_3005E10.unk_04 == 6 || gUnknown_3005E10.unk_04 == 7 || gUnknown_3005E10.unk_04 == 8) + if (lman.state == LMAN_STATE_START_SEARCH_CHILD || lman.state == LMAN_STATE_POLL_SEARCH_CHILD || lman.state == LMAN_STATE_END_SEARCH_CHILD || lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { - flags = ((gRfuLinkStatus->connSlotFlag ^ gUnknown_3005E10.unk_0c) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; - gUnknown_3005E10.unk_0c = gRfuLinkStatus->connSlotFlag; - if (flags) + newSlot = ((gRfuLinkStatus->connSlotFlag ^ lman.connectSlot_flag_old) & gRfuLinkStatus->connSlotFlag) & ~gRfuLinkStatus->getNameFlag; + lman.connectSlot_flag_old = gRfuLinkStatus->connSlotFlag; + if (newSlot) { - gUnknown_3005E10.unk_14 = flags; - sub_80FE7F0(0x10, 0x01); + lman.param[0] = newSlot; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_DETECTED, 1); } - sp0 = 0x00; + newAcceptSlot = 0x00; for (i = 0; i < RFU_CHILD_MAX; i++) { - r4 = 1 << i; - r5 = 0x00; - if (flags & r4) + tgtSlot = 1 << i; + flags = 0x00; + if (newSlot & tgtSlot) { - gUnknown_3005E10.unk_28[i] = gUnknown_3005E10.unk_26; - gUnknown_3005E10.unk_24 |= r4; + lman.nameAcceptTimer.count[i] = lman.nameAcceptTimer.count_max; + lman.nameAcceptTimer.active |= tgtSlot; } - else if (gUnknown_3005E10.unk_24 & r4) + else if (lman.nameAcceptTimer.active & tgtSlot) { if (gRfuSlotStatusNI[i]->recv.state == SLOT_STATE_RECV_SUCCESS) { if (gRfuSlotStatusNI[i]->recv.dataType == 1) // Game identification information { - r5 = 0x02; - for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++) + flags = 0x02; + for (ptr = lman.acceptable_serialNo_list; *ptr != 0xFFFF; ptr++) { if (gRfuLinkStatus->partner[i].serialNo == *ptr) { - gUnknown_3005E10.unk_00 |= r4; - gUnknown_3005E10.unk_01++; - sp0 |= r4; - r5 |= 0x01; + lman.acceptSlot_flag |= tgtSlot; + lman.acceptCount++; + newAcceptSlot |= tgtSlot; + flags |= 0x01; break; } } - if (!(r5 & 0x01)) + if (!(flags & 0x01)) { - r5 |= 0x04; + flags |= 0x04; } } } - else if (--gUnknown_3005E10.unk_28[i] == 0) + else if (--lman.nameAcceptTimer.count[i] == 0) { - r5 = 0x06; + flags = 0x06; } - if (r5 & 0x02) + if (flags & 0x02) { - gUnknown_3005E10.unk_24 &= ~r4; - gUnknown_3005E10.unk_28[i] = 0; + lman.nameAcceptTimer.active &= ~tgtSlot; + lman.nameAcceptTimer.count[i] = 0; rfu_clearSlot(TYPE_NI_RECV, i); } - if (r5 & 0x04) + if (flags & 0x04) { - gUnknown_3005E10.unk_0d |= r4; + lman.reserveDisconnectSlot_flag |= tgtSlot; } } } - if (sp0) + if (newAcceptSlot) { - gUnknown_3005E10.unk_14 = sp0; - sub_80FE7F0(0x11, 0x01); + lman.param[0] = newAcceptSlot; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED, 1); } - if (gUnknown_3005E10.unk_0d) + if (lman.reserveDisconnectSlot_flag) { - r5 = 0x01; - if (gRfuLinkStatus->sendSlotUNIFlag && ((gUnknown_3005E10.unk_03 & gUnknown_3005E10.unk_00) != gUnknown_3005E10.unk_00)) + flags = 0x01; + if (gRfuLinkStatus->sendSlotUNIFlag && ((lman.parentAck_flag & lman.acceptSlot_flag) != lman.acceptSlot_flag)) { - r5 = 0x00; + flags = 0x00; } - if (r5) + if (flags) { - sub_80FE818(gUnknown_3005E10.unk_0d); - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_0d; - gUnknown_3005E10.unk_0d = 0; - sub_80FE7F0(0x12, 0x01); + rfu_LMAN_disconnect(lman.reserveDisconnectSlot_flag); + lman.param[0] = lman.reserveDisconnectSlot_flag; + lman.reserveDisconnectSlot_flag = 0; + rfu_LMAN_occureCallback(LMAN_MSG_NEW_CHILD_CONNECT_REJECTED, 1); } } - if (gUnknown_3005E10.unk_24 == 0 && gUnknown_3005E10.unk_04 == 8) + if (lman.nameAcceptTimer.active == 0 && lman.state == LMAN_STATE_WAIT_RECV_CHILD_NAME) { - if (gUnknown_3005E10.unk_07 == 0) + if (lman.pcswitch_flag == 0) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE7F0(0x14, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_occureCallback(LMAN_MSG_END_WAIT_CHILD_NAME, 0); } else { - if (gUnknown_3005E10.unk_07 == 2) + if (lman.pcswitch_flag == 2) { - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; } else { - gUnknown_3005E10.unk_07 = 1; - gUnknown_3005E10.unk_04 = 5; + lman.pcswitch_flag = 1; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } - if (gUnknown_3005E10.unk_00) + if (lman.acceptSlot_flag) { - gUnknown_3005E10.unk_1a = 0; - gUnknown_3005E10.unk_07 = 8; - gUnknown_3005E10.unk_04 = 5; + lman.connect_period = 0; + lman.pcswitch_flag = 8; + lman.state = LMAN_STATE_START_SEARCH_CHILD; } } } } } -static void sub_80FE63C(void) +static void rfu_LMAN_CHILD_checkSendChildName(void) { u16 imeBak = REG_IME; REG_IME = 0; - if (gUnknown_3005E10.unk_04 == 15) + if (lman.state == LMAN_STATE_SEND_CHILD_NAME) { - if (--gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] == 0 || gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_FAILED) + if (--lman.nameAcceptTimer.count[lman.child_slot] == 0 || gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_FAILED) { - sub_80FEB14(); - gUnknown_3005E10.unk_04 = 24; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0; + rfu_LMAN_requestChangeAgbClockMaster(); + lman.state = LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); + lman.nameAcceptTimer.count[lman.child_slot] = 0; } } REG_IME = imeBak; - if (gUnknown_3005E10.unk_04 == 24) + if (lman.state == LMAN_STATE_WAIT_CHANGE_CLOCK_MASTER) { - if (gUnknown_3005E10.unk_02 == 1) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); } - if (gUnknown_3005E10.unk_02 == 0) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - sub_80FE818(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); - gUnknown_3005E10.unk_14 = 0; - sub_80FE7F0(0x25, 0x01); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_LMAN_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); + lman.param[0] = 0; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED, 1); } } } -static void sub_80FE6F0(void) +static void rfu_LMAN_CHILD_checkSendChildName2(void) { - if (gUnknown_3005E10.unk_04 == 15 && gRfuSlotStatusNI[gUnknown_3005E10.unk_10]->send.state == SLOT_STATE_SEND_SUCCESS) + if (lman.state == LMAN_STATE_SEND_CHILD_NAME && gRfuSlotStatusNI[lman.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS) { - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; - rfu_clearSlot(TYPE_NI_SEND, gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_24 &= ~(1 << gUnknown_3005E10.unk_10); - gUnknown_3005E10.unk_28[gUnknown_3005E10.unk_10] = 0; - sub_80FE7F0(0x24, 0x00); + lman.state = lman.next_state = LMAN_STATE_READY; + rfu_clearSlot(TYPE_NI_SEND, lman.child_slot); + lman.nameAcceptTimer.active &= ~(1 << lman.child_slot); + lman.nameAcceptTimer.count[lman.child_slot] = 0; + rfu_LMAN_occureCallback(LMAN_MSG_CHILD_NAME_SEND_COMPLETED, 0); } } -static void sub_80FE74C(void) +static void rfu_LMAN_CHILD_linkRecoveryProcess(void) { - if (gUnknown_3005E10.unk_06 == 0 && gUnknown_3005E10.unk_0a == 1) + if (lman.parent_child == 0 && lman.linkRecovery_start_flag == 1) { - gUnknown_3005E10.unk_11 = gUnknown_3005E10.unk_04; - gUnknown_3005E10.unk_12 = gUnknown_3005E10.unk_05; - gUnknown_3005E10.unk_04 = 16; - gUnknown_3005E10.unk_05 = 17; - gUnknown_3005E10.unk_0a = 2; + lman.state_bak[0] = lman.state; + lman.state_bak[1] = lman.next_state; + lman.state = LMAN_STATE_START_LINK_RECOVERY; + lman.next_state = LMAN_STATE_POLL_LINK_RECOVERY; + lman.linkRecovery_start_flag = 2; } } -static u8 sub_80FE778(void) +static u8 rfu_LMAN_CHILD_checkEnableParentCandidate(void) { u8 i; - const u16 *ptr; + u16 *serialNo; u8 flags = 0x00; for (i = 0; i < gRfuLinkStatus->findParentCount; i++) { - for (ptr = gUnknown_3005E10.unk_20; *ptr != 0xFFFF; ptr++) + for (serialNo = lman.acceptable_serialNo_list; *serialNo != 0xFFFF; serialNo++) { - if (gRfuLinkStatus->partner[i].serialNo == *ptr) + if (gRfuLinkStatus->partner[i].serialNo == *serialNo) { flags |= (1 << i); } @@ -1175,25 +1174,25 @@ static u8 sub_80FE778(void) return flags; } -static void sub_80FE7F0(u8 a0, u8 a1) +static void rfu_LMAN_occureCallback(u8 msg, u8 param_count) { - if (gUnknown_3005E10.unk_40 != NULL) + if (lman.LMAN_callback != NULL) { - gUnknown_3005E10.unk_40(a0, a1); + lman.LMAN_callback(msg, param_count); } - gUnknown_3005E10.unk_14 = gUnknown_3005E10.unk_16 = 0; + lman.param[0] = lman.param[1] = 0; } -static void sub_80FE818(u8 a0) +static void rfu_LMAN_disconnect(u8 bm_disconnectedSlot) { - u8 unk_0e_bak = gUnknown_3005E10.unk_0e; - gUnknown_3005E10.unk_0e = 1; - rfu_REQ_disconnect(a0); + u8 active_bak = lman.active; + lman.active = 1; + rfu_REQ_disconnect(bm_disconnectedSlot); rfu_waitREQComplete(); - gUnknown_3005E10.unk_0e = unk_0e_bak; + lman.active = active_bak; } -static void sub_80FE83C(u8 a0) +static void rfu_LMAN_reflectCommunicationStatus(u8 bm_disconnectedSlot) { u8 i; @@ -1201,9 +1200,9 @@ static void sub_80FE83C(u8 a0) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & a0) + if (gRfuSlotStatusNI[i]->send.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->send.bmSlot & bm_disconnectedSlot) { - rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~a0); + rfu_changeSendTarget(TYPE_NI, i, gRfuSlotStatusNI[i]->send.bmSlot & ~bm_disconnectedSlot); } } } @@ -1211,7 +1210,7 @@ static void sub_80FE83C(u8 a0) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & a0) + if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.bmSlot & bm_disconnectedSlot) { rfu_NI_stopReceivingData(i); } @@ -1219,24 +1218,24 @@ static void sub_80FE83C(u8 a0) } if (gRfuLinkStatus->sendSlotUNIFlag) { - gRfuLinkStatus->sendSlotUNIFlag &= ~a0; + gRfuLinkStatus->sendSlotUNIFlag &= ~bm_disconnectedSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && a0 & gRfuSlotStatusUNI[i]->send.bmSlot) + if (gRfuSlotStatusUNI[i]->send.state == SLOT_STATE_SEND_UNI && bm_disconnectedSlot & gRfuSlotStatusUNI[i]->send.bmSlot) { - gRfuSlotStatusUNI[i]->send.bmSlot &= ~a0; + gRfuSlotStatusUNI[i]->send.bmSlot &= ~bm_disconnectedSlot; } } } } -static void sub_80FE918(void) +static void rfu_LMAN_checkNICommunicateStatus(void) { u8 i; u8 j; u8 flags; - if (gUnknown_3005E10.unk_18) + if (lman.NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag) { @@ -1247,7 +1246,7 @@ static void sub_80FE918(void) flags = 0; for (j = 0; j < RFU_CHILD_MAX; j++) { - if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > gUnknown_3005E10.unk_18) + if ((gRfuSlotStatusNI[i]->send.bmSlot >> j) & 1 && gRfuSlotStatusNI[j]->send.failCounter > lman.NI_failCounter_limit) { flags |= (1 << j); } @@ -1263,7 +1262,7 @@ static void sub_80FE918(void) { for (i = 0; i < RFU_CHILD_MAX; i++) { - if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > gUnknown_3005E10.unk_18) + if (gRfuSlotStatusNI[i]->recv.state & SLOT_BUSY_FLAG && gRfuSlotStatusNI[i]->recv.failCounter > lman.NI_failCounter_limit) { rfu_NI_stopReceivingData(i); } @@ -1272,109 +1271,109 @@ static void sub_80FE918(void) } } -void sub_80FEA10(void (*func)(u16)) +void rfu_LMAN_setMSCCallback(void (*MSC_callback_p)(u16)) { - gUnknown_3005E10.unk_44 = func; - rfu_setMSCCallback(sub_80FE394); + lman.MSC_callback = MSC_callback_p; + rfu_setMSCCallback(rfu_LMAN_MSC_callback); } -static void sub_80FEA28(void (*func)(u8, u8)) +static void rfu_LMAN_setLMANCallback(void (*func)(u8, u8)) { - gUnknown_3005E10.unk_40 = func; + lman.LMAN_callback = func; } -u8 sub_80FEA34(u8 a0, u16 a1) +u8 rfu_LMAN_setLinkRecovery(u8 enable_flag, u16 recovery_period) { u16 imeBak; - if (gUnknown_3005E10.unk_09 && a0 == 0 && gUnknown_3005E10.unk_30) + if (lman.linkRecovery_enable && enable_flag == 0 && lman.linkRecoveryTimer.active) { - return 5; + return LMAN_ERROR_NOW_LINK_RECOVERY; } imeBak = REG_IME; REG_IME = 0; - gUnknown_3005E10.unk_09 = a0; - gUnknown_3005E10.unk_32 = a1; + lman.linkRecovery_enable = enable_flag; + lman.linkRecoveryTimer.count_max = recovery_period; REG_IME = imeBak; return 0; } -static u8 sub_80FEA78(u16 a0) +static u8 rfu_LMAN_setNIFailCounterLimit(u16 NI_failCounter_limit) { if (gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag) { - gUnknown_3005E10.unk_14 = 6; - sub_80FE7F0(0xf3, 0x01); - return 6; + lman.param[0] = 6; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_NOW_COMMUNICATION; } - gUnknown_3005E10.unk_18 = a0; + lman.NI_failCounter_limit = NI_failCounter_limit; return 0; } -static u8 sub_80FEAB4(u8 a0) +static u8 rfu_LMAN_setFastSearchParent(u8 enable_flag) { - if (gUnknown_3005E10.unk_04 == 9 || gUnknown_3005E10.unk_04 == 10 || gUnknown_3005E10.unk_04 == 11) + if (lman.state == LMAN_STATE_START_SEARCH_PARENT || lman.state == LMAN_STATE_POLL_SEARCH_PARENT || lman.state == LMAN_STATE_END_SEARCH_PARENT) { - gUnknown_3005E10.unk_14 = 7; - sub_80FE7F0(0xf3, 0x01); - return 7; + lman.param[0] = 7; + rfu_LMAN_occureCallback(LMAN_MSG_LMAN_API_ERROR_RETURN, 1); + return LMAN_ERROR_NOW_SEARCH_PARENT; } - if (a0) + if (enable_flag) { - gUnknown_3005E10.unk_0b = 1; + lman.fastSearchParent_flag = 1; } else { - gUnknown_3005E10.unk_0b = 0; + lman.fastSearchParent_flag = 0; } return 0; } -static void sub_80FEAF4(void) +static void rfu_LMAN_managerChangeAgbClockMaster(void) { - if (gUnknown_3005E10.unk_02) + if (lman.childClockSlave_flag != RFU_CHILD_CLOCK_SLAVE_OFF) { - gUnknown_3005E10.unk_02 = 0; - sub_80FE7F0(0x45, 0x00); + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF; + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } } -void sub_80FEB14(void) +void rfu_LMAN_requestChangeAgbClockMaster(void) { - if (gUnknown_3005E10.unk_02 == 0) + if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_OFF) { - sub_80FE7F0(0x45, 0x00); + rfu_LMAN_occureCallback(LMAN_MSG_CHANGE_AGB_CLOCK_MASTER, 0); } - else if (gUnknown_3005E10.unk_02 == 1) + else if (lman.childClockSlave_flag == RFU_CHILD_CLOCK_SLAVE_ON) { - gUnknown_3005E10.unk_02 = 2; + lman.childClockSlave_flag = RFU_CHILD_CLOCK_SLAVE_OFF_REQ; } } -void sub_80FEB3C(void) +void rfu_LMAN_forceChangeSP(void) { - if (gUnknown_3005E10.unk_07) + if (lman.pcswitch_flag) { - switch (gUnknown_3005E10.unk_04) + switch (lman.state) { - case 5: - gUnknown_3005E10.unk_07 = 3; - gUnknown_3005E10.unk_04 = 9; + case LMAN_STATE_START_SEARCH_CHILD: + lman.pcswitch_flag = 3; + lman.state = LMAN_STATE_START_SEARCH_PARENT; break; - case 6: - gUnknown_3005E10.unk_07 = 2; - gUnknown_3005E10.unk_1a = 1; + case LMAN_STATE_POLL_SEARCH_CHILD: + lman.pcswitch_flag = 2; + lman.connect_period = 1; break; - case 7: - case 8: - gUnknown_3005E10.unk_07 = 2; + case LMAN_STATE_END_SEARCH_CHILD: + case LMAN_STATE_WAIT_RECV_CHILD_NAME: + lman.pcswitch_flag = 2; break; - case 9: - case 10: - gUnknown_3005E10.unk_1a = 40; + case LMAN_STATE_START_SEARCH_PARENT: + case LMAN_STATE_POLL_SEARCH_PARENT: + lman.connect_period = 40; break; - case 11: - gUnknown_3005E10.unk_1a = 40; - gUnknown_3005E10.unk_04 = 10; + case LMAN_STATE_END_SEARCH_PARENT: + lman.connect_period = 40; + lman.state = LMAN_STATE_POLL_SEARCH_PARENT; break; } } diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index a27948650..70dbab5e4 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -21,15 +21,15 @@ struct UnkRfuStruct_8010A14{ u8 fill_a0[0x5c]; }; -static EWRAM_DATA struct UnkLinkRfuStruct_02022B2C sRfuReqConfig = {}; +static EWRAM_DATA struct InitializeParametersTag sRfuReqConfig = {}; static EWRAM_DATA struct UnkLinkRfuStruct_02022B44 gUnknown_203AC08 = {}; -static struct RfuAPIBuffer gRfuAPIBuffer; +static u32 gf_rfu_REQ_api[RFU_API_BUFF_SIZE_RAM / 4]; static u8 gUnknown_3001FF8[14]; static u16 gUnknown_3002008[7]; struct GFtgtGname gHostRFUtgtGnameBuffer; -struct UnkRfuStruct_2 Rfu; +GF_RFU_MANAGER Rfu; u8 gHostRFUtgtUnameBuffer[PLAYER_NAME_LENGTH + 1]; static void sub_80F8AA4(void); @@ -38,7 +38,7 @@ static void sub_80F8D20(u16 a0); static void sub_80F8DA8(u16 a0); static void sub_80F906C(void); static void sub_80F9868(u8 unused); -static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data); +static void ResetSendDataManager(struct UnkRfuStruct_2_Sub_6c *data); static void sub_80F9D04(u16 command); static void rfufunc_80F9F44(void); static void sub_80F9FA8(void); @@ -51,28 +51,28 @@ static void sub_80FA9D0(u16 a0); static void sub_80FAA58(void * a0); static void sub_80FAA94(u8 taskId); static void sub_80FACF0(u8 taskId); -static void sub_80FB0E8(u32 a0); +static void GetLinkmanErrorParams(u32 msg); static void sub_80FB564(s32 a0); static void sub_80FBB74(void); -static u8 sub_80FBC70(const u8 *a0, u16 a1); -static void sub_80FBCF8(u32 a0); +static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId); +static void sub_80FBCF8(u32 bmDisconnectSlot); static void sub_80FBE20(u32 a0, u32 a1); static void sub_80FC028(u8 taskId); static void sub_80FC208(void); static void nullsub_89(u8 taskId); -static const struct UnkLinkRfuStruct_02022B2C sRfuReqConfigTemplate = { +static const struct InitializeParametersTag sRfuReqConfigTemplate = { .maxMFrame = 4, - .mcTimer = 32, - .availSlotFlag = 0, - .mbootFlag = 0, + .MC_TimerCount = 32, + .availSlot_flag = 0, + .mboot_flag = 0, .serialNo = 0x0002, - .gname = &gHostRFUtgtGnameBuffer, - .uname = gHostRFUtgtUnameBuffer, - .unk_10 = 0x01, - .unk_11 = 0x00, - .unk_12 = 0x0258, - .unk_14 = 0x012c + .gameName = (void *)&gHostRFUtgtGnameBuffer, + .userName = gHostRFUtgtUnameBuffer, + .fastSearchParent_flag = TRUE, + .linkRecovery_enable = FALSE, + .linkRecovery_period = 600, + .NI_failCounter_limit = 300 }; static const u8 sAvailSlots[] = { @@ -138,8 +138,10 @@ static const struct { { gBlockSendBuffer, 40 } }; -static const u16 gUnknown_843EC8C[] = { - 0x0002, 0x7f7d, 0xFFFF +static const u16 sAcceptedSerialNos[] = { + 0x0002, // Pokemon FR/LG/EM + 0x7f7d, + 0xFFFF }; static const char sUnref_843EC92[][15] = { @@ -183,21 +185,21 @@ static void nullsub_88(u16 unused_0, u8 unused_1, u8 unused_2, u8 unused_3) void sub_80F85F8(void) { s32 i; - u8 unk_ee_bak = Rfu.unk_ee; + u8 errorState_bak = Rfu.errorState; CpuFill16(0, &Rfu, sizeof Rfu); Rfu.unk_0c = 0xFF; - Rfu.unk_ee = unk_ee_bak; - if (Rfu.unk_ee != 4) + Rfu.errorState = errorState_bak; + if (Rfu.errorState != 4) { - Rfu.unk_ee = 0; + Rfu.errorState = 0; } for (i = 0; i < 5; i++) { - sub_80F9CB4(Rfu.unk_80 + i); + ResetSendDataManager(Rfu.unk_80 + i); } - sub_80F9CB4(&Rfu.unk_6c); - sub_80FC478(&Rfu.unk_124); - sub_80FC4D4(&Rfu.unk_9e8); + ResetSendDataManager(&Rfu.unk_6c); + RFU_queue_20_70_reset(&Rfu.unk_124); + RFU_queue_40_14_reset(&Rfu.unk_9e8); CpuFill16(0, gSendCmd, sizeof gSendCmd); CpuFill16(0, gRecvCmds, sizeof gRecvCmds); CpuFill16(0, gLinkPlayers, sizeof gLinkPlayers); @@ -218,7 +220,7 @@ void InitRFU(void) void sub_80F86F4(void) { - if (!rfu_initializeAPI(&gRfuAPIBuffer, sizeof gRfuAPIBuffer, gIntrTable + 1, TRUE)) + if (!rfu_initializeAPI(gf_rfu_REQ_api, RFU_API_BUFF_SIZE_RAM, gIntrTable + 1, TRUE)) { gLinkType = 0; sub_80FB128(FALSE); @@ -233,28 +235,28 @@ static void sub_80F8738(u8 taskId) switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfig); + rfu_LMAN_initializeRFU(&sRfuReqConfig); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 2: - sub_80FD538(Rfu.unk_0c, 0, 240, gUnknown_843EC8C); + rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 240, (u16*)sAcceptedSerialNos); Rfu.unk_04 = 3; gTasks[taskId].data[1] = 6; break; case 3: break; case 4: - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); Rfu.unk_04 = 5; break; case 5: break; case 18: Rfu.unk_cdb = 0; - sub_80FEA10(sub_80F8DA8); + rfu_LMAN_setMSCCallback(sub_80F8DA8); sub_80F8AA4(); sub_80F8AEC(); Rfu.unk_04 = 20; @@ -319,14 +321,14 @@ static void sub_80F893C(u8 taskId) switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfigTemplate); + rfu_LMAN_initializeRFU((INIT_PARAM*)&sRfuReqConfigTemplate); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 6: - sub_80FD538(Rfu.unk_0c, 0, 0xf0, gUnknown_843EC8C); + rfu_LMAN_establishConnection(Rfu.unk_0c, 0, 240, (u16*)sAcceptedSerialNos); Rfu.unk_04 = 7; gTasks[taskId].data[1] = 7; break; @@ -343,7 +345,7 @@ static void sub_80F893C(u8 taskId) break; case 6: case 9: - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 2; DestroyTask(taskId); break; @@ -351,9 +353,9 @@ static void sub_80F893C(u8 taskId) break; case 12: { - u8 r5 = 1 << Rfu.unk_c3e; - rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.unk_c3e); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); + u8 r5 = 1 << Rfu.child_slot; + rfu_clearSlot(TYPE_NI_SEND | TYPE_NI_RECV, Rfu.child_slot); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); rfu_UNI_setSendData(r5, Rfu.unk_4c, sizeof(Rfu.unk_4c)); gTasks[taskId].data[1] = 8; DestroyTask(taskId); @@ -371,54 +373,54 @@ static void sub_80F893C(u8 taskId) static void sub_80F8AA4(void) { u8 i; - u8 r5 = gUnknown_3005E10.unk_00; + u8 acceptSlot = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { - if (r5 & 1) + if (acceptSlot & 1) { rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i])); rfu_clearSlot(TYPE_UNI_SEND | TYPE_UNI_RECV, i); } - r5 >>= 1; + acceptSlot >>= 1; } } static void sub_80F8AEC(void) { - u8 r5 = gUnknown_3005E10.unk_00; - rfu_UNI_setSendData(r5, Rfu.unk_c87, sizeof(Rfu.unk_c87)); - Rfu.unk_cda = sub_80F886C(r5); - Rfu.unk_ce2 = r5; - sub_80F887C(r5, -1); + u8 acceptSlot = lman.acceptSlot_flag; + rfu_UNI_setSendData(acceptSlot, Rfu.recvCmds, sizeof(Rfu.recvCmds)); + Rfu.unk_cda = sub_80F886C(acceptSlot); + Rfu.bm_PartnerFlags = acceptSlot; + sub_80F887C(acceptSlot, -1); Rfu.unk_0c = 1; } static void sub_80F8B34(u8 taskId) { - if (sub_80F9800()->unk_0a_0 == 0x54 && sub_80FB9F4() == 4) + if (GetHostRFUtgtGname()->activity == 0x54 && sub_80FB9F4() == 4) { - rfu_REQ_disconnect(gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); sub_80FB9E4(0, 0); } switch (Rfu.unk_04) { case 0: - sub_80FD4B0(&sRfuReqConfig); + rfu_LMAN_initializeRFU(&sRfuReqConfig); Rfu.unk_04 = 1; gTasks[taskId].data[1] = 1; break; case 1: break; case 17: - sub_80FD538(2, 0, 240, gUnknown_843EC8C); - sub_80FEA10(sub_80F8D20); + rfu_LMAN_establishConnection(2, 0, 240, (u16*)sAcceptedSerialNos); + rfu_LMAN_setMSCCallback(sub_80F8D20); Rfu.unk_04 = 18; break; case 18: break; case 13: - if (rfu_UNI_setSendData(1 << Rfu.unk_c3e, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0) + if (rfu_UNI_setSendData(1 << Rfu.child_slot, Rfu.unk_4c, sizeof(Rfu.unk_4c)) == 0) { Rfu.unk_0c = 0; DestroyTask(taskId); @@ -433,14 +435,14 @@ static void sub_80F8B34(u8 taskId) } break; case 14: - sub_80FD760(0); + rfu_LMAN_stopManager(0); Rfu.unk_04 = 15; break; case 15: break; case 16: Rfu.unk_cdb = 0; - sub_80FEA10(sub_80F8DA8); + rfu_LMAN_setMSCCallback(sub_80F8DA8); sub_80FAFE0(1); sub_80F8AA4(); sub_80F8AEC(); @@ -456,12 +458,12 @@ static void sub_80F8B34(u8 taskId) void sub_80F8CFC(void) { - sub_80FD538(1, 0, 240, gUnknown_843EC8C); + rfu_LMAN_establishConnection(1, 0, 240, (u16*)sAcceptedSerialNos); } void sub_80F8D14(void) { - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); } static void sub_80F8D20(u16 unused) @@ -474,16 +476,16 @@ static void sub_80F8D20(u16 unused) } rfu_REQ_recvData(); rfu_waitREQComplete(); - if (gRfuSlotStatusUNI[Rfu.unk_c3e]->recv.newDataFlag) + if (gRfuSlotStatusUNI[Rfu.child_slot]->recv.newDataFlag) { Rfu.unk_cd0++; - sub_80FC588(&Rfu.unk_124, Rfu.unk_c3f); + RFU_queue_20_70_recv(&Rfu.unk_124, Rfu.unk_c3f); gUnknown_203AC08.unk_06++; sub_80F906C(); - rfu_UNI_readySendData(Rfu.unk_c3e); - rfu_UNI_clearRecvNewDataFlag(Rfu.unk_c3e); + rfu_UNI_readySendData(Rfu.child_slot); + rfu_UNI_clearRecvNewDataFlag(Rfu.child_slot); } - LinkRfu_REQ_SendData_HandleParentRelationship(TRUE); + rfu_LMAN_REQ_sendData(TRUE); } static void sub_80F8DA8(u16 unused) @@ -498,7 +500,7 @@ void sub_80F8DC0(void) if (gQuestLogState == 2 || gQuestLogState == 3) return; - sub_80FD52C(); + rfu_LMAN_powerDownRFU(); if (Rfu.unk_0c == 1) { if (FuncIsActiveTask(sub_80F8738) == TRUE) @@ -550,7 +552,7 @@ static bool8 sub_80F8EA4(void) static bool32 sub_80F8ECC(void) { - if (Rfu.unk_04 == 7 && !sub_80FD610(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240)) + if (Rfu.unk_04 == 7 && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[Rfu.unk_c3d].id, 240)) { Rfu.unk_04 = 9; return TRUE; @@ -567,7 +569,7 @@ static void sub_80F8F10(void) bool8 sub_80F8F40(void) { - if (gUnknown_3005E10.unk_00) + if (lman.acceptSlot_flag) { return TRUE; } @@ -577,7 +579,7 @@ bool8 sub_80F8F40(void) void sub_80F8F5C(void) { Rfu.unk_04 = 4; - Rfu.unk_ce7 = gUnknown_3005E10.unk_00; + Rfu.unk_ce7 = lman.acceptSlot_flag; } bool32 sub_80F8F7C(bool32 a0) @@ -616,11 +618,11 @@ static void sub_80F8FD4(void) for (i = 0; i < 5; i++) { - struct UnkRfuStruct_2 *ptr = &Rfu; + GF_RFU_MANAGER *ptr = &Rfu; for (j = 0; j < 7; j++) { - ptr->unk_c87[i][j][1] = gRecvCmds[i][j] >> 8; - ptr->unk_c87[i][j][0] = gRecvCmds[i][j]; + ptr->recvCmds[i][j][1] = gRecvCmds[i][j] >> 8; + ptr->recvCmds[i][j][0] = gRecvCmds[i][j]; } } CpuFill16(0, gRecvCmds, sizeof gRecvCmds); @@ -643,8 +645,8 @@ static void sub_80F906C(void) { if (Rfu.unk_c3c) { - u8 r2 = sub_80FC888(&Rfu.unk_c1c, Rfu.unk_4c); - if (Rfu.unk_c1c.unk_1e == 0) + u8 r2 = RFU_queue_2_14_send(&Rfu.unk_c1c, Rfu.unk_4c); + if (Rfu.unk_c1c.count == 0) { Rfu.unk_c3c = 0; } @@ -655,8 +657,8 @@ static void sub_80F906C(void) } if (Rfu.unk_c3c == 0) { - sub_80FC79C(&Rfu.unk_9e8, Rfu.unk_4c); - sub_80FC828(&Rfu.unk_c1c, Rfu.unk_4c); + RFU_queue_40_14_send(&Rfu.unk_9e8, Rfu.unk_4c); + RFU_queue_2_14_recv(&Rfu.unk_c1c, Rfu.unk_4c); } } @@ -688,26 +690,26 @@ static bool32 sub_80F911C(void) { rfu_REQ_recvData(); rfu_waitREQComplete(); - LinkRfu_REQ_SendData_HandleParentRelationship(FALSE); + rfu_LMAN_REQ_sendData(FALSE); } else { Rfu.unk_cdb = 0; - if ((Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag) == Rfu.unk_ce2 && (Rfu.unk_ce2 & gRfuLinkStatus->connSlotFlag)) + if ((Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag) == Rfu.bm_PartnerFlags && (Rfu.bm_PartnerFlags & gRfuLinkStatus->connSlotFlag)) { if (!Rfu.unk_cdc) { - if (Rfu.unk_ce3) + if (Rfu.bm_DisconnectSlot) { - sub_80FBCF8(Rfu.unk_ce3); - Rfu.unk_ce3 = 0; + sub_80FBCF8(Rfu.bm_DisconnectSlot); + Rfu.bm_DisconnectSlot = 0; if (Rfu.unk_ce4 == 1) { sub_80FB9E4(2, 0x8000); - sub_80FB0E8(0x8000); + GetLinkmanErrorParams(0x8000); return FALSE; } - if (!gUnknown_3005E10.unk_00) + if (!lman.acceptSlot_flag) { sub_80F8DC0(); gReceivedRemoteLinkPlayers = 0; @@ -716,7 +718,7 @@ static bool32 sub_80F911C(void) } sub_80F8FD4(); rfu_UNI_readySendData(Rfu.unk_cda); - LinkRfu_REQ_SendData_HandleParentRelationship(TRUE); + rfu_LMAN_REQ_sendData(TRUE); } else { @@ -741,18 +743,18 @@ static bool32 sub_80F9204(void) rfu_waitREQComplete(); while (Rfu.unk_cdb == 0) { - if (Rfu.unk_ee != 0) + if (Rfu.errorState != 0) { return FALSE; } } rfu_REQ_recvData(); rfu_waitREQComplete(); - if ((gUnknown_3005E10.unk_03 & Rfu.unk_ce2) == Rfu.unk_ce2) + if ((lman.parentAck_flag & Rfu.bm_PartnerFlags) == Rfu.bm_PartnerFlags) { Rfu.unk_cdc = 0; gUnknown_203AC08.unk_06++; - flags = gUnknown_3005E10.unk_00; + flags = lman.acceptSlot_flag; for (i = 0; i < RFU_CHILD_MAX; i++) { if (flags & 1) @@ -762,7 +764,7 @@ static bool32 sub_80F9204(void) if (Rfu.unk_cee[i] != 0xFF && (Rfu.unk_14[i][0] >> 5) != ((Rfu.unk_cee[i] + 1) & 7)) { if (++Rfu.unk_cea[i] > 4) - sub_80FB0E8(0x8100); + GetLinkmanErrorParams(0x8100); } else { @@ -796,12 +798,12 @@ static bool32 sub_80F9204(void) rfu_setRecvBuffer(TYPE_UNI, i, Rfu.unk_14[i], sizeof(Rfu.unk_14[i])); } } - sub_80F887C(Rfu.unk_ce2, Rfu.unk_ce2 | Rfu.unk_ce5); + sub_80F887C(Rfu.bm_PartnerFlags, Rfu.bm_PartnerFlags | Rfu.unk_ce5); Rfu.unk_ce9 = Rfu.unk_ce5; - Rfu.unk_ce2 |= Rfu.unk_ce5; + Rfu.bm_PartnerFlags |= Rfu.unk_ce5; Rfu.unk_ce5 = 0; - rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, sizeof(Rfu.unk_c87)); - Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2); + rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, sizeof(Rfu.recvCmds)); + Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags); CreateTask(sub_80FAA94, 0); } } @@ -845,7 +847,7 @@ static bool32 sub_80F9514(void) u8 sp48[2 * (CMD_LENGTH - 1)]; u8 switchval; - sub_80FC6E8(&Rfu.unk_124, sp00); + RFU_queue_20_70_send(&Rfu.unk_124, sp00); for (i = 0; i < MAX_RFU_PLAYERS; i++) { for (j = 0; j < CMD_LENGTH - 1; j++) @@ -854,7 +856,7 @@ static bool32 sub_80F9514(void) } } sub_80F9868(0); - if (gUnknown_3005E10.unk_02 == 0 && Rfu.unk_ce4) + if (lman.childClockSlave_flag == 0 && Rfu.unk_ce4) { rfu_REQ_disconnect(gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag); rfu_waitREQComplete(); @@ -867,9 +869,9 @@ static bool32 sub_80F9514(void) if (Rfu.unk_ce4 == 1) { sub_80FB9E4(2, 0x9000); - sub_80FB0E8(0x9000); + GetLinkmanErrorParams(0x9000); } - gUnknown_3005E10.unk_04 = gUnknown_3005E10.unk_05 = 0; + lman.state = lman.next_state = 0; Rfu.unk_ce4 = 0; } if (Rfu.unk_cd0) @@ -877,7 +879,7 @@ static bool32 sub_80F9514(void) Rfu.unk_cd0--; CallRfuFunc(); sub_80F94BC(gSendCmd, sp48); - sub_80FC63C(&Rfu.unk_9e8, sp48); + RFU_queue_40_14_recv(&Rfu.unk_9e8, sp48); for (i = 0; i < CMD_LENGTH - 1; i++) gSendCmd[i] = 0; } @@ -888,8 +890,8 @@ static void sub_80F965C(u8 unused, u32 flags) { s32 i, j; - const u8 *r10 = Rfu.unk_6c.unk_04; - for (i = 0; i < Rfu.unk_6c.unk_02; i++) + const u8 *r10 = Rfu.unk_6c.payload; + for (i = 0; i < Rfu.unk_6c.count; i++) { if (!(flags & 1)) { @@ -905,7 +907,7 @@ static void sub_80F965C(u8 unused, u32 flags) j++;j--; // Needed to match; } - sub_80FC63C(&Rfu.unk_9e8, gUnknown_3001FF8); + RFU_queue_40_14_recv(&Rfu.unk_9e8, gUnknown_3001FF8); Rfu.unk_6c.unk_0c |= (1 << i); } flags >>= 1; @@ -936,10 +938,10 @@ static u8 sub_80F9770(const u8 *a0) { Rfu.unk_cde[i] = a0[i]; } - return a0[Rfu.unk_c3e]; + return a0[Rfu.child_slot]; } -static void rfu_func_080F97B8(void) +static void RfuFunc_SendKeysToRfu(void) { static u8 gUnknown_3001188; if (gReceivedRemoteLinkPlayers @@ -952,20 +954,20 @@ static void rfu_func_080F97B8(void) } } -struct GFtgtGname *sub_80F9800(void) +struct GFtgtGname *GetHostRFUtgtGname(void) { return &gHostRFUtgtGnameBuffer; } bool32 IsSendingKeysToRfu(void) { - return Rfu.RfuFunc == rfu_func_080F97B8; + return Rfu.RfuFunc == RfuFunc_SendKeysToRfu; } -void sub_80F9828(void) +void StartSendingKeysToRfu(void) { AGB_ASSERT_EX(Rfu.RfuFunc == NULL, ABSPATH("rfu.c"), 1473); - Rfu.RfuFunc = rfu_func_080F97B8; + Rfu.RfuFunc = RfuFunc_SendKeysToRfu; } void Rfu_set_zero(void) @@ -997,8 +999,8 @@ static void sub_80F9868(u8 unused) if (Rfu.unk_80[i].unk_12 == 0) { Rfu.unk_80[i].unk_00 = 0; - Rfu.unk_80[i].unk_02 = gRecvCmds[i][1]; - Rfu.unk_80[i].unk_11 = gRecvCmds[i][2]; + Rfu.unk_80[i].count = gRecvCmds[i][1]; + Rfu.unk_80[i].owner = gRecvCmds[i][2]; Rfu.unk_80[i].unk_08 = 0; Rfu.unk_80[i].unk_12 = 1; Rfu.unk_5c[i] = 0; @@ -1011,11 +1013,11 @@ static void sub_80F9868(u8 unused) Rfu.unk_80[i].unk_08 |= (1 << Rfu.unk_80[i].unk_00); for (j = 0; j < 6; j++) gBlockRecvBuffer[i][Rfu.unk_80[i].unk_00 * 6 + j] = gRecvCmds[i][j + 1]; - if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].unk_02]) + if (Rfu.unk_80[i].unk_08 == gUnknown_843EBD4[Rfu.unk_80[i].count]) { Rfu.unk_80[i].unk_12 = 2; Rfu_SetBlockReceivedFlag(i); - if (sub_80F9800()->unk_0a_0 == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) + if (GetHostRFUtgtGname()->activity == 0x45 && gReceivedRemoteLinkPlayers != 0 && Rfu.unk_0c == 0) sub_80FAA58(gBlockRecvBuffer); } } @@ -1038,7 +1040,7 @@ static void sub_80F9868(u8 unused) if (gRecvCmds[i][1] & gRfuLinkStatus->connSlotFlag) { gReceivedRemoteLinkPlayers = 0; - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = gRecvCmds[i][2]; } Rfu.playerCount = gRecvCmds[i][3]; @@ -1056,7 +1058,7 @@ static void sub_80F9868(u8 unused) case 0xee00: if (Rfu.unk_0c == 1) { - Rfu.unk_ce3 |= gRecvCmds[i][1]; + Rfu.bm_DisconnectSlot |= gRecvCmds[i][1]; Rfu.unk_ce4 = gRecvCmds[i][2]; sub_80FA9D0(gRecvCmds[i][1]); } @@ -1102,14 +1104,14 @@ static bool8 sub_80F9C78(void) return TRUE; } -static void sub_80F9CB4(struct UnkRfuStruct_2_Sub_6c *data) +static void ResetSendDataManager(struct UnkRfuStruct_2_Sub_6c *data) { data->unk_00 = 0; - data->unk_02 = 0; - data->unk_04 = NULL; + data->count = 0; + data->payload = NULL; data->unk_08 = 0; data->unk_10 = 0; - data->unk_11 = 0; + data->owner = 0; data->unk_12 = 0; } @@ -1138,8 +1140,8 @@ static void sub_80F9D04(u16 command) switch (command) { case 0x8800: - gSendCmd[1] = Rfu.unk_6c.unk_02; - gSendCmd[2] = Rfu.unk_6c.unk_11 + 0x80; + gSendCmd[1] = Rfu.unk_6c.count; + gSendCmd[2] = Rfu.unk_6c.owner + 0x80; break; case 0xa100: if (sub_80F9C50()) @@ -1147,7 +1149,7 @@ static void sub_80F9D04(u16 command) break; case 0x7700: case 0x7800: - tmp = Rfu.unk_ce2 ^ Rfu.unk_ce3; + tmp = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot; Rfu.playerCount = gUnknown_843EC41[tmp] + 1; gSendCmd[1] = Rfu.playerCount; buff = (u8 *)(gSendCmd + 2); @@ -1172,11 +1174,11 @@ static void sub_80F9D04(u16 command) } } -void sub_80F9E2C(void *a0) +void sub_80F9E2C(void * data) { if (gSendCmd[0] == 0 && !sub_80FBA00()) { - memcpy(Rfu.unk_f2, a0, sizeof(Rfu.unk_f2)); + memcpy(Rfu.unk_f2, data, sizeof(Rfu.unk_f2)); sub_80F9D04(0x2f00); } } @@ -1195,17 +1197,17 @@ bool32 Rfu_InitBlockSend(const u8 *src, size_t size) return FALSE; } r4 = (size % 12) != 0; - Rfu.unk_6c.unk_11 = GetMultiplayerId(); + Rfu.unk_6c.owner = GetMultiplayerId(); Rfu.unk_6c.unk_10 = 1; - Rfu.unk_6c.unk_02 = (size / 12) + r4; + Rfu.unk_6c.count = (size / 12) + r4; Rfu.unk_6c.unk_00 = 0; if (size > 0x100) - Rfu.unk_6c.unk_04 = src; + Rfu.unk_6c.payload = src; else { if (src != gBlockSendBuffer) memcpy(gBlockSendBuffer, src, size); - Rfu.unk_6c.unk_04 = gBlockSendBuffer; + Rfu.unk_6c.payload = gBlockSendBuffer; } sub_80F9D04(0x8800); Rfu.RfuFunc = rfufunc_80F9F44; @@ -1233,12 +1235,12 @@ static void rfufunc_80F9F44(void) static void sub_80F9FA8(void) { s32 i; - const u8 *src = Rfu.unk_6c.unk_04; + const u8 *src = Rfu.unk_6c.payload; gSendCmd[0] = 0x8900 | Rfu.unk_6c.unk_00; for (i = 0; i < 7; i++) gSendCmd[i + 1] = (src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 1] << 8) | src[(i << 1) + Rfu.unk_6c.unk_00 * 12 + 0]; Rfu.unk_6c.unk_00++; - if (Rfu.unk_6c.unk_02 <= Rfu.unk_6c.unk_00) + if (Rfu.unk_6c.count <= Rfu.unk_6c.unk_00) { Rfu.unk_6c.unk_10 = 0; Rfu.RfuFunc = rfufunc_80FA020; @@ -1247,17 +1249,17 @@ static void sub_80F9FA8(void) static void rfufunc_80FA020(void) { - const u8 *src = Rfu.unk_6c.unk_04; + const u8 *src = Rfu.unk_6c.payload; u8 mpId = GetMultiplayerId(); s32 i; if (Rfu.unk_0c == 0) { - gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.unk_02 - 1); + gSendCmd[0] = (~0x76ff) | (Rfu.unk_6c.count - 1); for (i = 0; i < 7; i++) - gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.unk_02 - 1) * 12 + 0]; - if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.unk_02 - 1) + gSendCmd[i + 1] = (src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 1] << 8) | src[(i << 1) + (Rfu.unk_6c.count - 1) * 12 + 0]; + if ((u8)gRecvCmds[mpId][0] == Rfu.unk_6c.count - 1) { - if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].unk_02]) + if (Rfu.unk_80[mpId].unk_08 != gUnknown_843EBD4[Rfu.unk_80[mpId].count]) { sub_80F965C(mpId, Rfu.unk_80[mpId].unk_08); gUnknown_203AC08.unk_64++; @@ -1280,7 +1282,7 @@ bool8 sub_80FA0F8(u8 a0) static void sub_80FA114(void) { rfu_clearAllSlot(); - sub_80FD52C(); + rfu_LMAN_powerDownRFU(); gReceivedRemoteLinkPlayers = 0; Rfu.unk_ef = 1; Rfu.RfuFunc = NULL; @@ -1297,7 +1299,7 @@ static void sub_80FA160(void) { if (Rfu.unk_0c == 0) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 2; } else @@ -1306,9 +1308,9 @@ static void sub_80FA160(void) void LinkRfu_FatalError(void) { - sub_80FEB14(); + rfu_LMAN_requestChangeAgbClockMaster(); Rfu.unk_ce4 = 1; - Rfu.unk_ce3 = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; + Rfu.bm_DisconnectSlot = gRfuLinkStatus->connSlotFlag | gRfuLinkStatus->linkLossSlotFlag; } static void sub_80FA1C4(void) @@ -1327,7 +1329,7 @@ static void sub_80FA1C4(void) gBattleTypeFlags &= (u16)~BATTLE_TYPE_20; if (Rfu.unk_0c == 0) { - Rfu.unk_ee = 3; + Rfu.errorState = 3; sub_80FA160(); } else @@ -1367,7 +1369,7 @@ static void sub_80FA2B0(void) if (GetMultiplayerId() != 0) { - if (Rfu.unk_124.unk_8c2 == 0 && Rfu.unk_fe > 0x3c) + if (Rfu.unk_124.count == 0 && Rfu.unk_fe > 0x3c) { sub_80F9D04(0x6600); Rfu.unk_fe = 0; @@ -1391,7 +1393,7 @@ static void sub_80FA2B0(void) static void sub_80FA350(void) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA2B0; @@ -1405,7 +1407,7 @@ static void sub_80FA388(void) if (GetMultiplayerId() != 0) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA2B0; @@ -1421,7 +1423,7 @@ static void sub_80FA388(void) } if (i == playerCount) { - if (Rfu.unk_124.unk_8c2 == 0 && gSendCmd[0] == 0) + if (Rfu.unk_124.count == 0 && gSendCmd[0] == 0) { sub_80F9D04(0x6600); Rfu.RfuFunc = sub_80FA350; @@ -1439,12 +1441,12 @@ void sub_80FA42C(void) } } -bool32 sub_80FA44C(u32 a0) +bool32 RfuSerialNumberIsValid(u32 serialNo) { s32 i; - for (i = 0; gUnknown_843EC8C[i] != a0; i++) + for (i = 0; sAcceptedSerialNos[i] != serialNo; i++) { - if (gUnknown_843EC8C[i] == 0xFFFF) + if (sAcceptedSerialNos[i] == 0xFFFF) return FALSE; } return TRUE; @@ -1453,15 +1455,15 @@ bool32 sub_80FA44C(u32 a0) u8 sub_80FA484(bool32 a0) { if (!a0) - return sub_80FEA34(0, 0); - sub_80FEA34(1, 0x258); + return rfu_LMAN_setLinkRecovery(0, 0); + rfu_LMAN_setLinkRecovery(1, 600); return 0; } void sub_80FA4A8(void) { Rfu.unk_cd9 = 1; - sub_80FD760(FALSE); + rfu_LMAN_stopManager(FALSE); } u8 LinkRfu_GetMultiplayerId(void) @@ -1507,7 +1509,7 @@ static bool8 sub_80FA528(void) } } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED) + else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED) { rfu_clearSlot(TYPE_NI_RECV, i); } @@ -1541,9 +1543,9 @@ bool32 sub_80FA5D4(void) return FALSE; } -bool32 sub_80FA634(u16 a0, const u8 *a1) +bool32 sub_80FA634(u16 trainerId, const u8 *trainerName) { - u8 r1 = sub_80FBC70(a1, a0); + u8 r1 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (r1 == 0xFF) return TRUE; if (Rfu.unk_cd1[r1] == 9) @@ -1553,7 +1555,7 @@ bool32 sub_80FA634(u16 a0, const u8 *a1) void sub_80FA670(u8 a0, u16 a1, const u8 *a2) { - u8 r4 = sub_80FBC70(a2, a1); + u8 r4 = GetPartnerIndexByNameAndTrainerID(a2, a1); Rfu.unk_cd1[r4] = a0; rfu_clearSlot(TYPE_NI_SEND, r4); rfu_NI_setSendData(1 << r4, 8, Rfu.unk_cd1 + r4, 1); @@ -1562,13 +1564,13 @@ void sub_80FA670(u8 a0, u16 a1, const u8 *a2) void sub_80FA6BC(void) { Rfu.unk_c85 = 8; - rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e); - rfu_NI_setSendData(1 << Rfu.unk_c3e, 8, &Rfu.unk_c85, 1); + rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot); + rfu_NI_setSendData(1 << Rfu.child_slot, 8, &Rfu.unk_c85, 1); } -u32 sub_80FA6FC(u16 a0, const u8 *a1) +u32 sub_80FA6FC(u16 trainerId, const u8 *trainerName) { - u8 r0 = sub_80FBC70(a1, a0); + u8 r0 = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (r0 == 0xFF) return 2; if (gRfuSlotStatusNI[r0]->send.state == 0) @@ -1597,18 +1599,18 @@ static s32 sub_80FA788(void) s32 retval = 0; if (Rfu.unk_c85 == 8) { - if (gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->send.state == SLOT_STATE_SEND_FAILED) - rfu_clearSlot(TYPE_NI_SEND, Rfu.unk_c3e); + if (gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->send.state == SLOT_STATE_SEND_FAILED) + rfu_clearSlot(TYPE_NI_SEND, Rfu.child_slot); } - if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) + if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS || gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN) { - rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e); + rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot); sub_80FB9E4(Rfu.unk_c86, 0); retval = Rfu.unk_c86; } - else if (gRfuSlotStatusNI[Rfu.unk_c3e]->recv.state == SLOT_STATE_RECV_FAILED) + else if (gRfuSlotStatusNI[Rfu.child_slot]->recv.state == SLOT_STATE_RECV_FAILED) { - rfu_clearSlot(TYPE_NI_RECV, Rfu.unk_c3e); + rfu_clearSlot(TYPE_NI_RECV, Rfu.child_slot); retval = 6; } return retval; @@ -1682,7 +1684,7 @@ static void sub_80FA834(u8 taskId) DestroyTask(taskId); gReceivedRemoteLinkPlayers = 1; Rfu.unk_ce8 = FALSE; - sub_80FEA34(1, 0x258); + rfu_LMAN_setLinkRecovery(1, 600); if (Rfu.unk_ce6) { for (i = 0; i < RFU_CHILD_MAX; i++) @@ -1840,42 +1842,42 @@ static void sub_80FACF0(u8 taskId) } } -static void sub_80FAD98(void) +static void RfuCheckErrorStatus(void) { - if (Rfu.unk_ee == 1 && gUnknown_3005E10.unk_02 == 0) + if (Rfu.errorState == 1 && lman.childClockSlave_flag == 0) { if (gMain.callback2 == c2_mystery_gift_e_reader_run) gWirelessCommType = 2; SetMainCallback2(CB2_LinkError); gMain.savedCallback = CB2_LinkError; - sub_800ACBC((Rfu.unk_0a << 16) | (Rfu.unk_10 << 8) | Rfu.unk_12, Rfu.unk_124.unk_8c2, Rfu.unk_9e8.unk_232, sub_80FB9F4() == 2); - Rfu.unk_ee = 2; + SetLinkErrorFromRfu((Rfu.linkman_msg << 16) | (Rfu.linkman_param[0] << 8) | Rfu.linkman_param[1], Rfu.unk_124.count, Rfu.unk_9e8.count, sub_80FB9F4() == 2); + Rfu.errorState = 2; CloseLink(); } - else if (Rfu.unk_9e8.unk_233 == 1 || Rfu.unk_124.unk_8c3 == 1) + else if (Rfu.unk_9e8.full == 1 || Rfu.unk_124.full == 1) { - if (gUnknown_3005E10.unk_02) - sub_80FEB14(); + if (lman.childClockSlave_flag) + rfu_LMAN_requestChangeAgbClockMaster(); sub_80FB9E4(1, 0x7000); - sub_80FB0E8(0x7000); + GetLinkmanErrorParams(0x7000); } } static void rfu_REQ_recvData_then_sendData(void) { - if (gUnknown_3005E10.unk_06 == 1) + if (lman.parent_child == MODE_PARENT) { rfu_REQ_recvData(); rfu_waitREQComplete(); - LinkRfu_REQ_SendData_HandleParentRelationship(0); + rfu_LMAN_REQ_sendData(RFU_CHILD_CLOCK_SLAVE_OFF); } } -bool32 sub_80FAE94(void) +bool32 LinkRfuMain1(void) { bool32 retval = FALSE; Rfu.unk_ccd = 0; - sub_80FDA30(Random()); + rfu_LMAN_manager_entity(Random()); if (Rfu.unk_ef == 0) { switch (Rfu.unk_0c) @@ -1894,14 +1896,14 @@ bool32 sub_80FAE94(void) return retval; } -bool32 sub_80FAEF0(void) +bool32 LinkRfuMain2(void) { bool32 retval = FALSE; if (Rfu.unk_ef == 0) { if (Rfu.unk_0c == 1) retval = sub_80F9204(); - sub_80FAD98(); + RfuCheckErrorStatus(); } return retval; } @@ -1955,11 +1957,11 @@ void sub_80FB030(u32 linkPlayerCount) u32 r7; s32 r8; - if (sub_80F9800()->unk_0a_0 == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { r5 = 0; r7 = 0; - r8 = Rfu.unk_ce2 ^ Rfu.unk_ce3; + r8 = Rfu.bm_PartnerFlags ^ Rfu.bm_DisconnectSlot; for (i = 0; i < RFU_CHILD_MAX; i++) { if ((r8 >> i) & 1) @@ -1975,33 +1977,33 @@ void sub_80FB030(u32 linkPlayerCount) } } -static void sub_80FB0E8(u32 a0) +static void GetLinkmanErrorParams(u32 msg) { - if (Rfu.unk_ee == 0) + if (Rfu.errorState == 0) { - Rfu.unk_10 = gUnknown_3005E10.unk_14; - Rfu.unk_12 = gUnknown_3005E10.unk_16; - Rfu.unk_0a = a0; - Rfu.unk_ee = 1; + Rfu.linkman_param[0] = lman.param[0]; + Rfu.linkman_param[1] = lman.param[1]; + Rfu.linkman_msg = msg; + Rfu.errorState = 1; } } static void sub_80FB118(void) { - Rfu.unk_ee = 0; + Rfu.errorState = 0; } void sub_80FB128(bool32 a0) { if (!a0) - Rfu.unk_ee = 0; + Rfu.errorState = 0; else - Rfu.unk_ee = 4; + Rfu.errorState = 4; } static void sub_80FB154(void) { - sub_80FBE20(gUnknown_3005E10.unk_00, 1); + sub_80FBE20(lman.acceptSlot_flag, 1); Rfu.RfuFunc = NULL; } @@ -2010,25 +2012,25 @@ static void sub_80FB174(void) Rfu.RfuFunc = sub_80FB154; } -static void sub_80FB184(u8 a0, u8 unused1) +static void sub_80FB184(u8 msg, u8 param_count) { u8 i; u8 r6 = 0; - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 2; break; - case 0x10: + case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: break; - case 0x11: - sub_80FB564(gUnknown_3005E10.unk_14); + case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: + sub_80FB564(lman.param[0]); for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_14 >> i) & 1) + if ((lman.param[0] >> i) & 1) { struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname; - if (structPtr->unk_0a_0 == sub_80F9800()->unk_0a_0) + if (structPtr->activity == GetHostRFUtgtGname()->activity) { Rfu.unk_cd1[i] = 0; Rfu.unk_cd5[i] = 0; @@ -2046,50 +2048,54 @@ static void sub_80FB184(u8 a0, u8 unused1) rfu_waitREQComplete(); } break; - case 0x12: + case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; - case 0x13: + case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; - case 0x14: - if (Rfu.unk_ce7 != gUnknown_3005E10.unk_00) + case LMAN_MSG_END_WAIT_CHILD_NAME: + if (Rfu.unk_ce7 != lman.acceptSlot_flag) { - rfu_REQ_disconnect(Rfu.unk_ce7 ^ gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(Rfu.unk_ce7 ^ lman.acceptSlot_flag); rfu_waitREQComplete(); } Rfu.unk_04 = 0x11; break; - case 0x31: - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + Rfu.linkLossRecoveryState = 1; break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; break; - case 0x30: - case 0x33: - Rfu.unk_f0 = 4; - Rfu.unk_ce2 &= ~gUnknown_3005E10.unk_14; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 4; + Rfu.bm_PartnerFlags &= ~lman.param[0]; if (gReceivedRemoteLinkPlayers == 1) { - if (Rfu.unk_ce2 == 0) - sub_80FB0E8(a0); + if (Rfu.bm_PartnerFlags == 0) + GetLinkmanErrorParams(msg); else sub_80FB174(); } - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); break; case 0x34: break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xf3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xf0 ... 0xf2: - case 0xff: - sub_80FB0E8(a0); - sub_80FB9E4(1, a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + GetLinkmanErrorParams(msg); + sub_80FB9E4(1, msg); Rfu.unk_cdb = 1; break; } @@ -2097,68 +2103,72 @@ static void sub_80FB184(u8 a0, u8 unused1) static const u8 unref_843EDF3[] = _(" あきと"); -static void sub_80FB37C(u8 a0, u8 unused1) +static void sub_80FB37C(u8 msg, u8 param_count) { - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 6; break; - case 0x20: - Rfu.unk_ccd = gUnknown_3005E10.unk_14; + case LMAN_MSG_PARENT_FOUND: + Rfu.unk_ccd = lman.param[0]; break; - case 0x21: + case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; - case 0x22: - Rfu.unk_c3e = gUnknown_3005E10.unk_14; + case LMAN_MSG_CONNECT_PARENT_SUCCESSED: + Rfu.child_slot = lman.param[0]; break; - case 0x23: - sub_80FB9E4(2, a0); + case LMAN_MSG_CONNECT_PARENT_FAILED: + sub_80FB9E4(2, msg); break; - case 0x24: + case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.unk_04 = 11; Rfu.unk_c85 = 0; Rfu.unk_c86 = 0; - rfu_setRecvBuffer(TYPE_NI, Rfu.unk_c3e, &Rfu.unk_c86, 1); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, 70); + rfu_setRecvBuffer(TYPE_NI, Rfu.child_slot, &Rfu.unk_c86, 1); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); break; - case 0x25: - sub_80FB9E4(2, 0x25); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + sub_80FB9E4(2, msg); break; - case 0x30: - Rfu.unk_f0 = 2; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 2; if (Rfu.unk_c86 == 6) break; - case 0x33: - if (Rfu.unk_f0 != 2) - Rfu.unk_f0 = 4; + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + if (Rfu.linkLossRecoveryState != 2) + Rfu.linkLossRecoveryState = 4; if (Rfu.unk_c86 != 9) - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); nullsub_87("LINK LOSS DISCONNECT!", 5, 5); if (gReceivedRemoteLinkPlayers == 1) - sub_80FB0E8(a0); + GetLinkmanErrorParams(msg); break; - case 0x31: - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + Rfu.linkLossRecoveryState = 1; nullsub_87("LINK LOSS RECOVERY NOW", 5, 5); break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; Rfu.unk_c3c = 1; break; case 0x34: break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xF3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xF0 ... 0xF2: - case 0xFF: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_cdb = 1; break; } @@ -2188,7 +2198,7 @@ static u8 sub_80FB5A0(s32 a0) if ((a0 >> i) & 1) { struct GFtgtGname *structPtr = (void *)&gRfuLinkStatus->partner[i].gname; - if (structPtr->unk_0a_0 == 0x45) + if (structPtr->activity == 0x45) ret |= (1 << i); } } @@ -2196,22 +2206,22 @@ static u8 sub_80FB5A0(s32 a0) return ret; } -static void sub_80FB5EC(u8 a0, u8 unused1) +static void sub_80FB5EC(u8 msg, u8 param_count) { u8 r1; - switch (a0) + switch (msg) { - case 0x00: + case LMAN_MSG_INITIALIZE_COMPLETED: Rfu.unk_04 = 0x11; break; - case 0x10: + case LMAN_MSG_NEW_CHILD_CONNECT_DETECTED: sub_80FB9E4(4, 0); break; - case 0x11: - if (sub_80F9800()->unk_0a_0 == 0x45 && Rfu.unk_cd9 == 0) + case LMAN_MSG_NEW_CHILD_CONNECT_ACCEPTED: + if (GetHostRFUtgtGname()->activity == 0x45 && Rfu.unk_cd9 == 0) { - u8 idx = sub_80FB5A0(gUnknown_3005E10.unk_14); + u8 idx = sub_80FB5A0(lman.param[0]); if (idx != 0) { r1 = 1 << sub_80F886C(idx); @@ -2226,42 +2236,42 @@ static void sub_80FB5EC(u8 a0, u8 unused1) Rfu.unk_ce6 |= idx; } } - if (idx != gUnknown_3005E10.unk_14) + if (idx != lman.param[0]) { - Rfu.unk_ce3 |= (idx ^ gUnknown_3005E10.unk_14); + Rfu.bm_DisconnectSlot |= (idx ^ lman.param[0]); Rfu.unk_ce4 = 2; } } - else if (sub_80F9800()->unk_0a_0 == 0x54) + else if (GetHostRFUtgtGname()->activity == 0x54) { - rfu_REQ_disconnect(gUnknown_3005E10.unk_00); + rfu_REQ_disconnect(lman.acceptSlot_flag); rfu_waitREQComplete(); } - sub_80FB564(gUnknown_3005E10.unk_14); + sub_80FB564(lman.param[0]); break; - case 0x12: + case LMAN_MSG_NEW_CHILD_CONNECT_REJECTED: break; - case 0x13: + case LMAN_MSG_SEARCH_CHILD_PERIOD_EXPIRED: break; - case 0x14: - if (sub_80F9800()->unk_0a_0 != 0x45 && gUnknown_3005E10.unk_01 > 1) + case LMAN_MSG_END_WAIT_CHILD_NAME: + if (GetHostRFUtgtGname()->activity != 0x45 && lman.acceptCount > 1) { - r1 = 1 << sub_80F886C(gUnknown_3005E10.unk_14); - rfu_REQ_disconnect(gUnknown_3005E10.unk_00 ^ r1); + r1 = 1 << sub_80F886C(lman.param[0]); + rfu_REQ_disconnect(lman.acceptSlot_flag ^ r1); rfu_waitREQComplete(); } if (Rfu.unk_04 == 0xF) Rfu.unk_04 = 0x10; break; - case 0x20: - Rfu.unk_ccd = gUnknown_3005E10.unk_14; + case LMAN_MSG_PARENT_FOUND: + Rfu.unk_ccd = lman.param[0]; break; - case 0x21: + case LMAN_MSG_SEARCH_PARENT_PERIOD_EXPIRED: break; - case 0x22: - Rfu.unk_c3e = gUnknown_3005E10.unk_14; + case LMAN_MSG_CONNECT_PARENT_SUCCESSED: + Rfu.child_slot = lman.param[0]; break; - case 0x23: + case LMAN_MSG_CONNECT_PARENT_FAILED: Rfu.unk_04 = 0x12; if (Rfu.unk_ccf < 2) { @@ -2270,67 +2280,72 @@ static void sub_80FB5EC(u8 a0, u8 unused1) } else { - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); } break; - case 0x24: + case LMAN_MSG_CHILD_NAME_SEND_COMPLETED: Rfu.unk_04 = 0xD; sub_80FB9E4(3, 0); - rfu_setRecvBuffer(TYPE_UNI, Rfu.unk_c3e, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); + rfu_setRecvBuffer(TYPE_UNI, Rfu.child_slot, Rfu.unk_c3f, sizeof(Rfu.unk_c3f)); break; - case 0x25: - sub_80FB9E4(2, a0); + case LMAN_MSG_CHILD_NAME_SEND_FAILED_AND_DISCONNECTED: + sub_80FB9E4(2, msg); break; - case 0x31: - if (gUnknown_3005E10.unk_00 & gUnknown_3005E10.unk_14) - Rfu.unk_f0 = 1; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_START_RECOVERY: + if (lman.acceptSlot_flag & lman.param[0]) + Rfu.linkLossRecoveryState = 1; break; - case 0x32: - Rfu.unk_f0 = 3; + case LMAN_MSG_LINK_RECOVERY_SUCCESSED: + Rfu.linkLossRecoveryState = 3; if (gRfuLinkStatus->parentChild == MODE_CHILD) Rfu.unk_c3c = 1; break; - case 0x30: - Rfu.unk_f0 = 2; - case 0x33: - if (Rfu.unk_f0 != 2) - Rfu.unk_f0 = 4; + case LMAN_MSG_LINK_LOSS_DETECTED_AND_DISCONNECTED: + Rfu.linkLossRecoveryState = 2; + // fallthrough + case LMAN_MSG_LINK_RECOVERY_FAILED_AND_DISCONNECTED: + if (Rfu.linkLossRecoveryState != 2) + Rfu.linkLossRecoveryState = 4; if (Rfu.unk_0c == 1) { if (gReceivedRemoteLinkPlayers == 1) { - Rfu.unk_ce2 &= ~(gUnknown_3005E10.unk_14); - if (Rfu.unk_ce2 == 0) - sub_80FB0E8(a0); + Rfu.bm_PartnerFlags &= ~(lman.param[0]); + if (Rfu.bm_PartnerFlags == 0) + GetLinkmanErrorParams(msg); else sub_80FB174(); } } else if (Rfu.unk_ce4 != 2 && gReceivedRemoteLinkPlayers == 1) { - sub_80FB0E8(a0); - sub_80FD760(0); + GetLinkmanErrorParams(msg); + rfu_LMAN_stopManager(0); } - if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && gUnknown_3005E10.unk_07 == 0 && FuncIsActiveTask(sub_80F8B34) == TRUE) + if (gRfuLinkStatus->parentChild == MODE_NEUTRAL && lman.pcswitch_flag == 0 && FuncIsActiveTask(sub_80F8B34) == TRUE) Rfu.unk_04 = 0x11; - sub_80FB9E4(2, a0); + sub_80FB9E4(2, msg); break; - case 0x40: - Rfu.unk_ce3 = 0; + case LMAN_MSG_LINK_DISCONNECTED_BY_USER: + Rfu.bm_DisconnectSlot = 0; break; - case 0x42 ... 0x44: + case LMAN_MSG_RFU_POWER_DOWN: + case LMAN_MSG_MANAGER_STOPPED: + case LMAN_MSG_MANAGER_FORCED_STOPPED_AND_RFU_RESET: break; - case 0xF3: - sub_80FB9E4(1, a0); - sub_80FB0E8(a0); + case LMAN_MSG_LMAN_API_ERROR_RETURN: + sub_80FB9E4(1, msg); + GetLinkmanErrorParams(msg); Rfu.unk_ef = 1; break; - case 0xF0 ... 0xF2: - case 0xFF: - sub_80FB0E8(a0); - sub_80FB9E4(1, a0); + case LMAN_MSG_REQ_API_ERROR: + case LMAN_MSG_WATCH_DOG_TIMER_ERROR: + case LMAN_MSG_CLOCK_SLAVE_MS_CHANGE_ERROR_BY_DMA: + case LMAN_MSG_RFU_FATAL_ERROR: + GetLinkmanErrorParams(msg); + sub_80FB9E4(1, msg); Rfu.unk_cdb = 0; break; } @@ -2341,10 +2356,10 @@ void sub_80FB9D0(void) Rfu.unk_ce4 = 2; } -void sub_80FB9E4(u8 a0, u16 a1) +void sub_80FB9E4(u8 a0, u16 msg) { Rfu.unk_f1 = a0; - Rfu.unk_0a = a1; + Rfu.linkman_msg = msg; } u8 sub_80FB9F4(void) @@ -2354,8 +2369,8 @@ u8 sub_80FB9F4(void) bool32 sub_80FBA00(void) { - u32 var = sub_80FB9F4() - 1; - if (var < 2) + u32 var = sub_80FB9F4(); + if (var == 1 || var == 2) return TRUE; else return FALSE; @@ -2373,7 +2388,7 @@ bool8 Rfu_IsMaster(void) void RFUVSync(void) { - LinkRfu_syncVBlank_(); + rfu_LMAN_syncVBlank(); } void sub_80FBA44(void) @@ -2445,9 +2460,9 @@ void sub_80FBB8C(u32 a0) { Rfu.unk_0c = 1; sub_80FAF1C(); - sub_80FD430(sub_80FB184, NULL); + rfu_LMAN_initializeManager(sub_80FB184, NULL); sRfuReqConfig = sRfuReqConfigTemplate; - sRfuReqConfig.availSlotFlag = sAvailSlots[a0 - 1]; + sRfuReqConfig.availSlot_flag = sAvailSlots[a0 - 1]; sub_80F8E74(); } @@ -2455,7 +2470,7 @@ void sub_80FBBD8(void) { Rfu.unk_0c = 0; sub_80FAF1C(); - sub_80FD430(sub_80FB37C, sub_80F8D20); + rfu_LMAN_initializeManager(sub_80FB37C, sub_80F8D20); sub_80F8F10(); } @@ -2465,10 +2480,10 @@ void sub_80FBC00(void) return; Rfu.unk_0c = 2; sub_80FAF1C(); - sub_80FD430(sub_80FB5EC, NULL); + rfu_LMAN_initializeManager(sub_80FB5EC, NULL); sRfuReqConfig = sRfuReqConfigTemplate; - sRfuReqConfig.unk_11 = 0; - sRfuReqConfig.unk_12 = 0x258; + sRfuReqConfig.linkRecovery_enable = 0; + sRfuReqConfig.linkRecovery_period = 600; Rfu.unk_67 = CreateTask(sub_80F8B34, 1); } @@ -2478,17 +2493,24 @@ static u16 ReadU16(const void *ptr) return (ptr_[1] << 8) | (ptr_[0]); } -static u8 sub_80FBC70(const u8 *a0, u16 a1) +/* + * ================================================================ + * Looks up the player by uname and pid. Returns the index in + * gRfuLinkStatus->partner of the first match with a valid slot ID. + * Returns 0xFF if not found. + * ================================================================ + */ +static u8 GetPartnerIndexByNameAndTrainerID(const u8 *trainerName, u16 trainerId) { u8 i; u8 ret = 0xFF; for (i = 0; i < RFU_CHILD_MAX; i++) { - u16 trainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId); - if (sub_80FA44C(gRfuLinkStatus->partner[i].serialNo) - && !StringCompare(a0, gRfuLinkStatus->partner[i].uname) - && a1 == trainerId) + u16 partnerTrainerId = ReadU16(((struct GFtgtGname *)gRfuLinkStatus->partner[i].gname)->unk_00.playerTrainerId); + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[i].serialNo) + && !StringCompare(trainerName, gRfuLinkStatus->partner[i].uname) + && trainerId == partnerTrainerId) { ret = i; if (gRfuLinkStatus->partner[i].slot != 0xFF) @@ -2499,19 +2521,19 @@ static u8 sub_80FBC70(const u8 *a0, u16 a1) return ret; } -static void sub_80FBCF8(u32 a0) +static void sub_80FBCF8(u32 bmDisconnectSlot) { - rfu_REQ_disconnect(a0); + rfu_REQ_disconnect(bmDisconnectSlot); rfu_waitREQComplete(); - Rfu.unk_ce2 &= ~(a0); + Rfu.bm_PartnerFlags &= ~(bmDisconnectSlot); rfu_clearSlot(TYPE_UNI_SEND, Rfu.unk_cda); - rfu_UNI_setSendData(Rfu.unk_ce2, Rfu.unk_c87, 70); - Rfu.unk_cda = sub_80F886C(Rfu.unk_ce2); + rfu_UNI_setSendData(Rfu.bm_PartnerFlags, Rfu.recvCmds, 70); + Rfu.unk_cda = sub_80F886C(Rfu.bm_PartnerFlags); } -void sub_80FBD4C(const u8 *ptr, u16 a1) +void sub_80FBD4C(const u8 *trainerName, u16 trainerId) { - u8 var = sub_80FBC70(ptr, a1); + u8 var = GetPartnerIndexByNameAndTrainerID(trainerName, trainerId); if (var != 0xFF) sub_80FBCF8(1 << var); } @@ -2525,7 +2547,7 @@ void sub_80FBD6C(u32 a0) for (i = 0; i < RFU_CHILD_MAX; i++) { - if (Rfu.unk_cde[i] == a0 && (Rfu.unk_ce2 >> i) & 1) + if (Rfu.unk_cde[i] == a0 && (Rfu.bm_PartnerFlags >> i) & 1) var |= 1 << i; } if (var) @@ -2568,7 +2590,7 @@ static void sub_80FBE80(u8 taskId) if (sub_80F8EA4()) { - u8 id = sub_80FBC70((u8*)data, ReadU16(&data[8])); + u8 id = GetPartnerIndexByNameAndTrainerID((u8*)data, ReadU16(&data[8])); if (id != 0xFF) { if (gRfuLinkStatus->partner[id].slot != 0xFF) @@ -2577,7 +2599,7 @@ static void sub_80FBE80(u8 taskId) if (sub_80F8ECC()) DestroyTask(taskId); } - else if (sub_80F9800()->unk_0a_0 == 0x15 || sub_80F9800()->unk_0a_0 == 0x16) + else if (GetHostRFUtgtGname()->activity == 0x15 || GetHostRFUtgtGname()->activity == 0x16) { data[15]++; } @@ -2619,12 +2641,12 @@ void sub_80FBF54(const u8 *src, u16 trainerId) static bool32 sub_80FBF98(s16 a1, struct GFtgtGname *structPtr) { - if (sub_80F9800()->unk_0a_0 == 0x45) + if (GetHostRFUtgtGname()->activity == 0x45) { - if (structPtr->unk_0a_0 != 0x45) + if (structPtr->activity != 0x45) return TRUE; } - else if (structPtr->unk_0a_0 != 0x40) + else if (structPtr->activity != 0x40) { return TRUE; } @@ -2660,15 +2682,15 @@ static void sub_80FC028(u8 taskId) DestroyTask(taskId); } - if (Rfu.unk_ccd != 0 && gUnknown_3005E10.unk_06 == 0) + if (Rfu.unk_ccd != 0 && lman.parent_child == 0) { u16 trainerId = ReadU16(((struct GFtgtGname *)&Rfu.unk_104.gname)->unk_00.playerTrainerId); - u8 id = sub_80FBC70(Rfu.unk_104.uname, trainerId); + u8 id = GetPartnerIndexByNameAndTrainerID(Rfu.unk_104.uname, trainerId); if (id != 0xFF) { if (!sub_80FBF98(gTasks[taskId].data[1], (struct GFtgtGname *)&gRfuLinkStatus->partner[id].gname)) { - if (gRfuLinkStatus->partner[id].slot != 0xFF && !sub_80FD610(gRfuLinkStatus->partner[id].id, 0x5A)) + if (gRfuLinkStatus->partner[id].slot != 0xFF && !rfu_LMAN_CHILD_connectParent(gRfuLinkStatus->partner[id].id, 0x5A)) { Rfu.unk_04 = 0xA; DestroyTask(taskId); @@ -2691,7 +2713,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2) Rfu.unk_f1 = 0; StringCopy(Rfu.unk_104.uname, name); memcpy(Rfu.unk_104.gname, structPtr, RFU_GAME_NAME_LENGTH); - sub_80FEB3C(); + rfu_LMAN_forceChangeSP(); taskId = CreateTask(sub_80FC028, 2); gTasks[taskId].data[1] = a2; taskId2 = FindTaskIdByFunc(sub_80F8B34); @@ -2709,7 +2731,7 @@ void sub_80FC114(const u8 *name, struct GFtgtGname *structPtr, u8 a2) bool8 sub_80FC1B0(void) { - if (Rfu.unk_f0 == 1) + if (Rfu.linkLossRecoveryState == 1) return TRUE; else return FALSE; @@ -2721,7 +2743,7 @@ bool32 sub_80FC1CC(void) for (i = 0; i < RFU_CHILD_MAX; i++) { - if ((gUnknown_3005E10.unk_00 >> i) & 1 && Rfu.unk_cd1[i] == 0) + if ((lman.acceptSlot_flag >> i) & 1 && Rfu.unk_cd1[i] == 0) return FALSE; } @@ -2784,9 +2806,9 @@ static void sub_80FC228(void) nullsub_87(gUnknown_843EE47, 6, i + 3); nullsub_87(gUnknown_843EE57, 0x16, i + 3); } - nullsub_88(gRfuLinkStatus->partner[Rfu.unk_c3e].serialNo, 1, 3, 4); - nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].gname, 6, 3); - nullsub_87(gRfuLinkStatus->partner[Rfu.unk_c3e].uname, 0x16, 3); + nullsub_88(gRfuLinkStatus->partner[Rfu.child_slot].serialNo, 1, 3, 4); + nullsub_87(gRfuLinkStatus->partner[Rfu.child_slot].gname, 6, 3); + nullsub_87(gRfuLinkStatus->partner[Rfu.child_slot].uname, 0x16, 3); } else { @@ -2824,12 +2846,12 @@ static const char gUnknown_843EEA8[][8] = { static u32 sub_80FC44C(void) { - return Rfu.unk_9e8.unk_232; + return Rfu.unk_9e8.count; } u32 GetRfuRecvQueueLength(void) { - return Rfu.unk_124.unk_8c2; + return Rfu.unk_124.count; } static void nullsub_89(u8 taskId) diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 69b6603a8..d7866b98a 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -166,7 +166,7 @@ static const struct SpriteTemplate sWirelessStatusIndicatorSpriteTemplate = { SpriteCallbackDummy }; -void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr) +void RFU_queue_20_70_reset(struct UnkRfuStruct_2_Sub_124 *queue) { s32 i; s32 j; @@ -175,16 +175,16 @@ void sub_80FC478(struct UnkRfuStruct_2_Sub_124 *ptr) { for (j = 0; j < 70; j++) { - ptr->unk_00[i][j] = 0; + queue->slots[i][j] = 0; } } - ptr->unk_8c1 = 0; - ptr->unk_8c0 = 0; - ptr->unk_8c2 = 0; - ptr->unk_8c3 = 0; + queue->send_slot = 0; + queue->recv_slot = 0; + queue->count = 0; + queue->full = 0; } -void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr) +void RFU_queue_40_14_reset(struct UnkRfuStruct_2_Sub_9e8 *ptr) { s32 i; s32 j; @@ -193,16 +193,16 @@ void sub_80FC4D4(struct UnkRfuStruct_2_Sub_9e8 *ptr) { for (j = 0; j < 14; j++) { - ptr->unk_00[i][j] = 0; + ptr->slots[i][j] = 0; } } - ptr->unk_231 = 0; - ptr->unk_230 = 0; - ptr->unk_232 = 0; - ptr->unk_233 = 0; + ptr->send_slot = 0; + ptr->recv_slot = 0; + ptr->count = 0; + ptr->full = 0; } -static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr) +static void RFU_queue_2_256_reset(struct UnkRfuStruct_Sub_Unused *ptr) { s32 i; s32 j; @@ -211,29 +211,29 @@ static void sub_80FC530(struct UnkRfuStruct_Sub_Unused *ptr) { for (j = 0; j < 256; j++) { - ptr->unk_00[i][j] = 0; + ptr->slots[i][j] = 0; } } - ptr->unk_201 = 0; - ptr->unk_200 = 0; - ptr->unk_202 = 0; - ptr->unk_203 = 0; + ptr->send_slot = 0; + ptr->recv_slot = 0; + ptr->count = 0; + ptr->full = 0; } -void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +void RFU_queue_20_70_recv(struct UnkRfuStruct_2_Sub_124 *queue, u8 *data) { s32 i; u16 imeBak; u8 count; - if (q1->unk_8c2 < 20) + if (queue->count < 20) { imeBak = REG_IME; REG_IME = 0; count = 0; for (i = 0; i < 70; i += 14) { - if (q2[i] == 0 && q2[i + 1] == 0) + if (data[i] == 0 && data[i + 1] == 0) { count++; } @@ -242,36 +242,36 @@ void sub_80FC588(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) { for (i = 0; i < 70; i++) { - q1->unk_00[q1->unk_8c0][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_8c0++; - q1->unk_8c0 %= 20; - q1->unk_8c2++; + queue->recv_slot++; + queue->recv_slot %= 20; + queue->count++; for (i = 0; i < 70; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->unk_8c3 = 1; + queue->full = 1; } } -void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +void RFU_queue_40_14_recv(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *data) { s32 i; u16 imeBak; - if (q1->unk_232 < 40) + if (queue->count < 40) { imeBak = REG_IME; REG_IME = 0; for (i = 0; i < 14; i++) { - if (q2[i] != 0) + if (data[i] != 0) { break; } @@ -280,57 +280,57 @@ void sub_80FC63C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) { for (i = 0; i < 14; i++) { - q1->unk_00[q1->unk_230][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_230++; - q1->unk_230 %= 40; - q1->unk_232++; + queue->recv_slot++; + queue->recv_slot %= 40; + queue->count++; for (i = 0; i < 14; i++) { - q2[i] = 0; + data[i] = 0; } } REG_IME = imeBak; } else { - q1->unk_233 = 1; + queue->full = 1; } } -bool8 sub_80FC6E8(struct UnkRfuStruct_2_Sub_124 *q1, u8 *q2) +bool8 RFU_queue_20_70_send(struct UnkRfuStruct_2_Sub_124 *queue, u8 *dest) { u16 imeBak; s32 i; imeBak = REG_IME; REG_IME = 0; - if (q1->unk_8c0 == q1->unk_8c1 || q1->unk_8c3 != 0) + if (queue->recv_slot == queue->send_slot || queue->full) { for (i = 0; i < 70; i++) { - q2[i] = 0; + dest[i] = 0; } REG_IME = imeBak; return FALSE; } for (i = 0; i < 70; i++) { - q2[i] = q1->unk_00[q1->unk_8c1][i]; + dest[i] = queue->slots[queue->send_slot][i]; } - q1->unk_8c1++; - q1->unk_8c1 %= 20; - q1->unk_8c2--; + queue->send_slot++; + queue->send_slot %= 20; + queue->count--; REG_IME = imeBak; return TRUE; } -bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) +bool8 RFU_queue_40_14_send(struct UnkRfuStruct_2_Sub_9e8 *queue, u8 *dest) { s32 i; u16 imeBak; - if (q1->unk_230 == q1->unk_231 || q1->unk_233 != 0) + if (queue->recv_slot == queue->send_slot || queue->full != 0) { return FALSE; } @@ -338,98 +338,98 @@ bool8 sub_80FC79C(struct UnkRfuStruct_2_Sub_9e8 *q1, u8 *q2) REG_IME = 0; for (i = 0; i < 14; i++) { - q2[i] = q1->unk_00[q1->unk_231][i]; + dest[i] = queue->slots[queue->send_slot][i]; } - q1->unk_231++; - q1->unk_231 %= 40; - q1->unk_232--; + queue->send_slot++; + queue->send_slot %= 40; + queue->count--; REG_IME = imeBak; return TRUE; } -void sub_80FC828(struct UnkRfuStruct_2_Sub_c1c *q1, const u8 *q2) +void RFU_queue_2_14_recv(struct UnkRfuStruct_2_Sub_c1c *queue, const u8 *data) { s32 i; - if (q2[1] == 0) + if (data[1] == 0) { - sub_80FC888(q1, NULL); + RFU_queue_2_14_send(queue, NULL); } else { for (i = 0; i < 14; i++) { - q1->unk_00[q1->unk_1c][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_1c++; - q1->unk_1c %= 2; - if (q1->unk_1e < 2) + queue->recv_slot++; + queue->recv_slot %= 2; + if (queue->count < 2) { - q1->unk_1e++; + queue->count++; } else { - q1->unk_1d = q1->unk_1c; + queue->send_slot = queue->recv_slot; } } } -bool8 sub_80FC888(struct UnkRfuStruct_2_Sub_c1c *q1, u8 *q2) +bool8 RFU_queue_2_14_send(struct UnkRfuStruct_2_Sub_c1c *queue, u8 *dest) { s32 i; - if (q1->unk_1e == 0) + if (queue->count == 0) { return FALSE; } - if (q2 != NULL) + if (dest != NULL) { for (i = 0; i < 14; i++) { - q2[i] = q1->unk_00[q1->unk_1d][i]; + dest[i] = queue->slots[queue->send_slot][i]; } } - q1->unk_1d++; - q1->unk_1d %= 2; - q1->unk_1e--; + queue->send_slot++; + queue->send_slot %= 2; + queue->count--; return TRUE; } -static void sub_80FC8D8(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2) +static void RFU_queue_2_256_recv(struct UnkRfuStruct_Sub_Unused *queue, u8 *data) { s32 i; - if (q1->unk_202 < 2) + if (queue->count < 2) { for (i = 0; i < 256; i++) { - q1->unk_00[q1->unk_200][i] = q2[i]; + queue->slots[queue->recv_slot][i] = data[i]; } - q1->unk_200++; - q1->unk_200 %= 2; - q1->unk_202++; + queue->recv_slot++; + queue->recv_slot %= 2; + queue->count++; } else { - q1->unk_203 = 1; + queue->full = 1; } } -static bool8 sub_80FC944(struct UnkRfuStruct_Sub_Unused *q1, u8 *q2) +static bool8 RFU_queue_2_256_send(struct UnkRfuStruct_Sub_Unused *queue, u8 *send) { s32 i; - if (q1->unk_200 == q1->unk_201 || q1->unk_203) + if (queue->recv_slot == queue->send_slot || queue->full) { return FALSE; } for (i = 0; i < 256; i++) { - q2[i] = q1->unk_00[q1->unk_201][i]; + send[i] = queue->slots[queue->send_slot][i]; } - q1->unk_201++; - q1->unk_201 %= 2; - q1->unk_202--; + queue->send_slot++; + queue->send_slot %= 2; + queue->count--; return TRUE; } @@ -438,7 +438,7 @@ static void sub_80FC9B8(u8 *q1, u8 mode) s32 i; u8 rval; u16 r5 = 0; - static u8 _3002018; + static u8 counter; switch (mode) { @@ -470,11 +470,11 @@ static void sub_80FC9B8(u8 *q1, u8 mode) case 3: for (i = 0; i < 200; i++) { - q1[i] = i + 1 + _3002018; - r5 += (i + 1 + _3002018) & 0xFF; + q1[i] = i + 1 + counter; + r5 += (i + 1 + counter) & 0xFF; } *((u16 *)(q1 + i)) = r5; - _3002018++; + counter++; break; } } @@ -617,7 +617,7 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3 r3 >>= 8; } data->playerGender = gSaveBlock2Ptr->playerGender; - data->unk_0a_0 = activity; + data->activity = activity; data->unk_0a_7 = r2; data->unk_00.unk_00_0 = GAME_LANGUAGE; data->unk_00.unk_01_2 = GAME_VERSION; @@ -629,14 +629,21 @@ void InitHostRFUtgtGname(struct GFtgtGname *data, u8 activity, bool32 r2, s32 r3 data->unk_00.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR); } +/* + * ========================================================== + * Returns 1 if parent, 0 if child or neutral. + * If partner serial number is valid, copies gname and uname. + * Otherwise, blanks these. + * ========================================================== + */ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) { bool8 retVal; - if (gUnknown_3005E10.unk_06 == 1) + if (lman.parent_child == MODE_PARENT) { retVal = TRUE; - if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo) && ((gRfuLinkStatus->getNameFlag >> idx) & 1)) { memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); @@ -650,7 +657,7 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) else { retVal = FALSE; - if (sub_80FA44C(gRfuLinkStatus->partner[idx].serialNo)) + if (RfuSerialNumberIsValid(gRfuLinkStatus->partner[idx].serialNo)) { memcpy(gname, &gRfuLinkStatus->partner[idx].gname, RFU_GAME_NAME_LENGTH); memcpy(uname, gRfuLinkStatus->partner[idx].uname, RFU_USER_NAME_LENGTH); @@ -664,6 +671,12 @@ bool8 sub_80FCC3C(struct GFtgtGname *gname, u8 *uname, u8 idx) return retVal; } +/* + * ========================================================== + * Specific check for serial number 0x7F7D, + * which comes from ??? + * ========================================================== + */ bool8 sub_80FCCF4(struct GFtgtGname *gname, u8 *uname, u8 idx) { bool8 retVal = FALSE; @@ -879,7 +892,7 @@ void RecordMixTrainerNames(void) s32 connectedTrainerRecordIndices[5]; struct TrainerNameRecord *newRecords = AllocZeroed(20 * sizeof(struct TrainerNameRecord)); - // Check if we already have a record saved for connected trainers. + // Check if we alsendy have a record saved for connected trainers. for (i = 0; i < GetLinkPlayerCount(); i++) { connectedTrainerRecordIndices[i] = -1; @@ -900,7 +913,7 @@ void RecordMixTrainerNames(void) { CopyTrainerRecord(&newRecords[nextSpace], (u16)gLinkPlayers[i].trainerId, gLinkPlayers[i].name); - // If we already had a record for this trainer, wipe it so that the next step doesn't duplicate it. + // If we alsendy had a record for this trainer, wipe it so that the next step doesn't duplicate it. if (connectedTrainerRecordIndices[i] >= 0) { ZeroName(gSaveBlock1Ptr->trainerNameRecords[connectedTrainerRecordIndices[i]].trainerName); diff --git a/src/party_menu.c b/src/party_menu.c index df0e70b37..c9a88f157 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -3881,7 +3881,7 @@ static void CursorCB_Register(u8 taskId) u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); - switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)sub_80F9800(), species2, species, obedience)) + switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience)) { case CANT_REGISTER_MON: StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); @@ -3907,7 +3907,7 @@ static void CursorCB_Trade1(u8 taskId) u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); - u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)sub_80F9800(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience); + u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gUnknown_203B064, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience); if (stringId != UR_TRADE_MSG_NONE) { diff --git a/src/rfu_union_tool.c b/src/rfu_union_tool.c index 3811aa3e7..36b291057 100644 --- a/src/rfu_union_tool.c +++ b/src/rfu_union_tool.c @@ -17,7 +17,7 @@ static EWRAM_DATA u32 sUnionObjRefreshTimer = 0; static u8 StartUnionObjAnimTask(void); static u32 sub_811BBC8(u32 playerIdx, u32 arg1); -static void sub_811C008(s32 arg0, s32 arg1, u8 arg2); +static void UnionPartnerObjectSetFacing(s32 arg0, s32 arg1, u8 arg2); static const u8 sUnionObjectEventGfxIds[][10] = { [MALE] = { @@ -70,11 +70,11 @@ static const u8 sOppositeFacingDirection[] = { }; static const u8 gUnknown_845711B[] = { - 1, - 3, - 1, - 4, - 2 + [DIR_NONE] = DIR_SOUTH, + [DIR_SOUTH] = DIR_WEST, + [DIR_NORTH] = DIR_SOUTH, + [DIR_WEST] = DIR_EAST, + [DIR_EAST] = DIR_NORTH }; static const u8 sUnionRoomLocalIds[] = { @@ -467,19 +467,19 @@ void sub_811BB68(void) } } -static u8 sub_811BBA0(u32 r1, u32 unused, struct GFtgtGname * r2) +static u8 UnionPartnerObjectGetFacing(u32 r1, u32 unused, struct GFtgtGname * gname) { if (r1 != 0) { return gUnknown_845711B[r1]; } - else if (r2->unk_0a_0 == 0x45) + else if (gname->activity == 0x45) { - return 1; + return DIR_SOUTH; } else { - return 4; + return DIR_EAST; } } @@ -488,7 +488,7 @@ static u32 sub_811BBC8(u32 a0, u32 a1) return RfuUnionObjectIsInvisible(5 * a0 + a1 - 0x38); } -static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9) +static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * gname) { s32 x, y; s32 r7 = 5 * r5 + r6; @@ -498,7 +498,7 @@ static void sub_811BBE0(u32 r5, u32 r6, u8 r8, struct GFtgtGname * r9) RfuUnionObjectStartWarp(r7 - 0x38, 1); } RfuUnionObjectSetFacingDirection(r7 - 0x38, r8); - sub_811C008(r6, r5, sub_811BBA0(r6, r5, r9)); + UnionPartnerObjectSetFacing(r6, r5, UnionPartnerObjectGetFacing(r6, r5, gname)); GetUnionRoomPlayerFacingCoords(r5, r6, &x, &y); sub_8059024(x, y, 1); } @@ -542,7 +542,7 @@ static void sub_811BCA0(u32 r7, struct GFtgtGname * r8) static void sub_811BDA8(u32 r5, struct GFtgtGname * r4) { u32 i; - switch (r4->unk_0a_0) + switch (r4->activity) { case 0x40: case 0x54: @@ -567,7 +567,7 @@ static void sub_811BDA8(u32 r5, struct GFtgtGname * r4) } } -static void sub_811BE6C(u32 r5, struct GFtgtGname * unused) +static void sub_811BE6C(u32 r5, struct GFtgtGname * gname) { s32 i; sub_811B90C(r5); @@ -584,11 +584,11 @@ static void UpdateUnionRoomPlayerSprites(struct UnkStruct_URoom *r0) sUnionObjRefreshTimer = 0; for (i = 0, r4 = r0->field_0->arr; i < 8; i++) { - if (r4[i].field_1A_0 == 1) + if (r4[i].tradeStatus == 1) { sub_811BDA8(i, &r4[i].unk.gname); } - else if (r4[i].field_1A_0 == 2) + else if (r4[i].tradeStatus == 2) { sub_811BE6C(i, &r4[i].unk.gname); } @@ -639,11 +639,11 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) { continue; } - if (r4[i].field_1A_0 != 1) + if (r4[i].tradeStatus != 1) { continue; } - sub_811C008(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]); + UnionPartnerObjectSetFacing(j, i, sOppositeFacingDirection[GetPlayerFacingDirection()]); *arg1 = j; *arg2 = i; return TRUE; @@ -652,12 +652,12 @@ bool32 sub_811BF00(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3) return FALSE; } -static void sub_811C008(s32 arg0, s32 arg1, u8 arg2) +static void UnionPartnerObjectSetFacing(s32 arg0, s32 arg1, u8 arg2) { TurnObjectEvent(5 * arg1 - 0x38 + arg0, arg2); } void sub_811C028(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2) { - return sub_811C008(arg0, arg1, sub_811BBA0(arg0, arg1, &arg2->arr[arg1].unk.gname)); + return UnionPartnerObjectSetFacing(arg0, arg1, UnionPartnerObjectGetFacing(arg0, arg1, &arg2->arr[arg1].unk.gname)); } diff --git a/src/union_room.c b/src/union_room.c index f942fb7d3..30f4d7d9b 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -65,7 +65,7 @@ static void sub_81161E4(struct UnkStruct_Leader * leader); static bool8 sub_8116444(struct UnkStruct_Leader * leader, u32 a1, u32 a2); static void sub_81164C8(u8 windowId, s32 itemId, u8 y); static u8 sub_8116524(struct UnkStruct_Main0 * a0); -static u8 sub_81165E8(struct UnkStruct_Main0 * a0); +static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * a0); static void sub_8116738(u8 taskId); static u32 sub_8116D10(struct UnkStruct_Group * group, s32 id); static void sub_8116D60(struct UnkStruct_Group * group, s32 id); @@ -90,16 +90,16 @@ static u8 sub_811A084(struct UnkStruct_Main4 * arg0, u32 arg1); static bool32 sub_811A0B4(const u8 * str); static bool32 sub_811A0E0(void); static bool8 PrintOnTextbox(u8 *textState, const u8 *str); -static s8 sub_811A14C(u8 *dest, bool32 arg1); -static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate); -static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6); +static s8 sub_811A14C(u8 *state_p, bool32 no_draw); +static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate); +static s32 TradeBoardMenuHandler(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6); static void sub_811A3F8(void); static void sub_811A41C(void); -static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); -static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count); -static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count); -static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1); -static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1); +static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx); +static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * arg0, u8 count); +static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * arg0, u8 count); +static bool8 AreUnkSharedObjectsDifferent(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1); +static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1); static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1); static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, u8 arg2); static void sub_811A81C(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 arg4, u8 id); @@ -109,10 +109,10 @@ static u32 sub_811A9FC(s32 a0); static u32 sub_811AA24(struct UnkStruct_x20 * unkX20); static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 playerGender); static void nullsub_92(u8 windowId, s32 itemId, u8 y); -static void sub_811ACA4(u8 windowId, s32 itemId, u8 y); -static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1); +static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y); +static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1); static s32 GetUnionRoomPlayerGender(s32 a0, struct UnkStruct_Main0 * a1); -static s32 sub_811ADD0(u32 type, u32 species); +static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species); static void sub_811AE68(u8 *dst, s32 arg1, u32 playerGender); static void sub_811AECC(u8 *dst, u8 arg1); static s32 sub_811AF6C(u8 *dst, u32 gender, u16 *arg2, struct UnkStruct_URoom * arg3); @@ -414,7 +414,7 @@ static const struct ListMenuTemplate gUnknown_8456F04 = { .cursorKind = 0 }; -static const struct WindowTemplate gUnknown_8456F1C = { +static const struct WindowTemplate sTradeBoardWindowTemplate = { .bg = 0, .tilemapLeft = 1, .tilemapTop = 1, @@ -434,7 +434,7 @@ static const struct WindowTemplate gUnknown_8456F24 = { .baseBlock = 0x039 }; -static const struct ListMenuItem gUnknown_8456F2C[] = { +static const struct ListMenuItem sTradeBoardListMenuItems[] = { {gUnknown_84571AC, -3}, {gUnknown_84571AC, 0}, {gUnknown_84571AC, 1}, @@ -447,10 +447,10 @@ static const struct ListMenuItem gUnknown_8456F2C[] = { {gUnknown_8459368, 8} }; -static const struct ListMenuTemplate gUnknown_8456F7C = { - .items = gUnknown_8456F2C, +static const struct ListMenuTemplate sTradeBoardListMenuTemplate = { + .items = sTradeBoardListMenuItems, .moveCursorFunc = ListMenuDefaultCursorMoveFunc, - .itemPrintFunc = sub_811ACA4, + .itemPrintFunc = TradeBoardListMenuItemPrintFunc, .totalItems = 10, .maxShowed = 5, .windowId = 0, @@ -518,7 +518,7 @@ static const struct ListMenuTemplate gUnknown_845701C = { .cursorKind = 0 }; -static const struct UnkStruct_Shared gUnknown_8457034 = {}; +static const struct UnkStruct_Shared sUnkStruct_Shared_Dummy = {}; // starts at gUnknown_082F0474 in pokeemerald, union link groups @@ -584,16 +584,16 @@ static void sub_811586C(u8 windowId, u8 arg1, u8 stringId) switch (arg1 << 8) { case 0x200: - sub_811A444(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[0][stringId - 1], 0, 2, 0); break; case 0x400: - sub_811A444(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[1][stringId - 1], 0, 2, 0); break; case 0x2500: - sub_811A444(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[2][stringId - 1], 0, 2, 0); break; case 0x3500: - sub_811A444(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_845742C[3][stringId - 1], 0, 2, 0); break; } @@ -605,11 +605,11 @@ static void sub_8115924(u8 windowId) u8 text[12]; u8 text2[12]; - sub_811A444(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0); + UR_AddTextPrinterParameterized(windowId, 2, gSaveBlock2Ptr->playerName, 0, 2, 0); StringCopy(text2, gUnknown_84571B4); ConvertIntToDecimalStringN(text, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5); StringAppend(text2, text); - sub_811A444(windowId, 0, text2, 0, 0x10, 0); + UR_AddTextPrinterParameterized(windowId, 0, text2, 0, 0x10, 0); } static void sub_811599C(u8 *dst, u8 caseId) @@ -659,11 +659,11 @@ static void sub_8115A68(u8 taskId) data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 5); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 5); LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName); data->field_0->arr[0].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].tradeStatus = 1; data->field_0->arr[0].field_1A_1 = 0; data->field_0->arr[0].field_1B = 0; data->field_17 = sub_811A054(data->field_4, 0xFF); @@ -672,7 +672,7 @@ static void sub_8115A68(u8 taskId) data->field_11 = AddWindow(&gUnknown_8456D04); FillWindowPixelBuffer(data->field_10, PIXEL_FILL(2)); - sub_811A444(data->field_10, 0, gUnknown_845747C, 8, 2, 4); + UR_AddTextPrinterParameterized(data->field_10, 0, gUnknown_845747C, 8, 2, 4); PutWindowTilemap(data->field_10); CopyWindowToVram(data->field_10, 2); @@ -686,14 +686,14 @@ static void sub_8115A68(u8 taskId) CopyWindowToVram(data->field_11, 2); CopyBgTilemapBufferToVram(0); - data->field_13 = 1; + data->playerCount = 1; data->state = 4; break; case 4: StringCopy(gStringVar1, gUnknown_8456C74[gUnknown_203B058]); if ((gUnknown_203B059 >> 4) != 0) { - if (data->field_13 > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0) + if (data->playerCount > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0) StringExpandPlaceholders(gStringVar4, gUnknown_8457264); else StringExpandPlaceholders(gStringVar4, gUnknown_8457234); @@ -703,7 +703,7 @@ static void sub_8115A68(u8 taskId) sub_811599C(gStringVar4, gUnknown_203B058); } - sub_811586C(data->field_11, gUnknown_203B059, data->field_13); + sub_811586C(data->field_11, gUnknown_203B059, data->playerCount); data->state = 5; break; case 5: @@ -714,7 +714,7 @@ static void sub_8115A68(u8 taskId) sub_8116444(data, 7, 10); if (JOY_NEW(B_BUTTON)) { - if (data->field_13 == 1) + if (data->playerCount == 1) data->state = 23; else if ((gUnknown_203B059 & 0xF0) != 0) data->state = 30; @@ -722,7 +722,7 @@ static void sub_8115A68(u8 taskId) data->state = 19; } if ((gUnknown_203B059 >> 4) != 0 - && data->field_13 > (gUnknown_203B059 >> 4) - 1 + && data->playerCount > (gUnknown_203B059 >> 4) - 1 && (gUnknown_203B059 & 0xF) != 0 && sub_80FC1CC() && JOY_NEW(START_BUTTON)) @@ -739,14 +739,14 @@ static void sub_8115A68(u8 taskId) if (!sub_80FA5D4()) { data->state = 6; - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); } break; case 10: id = ((gUnknown_203B058 & 0xF) == 2) ? 1 : 0; if (PrintOnTextbox(&data->textState, gUnknown_845767C[id])) { - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 4; } @@ -765,19 +765,19 @@ static void sub_8115A68(u8 taskId) } break; case 11: - switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName))) + switch (sub_811A14C(&data->textState, sub_80FA634(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName))) { case 0: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); data->field_19 = 5; - sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(5, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 12; break; case 1: case -1: data->field_19 = 6; - sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(6, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 12; break; case -3: @@ -786,29 +786,29 @@ static void sub_8115A68(u8 taskId) } break; case 12: - val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); if (val == 1) { if (data->field_19 == 5) { - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); - data->field_13++; - if (data->field_13 == (gUnknown_203B059 & 0xF)) + data->playerCount++; + if (data->playerCount == (gUnknown_203B059 & 0xF)) { - if ((gUnknown_203B059 & 0xF0) != 0 || data->field_13 == 4) + if ((gUnknown_203B059 & 0xF0) != 0 || data->playerCount == 4) { data->state = 15; } else { - IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]); + IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gUnknown_8457554); data->state = 13; } sub_80F8F5C(); - sub_811586C(data->field_11, gUnknown_203B059, data->field_13); + sub_811586C(data->field_11, gUnknown_203B059, data->playerCount); } else { @@ -817,9 +817,9 @@ static void sub_8115A68(u8 taskId) } else { - sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId)); - data->field_0->arr[data->field_13].field_1A_0 = 0; - sub_81165E8(data->field_0); + sub_80FBD4C(data->field_0->arr[data->playerCount].unk.playerName, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId)); + data->field_0->arr[data->playerCount].tradeStatus = 0; + UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 4; } @@ -873,7 +873,7 @@ static void sub_8115A68(u8 taskId) case -1: if ((gUnknown_203B059 & 0xF0) != 0) data->state = 15; - else if (data->field_13 == (gUnknown_203B059 & 0xF)) + else if (data->playerCount == (gUnknown_203B059 & 0xF)) data->state = 15; else data->state = 4; @@ -1040,7 +1040,7 @@ static bool8 sub_8116444(struct UnkStruct_Leader * data, u32 arg1, u32 arg2) case 1: PlaySE(SE_PC_LOGIN); RedrawListMenu(data->listTaskId); - IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->field_13]); + IntlConvPartnerUname7(gStringVar2, data->field_0->arr[data->playerCount]); sub_8116244(gStringVar4, gUnknown_203B058); data->state = arg1; break; @@ -1059,7 +1059,7 @@ static void sub_81164C8(u8 windowId, s32 itemId, u8 y) struct UnkStruct_Leader * data = sUnionRoomMain.leader; u8 var = 0; - switch (data->field_0->arr[itemId].field_1A_0) + switch (data->field_0->arr[itemId].tradeStatus) { case 1: if (data->field_0->arr[itemId].field_1B != 0) @@ -1082,7 +1082,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) for (i = 1; i < 5; i++) { - u16 var = data->field_0->arr[i].field_1A_0; + u16 var = data->field_0->arr[i].tradeStatus; if (var == 1) { id = sub_811A748(&data->field_0->arr[i], data->field_4->arr); @@ -1093,7 +1093,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) } else { - data->field_0->arr[i].field_1A_0 = 2; + data->field_0->arr[i].tradeStatus = 2; ret = 2; } } @@ -1114,7 +1114,7 @@ static u8 sub_8116524(struct UnkStruct_Main0 * arg0) return ret; } -static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) +static u8 UnionRoomLeaderField0CompactionAndCount(struct UnkStruct_Main0 * arg0) { struct UnkStruct_Leader * data = sUnionRoomMain.leader; u8 copiedCount; @@ -1127,7 +1127,7 @@ static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) copiedCount = 0; for (i = 0; i < 5; i++) { - if (data->field_8->arr[i].field_1A_0 == 1) + if (data->field_8->arr[i].tradeStatus == 1) { data->field_0->arr[copiedCount] = data->field_8->arr[i]; copiedCount++; @@ -1137,16 +1137,16 @@ static u8 sub_81165E8(struct UnkStruct_Main0 * arg0) ret = copiedCount; for (; copiedCount < 5; copiedCount++) { - data->field_0->arr[copiedCount].unk = gUnknown_8457034; + data->field_0->arr[copiedCount].unk = sUnkStruct_Shared_Dummy; data->field_0->arr[copiedCount].field_18 = 0; - data->field_0->arr[copiedCount].field_1A_0 = 0; + data->field_0->arr[copiedCount].tradeStatus = 0; data->field_0->arr[copiedCount].field_1A_1 = 0; data->field_0->arr[copiedCount].field_1B = 0; } for (i = 0; i < 5; i++) { - if (data->field_0->arr[i].field_1A_0 != 1) + if (data->field_0->arr[i].tradeStatus != 1) continue; if (data->field_0->arr[i].field_1B != 0x40) continue; @@ -1194,15 +1194,15 @@ static void sub_8116738(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, gSpecialVar_0x8004); data->field_C = AddWindow(&gUnknown_8456CD0); data->listWindowId = AddWindow(&gUnknown_8456D4C); data->field_D = AddWindow(&gUnknown_8456D54); FillWindowPixelBuffer(data->field_C, PIXEL_FILL(2)); - sub_811A444(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4); + UR_AddTextPrinterParameterized(data->field_C, 0, gUnknown_8458FC8, 8, 2, 4); PutWindowTilemap(data->field_C); CopyWindowToVram(data->field_C, 2); @@ -1234,9 +1234,9 @@ static void sub_8116738(u8 taskId) { // this unused variable along with the assignment is needed to match u32 unusedVar; - unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0; + unusedVar = data->field_0->arr[id].unk.gname.activity; - if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) + if (data->field_0->arr[id].tradeStatus == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) { u32 var = sub_8116D10(data, id); if (var == 0) @@ -1278,7 +1278,7 @@ static void sub_8116738(u8 taskId) case 6: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; sub_80FB9E4(0, 0); switch (gUnknown_203B058) { @@ -1478,8 +1478,8 @@ static void sub_8116E1C(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, 0xFF); data->field_F = 0; data->state = 3; @@ -1526,7 +1526,7 @@ static bool32 sub_8116F28(u32 arg0, u32 id) static u8 sub_8116F5C(struct UnkStruct_Group * data, u32 id) { - if (data->field_0->arr[id].field_1A_0 == 1) + if (data->field_0->arr[id].tradeStatus == 1) { if (data->field_0->arr[id].unk.gname.unk_0a_7) return 3; @@ -1556,14 +1556,14 @@ static u8 sub_8116FE4(void) for (i = 0; i < 16; i++) { - if (data->field_0->arr[i].field_1A_0 != 0) + if (data->field_0->arr[i].tradeStatus != 0) { id = sub_811A748(&data->field_0->arr[i], data->field_4->arr); if (id != 0xFF) { - if (data->field_0->arr[i].field_1A_0 == 1) + if (data->field_0->arr[i].tradeStatus == 1) { - if (sub_811A6DC(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0)) + if (AreUnionRoomPlayerGnamesDifferent(&data->field_0->arr[i].unk, &data->field_4->arr[id].unk0)) { data->field_0->arr[i].unk = data->field_4->arr[id].unk0; data->field_0->arr[i].field_1B = 0x40; @@ -1581,7 +1581,7 @@ static u8 sub_8116FE4(void) } else { - data->field_0->arr[i].field_1A_0 = 1; + data->field_0->arr[i].tradeStatus = 1; data->field_0->arr[i].field_1B = 0x40; ret = 1; } @@ -1590,12 +1590,12 @@ static u8 sub_8116FE4(void) } else { - if (data->field_0->arr[i].field_1A_0 != 2) + if (data->field_0->arr[i].tradeStatus != 2) { data->field_0->arr[i].field_18++; if (data->field_0->arr[i].field_18 >= 300) { - data->field_0->arr[i].field_1A_0 = 2; + data->field_0->arr[i].tradeStatus = 2; ret = 2; } } @@ -1961,11 +1961,11 @@ static void sub_8117A0C(u8 taskId) data->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(5 * sizeof(struct UnkStruct_x20)); - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 5); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 5); LinkRfu3_SetGnameUnameFromStaticBuffers(&data->field_0->arr[0].unk.gname, data->field_0->arr[0].unk.playerName); data->field_0->arr[0].field_18 = 0; - data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].tradeStatus = 1; data->field_0->arr[0].field_1A_1 = 0; data->field_0->arr[0].field_1B = 0; data->field_17 = sub_811A054(data->field_4, 0xFF); @@ -1979,7 +1979,7 @@ static void sub_8117A0C(u8 taskId) data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); CopyBgTilemapBufferToVram(0); - data->field_13 = 1; + data->playerCount = 1; data->state = 2; break; case 2: @@ -2002,7 +2002,7 @@ static void sub_8117A0C(u8 taskId) case 6: if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gUnknown_84577F8)) { - data->field_13 = sub_81165E8(data->field_0); + data->playerCount = UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 2; } @@ -2016,39 +2016,39 @@ static void sub_8117A0C(u8 taskId) case 0: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); data->field_19 = 5; - sub_80FA670(5, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(5, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 8; break; case 1: case -1: data->field_19 = 6; - sub_80FA670(6, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + sub_80FA670(6, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); data->state = 8; break; } break; case 8: - val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + val = sub_80FA6FC(ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId), data->field_0->arr[data->playerCount].unk.playerName); if (val == 1) { if (data->field_19 == 5) { - data->field_0->arr[data->field_13].field_1B = 0; + data->field_0->arr[data->playerCount].field_1B = 0; RedrawListMenu(data->listTaskId); - data->field_13++; - IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->field_13 - 1]); + data->playerCount++; + IntlConvPartnerUname7(gStringVar1, data->field_0->arr[data->playerCount - 1]); StringExpandPlaceholders(gStringVar4, gUnknown_8457554); data->state = 9; sub_80F8F5C(); } else { - sub_80FBD4C(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.gname.unk_00.playerTrainerId)); - data->field_0->arr[data->field_13].field_1A_0 = 0; - sub_81165E8(data->field_0); + sub_80FBD4C(data->field_0->arr[data->playerCount].unk.playerName, ReadAsU16(data->field_0->arr[data->playerCount].unk.gname.unk_00.playerTrainerId)); + data->field_0->arr[data->playerCount].tradeStatus = 0; + UnionRoomLeaderField0CompactionAndCount(data->field_0); RedrawListMenu(data->listTaskId); data->state = 2; } @@ -2169,8 +2169,8 @@ static void sub_8117F20(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A054(data->field_4, data->field_12 + 7); winTemplate1 = gUnknown_8456D4C; @@ -2209,9 +2209,9 @@ static void sub_8117F20(u8 taskId) { // this unused variable along with the assignment is needed to match u32 unusedVar; - unusedVar = data->field_0->arr[id].unk.gname.unk_0a_0; + unusedVar = data->field_0->arr[id].unk.gname.activity; - if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) + if (data->field_0->arr[id].tradeStatus == 1 && !data->field_0->arr[id].unk.gname.unk_0a_7) { data->field_F = id; LoadWirelessStatusIndicatorSpriteGfx(); @@ -2242,7 +2242,7 @@ static void sub_8117F20(u8 taskId) case 5: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; data->state = 10; } @@ -2335,8 +2335,8 @@ static void sub_81182DC(u8 taskId) data->state = 2; break; case 2: - sub_811A650(data->field_4->arr, 4); - sub_811A5E4(data->field_0->arr, 16); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x20Array(data->field_0->arr, 16); data->field_11 = sub_811A084(data->field_4, data->field_12 + 7); if (data->field_13 != 0) @@ -2371,7 +2371,7 @@ static void sub_81182DC(u8 taskId) id = ListMenu_ProcessInput(data->listTaskId); if (data->field_14 > 120) { - if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7) + if (data->field_0->arr[0].tradeStatus == 1 && !data->field_0->arr[0].unk.gname.unk_0a_7) { if (sub_8119FB0(&data->field_0->arr[0].unk.gname, data->field_12 + 7)) { @@ -2407,7 +2407,7 @@ static void sub_81182DC(u8 taskId) case 5: if (gReceivedRemoteLinkPlayers != 0) { - gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.unk_0a_0; + gUnknown_203B058 = data->field_0->arr[data->field_F].unk.gname.activity; data->state = 12; } @@ -2549,7 +2549,7 @@ static void sub_81186E0(u8 taskId) data->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); data->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); data->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - sub_811A5E4(data->field_0->arr, 8); + BlankUnkStruct_x20Array(data->field_0->arr, 8); gUnknown_203B058 = 0x40; data->field_20 = sub_8119E84(data->field_C, data->field_4, 9); ZeroUnionObjWork(data->unionObjs); @@ -2567,9 +2567,9 @@ static void sub_81186E0(u8 taskId) sub_800B1F4(); OpenLink(); sub_80FBC00(); - sub_811A5E4(&data->field_8->arr[0], 1); - sub_811A650(data->field_4->arr, 4); - sub_811A650(data->field_C->arr, 4); + BlankUnkStruct_x20Array(&data->field_8->arr[0], 1); + BlankUnkStruct_x1CArray(data->field_4->arr, 4); + BlankUnkStruct_x1CArray(data->field_C->arr, 4); gSpecialVar_Result = 0; data->state = 3; break; @@ -2760,7 +2760,7 @@ static void sub_81186E0(u8 taskId) sub_8118664(6, gUnknown_8457B04[id][playerGender]); break; case 6: - var5 = sub_811A218(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_8456DF4, &gUnknown_8456E1C); if (var5 != -1) { if (gReceivedRemoteLinkPlayers == 0) @@ -3089,20 +3089,20 @@ static void sub_81186E0(u8 taskId) } break; case 42: - if (sub_80F9800()->species == SPECIES_NONE) + if (GetHostRFUtgtGname()->species == SPECIES_NONE) { data->state = 43; } else { - if (sub_80F9800()->species == SPECIES_EGG) + if (GetHostRFUtgtGname()->species == SPECIES_EGG) { StringCopy(gStringVar4, gUnknown_8458DE8); } else { - StringCopy(gStringVar1, gSpeciesNames[sub_80F9800()->species]); - ConvertIntToDecimalStringN(gStringVar2, sub_80F9800()->level, STR_CONV_MODE_LEFT_ALIGN, 3); + StringCopy(gStringVar1, gSpeciesNames[GetHostRFUtgtGname()->species]); + ConvertIntToDecimalStringN(gStringVar2, GetHostRFUtgtGname()->level, STR_CONV_MODE_LEFT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gUnknown_8458DBC); } sub_8118664(44, gStringVar4); @@ -3113,7 +3113,7 @@ static void sub_81186E0(u8 taskId) data->state = 47; break; case 47: - var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E34, &gUnknown_8456E54); if (var5 != -1) { if (var5 == -2 || var5 == 3) @@ -3149,7 +3149,7 @@ static void sub_81186E0(u8 taskId) } break; case 52: - var5 = sub_811A218(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04); + var5 = ListMenuHandler_AllItemsAvailable(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_8456E6C, &gUnknown_8456F04); if (var5 != -1) { switch (var5) @@ -3202,7 +3202,7 @@ static void sub_81186E0(u8 taskId) data->state = 48; break; case 48: - var5 = sub_811A2EC(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &gUnknown_8456F7C, data->field_0); + var5 = TradeBoardMenuHandler(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_8456F24, &sTradeBoardListMenuTemplate, data->field_0); if (var5 != -1) { switch (var5) @@ -3214,19 +3214,19 @@ static void sub_81186E0(u8 taskId) data->state = 4; break; default: - switch (sub_811ADD0(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species)) + switch (IsRequestedTypeAndSpeciesInPlayerParty(data->field_0->arr[var5].unk.gname.type, data->field_0->arr[var5].unk.gname.species)) { - case 0: + case UR_TRADE_MATCH: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); sub_8118664(49, gUnknown_8458E70); taskData[1] = var5; break; - case 1: + case UR_TRADE_NOTYPE: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]); sub_8118664(46, gUnknown_8458ED0); break; - case 2: + case UR_TRADE_NOEGG: IntlConvPartnerUname(gStringVar1, data->field_0->arr[var5]); StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.gname.type]); sub_8118664(46, gUnknown_8458F04); @@ -3368,13 +3368,13 @@ static void sub_81199FC(u8 taskId) break; case 2: structPtr->field_4 = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); - sub_811A650(structPtr->field_4->arr, 4); + BlankUnkStruct_x1CArray(structPtr->field_4->arr, 4); structPtr->field_C = AllocZeroed(4 * sizeof(struct UnkStruct_x1C)); - sub_811A650(structPtr->field_C->arr, 4); + BlankUnkStruct_x1CArray(structPtr->field_C->arr, 4); structPtr->field_0 = AllocZeroed(8 * sizeof(struct UnkStruct_x20)); - sub_811A5E4(structPtr->field_0->arr, 8); + BlankUnkStruct_x20Array(structPtr->field_0->arr, 8); structPtr->field_8 = AllocZeroed(sizeof(struct UnkStruct_x20)); - sub_811A5E4(&structPtr->field_8->arr[0], 1); + BlankUnkStruct_x20Array(&structPtr->field_8->arr[0], 1); structPtr->field_20 = sub_8119E84(structPtr->field_C, structPtr->field_4, 10); structPtr->state = 3; break; @@ -3387,7 +3387,7 @@ static void sub_81199FC(u8 taskId) { for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) { - if (structPtr->field_0->arr[i].field_1A_0 == 1) + if (structPtr->field_0->arr[i].tradeStatus == 1) { IntlConvPartnerUname(text, structPtr->field_0->arr[i]); if (PlayerHasMetTrainerBefore(ReadAsU16(structPtr->field_0->arr[i].unk.gname.unk_00.playerTrainerId), text)) @@ -3439,25 +3439,25 @@ static u8 sub_8119B94(void) for (i = 0; i < 4; i++) { - if (sub_811A694(&structPtr->field_C->arr[i].unk0, &gUnknown_8457034) == TRUE) + if (AreUnkSharedObjectsDifferent(&structPtr->field_C->arr[i].unk0, &sUnkStruct_Shared_Dummy) == TRUE) { structPtr->field_8->arr[0].unk = structPtr->field_C->arr[i].unk0; structPtr->field_8->arr[0].field_18 = 0; - structPtr->field_8->arr[0].field_1A_0 = 1; + structPtr->field_8->arr[0].tradeStatus = 1; structPtr->field_8->arr[0].field_1B = 1; return 4; } } for (j = 0; j < 8; j++) { - if (structPtr->field_0->arr[j].field_1A_0 != 0) + if (structPtr->field_0->arr[j].tradeStatus != 0) { i = sub_811A748(&structPtr->field_0->arr[j], &structPtr->field_4->arr[0]); if (i != 0xFF) { - if (structPtr->field_0->arr[j].field_1A_0 == 1) + if (structPtr->field_0->arr[j].tradeStatus == 1) { - if (sub_811A6DC(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0)) + if (AreUnionRoomPlayerGnamesDifferent(&structPtr->field_0->arr[j].unk, &structPtr->field_4->arr[i].unk0)) { structPtr->field_0->arr[j].unk = structPtr->field_4->arr[i].unk0; structPtr->field_0->arr[j].field_1B = 0x40; @@ -3472,27 +3472,27 @@ static u8 sub_8119B94(void) } else { - structPtr->field_0->arr[j].field_1A_0 = 1; + structPtr->field_0->arr[j].tradeStatus = 1; structPtr->field_0->arr[j].field_1B = 0; r7 = 2; } structPtr->field_0->arr[j].field_18 = 0; } - else if (structPtr->field_0->arr[j].field_1A_0 != 2) + else if (structPtr->field_0->arr[j].tradeStatus != 2) { structPtr->field_0->arr[j].field_18++; if (structPtr->field_0->arr[j].field_18 >= 600) { - structPtr->field_0->arr[j].field_1A_0 = 2; + structPtr->field_0->arr[j].tradeStatus = 2; r7 = 2; } } - else if (structPtr->field_0->arr[j].field_1A_0 == 2) + else if (structPtr->field_0->arr[j].tradeStatus == 2) { structPtr->field_0->arr[j].field_18++; if (structPtr->field_0->arr[j].field_18 >= 900) { - sub_811A5E4(&structPtr->field_0->arr[j], 1); + BlankUnkStruct_x20Array(&structPtr->field_0->arr[j], 1); } } } @@ -3511,35 +3511,35 @@ static void sub_8119D34(u8 taskId) s32 i, j; struct UnkStruct_Shared sp0; struct UnkStruct_Main4 ** ptr = (void*) gTasks[taskId].data; - bool8 r4; + bool8 parent_child; for (i = 0; i < 4; i++) { - r4 = sub_80FCC3C(&sp0.gname, sp0.playerName, i); - if (!sub_8116F28(sp0.gname.unk_0a_0, gTasks[taskId].data[4])) + parent_child = sub_80FCC3C(&sp0.gname, sp0.playerName, i); + if (!sub_8116F28(sp0.gname.activity, gTasks[taskId].data[4])) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } if (sp0.gname.unk_00.unk_00_0 == 1) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } - if (!r4) + if (!parent_child) { for (j = 0; j < i; j++) { - if (!sub_811A694(&ptr[1]->arr[j].unk0, &sp0)) + if (!AreUnkSharedObjectsDifferent(&ptr[1]->arr[j].unk0, &sp0)) { - sp0 = gUnknown_8457034; + sp0 = sUnkStruct_Shared_Dummy; } } ptr[1]->arr[i].unk0 = sp0; - ptr[1]->arr[i].unk18 = sub_811A694(&ptr[1]->arr[i].unk0, &gUnknown_8457034); + ptr[1]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[1]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } else { ptr[0]->arr[i].unk0 = sp0; - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } } @@ -3562,18 +3562,18 @@ static void sub_8119EB8(u8 taskId) for (i = 0; i < 4; i++) { sub_80FCC3C(&ptr[0]->arr[i].unk0.gname, ptr[0]->arr[i].unk0.playerName, i); - if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.unk_0a_0, gTasks[taskId].data[2])) + if (!sub_8116F28(ptr[0]->arr[i].unk0.gname.activity, gTasks[taskId].data[2])) { - ptr[0]->arr[i].unk0 = gUnknown_8457034; + ptr[0]->arr[i].unk0 = sUnkStruct_Shared_Dummy; } for (j = 0; j < i; j++) { - if (!sub_811A694(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0)) + if (!AreUnkSharedObjectsDifferent(&ptr[0]->arr[j].unk0, &ptr[0]->arr[i].unk0)) { - ptr[0]->arr[i].unk0 = gUnknown_8457034; + ptr[0]->arr[i].unk0 = sUnkStruct_Shared_Dummy; } } - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } @@ -3618,7 +3618,7 @@ static void sub_8119FD8(u8 taskId) { sub_8119FB0(&ptr[0]->arr[i].unk0.gname, gTasks[taskId].data[2]); } - ptr[0]->arr[i].unk18 = sub_811A694(&ptr[0]->arr[i].unk0, &gUnknown_8457034); + ptr[0]->arr[i].unk18 = AreUnkSharedObjectsDifferent(&ptr[0]->arr[i].unk0, &sUnkStruct_Shared_Dummy); } } @@ -3683,31 +3683,31 @@ static bool8 PrintOnTextbox(u8 *textState, const u8 *str) return FALSE; } -static s8 sub_811A14C(u8 *arg0, bool32 arg1) +static s8 sub_811A14C(u8 *state_p, bool32 no_draw) { s8 r1; - switch (*arg0) + switch (*state_p) { case 0: - if (arg1) + if (no_draw) { return -3; } DisplayYesNoMenuDefaultYes(); - (*arg0)++; + (*state_p)++; break; case 1: - if (arg1) + if (no_draw) { DestroyYesNoMenu(); - *arg0 = 0; + *state_p = 0; return -3; } r1 = Menu_ProcessInputNoWrapClearOnChoose(); if (r1 == -1 || r1 == 0 || r1 == 1) { - *arg0 = 0; + *state_p = 0; return r1; } break; @@ -3715,54 +3715,54 @@ static s8 sub_811A14C(u8 *arg0, bool32 arg1) return -2; } -static u8 sub_811A1AC(const struct WindowTemplate * template) +static u8 CreateTradeBoardWindow(const struct WindowTemplate * template) { u8 windowId = AddWindow(template); DrawStdWindowFrame(windowId, FALSE); FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); - sub_811A444(windowId, 0, gUnknown_8459378, 8, 1, 6); + UR_AddTextPrinterParameterized(windowId, 0, gUnknown_8459378, 8, 1, 6); PutWindowTilemap(windowId); CopyWindowToVram(windowId, 2); return windowId; } -static void sub_811A1FC(u8 windowId) +static void DeleteTradeBoardWindow(u8 windowId) { ClearStdWindowAndFrame(windowId, TRUE); RemoveWindow(windowId); } -static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate) +static s32 ListMenuHandler_AllItemsAvailable(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate) { - s32 r1, r8; + s32 input; - switch (*arg0) + switch (*state_p) { case 0: - *arg1 = AddWindow(winTemplate); - DrawStdWindowFrame(*arg1, FALSE); + *win_id_p = AddWindow(winTemplate); + DrawStdWindowFrame(*win_id_p, FALSE); gMultiuseListMenuTemplate = *menuTemplate; - gMultiuseListMenuTemplate.windowId = *arg1; - *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); - CopyWindowToVram(*arg1, TRUE); - (*arg0)++; + gMultiuseListMenuTemplate.windowId = *win_id_p; + *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + CopyWindowToVram(*win_id_p, TRUE); + (*state_p)++; break; case 1: - r8 = ListMenu_ProcessInput(*arg2); + input = ListMenu_ProcessInput(*list_menu_id_p); if (JOY_NEW(A_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - *arg0 = 0; - return r8; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + *state_p = 0; + return input; } else if (JOY_NEW(B_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + *state_p = 0; return -2; } break; @@ -3771,46 +3771,46 @@ static s32 sub_811A218(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate return -1; } -static s32 sub_811A2EC(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * arg6) +static s32 TradeBoardMenuHandler(u8 *state_p, u8 *win_id_p, u8 *list_menu_id_p, u8 *trade_board_win_id_p, const struct WindowTemplate * winTemplate, const struct ListMenuTemplate * menuTemplate, struct UnkStruct_Main0 * traders) { s32 input; s32 r4; - switch (*arg0) + switch (*state_p) { case 0: - *arg3 = sub_811A1AC(&gUnknown_8456F1C); - *arg1 = AddWindow(winTemplate); - DrawStdWindowFrame(*arg1, FALSE); + *trade_board_win_id_p = CreateTradeBoardWindow(&sTradeBoardWindowTemplate); + *win_id_p = AddWindow(winTemplate); + DrawStdWindowFrame(*win_id_p, FALSE); gMultiuseListMenuTemplate = *menuTemplate; - gMultiuseListMenuTemplate.windowId = *arg1; - *arg2 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1); - CopyWindowToVram(*arg1, TRUE); - (*arg0)++; + gMultiuseListMenuTemplate.windowId = *win_id_p; + *list_menu_id_p = ListMenuInit(&gMultiuseListMenuTemplate, 0, 1); + CopyWindowToVram(*win_id_p, TRUE); + (*state_p)++; break; case 1: - input = ListMenu_ProcessInput(*arg2); + input = ListMenu_ProcessInput(*list_menu_id_p); if (JOY_NEW(A_BUTTON | B_BUTTON)) { if (input == 8 || JOY_NEW(B_BUTTON)) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - sub_811A1FC(*arg3); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + DeleteTradeBoardWindow(*trade_board_win_id_p); + *state_p = 0; return -2; } else { - r4 = sub_811AD7C(arg6->arr, input); + r4 = GetIndexOfNthTradeBoardOffer(traders->arr, input); if (r4 >= 0) { - DestroyListMenuTask(*arg2, NULL, NULL); - ClearStdWindowAndFrame(*arg1, TRUE); - RemoveWindow(*arg1); - sub_811A1FC(*arg3); - *arg0 = 0; + DestroyListMenuTask(*list_menu_id_p, NULL, NULL); + ClearStdWindowAndFrame(*win_id_p, TRUE); + RemoveWindow(*win_id_p); + DeleteTradeBoardWindow(*trade_board_win_id_p); + *state_p = 0; return r4; } else @@ -3838,7 +3838,7 @@ static void sub_811A41C(void) EnableBothScriptContexts(); } -static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) +static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 colorIdx) { struct TextPrinterTemplate printerTemplate; @@ -3908,32 +3908,32 @@ static void sub_811A444(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 co AddTextPrinter(&printerTemplate, 0xFF, NULL); } -static void sub_811A5E4(struct UnkStruct_x20 * arg0, u8 count) +static void BlankUnkStruct_x20Array(struct UnkStruct_x20 * arg0, u8 count) { s32 i; for (i = 0; i < count; i++) { - arg0[i].unk = gUnknown_8457034; + arg0[i].unk = sUnkStruct_Shared_Dummy; arg0[i].field_18 = 0xFF; - arg0[i].field_1A_0 = 0; + arg0[i].tradeStatus = 0; arg0[i].field_1A_1 = 0; arg0[i].field_1B = 0; } } -static void sub_811A650(struct UnkStruct_x1C * arg0, u8 count) +static void BlankUnkStruct_x1CArray(struct UnkStruct_x1C * arg0, u8 count) { s32 i; for (i = 0; i < 4; i++) { - arg0[i].unk0 = gUnknown_8457034; - arg0[i].unk18 = 0; + arg0[i].unk0 = sUnkStruct_Shared_Dummy; + arg0[i].unk18 = FALSE; } } -static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1) +static bool8 AreUnkSharedObjectsDifferent(struct UnkStruct_Shared * arg0, const struct UnkStruct_Shared * arg1) { s32 i; @@ -3956,11 +3956,11 @@ static bool8 sub_811A694(struct UnkStruct_Shared * arg0, const struct UnkStruct_ return FALSE; } -static bool32 sub_811A6DC(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1) +static bool32 AreUnionRoomPlayerGnamesDifferent(struct UnkStruct_Shared * arg0, struct UnkStruct_Shared * arg1) { s32 i; - if (arg0->gname.unk_0a_0 != arg1->gname.unk_0a_0) + if (arg0->gname.activity != arg1->gname.activity) { return TRUE; } @@ -3998,7 +3998,7 @@ static u32 sub_811A748(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1) for (i = 0; i < 4; i++) { - if (arg1[i].unk18 && !sub_811A694(&arg0->unk, &arg1[i].unk0)) + if (arg1[i].unk18 && !AreUnkSharedObjectsDifferent(&arg0->unk, &arg1[i].unk0)) { result = i; arg1[i].unk18 = FALSE; @@ -4016,11 +4016,11 @@ static u8 sub_811A798(struct UnkStruct_x20 * arg0, struct UnkStruct_x1C * arg1, { for (i = 0; i < arg2; i++) { - if (arg0[i].field_1A_0 == 0) + if (arg0[i].tradeStatus == 0) { arg0[i].unk = arg1->unk0; arg0[i].field_18 = 0; - arg0[i].field_1A_0 = 1; + arg0[i].tradeStatus = 1; arg0[i].field_1B = 64; arg1->unk18 = FALSE; return i; @@ -4039,18 +4039,18 @@ static void sub_811A81C(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 * arg3, ConvertIntToDecimalStringN(gStringVar4, id + 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringAppend(gStringVar4, gUnknown_84571B0); - sub_811A444(arg0, 0, gStringVar4, arg1, arg2, 0); + UR_AddTextPrinterParameterized(arg0, 0, gStringVar4, arg1, arg2, 0); arg1 += 18; - r2 = arg3->unk.gname.unk_0a_0; - if (arg3->field_1A_0 == 1 && !(r2 & 0x40)) + r2 = arg3->unk.gname.activity; + if (arg3->tradeStatus == 1 && !(r2 & 0x40)) { IntlConvPartnerUname(sp10, *arg3); - sub_811A444(arg0, 2, sp10, arg1, arg2, arg4); + UR_AddTextPrinterParameterized(arg0, 2, sp10, arg1, arg2, arg4); ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gUnknown_84571B4); StringAppend(gStringVar4, sp0); arg1 += 77; - sub_811A444(arg0, 0, gStringVar4, arg1, arg2, arg4); + UR_AddTextPrinterParameterized(arg0, 0, gStringVar4, arg1, arg2, arg4); } } @@ -4059,15 +4059,15 @@ static void sub_811A910(u8 windowId, u8 x, u8 y, struct UnkStruct_x20 * arg3, u8 u8 sp0[6]; u8 sp10[30]; - if (arg3->field_1A_0 == 1) + if (arg3->tradeStatus == 1) { IntlConvPartnerUname(sp10, *arg3); - sub_811A444(windowId, 2, sp10, x, y, arg4); + UR_AddTextPrinterParameterized(windowId, 2, sp10, x, y, arg4); ConvertIntToDecimalStringN(sp0, arg3->unk.gname.unk_00.playerTrainerId[0] | (arg3->unk.gname.unk_00.playerTrainerId[1] << 8), STR_CONV_MODE_LEADING_ZEROS, 5); StringCopy(gStringVar4, gUnknown_84571B4); StringAppend(gStringVar4, sp0); x += 71; - sub_811A444(windowId, 0, gStringVar4, x, y, arg4); + UR_AddTextPrinterParameterized(windowId, 0, gStringVar4, x, y, arg4); } } @@ -4124,7 +4124,7 @@ static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 play { IntlConvPartnerUname(gStringVar1, *r5); r2 = PlayerHasMetTrainerBefore(ReadAsU16(r5->unk.gname.unk_00.playerTrainerId), gStringVar1); - if (r5->unk.gname.unk_0a_0 == 0x45) + if (r5->unk.gname.activity == 0x45) { StringExpandPlaceholders(gStringVar4, gUnknown_8457F80[r2][playerGender]); return 2; @@ -4142,7 +4142,7 @@ static s32 sub_811AA5C(struct UnkStruct_Main0 * arg0, u8 arg1, u8 arg2, u32 play { playerGender = (r5->unk.gname.unk_00.playerTrainerId[arg1 + 1] >> 3) & 1; } - switch (r5->unk.gname.unk_0a_0 & 0x3F) + switch (r5->unk.gname.activity & 0x3F) { case 1: StringExpandPlaceholders(gStringVar4, gUnknown_8458758[playerGender][Random() % 4]); @@ -4169,40 +4169,40 @@ static void nullsub_92(u8 windowId, s32 itemId, u8 y) } -static void sub_811ABE4(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx) +static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx) { u8 level_t[4]; u16 species = gname->species; u8 type = gname->type; u8 level = gname->level; - sub_811A444(windowId, 2, uname, 8, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, uname, 8, y, colorIdx); if (species == SPECIES_EGG) { - sub_811A444(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, gUnknown_8458FBC, 0x44, y, colorIdx); } else { BlitMoveInfoIcon(windowId, type + 1, 0x44, y); - sub_811A444(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, gSpeciesNames[species], 0x76, y, colorIdx); ConvertIntToDecimalStringN(level_t, level, STR_CONV_MODE_LEFT_ALIGN, 3); - sub_811A444(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx); + UR_AddTextPrinterParameterized(windowId, 2, level_t, GetStringRightAlignXOffset(2, level_t, 218), y, colorIdx); } } -static void sub_811ACA4(u8 windowId, s32 itemId, u8 y) +static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y) { struct UnkStruct_Leader * leader = sUnionRoomMain.leader; struct GFtgtGname * rfu; s32 i, j; u8 uname[8]; - if (itemId == -3 && y == gUnknown_8456F7C.upText_Y) + if (itemId == -3 && y == sTradeBoardListMenuTemplate.upText_Y) { - rfu = sub_80F9800(); + rfu = GetHostRFUtgtGname(); if (rfu->species != SPECIES_NONE) { - sub_811ABE4(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5); + TradeBoardPrintItemInfo(windowId, y, rfu, gSaveBlock2Ptr->playerName, 5); } } else @@ -4210,28 +4210,28 @@ static void sub_811ACA4(u8 windowId, s32 itemId, u8 y) j = 0; for (i = 0; i < 8; i++) { - if (leader->field_0->arr[i].field_1A_0 == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE) + if (leader->field_0->arr[i].tradeStatus == 1 && leader->field_0->arr[i].unk.gname.species != SPECIES_NONE) { j++; } if (j == itemId + 1) { IntlConvPartnerUname(uname, leader->field_0->arr[i]); - sub_811ABE4(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6); + TradeBoardPrintItemInfo(windowId, y, &leader->field_0->arr[i].unk.gname, uname, 6); break; } } } } -static s32 sub_811AD7C(struct UnkStruct_x20 * arg, s32 arg1) +static s32 GetIndexOfNthTradeBoardOffer(struct UnkStruct_x20 * arg, s32 arg1) { s32 i; s32 j = 0; for (i = 0; i < 8; i++) { - if (arg[i].field_1A_0 == 1 && arg[i].unk.gname.species != SPECIES_NONE) + if (arg[i].tradeStatus == 1 && arg[i].unk.gname.species != SPECIES_NONE) { j++; } @@ -4249,7 +4249,7 @@ static s32 GetUnionRoomPlayerGender(s32 arg1, struct UnkStruct_Main0 * arg0) return arg0->arr[arg1].unk.gname.playerGender; } -static s32 sub_811ADD0(u32 type, u32 species) +static s32 IsRequestedTypeAndSpeciesInPlayerParty(u32 type, u32 species) { s32 i; @@ -4260,10 +4260,10 @@ static s32 sub_811ADD0(u32 type, u32 species) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); if (species == SPECIES_EGG) { - return 0; + return UR_TRADE_MATCH; } } - return 2; + return UR_TRADE_NOEGG; } else { @@ -4272,10 +4272,10 @@ static s32 sub_811ADD0(u32 type, u32 species) species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); if (gBaseStats[species].type1 == type || gBaseStats[species].type2 == type) { - return 0; + return UR_TRADE_MATCH; } } - return 1; + return UR_TRADE_NOTYPE; } } diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 15601c028..fb5860ef8 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -207,7 +207,7 @@ void EnterUnionRoomChat(void) sWork = Alloc(sizeof(struct UnionRoomChat)); InitChatWork(sWork); gKeyRepeatStartDelay = 20; - sub_812B4AC(); + HelpSystem_DisableToggleWithRButton(); SetVBlankCallback(NULL); SetMainCallback2(CB2_LoadInterface); } @@ -893,7 +893,7 @@ static void ChatEntryRoutine_SaveAndExit(void) case 13: if (!gPaletteFade.active) { - sub_812B4B8(); + HelpSystem_EnableToggleWithRButton(); UnionRoomChat_FreeGraphicsWork(); FreeChatWork(); SetMainCallback2(CB2_ReturnToField); @@ -914,7 +914,7 @@ static bool32 TypeChatMessage_HandleDPad(void) { if (JOY_REPT(DPAD_UP)) { - if (sWork->currentRow) + if (sWork->currentRow > 0) sWork->currentRow--; else sWork->currentRow = sKeyboardPageMaxRow[sWork->currentPage]; @@ -938,7 +938,7 @@ static bool32 TypeChatMessage_HandleDPad(void) { if (JOY_REPT(DPAD_LEFT)) { - if (sWork->currentCol) + if (sWork->currentCol > 0) sWork->currentCol--; else sWork->currentCol = 4; diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 9be2823aa..919ea1e93 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -364,12 +364,12 @@ void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx) u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1) { - u32 r8 = unk20->unk.gname.unk_0a_0; + u32 r8 = unk20->unk.gname.activity; s32 i, j, k; for (i = 0; i < NELEMS(gUnknown_846FAC0); i++) { - if (r8 == gUnknown_846FAC0[i][0] && unk20->field_1A_0 == 1) + if (r8 == gUnknown_846FAC0[i][0] && unk20->tradeStatus == 1) { if (gUnknown_846FAC0[i][2] == 0) { |