summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/unk_02021FF8.s309
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/src/script_buffers.c4
-rw-r--r--arm9/src/unk_02021FF8.c176
-rw-r--r--include/unk_02021FF8.h30
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