diff options
author | Rémi Calixte <remicalixte.rmc@gmail.com> | 2021-03-18 09:38:39 +0100 |
---|---|---|
committer | Rémi Calixte <remicalixte.rmc@gmail.com> | 2021-03-18 09:38:39 +0100 |
commit | 71f0b43f821292a1093a9c7bad752f5a04655df3 (patch) | |
tree | 15f2a242143a73dd7d4639c838dd4e4b2edf8ec4 | |
parent | 4f75d9ce4df3d39b32d6bc77a15b88f4b58fa1ce (diff) |
decomp FUN_02016834
-rw-r--r-- | arm9/asm/unk_020166C8.s | 79 | ||||
-rw-r--r-- | arm9/src/unk_020166C8_c.c | 72 |
2 files changed, 65 insertions, 86 deletions
diff --git a/arm9/asm/unk_020166C8.s b/arm9/asm/unk_020166C8.s index ecbd9afe..a1caec42 100644 --- a/arm9/asm/unk_020166C8.s +++ b/arm9/asm/unk_020166C8.s @@ -5,85 +5,6 @@ .text - - thumb_func_start FUN_02016834 -FUN_02016834: ; 0x02016834 - push {r3-r7, lr} - sub sp, #0x8 - add r4, r0, #0x0 - add r5, r1, #0x0 - str r2, [sp, #0x0] - add r7, r3, #0x0 - bl OS_GetProcMode - cmp r0, #0x12 - bne _0201684C - bl ErrorHandling -_0201684C: - ldr r1, _020168CC ; =UNK_021C4D28 - ldr r0, [r1, #0x10] - ldrh r3, [r1, #0x1a] - ldrb r2, [r0, r5] - cmp r3, r2 - bne _020168C2 - ldrb r0, [r0, r4] - ldr r1, [r1, #0x0] - lsl r0, r0, #0x2 - ldr r6, [r1, r0] - cmp r6, #0x0 - beq _020168BC - ldr r1, [sp, #0x0] - add r0, r6, #0x0 - add r2, r7, #0x0 - bl tempName_NNS_FndAllocFromExpHeapEx - str r0, [sp, #0x4] - cmp r0, #0x0 - beq _020168B6 - bl FUN_020167F4 - add r7, r0, #0x0 - bmi _020168B0 - ldr r0, [sp, #0x4] - ldr r1, [sp, #0x0] - mov r2, #0x0 - lsl r4, r7, #0x2 - bl tempName_NNS_FndCreateExpHeapEx - ldr r1, _020168CC ; =UNK_021C4D28 - ldr r2, [r1, #0x0] - str r0, [r2, r4] - ldr r0, [r1, #0x0] - ldr r0, [r0, r4] - cmp r0, #0x0 - beq _020168AA - ldr r0, [r1, #0x4] - str r6, [r0, r4] - ldr r0, [sp, #0x4] - ldr r2, [r1, #0x8] - add sp, #0x8 - str r0, [r2, r4] - ldr r0, [r1, #0x10] - strb r7, [r0, r5] - mov r0, #0x1 - pop {r3-r7, pc} -_020168AA: - bl ErrorHandling - b _020168C6 -_020168B0: - bl ErrorHandling - b _020168C6 -_020168B6: - bl ErrorHandling - b _020168C6 -_020168BC: - bl ErrorHandling - b _020168C6 -_020168C2: - bl ErrorHandling -_020168C6: - mov r0, #0x0 - add sp, #0x8 - pop {r3-r7, pc} - .balign 4 -_020168CC: .word UNK_021C4D28 - thumb_func_start FUN_020168D0 FUN_020168D0: ; 0x020168D0 push {r4, lr} diff --git a/arm9/src/unk_020166C8_c.c b/arm9/src/unk_020166C8_c.c index 6e9e672f..00640ec1 100644 --- a/arm9/src/unk_020166C8_c.c +++ b/arm9/src/unk_020166C8_c.c @@ -3,8 +3,8 @@ struct UnkStruct_020166C8 { u32 *unk_ptr1; - void *unk_ptr2; - void *unk_ptr3; + u32 *unk_ptr2; + void **unk_ptr3; u16 *unk_ptr4; u8 *unk_ptr5; u16 unk_half1; @@ -16,7 +16,8 @@ struct UnkStruct_020166C8 struct UnkStruct_020166C8 UNK_021C4D28; extern void *tempName_NNS_FndCreateExpHeapEx(void *param0, u32 param1, u32 param2); -extern u32 FUN_02016834(u32 param0, u32 param1, u32 param2, u32 param3); +extern void *tempName_NNS_FndAllocFromExpHeapEx(void *param0, u32 param1, s32 param2); +u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3); THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size) { @@ -125,12 +126,69 @@ THUMB_FUNC s32 FUN_020167F4() return -1; } - -THUMB_FUNC u32 FUN_0201681C(u32 param0, u32 param1, u32 param2) { +THUMB_FUNC u32 FUN_0201681C(u32 param0, u32 param1, u32 param2) +{ return FUN_02016834(param0, param1, param2, 4); } - -THUMB_FUNC u32 FUN_02016828(u32 param0, u32 param1, u32 param2) { +THUMB_FUNC u32 FUN_02016828(u32 param0, u32 param1, u32 param2) +{ return FUN_02016834(param0, param1, param2, -4); +} + + +THUMB_FUNC u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3) +{ + if (OS_GetProcMode() == OS_PROCMODE_IRQ) + { + ErrorHandling(); + } + + u8 *ptr = UNK_021C4D28.unk_ptr5; + if (UNK_021C4D28.unk_half4 == ptr[param1]) + { + u32 r6 = UNK_021C4D28.unk_ptr1[ptr[param0]]; + if (r6 != 0) + { + void *res = tempName_NNS_FndAllocFromExpHeapEx(r6, param2, param3); + if (res != 0) + { + param3 = FUN_020167F4(); + if (param3 >= 0) + { + UNK_021C4D28.unk_ptr1[param3] = tempName_NNS_FndCreateExpHeapEx(res, param2, 0); + + if (UNK_021C4D28.unk_ptr1[param3] != 0) + { + UNK_021C4D28.unk_ptr2[param3] = r6; + UNK_021C4D28.unk_ptr3[param3] = res; + UNK_021C4D28.unk_ptr5[param1] = param3; + + return 1; + } + else + { + ErrorHandling(); + } + } + else + { + ErrorHandling(); + } + } + else + { + ErrorHandling(); + } + } + else + { + ErrorHandling(); + } + } + else + { + ErrorHandling(); + } + return 0; }
\ No newline at end of file |