summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/unk_020166C8.s79
-rw-r--r--arm9/src/unk_020166C8_c.c72
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