From 86a9f61835a96cf458befed92a31e6336fd342bc Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 29 Jan 2024 12:47:56 -0800 Subject: [PATCH] More decomping --- asm/code_809C5C4.s | 543 --------------------------------------------- src/code_809C5C4.c | 283 ++++++++++++++++++++++- 2 files changed, 281 insertions(+), 545 deletions(-) diff --git a/asm/code_809C5C4.s b/asm/code_809C5C4.s index b3aec36d8..b0631ff6c 100644 --- a/asm/code_809C5C4.s +++ b/asm/code_809C5C4.s @@ -5,549 +5,6 @@ .text - thumb_func_start sub_809C770 -sub_809C770: - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 16 - asrs r0, 16 - mov r8, r0 - lsls r1, 16 - asrs r6, r1, 16 - ldr r4, _0809C790 - ldr r1, [r4] - ldrb r0, [r1, 0xE] - cmp r0, 0 - beq _0809C794 - movs r0, 0 - strb r0, [r1, 0xE] - b _0809CA10 - .align 2, 0 -_0809C790: .4byte gUnknown_3001B68 -_0809C794: - ldrh r0, [r1, 0x8] - cmp r0, 0 - bne _0809C79E - bl sub_809C6EC -_0809C79E: - ldr r0, [r4] - ldrb r5, [r0, 0x18] - ldrb r7, [r0, 0x19] - cmp r6, 0x26 - bls _0809C7AA - b _0809C8C8 -_0809C7AA: - lsls r0, r6, 2 - ldr r1, _0809C7B4 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C7B4: .4byte _0809C7B8 - .align 2, 0 -_0809C7B8: - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C854 - .4byte _0809C868 - .4byte _0809C868 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C8C8 - .4byte _0809C86E - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809C8C4 -_0809C854: - mov r0, r8 - bl sub_8002658 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _0809C864 - b _0809CA10 -_0809C864: - movs r4, 0x1 - b _0809C988 -_0809C868: - movs r4, 0x1 - movs r5, 0 - b _0809C988 -_0809C86E: - mov r0, r8 - subs r0, 0xA4 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0xD - bls _0809C87C - b _0809CA10 -_0809C87C: - lsls r0, 2 - ldr r1, _0809C888 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C888: .4byte _0809C88C - .align 2, 0 -_0809C88C: - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809CA10 - .4byte _0809CA10 - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809CA10 - .4byte _0809CA10 - .4byte _0809CA10 - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809C8C4 - .4byte _0809C8C4 -_0809C8C4: - movs r4, 0 - b _0809C988 -_0809C8C8: - adds r0, r6, 0 - subs r0, 0xC - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x16 - bhi _0809C968 - lsls r0, 2 - ldr r1, _0809C8E0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809C8E0: .4byte _0809C8E4 - .align 2, 0 -_0809C8E4: - .4byte _0809C968 - .4byte _0809C940 - .4byte _0809C968 - .4byte _0809C968 - .4byte _0809C968 - .4byte _0809C968 - .4byte _0809C944 - .4byte _0809C944 - .4byte _0809C948 - .4byte _0809C948 - .4byte _0809C94C - .4byte _0809C968 - .4byte _0809C950 - .4byte _0809C950 - .4byte _0809C954 - .4byte _0809C954 - .4byte _0809C958 - .4byte _0809C958 - .4byte _0809C95C - .4byte _0809C95C - .4byte _0809C960 - .4byte _0809C960 - .4byte _0809C964 -_0809C940: - movs r1, 0 - b _0809C974 -_0809C944: - movs r1, 0x7 - b _0809C974 -_0809C948: - movs r1, 0x9 - b _0809C974 -_0809C94C: - movs r1, 0xA - b _0809C974 -_0809C950: - movs r1, 0xB - b _0809C974 -_0809C954: - movs r1, 0xD - b _0809C974 -_0809C958: - movs r1, 0xF - b _0809C974 -_0809C95C: - movs r1, 0x11 - b _0809C974 -_0809C960: - movs r1, 0x13 - b _0809C974 -_0809C964: - movs r1, 0x20 - b _0809C974 -_0809C968: - movs r0, 0 - movs r1, 0x13 - bl sub_8001658 - lsls r0, 16 - asrs r1, r0, 16 -_0809C974: - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809CA10 - adds r0, r1, 0 - bl sub_80A2740 - lsls r0, 24 - lsrs r7, r0, 24 - movs r4, 0x2 -_0809C988: - ldr r0, _0809C99C - ldr r2, [r0] - ldr r1, [r2, 0x10] - adds r3, r0, 0 - cmp r1, r4 - beq _0809C9A0 - movs r0, 0x2 - str r0, [r2] - b _0809C9DE - .align 2, 0 -_0809C99C: .4byte gUnknown_3001B68 -_0809C9A0: - cmp r4, 0x1 - bne _0809C9CC - ldrb r0, [r2, 0x18] - cmp r5, r0 - bne _0809C9B2 - movs r1, 0x14 - ldrsh r0, [r2, r1] - cmp r0, r8 - beq _0809C9BC -_0809C9B2: - strb r4, [r2, 0xC] - ldr r0, [r3] - adds r0, 0x20 - strb r4, [r0] - b _0809C9E8 -_0809C9BC: - cmp r5, 0 - bne _0809C9E8 - movs r1, 0x16 - ldrsh r0, [r2, r1] - cmp r0, r6 - beq _0809C9E8 - strb r4, [r2, 0xC] - b _0809C9E8 -_0809C9CC: - cmp r4, 0x2 - bne _0809C9E8 - ldrb r0, [r2, 0x19] - cmp r7, r0 - bne _0809C9DE - movs r1, 0x16 - ldrsh r0, [r2, r1] - cmp r0, r6 - beq _0809C9E8 -_0809C9DE: - movs r1, 0x1 - strb r1, [r2, 0xC] - ldr r0, [r3] - adds r0, 0x20 - strb r1, [r0] -_0809C9E8: - ldr r1, [r3] - ldrb r0, [r1, 0xC] - cmp r0, 0 - beq _0809CA10 - str r4, [r1, 0x10] - movs r2, 0 - mov r0, r8 - strh r0, [r1, 0x14] - strh r6, [r1, 0x16] - strb r5, [r1, 0x18] - ldr r0, [r3] - strb r7, [r0, 0x19] - ldr r1, [r3] - ldrh r0, [r1, 0x8] - cmp r0, 0x4 - beq _0809CA10 - strb r2, [r1, 0xC] - ldr r0, [r3] - adds r0, 0x20 - strb r2, [r0] -_0809CA10: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_809C770 - - thumb_func_start nullsub_105 -nullsub_105: - bx lr - thumb_func_end nullsub_105 - - thumb_func_start sub_809CA20 -sub_809CA20: - push {lr} - ldr r1, _0809CA74 - ldr r2, [r1] - ldr r0, [r2] - cmp r0, 0 - beq _0809CA38 - movs r0, 0 - str r0, [r2] - movs r0, 0x1F - str r0, [r2, 0x4] - movs r0, 0x1 - strb r0, [r2, 0xC] -_0809CA38: - ldr r1, [r1] - ldrb r0, [r1, 0xC] - cmp r0, 0 - beq _0809CAE8 - ldrh r0, [r1, 0x8] - strh r0, [r1, 0xA] - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x4 - bne _0809CA5E - ldr r2, [r1, 0x10] - cmp r2, 0 - bne _0809CA5E - movs r0, 0x2 - strh r0, [r1, 0xA] - str r2, [r1, 0x1C] - adds r1, 0x20 - movs r0, 0 - strb r0, [r1] -_0809CA5E: - ldr r0, _0809CA74 - ldr r0, [r0] - ldrh r0, [r0, 0xA] - cmp r0, 0x5 - bhi _0809CADA - lsls r0, 2 - ldr r1, _0809CA78 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809CA74: .4byte gUnknown_3001B68 -_0809CA78: .4byte _0809CA7C - .align 2, 0 -_0809CA7C: - .4byte _0809CAD2 - .4byte _0809CAD2 - .4byte _0809CABE - .4byte _0809CA94 - .4byte _0809CAB0 - .4byte _0809CAC8 -_0809CA94: - bl nullsub_111 - bl nullsub_113 - bl nullsub_112 - ldr r0, _0809CAAC - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0xD] - b _0809CADA - .align 2, 0 -_0809CAAC: .4byte gUnknown_3001B68 -_0809CAB0: - bl nullsub_114 - bl nullsub_115 - bl nullsub_116 - b _0809CADA -_0809CABE: - bl nullsub_109 - bl nullsub_110 - b _0809CADA -_0809CAC8: - bl nullsub_107 - bl nullsub_108 - b _0809CADA -_0809CAD2: - bl nullsub_107 - bl nullsub_108 -_0809CADA: - ldr r0, _0809CAE4 - ldr r1, [r0] - movs r0, 0 - strb r0, [r1, 0xC] - b _0809CB1E - .align 2, 0 -_0809CAE4: .4byte gUnknown_3001B68 -_0809CAE8: - ldrh r0, [r1, 0xA] - cmp r0, 0x5 - bhi _0809CB1E - lsls r0, 2 - ldr r1, _0809CAF8 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809CAF8: .4byte _0809CAFC - .align 2, 0 -_0809CAFC: - .4byte _0809CB1E - .4byte _0809CB1E - .4byte _0809CB1E - .4byte _0809CB14 - .4byte _0809CB1A - .4byte _0809CB1E -_0809CB14: - bl nullsub_113 - b _0809CB1E -_0809CB1A: - bl nullsub_116 -_0809CB1E: - pop {r0} - bx r0 - thumb_func_end sub_809CA20 - - thumb_func_start nullsub_106 -nullsub_106: - bx lr - thumb_func_end nullsub_106 - - thumb_func_start nullsub_107 -nullsub_107: - bx lr - thumb_func_end nullsub_107 - - thumb_func_start nullsub_108 -nullsub_108: - bx lr - thumb_func_end nullsub_108 - - thumb_func_start nullsub_109 -nullsub_109: - bx lr - thumb_func_end nullsub_109 - - thumb_func_start nullsub_110 -nullsub_110: - bx lr - thumb_func_end nullsub_110 - - thumb_func_start nullsub_111 -nullsub_111: - bx lr - thumb_func_end nullsub_111 - - thumb_func_start nullsub_112 -nullsub_112: - bx lr - thumb_func_end nullsub_112 - - thumb_func_start nullsub_113 -nullsub_113: - bx lr - thumb_func_end nullsub_113 - - thumb_func_start nullsub_114 -nullsub_114: - bx lr - thumb_func_end nullsub_114 - - thumb_func_start nullsub_115 -nullsub_115: - bx lr - thumb_func_end nullsub_115 - - thumb_func_start nullsub_116 -nullsub_116: - bx lr - thumb_func_end nullsub_116 - - thumb_func_start sub_809CB50 -sub_809CB50: - push {r4,lr} - ldr r4, _0809CB70 - movs r0, 0xC - movs r1, 0x6 - bl MemoryAlloc - str r0, [r4] - movs r1, 0x1 - negs r1, r1 - str r1, [r0, 0x4] - movs r1, 0 - str r1, [r0, 0x8] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0809CB70: .4byte gUnknown_20399E0 - thumb_func_end sub_809CB50 - - thumb_func_start sub_809CB74 -sub_809CB74: - push {r4,lr} - ldr r4, _0809CB88 - ldr r0, [r4] - bl MemoryFree - movs r0, 0 - str r0, [r4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0809CB88: .4byte gUnknown_20399E0 - thumb_func_end sub_809CB74 - - thumb_func_start sub_809CB8C -sub_809CB8C: - push {lr} - movs r0, 0 - movs r1, 0x3B - bl sub_80015C0 - movs r0, 0 - movs r1, 0x3D - bl sub_80015C0 - pop {r0} - bx r0 - thumb_func_end sub_809CB8C - - thumb_func_start sub_809CBA4 -sub_809CBA4: - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl FindItemInInventory - cmp r0, 0 - bge _0809CBB6 - movs r0, 0 - b _0809CBB8 -_0809CBB6: - movs r0, 0x1 -_0809CBB8: - pop {r1} - bx r1 - thumb_func_end sub_809CBA4 - thumb_func_start sub_809CBBC sub_809CBBC: push {r4-r7,lr} diff --git a/src/code_809C5C4.c b/src/code_809C5C4.c index 2b60dfe41..3a01d45ad 100644 --- a/src/code_809C5C4.c +++ b/src/code_809C5C4.c @@ -1,7 +1,9 @@ #include "global.h" +#include "items.h" #include "memory.h" #include "game_options.h" #include "ground_main.h" +#include "code_80A26CC.h" struct unkStruct_3001B68 { @@ -13,8 +15,8 @@ struct unkStruct_3001B68 u8 unkD; u8 unkE; u32 unk10; - u16 unk14; - u16 unk16; + s16 unk14; + s16 unk16; u8 unk18; u8 unk19; u32 unk1C; @@ -23,6 +25,17 @@ struct unkStruct_3001B68 extern struct unkStruct_3001B68 *gUnknown_3001B68; + +struct unkStruct_20399E0 +{ + u32 unk0; + s32 unk4; + u32 unk8; +}; + +extern struct unkStruct_20399E0 *gUnknown_20399E0; + + void sub_809C63C(); u8 sub_809C740(void); void nullsub_107(); @@ -36,6 +49,11 @@ void nullsub_114(); void nullsub_115(); void nullsub_116(); +// Event_flag.h +u8 sub_8002658(s16); +s16 sub_8001658(u32, u32); +extern void sub_80015C0(u32, u32); + void sub_809C5C4(void) { gUnknown_3001B68 = MemoryAlloc(sizeof(struct unkStruct_3001B68), 6); @@ -150,3 +168,264 @@ void sub_809C760(void) { gUnknown_3001B68->unkE = 1; } + +void sub_809C770(s16 param_1, s16 param_2) +{ + u8 uVar2; + u8 uVar3; + s32 iVar5; + u32 uVar6; + + s32 param_1_s32; + s32 param_2_s32; + + param_1_s32 = param_1; + param_2_s32 = param_2; + + if (gUnknown_3001B68->unkE != 0) { + gUnknown_3001B68->unkE = 0; + return; + } + if (gUnknown_3001B68->unk8 == 0) { + sub_809C6EC(); + } + uVar2 = gUnknown_3001B68->unk18; + uVar3 = gUnknown_3001B68->unk19; + switch(param_2_s32) { + case 9: + uVar2 = sub_8002658(param_1_s32); + if (uVar2 == 0) { + return; + } + uVar6 = 1; + break; + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 10: + case 0xb: + uVar6 = 1; + uVar2 = 0; + break; + case 0x23: + switch((s16)(param_1_s32)) { + case 0xA4: + case 0xA5: + case 0xA8: + case 0xA9: + case 0xAA: + case 0xAE: + case 0xAF: + case 0xB0: + case 0xB1: + uVar6 = 0; + break; + default: + return; + } + break; + case 0x24: + case 0x25: + case 0x26: + uVar6 = 0; + break; + default: + switch((s16)(param_2_s32 - 0xc)) { + case 1: + iVar5 = 0; + break; + case 6: + case 7: + iVar5 = 7; + break; + case 8: + case 9: + iVar5 = 9; + break; + case 10: + iVar5 = 10; + break; + case 0xc: + case 0xd: + iVar5 = 0xb; + break; + case 0xe: + case 0xf: + iVar5 = 0xd; + break; + case 0x10: + case 0x11: + iVar5 = 0xf; + break; + case 0x12: + case 0x13: + iVar5 = 0x11; + break; + case 0x14: + case 0x15: + iVar5 = 0x13; + break; + case 0x16: + iVar5 = 0x20; + break; + case 0: + default: + iVar5 = sub_8001658(0,0x13); + break; + + } + if (iVar5 == -1) { + return; + } + uVar3 = sub_80A2740(iVar5); + uVar6 = 2; + break; + } + if (gUnknown_3001B68->unk10 != uVar6) { + gUnknown_3001B68->unk0 = 2; + gUnknown_3001B68->unkC = 1; + gUnknown_3001B68->unk20 = 1; + } + else + { + if (uVar6 == 1) { + if ((uVar2 != gUnknown_3001B68->unk18) || + (gUnknown_3001B68->unk14 != param_1_s32)) { + gUnknown_3001B68->unkC = 1; + gUnknown_3001B68->unk20 = 1; + } + else { + if ((uVar2 == 0) && (gUnknown_3001B68->unk16 != param_2_s32)) { + gUnknown_3001B68->unkC = 1; + } + } + } + else if ((uVar6 == 2) && + ((uVar3 != gUnknown_3001B68->unk19 || (gUnknown_3001B68->unk16 != param_2_s32)))) + { + gUnknown_3001B68->unkC = 1; + gUnknown_3001B68->unk20 = 1; + } + } + if (gUnknown_3001B68->unkC != 0) { + gUnknown_3001B68->unk10 = uVar6; + gUnknown_3001B68->unk14 = param_1_s32; + gUnknown_3001B68->unk16 = param_2_s32; + gUnknown_3001B68->unk18 = uVar2; + gUnknown_3001B68->unk19 = uVar3; + if (gUnknown_3001B68->unk8 != 4) { + gUnknown_3001B68->unkC = 0; + gUnknown_3001B68->unk20 = 0; + } + } +} + +void nullsub_105(void) {} + +void sub_809CA20(void) +{ + u16 *puVar1; + + if (gUnknown_3001B68->unk0 != 0) { + gUnknown_3001B68->unk0 = 0; + gUnknown_3001B68->unk4 = 0x1f; + gUnknown_3001B68->unkC = 1; + } + if (gUnknown_3001B68->unkC != 0) { + puVar1 = &gUnknown_3001B68->unk8; + gUnknown_3001B68->unkA = *puVar1; + if ((*puVar1 == 4) && (gUnknown_3001B68->unk10 == 0)) { + gUnknown_3001B68->unkA = 2; + gUnknown_3001B68->unk1C = 0; + gUnknown_3001B68->unk20 = 0; + } + switch(gUnknown_3001B68->unkA) { + case 3: + nullsub_111(); + nullsub_113(); + nullsub_112(); + gUnknown_3001B68->unkD = 1; + break; + case 4: + nullsub_114(); + nullsub_115(); + nullsub_116(); + break; + case 2: + nullsub_109(); + nullsub_110(); + break; + case 5: + nullsub_107(); + nullsub_108(); + break; + case 0: + case 1: + nullsub_107(); + nullsub_108(); + break; + } + gUnknown_3001B68->unkC = 0; + + } + else { + switch(gUnknown_3001B68->unkA) { + case 3: + nullsub_113(); + break; + case 4: + nullsub_116(); + case 0: + case 1: + case 2: + case 5: + break; + } + } +} + + +void nullsub_106(void) {} +void nullsub_107(void) {} +void nullsub_108(void) {} +void nullsub_109(void) {} +void nullsub_110(void) {} +void nullsub_111(void) {} +void nullsub_112(void) {} +void nullsub_113(void) {} +void nullsub_114(void) {} +void nullsub_115(void) {} +void nullsub_116(void) {} + +void sub_809CB50(void) +{ + gUnknown_20399E0 = MemoryAlloc(sizeof(struct unkStruct_20399E0), 6); + gUnknown_20399E0->unk4 = -1; + gUnknown_20399E0->unk8 = 0; +} + +void sub_809CB74(void) { + MemoryFree(gUnknown_20399E0); + gUnknown_20399E0 = NULL; +} + + +void sub_809CB8C(void) { + sub_80015C0(0, 0x3B); + sub_80015C0(0, 0x3D); +} + +bool8 sub_809CBA4(u8 param_1) +{ + + if(FindItemInInventory(param_1) >= 0) + return 1; + else + return 0; +}