From ba6c9b1a5647301b3ccafa51bd2ce007d48666df Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 17 Jul 2023 11:22:44 -0700 Subject: [PATCH] continue decomping link functions --- asm/other_menus.s | 288 ------------------------------------- include/main_menu.h | 2 +- ld_script.txt | 1 + src/other_menus.c | 4 +- src/other_menus_1.c | 183 +++++++++++++++++++++++ src/rescue_password_menu.c | 4 +- 6 files changed, 189 insertions(+), 293 deletions(-) create mode 100644 src/other_menus_1.c diff --git a/asm/other_menus.s b/asm/other_menus.s index 2e4350635..652877b0c 100644 --- a/asm/other_menus.s +++ b/asm/other_menus.s @@ -1071,292 +1071,4 @@ _08038070: .4byte gTeamInventory_203B460 _08038074: .4byte 0x000003e7 thumb_func_end sub_8038014 - thumb_func_start sub_8038078 -sub_8038078: - push {r4-r6,lr} - adds r5, r0, 0 - adds r4, r1, 0 - bl sub_800D588 - lsls r0, 24 - cmp r0, 0 - bne _0803808A - adds r4, r5, 0 -_0803808A: - ldr r6, [r4, 0x10] - ldr r0, _08038098 - ldr r0, [r0] - cmp r0, 0 - beq _0803809C - ldr r5, [r0, 0x50] - b _080380A2 - .align 2, 0 -_08038098: .4byte gUnknown_203B184 -_0803809C: - bl sub_8011C34 - adds r5, r0, 0 -_080380A2: - movs r0, 0x4 - adds r1, r6, 0 - bl HasMail - lsls r0, 24 - cmp r0, 0 - beq _080380BA - ldr r0, [r4, 0x28] - cmp r0, r5 - bne _080380BA - movs r0, 0 - b _080380BC -_080380BA: - movs r0, 0xB -_080380BC: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8038078 - - thumb_func_start sub_80380C4 -sub_80380C4: - push {r4-r6,lr} - adds r6, r0, 0 - adds r4, r1, 0 - bl sub_800D588 - lsls r0, 24 - adds r5, r4, 0 - cmp r0, 0 - bne _080380D8 - adds r5, r6, 0 -_080380D8: - ldr r4, [r5, 0x10] - movs r0, 0x2 - adds r1, r4, 0 - bl HasMail - lsls r0, 24 - cmp r0, 0 - bne _08038110 - movs r0, 0x4 - adds r1, r4, 0 - bl HasMail - lsls r0, 24 - cmp r0, 0 - bne _08038110 - movs r0, 0x6 - adds r1, r4, 0 - bl HasMail - lsls r0, 24 - cmp r0, 0 - bne _08038110 - ldr r0, [r5, 0x10] - bl sub_8095298 - lsls r0, 24 - cmp r0, 0 - beq _08038114 -_08038110: - movs r0, 0x7 - b _08038126 -_08038114: - bl FindOpenMailSlot - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - beq _08038124 - movs r0, 0 - b _08038126 -_08038124: - movs r0, 0xD -_08038126: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_80380C4 - - thumb_func_start sub_803812C -sub_803812C: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - bl sub_800D588 - lsls r0, 24 - cmp r0, 0 - bne _0803813E - adds r4, r5, 0 -_0803813E: - ldr r1, [r4, 0x10] - movs r0, 0x1 - bl HasMail - lsls r0, 24 - cmp r0, 0 - bne _08038150 - movs r0, 0x9 - b _08038152 -_08038150: - movs r0, 0 -_08038152: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_803812C - - thumb_func_start sub_8038158 -sub_8038158: - movs r0, 0 - bx lr - thumb_func_end sub_8038158 - - thumb_func_start sub_803815C -sub_803815C: - push {r4,lr} - adds r3, r1, 0 - movs r4, 0 - cmp r0, 0xA - bhi _080381D2 - lsls r0, 2 - ldr r1, _08038170 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08038170: .4byte _08038174 - .align 2, 0 -_08038174: - .4byte _080381A0 - .4byte _080381A0 - .4byte _080381D2 - .4byte _080381B4 - .4byte _080381D2 - .4byte _080381BE - .4byte _080381D2 - .4byte _080381AA - .4byte _080381D2 - .4byte _080381D2 - .4byte _080381C8 -_080381A0: - adds r0, r3, 0 - adds r1, r2, 0 - bl sub_8038014 - b _080381D0 -_080381AA: - adds r0, r3, 0 - adds r1, r2, 0 - bl sub_8038078 - b _080381D0 -_080381B4: - adds r0, r3, 0 - adds r1, r2, 0 - bl sub_80380C4 - b _080381D0 -_080381BE: - adds r0, r3, 0 - adds r1, r2, 0 - bl sub_803812C - b _080381D0 -_080381C8: - adds r0, r3, 0 - adds r1, r2, 0 - bl sub_8038158 -_080381D0: - adds r4, r0, 0 -_080381D2: - adds r0, r4, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_803815C - - thumb_func_start sub_80381DC -sub_80381DC: - push {lr} - bl sub_8037F9C - pop {r0} - bx r0 - thumb_func_end sub_80381DC - - thumb_func_start sub_80381E8 -sub_80381E8: - push {lr} - bl sub_803815C - pop {r1} - bx r1 - thumb_func_end sub_80381E8 - - thumb_func_start sub_80381F4 -sub_80381F4: - push {r4-r7,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r6, r1, 0 - adds r7, r2, 0 - movs r4, 0 - bl sub_803815C - str r0, [sp] - ldr r0, _08038218 - str r4, [r0] - bl sub_800D494 - mov r0, sp - movs r1, 0x4 - bl sub_800D59C - b _0803822E - .align 2, 0 -_08038218: .4byte gUnknown_202EC4C -_0803821C: - subs r0, r4, 0x3 - cmp r0, 0x2 - bls _08038272 - ldr r1, _08038250 - ldr r0, [r1] - cmp r0, 0x63 - bgt _0803827E - adds r0, 0x1 - str r0, [r1] -_0803822E: - bl sub_80373C4 - bl sub_800D33C - adds r4, r0, 0 - bl sub_800D570 - cmp r4, 0x2 - bne _0803821C - bl sub_800D600 - lsls r0, 24 - cmp r0, 0 - beq _08038254 - bl sub_8037DF0 - b _0803825E - .align 2, 0 -_08038250: .4byte gUnknown_202EC4C -_08038254: - bl sub_800D520 - bl sub_800D510 - movs r0, 0x5 -_0803825E: - str r0, [sp] - ldr r0, [sp] - cmp r0, 0 - bne _0803828A - adds r0, r5, 0 - adds r1, r6, 0 - adds r2, r7, 0 - bl sub_8037F9C - b _08038292 -_08038272: - bl sub_800D520 - bl sub_800D510 - movs r0, 0x1 - b _08038298 -_0803827E: - bl sub_800D520 - bl sub_800D510 - movs r0, 0xF - b _08038298 -_0803828A: - bl sub_800D520 - bl sub_800D510 -_08038292: - bl sub_800D520 - ldr r0, [sp] -_08038298: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80381F4 - .align 2,0 diff --git a/include/main_menu.h b/include/main_menu.h index 606b6086b..3bcc50339 100644 --- a/include/main_menu.h +++ b/include/main_menu.h @@ -40,7 +40,7 @@ struct unkStruct_8035D94 u8 itemIndex_u8; u32 itemIndex_u32; } itemIndex; - u32 numItems; + s32 numItems; }; struct MainMenuSub diff --git a/ld_script.txt b/ld_script.txt index 700f231d3..9a6a8c802 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -155,6 +155,7 @@ SECTIONS { src/trade_items_menu.o(.text); src/other_menus.o(.text); asm/other_menus.o(.text); + src/other_menus_1.o(.text); src/adventure_log_menu.o(.text); src/unk_menu_203B360.o(.text); src/save_menu.o(.text); diff --git a/src/other_menus.c b/src/other_menus.c index 336daae3f..ad97a3997 100644 --- a/src/other_menus.c +++ b/src/other_menus.c @@ -464,8 +464,8 @@ extern void TransferBGPaletteBuffer(); extern void xxx_call_update_bg_vram(); extern void sub_8009908(); extern void xxx_call_update_bg_sound_input(); -extern s32 sub_8037D64(u32, void *, void *); -extern s32 sub_80381F4(u32, void *, void *); +extern s32 sub_8037D64(u32 mode, void *, void *); +extern s32 sub_80381F4(u32 mode, void *, void *); extern void sub_8037810(void); extern void sub_8011830(void); extern s32 sub_8037B28(u32); diff --git a/src/other_menus_1.c b/src/other_menus_1.c new file mode 100644 index 000000000..f2626c190 --- /dev/null +++ b/src/other_menus_1.c @@ -0,0 +1,183 @@ +#include "global.h" +#include "constants/communication_error_codes.h" +#include "dungeon_global_data.h" +#include "pokemon.h" +#include "code_8094F88.h" +#include "save.h" + +extern s32 gCommsTimeout; // Counts to 100 and then errors if other player hasn't connected +extern s32 sub_803815C(u32, void *, void*); +extern void sub_800D494(void); +extern s32 sub_800D33C(void); +extern void sub_800D520(void); +extern u8 sub_800D600(void); +extern void sub_80373C4(void); +extern void sub_800D59C(s32 *, u32); +extern void sub_800D570(void); +extern void sub_800D510(void); +extern s32 sub_8037DF0(void); +extern void sub_8037F9C(u32, u8 *, u8 *); + +extern s32 sub_8038014(void *param_2,void *param_3); +extern u8 sub_800D588(void); +extern struct UnkStruct_203B184 *gUnknown_203B184; + +s32 sub_8038078(struct unkStruct_203B480 *param_1,struct unkStruct_203B480 *param_2) +{ + u32 uVar2; + u32 uVar3; + + if (sub_800D588() == 0) { + param_2 = param_1; + } + uVar3 = (param_2->unk10).unk10; + if (gUnknown_203B184 != NULL) { + uVar2 = gUnknown_203B184->unk050; + } + else { + uVar2 = sub_8011C34(); + } + if (HasMail(4,uVar3) && (param_2->unk28 == uVar2)) { + return COMMS_GOOD; + } + else { + return COMMS_NOT_ELIGIBLE_2; + } +} + +s32 sub_80380C4(struct unkStruct_203B480 *param_1,struct unkStruct_203B480 *param_2) +{ + u32 uVar2; + struct unkStruct_203B480 *mail; + + if (sub_800D588() == 0) { + mail = param_1; + } + else + mail = param_2; + + uVar2 = mail->unk10.unk10; + if (HasMail(2,uVar2) || HasMail(4,uVar2) || HasMail(6,uVar2)) + { + return COMMS_DUPLICATE_MAIL; + } + if(sub_8095298(mail->unk10.unk10)) + { + return COMMS_DUPLICATE_MAIL; + } + else if (FindOpenMailSlot() == -1) + { + return COMMS_NO_ROOM_MAIL; + } + else + { + return COMMS_GOOD; + } +} + +s32 sub_803812C(struct unkStruct_203B480 *param_1, struct unkStruct_203B480 *param_2) +{ + if (sub_800D588() == 0) { + param_2 = param_1; + } + if (HasMail(1, (param_2->unk10).unk10)) { + return COMMS_GOOD; + } + else { + return COMMS_NOT_ELIGIBLE_1; + } +} + +s32 sub_8038158(void *param_1, void *param_2) +{ + return COMMS_GOOD; +} + +s32 sub_803815C(u32 mode, void *param_2, void *param_3) +{ + s32 linkStatus; + + linkStatus = COMMS_GOOD; + switch(mode) { + case 0: + case 1: + linkStatus = sub_8038014(param_2, param_3); + break; + case 7: + linkStatus = sub_8038078(param_2, param_3); + break; + case 3: + linkStatus = sub_80380C4(param_2, param_3); + break; + case 5: + linkStatus = sub_803812C(param_2, param_3); + break; + case 10: + linkStatus = sub_8038158(param_2, param_3); + break; + } + return linkStatus; +} + +void sub_80381DC(u32 mode, void * param_2, void * param_3) +{ + sub_8037F9C(mode, param_2, param_3); +} + +s32 sub_80381E8(u32 mode, void * param_2, void * param_3) +{ + return sub_803815C(mode, param_2, param_3); +} + +// TODO: clean this up +s32 sub_80381F4(u32 mode, void * param_2, void * param_3) +{ + u32 iVar2; + s32 linkStatus; + + iVar2 = 0; + linkStatus = sub_803815C(mode, param_2, param_3); + gCommsTimeout = 0; + sub_800D494(); + sub_800D59C(&linkStatus, 4); + goto _first; +_start: + while (iVar2 - 3 > 2) { + if (99 < gCommsTimeout) { + sub_800D520(); + sub_800D510(); + return COMMS_NOT_READY; + } + gCommsTimeout++; + _first: + sub_80373C4(); + iVar2 = sub_800D33C(); + sub_800D570(); + if (iVar2 == 2) { + if (sub_800D600() != 0) { + linkStatus = sub_8037DF0(); + } + else { + sub_800D520(); + sub_800D510(); + linkStatus = 5; + } + if (linkStatus != COMMS_GOOD) { + sub_800D520(); + sub_800D510(); + } + else { + sub_8037F9C(mode, param_2, param_3); + } + goto _end; + } + else + goto _start; + } + sub_800D520(); + sub_800D510(); + return 1; +_end: + sub_800D520(); + return linkStatus; +} diff --git a/src/rescue_password_menu.c b/src/rescue_password_menu.c index 7e4aa53f1..7efffd7a3 100644 --- a/src/rescue_password_menu.c +++ b/src/rescue_password_menu.c @@ -14,7 +14,7 @@ #define RESCUE_PASSWORD_SIZE 0x36 -EWRAM_DATA u32 gUnknown_202EC4C = {0}; +EWRAM_DATA s32 gCommsTimeout = {0}; EWRAM_DATA u8 gRescuePasswordBuffer[RESCUE_PASSWORD_SIZE] = {0}; extern struct unkStruct_203B484 *gUnknown_203B484; @@ -760,4 +760,4 @@ void sub_80391F8(void) } xxx_draw_string_80144C4(); gRescuePasswordMenu->unk210 += 1; -} \ No newline at end of file +}