diff options
-rw-r--r-- | arm9/arm9.lsf | 1 | ||||
-rw-r--r-- | arm9/asm/unk_020166C8.s | 167 | ||||
-rw-r--r-- | arm9/global.inc | 1 | ||||
-rw-r--r-- | arm9/src/unk_020166C8_c.c | 106 |
4 files changed, 108 insertions, 167 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index b8accee4..7b581663 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -48,6 +48,7 @@ Static arm9 Object unk_02015D14.o Object unk_02015E30.o Object game_init.o + Object unk_020166C8_c.o Object unk_020166C8.o Object unk_02016B94.o Object unk_0201B1A8.o diff --git a/arm9/asm/unk_020166C8.s b/arm9/asm/unk_020166C8.s index 3c251114..39bf564d 100644 --- a/arm9/asm/unk_020166C8.s +++ b/arm9/asm/unk_020166C8.s @@ -2,175 +2,8 @@ .include "global.inc" .section .bss - - .global UNK_021C4D28 -UNK_021C4D28: ; 0x021C4D28 - .space 0x1c - .text - thumb_func_start FUN_020166C8 -FUN_020166C8: ; 0x020166C8 - push {r3-r7, lr} - sub sp, #0x8 - add r4, r1, #0x0 - add r5, r0, #0x0 - add r0, r4, #0x0 - str r0, [sp, #0x4] - add r0, #0x18 - add r6, r2, #0x0 - str r0, [sp, #0x4] - cmp r6, r0 - bhs _020166E0 - add r6, r0, #0x0 -_020166E0: - cmp r3, #0x0 - beq _020166FE - mov r0, #0x3 - tst r0, r3 - beq _020166F4 - mov r0, #0x3 -_020166EC: - add r3, r3, #0x1 - add r1, r3, #0x0 - tst r1, r0 - bne _020166EC -_020166F4: - mov r0, #0x0 - add r1, r3, #0x0 - mov r2, #0x4 - bl OS_AllocFromArenaLo -_020166FE: - ldr r1, [sp, #0x4] - lsl r7, r6, #0x1 - lsl r2, r1, #0x1 - add r1, r1, r2 - add r1, r1, #0x1 - lsl r1, r1, #0x2 - add r1, r7, r1 - mov r0, #0x0 - add r1, r6, r1 - mov r2, #0x4 - bl OS_AllocFromArenaLo - ldr r1, _020167F0 ; =UNK_021C4D28 - str r0, [r1, #0x0] - ldr r1, [sp, #0x4] - add r1, r1, #0x1 - lsl r1, r1, #0x2 - add r1, r0, r1 - ldr r0, _020167F0 ; =UNK_021C4D28 - str r1, [r0, #0x4] - ldr r0, [sp, #0x4] - lsl r0, r0, #0x2 - add r2, r1, r0 - ldr r1, _020167F0 ; =UNK_021C4D28 - str r2, [r1, #0x8] - add r1, r2, r0 - ldr r0, _020167F0 ; =UNK_021C4D28 - str r1, [r0, #0xc] - add r1, r1, r7 - str r1, [r0, #0x10] - strh r6, [r0, #0x14] - strh r4, [r0, #0x16] - ldr r0, [sp, #0x4] - mov r7, #0x0 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - ldr r0, _020167F0 ; =UNK_021C4D28 - cmp r4, #0x0 - strh r1, [r0, #0x1a] - strh r1, [r0, #0x18] - bls _020167A0 - str r7, [sp, #0x0] -_02016752: - ldr r0, [r5, #0x4] - cmp r0, #0x0 - beq _0201675C - cmp r0, #0x2 - beq _02016768 -_0201675C: - ldr r1, [r5, #0x0] - mov r0, #0x0 - mov r2, #0x4 - bl OS_AllocFromArenaLo - b _02016772 -_02016768: - ldr r1, [r5, #0x0] - mov r0, #0x2 - mov r2, #0x4 - bl OS_AllocFromArenaHi -_02016772: - cmp r0, #0x0 - beq _0201678E - ldr r1, [r5, #0x0] - mov r2, #0x0 - bl tempName_NNS_FndCreateExpHeapEx - ldr r1, _020167F0 ; =UNK_021C4D28 - ldr r2, [r1, #0x0] - ldr r1, [sp, #0x0] - str r0, [r2, r1] - ldr r0, _020167F0 ; =UNK_021C4D28 - ldr r0, [r0, #0x10] - strb r7, [r0, r7] - b _02016792 -_0201678E: - bl ErrorHandling -_02016792: - ldr r0, [sp, #0x0] - add r7, r7, #0x1 - add r0, r0, #0x4 - add r5, #0x8 - str r0, [sp, #0x0] - cmp r7, r4 - blo _02016752 -_020167A0: - ldr r0, [sp, #0x4] - add r1, r0, #0x1 - cmp r4, r1 - bhs _020167C0 - ldr r3, _020167F0 ; =UNK_021C4D28 - lsl r2, r4, #0x2 - mov r0, #0x0 -_020167AE: - ldr r5, [r3, #0x0] - str r0, [r5, r2] - ldrh r7, [r3, #0x1a] - ldr r5, [r3, #0x10] - add r2, r2, #0x4 - strb r7, [r5, r4] - add r4, r4, #0x1 - cmp r4, r1 - blo _020167AE -_020167C0: - cmp r4, r6 - bhs _020167D2 - ldr r0, _020167F0 ; =UNK_021C4D28 -_020167C6: - ldrh r2, [r0, #0x1a] - ldr r1, [r0, #0x10] - strb r2, [r1, r4] - add r4, r4, #0x1 - cmp r4, r6 - blo _020167C6 -_020167D2: - mov r4, #0x0 - cmp r6, #0x0 - bls _020167EA - ldr r0, _020167F0 ; =UNK_021C4D28 - add r3, r4, #0x0 - add r2, r4, #0x0 -_020167DE: - ldr r1, [r0, #0xc] - add r4, r4, #0x1 - strh r2, [r1, r3] - add r3, r3, #0x2 - cmp r4, r6 - blo _020167DE -_020167EA: - add sp, #0x8 - pop {r3-r7, pc} - nop -_020167F0: .word UNK_021C4D28 thumb_func_start FUN_020167F4 FUN_020167F4: ; 0x020167F4 diff --git a/arm9/global.inc b/arm9/global.inc index d816d92a..a9c01091 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -8519,3 +8519,4 @@ .extern CARDi_InitCommon .extern MonNotFaintedOrEgg .extern CountAlivePokemon +.extern UNK_021C4D28 diff --git a/arm9/src/unk_020166C8_c.c b/arm9/src/unk_020166C8_c.c new file mode 100644 index 00000000..b3cb4503 --- /dev/null +++ b/arm9/src/unk_020166C8_c.c @@ -0,0 +1,106 @@ +#include "global.h" + +struct UnkStruct_020166C8 +{ + u32 *unk_ptr1; + void *unk_ptr2; + void *unk_ptr3; + u16 *unk_ptr4; + u8 *unk_ptr5; + u16 unk_half1; + u16 unk_half2; + u16 unk_half3; + u16 unk_half4; +}; + +struct UnkStruct_020166C8 UNK_021C4D28; + +extern void *tempName_NNS_FndCreateExpHeapEx(void *param0, u32 param1, u32 param2); + + +THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size) +{ + u32 r7; + u32 saved_in_stack; + + saved_in_stack = param1 + 0x18; + + if (param2 < saved_in_stack) + { + param2 = saved_in_stack; + } + if (pre_size != 0) + { + while (pre_size % 4 != 0) + { + pre_size++; + } + + OS_AllocFromArenaLo(0, pre_size, 4); + } + + r7 = param2 * 2; + void *ptr = OS_AllocFromArenaLo(0, (saved_in_stack * 3 + 1) * 4 + r7 + param2, 4); + UNK_021C4D28.unk_ptr1 = ptr; + ptr += (saved_in_stack + 1) * 4; + UNK_021C4D28.unk_ptr2 = ptr; + ptr += saved_in_stack * 4; + UNK_021C4D28.unk_ptr3 = ptr; + ptr += saved_in_stack * 4; + UNK_021C4D28.unk_ptr4 = ptr; + ptr += r7; + UNK_021C4D28.unk_ptr5 = ptr; + UNK_021C4D28.unk_half1 = param2; + UNK_021C4D28.unk_half2 = param1; + + r7 = 0; + UNK_021C4D28.unk_half4 = (u16)saved_in_stack; + UNK_021C4D28.unk_half3 = (u16)saved_in_stack; + + while (r7 < param1) + { + void *ptr; + if (param0[1] == 0 || param0[1] != 2) + { + ptr = OS_AllocFromArenaLo(0, param0[0], 4); + } + else + { + ptr = OS_AllocFromArenaHi(2, param0[0], 4); + } + + if (ptr != 0) + { + void *res = tempName_NNS_FndCreateExpHeapEx(ptr, param0[0], 0); + UNK_021C4D28.unk_ptr1[r7] = res; + UNK_021C4D28.unk_ptr5[r7] = (u8)r7; + } + else + { + ErrorHandling(); + } + + param0 += 2; + r7++; + } + + while (param1 < saved_in_stack + 1) + { + UNK_021C4D28.unk_ptr1[param1] = 0; + UNK_021C4D28.unk_ptr5[param1] = (u8)UNK_021C4D28.unk_half4; + + param1++; + } + + while (param1 < param2) + { + UNK_021C4D28.unk_ptr5[param1] = (u8)UNK_021C4D28.unk_half4; + + param1++; + } + + for (param1 = 0; param1 < param2; param1++) + { + UNK_021C4D28.unk_ptr4[param1] = 0; + } +} |