diff options
-rw-r--r-- | arm9/asm/unk_02021FF8.s | 309 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/src/script_buffers.c | 4 | ||||
-rw-r--r-- | arm9/src/unk_02021FF8.c | 176 | ||||
-rw-r--r-- | include/unk_02021FF8.h | 30 |
5 files changed, 209 insertions, 312 deletions
diff --git a/arm9/asm/unk_02021FF8.s b/arm9/asm/unk_02021FF8.s deleted file mode 100644 index 0609835c..00000000 --- a/arm9/asm/unk_02021FF8.s +++ /dev/null @@ -1,309 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .rodata - - .global UNK_020EE6CC -UNK_020EE6CC: ; 0x020EE6CC - .word FUN_020221EC - .word FUN_02022208 - - .text - - thumb_func_start FUN_02022030 -FUN_02022030: ; 0x02022030 - ldrh r1, [r0, #0x2] - cmp r1, #0x0 - beq _02022044 - ldrh r1, [r0, #0x8] - mov r0, #0xf1 - lsl r0, r0, #0x8 - cmp r1, r0 - bne _02022044 - mov r0, #0x1 - bx lr -_02022044: - mov r0, #0x0 - bx lr - - thumb_func_start FUN_02022048 -FUN_02022048: ; 0x02022048 - push {r3-r7, lr} - add r4, r1, #0x0 - str r0, [sp, #0x0] - add r0, r4, #0x0 - bl FUN_02022030 - cmp r0, #0x0 - beq _020220B2 - ldr r0, [sp, #0x0] - ldr r1, [sp, #0x0] - ldrh r0, [r0, #0x2] - add r1, #0x8 - ldr r7, _020220BC ; =0x000001FF - lsl r0, r0, #0x1 - add r3, r1, r0 - mov r0, #0x0 - add r4, #0xa - add r1, r0, #0x0 -_0202206C: - ldrh r2, [r4, #0x0] - asr r2, r0 - and r2, r7 - lsl r2, r2, #0x10 - add r0, #0x9 - lsr r2, r2, #0x10 - cmp r0, #0xf - blt _02022094 - add r4, r4, #0x2 - sub r0, #0xf - beq _02022094 - ldrh r6, [r4, #0x0] - mov r5, #0x9 - sub r5, r5, r0 - lsl r6, r5 - ldr r5, _020220BC ; =0x000001FF - and r5, r6 - orr r2, r5 - lsl r2, r2, #0x10 - lsr r2, r2, #0x10 -_02022094: - ldr r5, _020220BC ; =0x000001FF - cmp r2, r5 - beq _020220A2 - strh r2, [r3, #0x0] - add r3, r3, #0x2 - add r1, r1, #0x1 - b _0202206C -_020220A2: - ldr r0, _020220C0 ; =0x0000FFFF - strh r0, [r3, #0x0] - ldr r0, [sp, #0x0] - ldrh r0, [r0, #0x2] - add r1, r0, r1 - ldr r0, [sp, #0x0] - strh r1, [r0, #0x2] - pop {r3-r7, pc} -_020220B2: - ldr r0, [sp, #0x0] - add r1, r4, #0x0 - bl StringCat - pop {r3-r7, pc} - .balign 4 -_020220BC: .word 0x000001FF -_020220C0: .word 0x0000FFFF - - thumb_func_start FUN_020220C4 -FUN_020220C4: ; 0x020220C4 - push {r3-r7, lr} - add r7, r1, #0x0 - add r5, r0, #0x0 - add r6, r2, #0x0 - str r3, [sp, #0x0] - cmp r7, #0x0 - bne _020220D6 - bl ErrorHandling -_020220D6: - ldr r0, [sp, #0x18] - mov r1, #0x14 - bl AllocFromHeap - add r4, r0, #0x0 - beq _0202211C - str r5, [r4, #0x0] - str r7, [r4, #0x4] - ldr r0, [sp, #0x0] - str r6, [r4, #0x8] - str r0, [r4, #0xc] - ldr r0, [sp, #0x18] - lsl r1, r7, #0x2 - bl AllocFromHeap - str r0, [r4, #0x10] - cmp r0, #0x0 - beq _02022114 - mov r6, #0x0 - cmp r7, #0x0 - bls _0202211C - add r5, r6, #0x0 -_02022102: - ldr r0, [r4, #0x10] - add r0, r0, r5 - bl FUN_02022120 - add r6, r6, #0x1 - add r5, r5, #0x4 - cmp r6, r7 - blo _02022102 - b _0202211C -_02022114: - add r0, r4, #0x0 - bl FreeToHeap - mov r4, #0x0 -_0202211C: - add r0, r4, #0x0 - pop {r3-r7, pc} - - thumb_func_start FUN_02022120 -FUN_02022120: ; 0x02022120 - mov r1, #0x0 - strb r1, [r0, #0x0] - strb r1, [r0, #0x1] - strh r1, [r0, #0x2] - bx lr - .balign 4 - - thumb_func_start FUN_0202212C -FUN_0202212C: ; 0x0202212C - push {r4, lr} - add r4, r0, #0x0 - bne _02022136 - bl ErrorHandling -_02022136: - ldr r0, [r4, #0x10] - bl FreeToHeap - add r0, r4, #0x0 - bl FreeToHeap - pop {r4, pc} - - thumb_func_start FUN_02022144 -FUN_02022144: ; 0x02022144 - push {r3-r7, lr} - sub sp, #0x8 - add r5, r0, #0x0 - bl FUN_02020A98 - str r0, [sp, #0x0] - cmp r0, #0x0 - beq _02022190 - bl FUN_02020AA4 - str r0, [sp, #0x4] - ldr r0, [r5, #0x4] - mov r6, #0x0 - cmp r0, #0x0 - bls _020221AE - add r4, r6, #0x0 -_02022164: - ldr r0, [r5, #0x10] - add r0, r0, r4 - ldrb r0, [r0, #0x1] - cmp r0, #0x0 - ldr r0, [r5, #0x0] - beq _02022178 - add r0, r0, r4 - bl FUN_02020A40 - b _0202217E -_02022178: - add r0, r0, r4 - bl FUN_02020A6C -_0202217E: - ldr r1, [r5, #0x10] - add r6, r6, #0x1 - add r1, r1, r4 - strb r0, [r1, #0x1] - ldr r0, [r5, #0x4] - add r4, r4, #0x4 - cmp r6, r0 - blo _02022164 - b _020221AE -_02022190: - ldr r0, [r5, #0x4] - mov r3, #0x0 - str r3, [sp, #0x4] - cmp r0, #0x0 - bls _020221AE - add r2, r3, #0x0 - add r1, r3, #0x0 -_0202219E: - ldr r0, [r5, #0x10] - add r3, r3, #0x1 - add r0, r0, r2 - strb r1, [r0, #0x1] - ldr r0, [r5, #0x4] - add r2, r2, #0x4 - cmp r3, r0 - blo _0202219E -_020221AE: - mov r4, #0x0 - cmp r0, #0x0 - bls _020221E4 - add r7, r4, #0x0 -_020221B6: - ldr r3, [r5, #0x10] - ldr r1, [sp, #0x0] - add r0, r3, r7 - ldrb r3, [r3, r7] - ldr r2, [sp, #0x4] - lsl r6, r3, #0x2 - ldr r3, _020221E8 ; =UNK_020EE6CC - ldr r3, [r3, r6] - blx r3 - add r1, r0, #0x0 - mov r0, #0x0 - mvn r0, r0 - cmp r1, r0 - beq _020221DA - ldr r2, [r5, #0xc] - ldr r3, [r5, #0x8] - add r0, r4, #0x0 - blx r3 -_020221DA: - ldr r0, [r5, #0x4] - add r4, r4, #0x1 - add r7, r7, #0x4 - cmp r4, r0 - blo _020221B6 -_020221E4: - add sp, #0x8 - pop {r3-r7, pc} - .balign 4 -_020221E8: .word UNK_020EE6CC - - thumb_func_start FUN_020221EC -FUN_020221EC: ; 0x020221EC - push {r3, lr} - ldrb r1, [r0, #0x1] - cmp r1, #0x0 - beq _02022202 - cmp r2, #0x0 - beq _02022202 - mov r1, #0x1 - bl FUN_0202223C - mov r0, #0x0 - pop {r3, pc} -_02022202: - mov r0, #0x0 - mvn r0, r0 - pop {r3, pc} - - thumb_func_start FUN_02022208 -FUN_02022208: ; 0x02022208 - push {r3, lr} - ldrb r2, [r0, #0x1] - cmp r2, #0x0 - beq _02022220 - ldrh r2, [r0, #0x2] - ldr r1, _02022238 ; =0x0000FFFF - cmp r2, r1 - bhs _0202221C - add r1, r2, #0x1 - strh r1, [r0, #0x2] -_0202221C: - mov r0, #0x2 - pop {r3, pc} -_02022220: - cmp r1, #0x0 - beq _0202222E - mov r1, #0x0 - bl FUN_0202223C - mov r0, #0x3 - pop {r3, pc} -_0202222E: - mov r1, #0x0 - bl FUN_0202223C - mov r0, #0x1 - pop {r3, pc} - .balign 4 -_02022238: .word 0x0000FFFF - - thumb_func_start FUN_0202223C -FUN_0202223C: ; 0x0202223C - strb r1, [r0, #0x0] - mov r1, #0x0 - strh r1, [r0, #0x2] - bx lr diff --git a/arm9/global.inc b/arm9/global.inc index 369083f7..8f1f4448 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -1407,7 +1407,7 @@ .extern StringCat .extern StrAddChar .extern StrUpperFirstChar -.extern FUN_02022048 +.extern StringCat_HandleTrainerName .extern FUN_020220C4 .extern FUN_0202212C .extern FUN_02022144 diff --git a/arm9/src/script_buffers.c b/arm9/src/script_buffers.c index 0c1b3996..431f63b4 100644 --- a/arm9/src/script_buffers.c +++ b/arm9/src/script_buffers.c @@ -18,7 +18,7 @@ extern void * FUN_02024EC0(struct SaveBlock2 * sav2); extern u16 * FUN_02024EE8(void *); extern u32 GetCityNamesMsgdataIdByCountry(u32); extern void GetECWordIntoStringByIndex(u32 a0, struct String * a1); -extern void FUN_02022048(struct String * dest, const struct String * src); +extern void StringCat_HandleTrainerName(struct String * dest, const struct String * src); extern void StrAddChar(struct String * str, u16 val); extern void * FUN_02006BB0(NarcId, s32, s32, struct UnkStruct_0200B870_sub **, u32); extern BOOL UncompressFromNarc(NarcId narcId, s32 memberNo, BOOL a2, u32 heap_id, BOOL a4); @@ -726,7 +726,7 @@ void StringExpandPlaceholders(struct ScrStrBufs * mgr, struct String * dest, str { u32 idx = MsgArray_ControlCodeGetField(cstr, 0); GF_ASSERT(idx < mgr->count); - FUN_02022048(dest, mgr->array[idx].msg); + StringCat_HandleTrainerName(dest, mgr->array[idx].msg); cstr = MsgArray_SkipControlCode(cstr); } else diff --git a/arm9/src/unk_02021FF8.c b/arm9/src/unk_02021FF8.c new file mode 100644 index 00000000..2fe37556 --- /dev/null +++ b/arm9/src/unk_02021FF8.c @@ -0,0 +1,176 @@ +#include "global.h" +#include "string16.h" +#include "heap.h" +#include "unk_02021FF8.h" + +#pragma thumb on + +BOOL String_IsTrainerName(struct String * string) +{ + return string->size != 0 && string->data[0] == 0xF100; +} + +void StringCat_HandleTrainerName(struct String * dest, struct String * src) +{ + if (String_IsTrainerName(src)) + { + u16 * dest_p = &dest->data[dest->size]; + u16 * src_p = &src->data[1]; + s32 bit = 0; + u32 outsize = 0; + u16 cur_char = 0; + + while (1) + { + cur_char = (u16)((*src_p >> bit) & 0x1FF); + bit += 9; + if (bit >= 15) + { + src_p++; + bit -= 15; + if (bit != 0) + { + cur_char |= (*src_p << (9 - bit)) & 0x1FF; + } + } + if (cur_char == 0x1FF) + break; + *dest_p++ = cur_char; + outsize++; + } + *dest_p = EOS; + dest->size += outsize; + } + else + StringCat(dest, src); +} + +struct UnkStruct_020220C4 * FUN_020220C4(u8 * a0, u32 a1, void (*a2)(s32, s32, u32), u32 a3, u32 a4) +{ + struct UnkStruct_020220C4 * ret; + s32 i; + GF_ASSERT(a1 != 0); + ret = AllocFromHeap(a4, sizeof(struct UnkStruct_020220C4)); + if (ret != NULL) + { + ret->field_0 = a0; + ret->field_4 = a1; + ret->field_8 = a2; + ret->field_C = a3; + ret->field_10 = AllocFromHeap(a4, a1 * sizeof(struct UnkStruct_020220C4_sub)); + if (ret->field_10 != NULL) + { + for (i = 0; i < a1; i++) + { + FUN_02022120(&ret->field_10[i]); + } + } + else + { + FreeToHeap(ret); + ret = NULL; + } + } + return ret; +} + +void FUN_02022120(struct UnkStruct_020220C4_sub * sub) +{ + sub->field_0 = 0; + sub->field_1 = 0; + sub->field_2 = 0; +} + +void FUN_0202212C(struct UnkStruct_020220C4 * unk) +{ + GF_ASSERT(unk != NULL); + FreeToHeap(unk->field_10); + FreeToHeap(unk); +} + +extern u16 FUN_02020A98(void); +extern u16 FUN_02020AA4(void); +extern u8 FUN_02020A40(u8 * a0); +extern u8 FUN_02020A6C(u8 * a0); + +s32 (*const UNK_020EE6CC[])(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2) = { + FUN_020221EC, + FUN_02022208 +}; + +void FUN_02022144(struct UnkStruct_020220C4 * unk) +{ + u32 sp4; + u32 sp0 = FUN_02020A98(); + s32 i; + s32 r1; + if (sp0 != 0) + { + sp4 = FUN_02020AA4(); + for (i = 0; i < unk->field_4; i++) + { + u8 res; + if (unk->field_10[i].field_1 != 0) + { + res = FUN_02020A40(&unk->field_0[4 * i]); + } + else + { + res = FUN_02020A6C(&unk->field_0[4 * i]); + } + unk->field_10[i].field_1 = res; + } + } + else + { + sp4 = 0; + for (i = 0; i < unk->field_4; i++) + { + unk->field_10[i].field_1 = 0; + } + } + for (i = 0; i < unk->field_4; i++) + { + r1 = UNK_020EE6CC[unk->field_10[i].field_0](&unk->field_10[i], sp0, sp4); + if (r1 != -1) + { + unk->field_8(i, r1, unk->field_C); + } + } +} + +s32 FUN_020221EC(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2) +{ +#pragma unused(a1) + if (a0->field_1 && a2) + { + FUN_0202223C(a0, 1); + return 0; + } + return -1; +} + +s32 FUN_02022208(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2) +{ +#pragma unused(a2) + if (a0->field_1) + { + if (a0->field_2 < 0xFFFF) + a0->field_2++; + return 2; + } + else if (a1) + { + FUN_0202223C(a0, 0); + return 3; + } + FUN_0202223C(a0, 0); + return 1; +} + +void FUN_0202223C(struct UnkStruct_020220C4_sub * a0, u8 a1) +{ + a0->field_0 = a1; + a0->field_2 = 0; +} + diff --git a/include/unk_02021FF8.h b/include/unk_02021FF8.h new file mode 100644 index 00000000..59120668 --- /dev/null +++ b/include/unk_02021FF8.h @@ -0,0 +1,30 @@ +#ifndef POKEDIAMOND_UNK_02021FF8_H +#define POKEDIAMOND_UNK_02021FF8_H + +struct UnkStruct_020220C4_sub +{ + u8 field_0; + u8 field_1; + u16 field_2; +}; + +struct UnkStruct_020220C4 +{ + u8 * field_0; + u32 field_4; + void (*field_8)(s32, s32, u32); + u32 field_C; + struct UnkStruct_020220C4_sub * field_10; +}; + +BOOL String_IsTrainerName(struct String * string); +void StringCat_HandleTrainerName(struct String * dest, struct String * src); +struct UnkStruct_020220C4 * FUN_020220C4(u8 * a0, u32 a1, void (*a2)(s32, s32, u32), u32 a3, u32 a4); +void FUN_02022120(struct UnkStruct_020220C4_sub * sub); +void FUN_0202212C(struct UnkStruct_020220C4 * unk); +void FUN_02022144(struct UnkStruct_020220C4 * unk); +s32 FUN_020221EC(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2); +s32 FUN_02022208(struct UnkStruct_020220C4_sub * a0, u32 a1, u32 a2); +void FUN_0202223C(struct UnkStruct_020220C4_sub * a0, u8 a1); + +#endif //POKEDIAMOND_UNK_02021FF8_H |