summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/main.c38
-rw-r--r--arm9/src/msgdata.c10
-rw-r--r--arm9/src/pokemon.c14
-rw-r--r--arm9/src/unk_0200CA44.c8
-rw-r--r--arm9/src/unk_0201B8B8.c12
-rw-r--r--arm9/src/unk_02021934.c367
6 files changed, 408 insertions, 41 deletions
diff --git a/arm9/src/main.c b/arm9/src/main.c
index 45f3eba4..ac2d9ca9 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -99,8 +99,8 @@ THUMB_FUNC void NitroMain(void)
break;
}
}
- gUnknown21C48B8.unk6C = 1;
- gUnknown21C48B8.unk30 = 0;
+ gMain.unk6C = 1;
+ gMain.unk30 = 0;
InitializeMainRNG();
FUN_0200A2AC();
FUN_02015E30();
@@ -110,34 +110,34 @@ THUMB_FUNC void NitroMain(void)
FUN_02000EE8();
FUN_02000FE8();
FUN_02016464();
- if ((gUnknown21C48B8.unk38 & SOFT_RESET_KEY) == SOFT_RESET_KEY && !gUnk021C4918.unk8) // soft reset?
+ if ((gMain.unk38 & SOFT_RESET_KEY) == SOFT_RESET_KEY && !gUnk021C4918.unk8) // soft reset?
{
DoSoftReset(0); // soft reset?
}
if (FUN_0202FB80())
{
FUN_02000E0C();
- FUN_0201B5CC(gUnknown21C48B8.unk18);
- FUN_0201B5CC(gUnknown21C48B8.unk24);
- if (!gUnknown21C48B8.unk30)
+ FUN_0201B5CC(gMain.unk18);
+ FUN_0201B5CC(gMain.unk24);
+ if (!gMain.unk30)
{
OS_WaitIrq(1, 1);
- gUnknown21C48B8.unk2C++;
+ gMain.unk2C++;
}
}
FUN_020125D4();
FUN_02015E60();
FUN_020222C4();
- FUN_0201B5CC(gUnknown21C48B8.unk24);
+ FUN_0201B5CC(gMain.unk24);
OS_WaitIrq(1, 1);
- gUnknown21C48B8.unk2C++;
- gUnknown21C48B8.unk30 = 0;
+ gMain.unk2C++;
+ gMain.unk30 = 0;
FUN_0200A318();
FUN_0200E2D8();
- if (gUnknown21C48B8.unk0)
- gUnknown21C48B8.unk0(gUnknown21C48B8.unk4);
+ if (gMain.unk0)
+ gMain.unk0(gMain.unk4);
DoSoundUpdateFrame();
- FUN_0201B5CC(gUnknown21C48B8.unk20);
+ FUN_0201B5CC(gMain.unk20);
}
}
@@ -183,10 +183,10 @@ THUMB_FUNC void FUN_02000E9C(void)
{
FUN_0202FB80();
OS_WaitIrq(TRUE, OS_IE_V_BLANK);
- gUnknown21C48B8.unk2C++;
- gUnknown21C48B8.unk30 = 0;
- if (gUnknown21C48B8.unk0 != NULL)
- gUnknown21C48B8.unk0(gUnknown21C48B8.unk4);
+ gMain.unk2C++;
+ gMain.unk30 = 0;
+ if (gMain.unk0 != NULL)
+ gMain.unk0(gMain.unk4);
}
THUMB_FUNC void FUN_02000EC8(u32 parameter)
@@ -258,7 +258,7 @@ THUMB_FUNC void FUN_02000F4C(u32 arg0, u32 arg1)
{
FUN_02000FE8();
FUN_02016464();
- if (gUnknown21C48B8.unk48 & 1)
+ if (gMain.unk48 & 1)
break;
FUN_02000E9C();
}
@@ -275,7 +275,7 @@ THUMB_FUNC void InitializeMainRNG(void)
struct Unk21C4828 sp0;
FUN_0201265C(&spC, &sp0);
{
- u32 r4 = gUnknown21C48B8.unk2C;
+ u32 r4 = gMain.unk2C;
u32 r5 = ((sp0.unk4 + sp0.unk8) << 24) + (spC.unk0 + ((256 * spC.unk4 * spC.unk8) << 16) + (sp0.unk0 << 16));
SetMTRNGSeed(r4 + r5);
SetLCRNGSeed(r4 + r5);
diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c
index ae33e0f5..e90c7122 100644
--- a/arm9/src/msgdata.c
+++ b/arm9/src/msgdata.c
@@ -102,7 +102,7 @@ static void ReadMsgData_ExistingTable_ExistingString(struct MsgDataTable * table
{
MI_CpuCopy16((char *)table + alloc.offset, buf, 2 * alloc.length);
Decrypt2(buf, alloc.length, num);
- FUN_02021E8C(dest, buf, alloc.length);
+ CopyU16ArrayToStringN(dest, buf, alloc.length);
FreeToHeap(buf);
}
}
@@ -129,7 +129,7 @@ static struct String * ReadMsgData_ExistingTable_NewString(struct MsgDataTable *
Decrypt2(buf, alloc.length, num);
dest = String_ctor(alloc.length, heap_id);
if (dest != NULL)
- FUN_02021E8C(dest, buf, alloc.length);
+ CopyU16ArrayToStringN(dest, buf, alloc.length);
FreeToHeap(buf);
return dest;
}
@@ -173,7 +173,7 @@ static void ReadMsgData_ExistingNarc_ExistingString(NARC * narc, u32 group, u32
{
NARC_ReadFromMember(narc, group, alloc.offset, size, buf);
Decrypt2(buf, alloc.length, num);
- FUN_02021E8C(dest, buf, alloc.length);
+ CopyU16ArrayToStringN(dest, buf, alloc.length);
FreeToHeap(buf);
return;
}
@@ -223,7 +223,7 @@ static struct String * ReadMsgData_ExistingNarc_NewString(NARC * narc, u32 group
{
NARC_ReadFromMember(narc, group, alloc.offset, size, buf);
Decrypt2(buf, alloc.length, num);
- FUN_02021E8C(dest, buf, alloc.length);
+ CopyU16ArrayToStringN(dest, buf, alloc.length);
FreeToHeap(buf);
}
}
@@ -360,7 +360,7 @@ struct String * ReadMsgData_ExpandPlaceholders(u32 * a0, struct MsgData * msgDat
r5 = NewString_ReadMsgData(msgData, msgno);
if (r5 != NULL)
{
- StringExpandPlaceholders(a0, r4, r5);
+ FUN_0200B7B8(a0, r4, r5);
ret = StringDup(r4, a3);
String_dtor(r5);
}
diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c
index e56faac3..eb51d5fb 100644
--- a/arm9/src/pokemon.c
+++ b/arm9/src/pokemon.c
@@ -867,7 +867,7 @@ u32 GetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * dest)
}
else
{
- FUN_02021E28(dest, blockC->nickname);
+ CopyU16ArrayToString(dest, blockC->nickname);
}
break;
case MON_DATA_UNK_120:
@@ -911,7 +911,7 @@ u32 GetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * dest)
}
break;
case MON_DATA_OT_NAME_2:
- FUN_02021E28(dest, blockD->otTrainerName);
+ CopyU16ArrayToString(dest, blockD->otTrainerName);
break;
case MON_DATA_EGG_MET_YEAR:
ret = blockD->dateEggReceived[0];
@@ -1321,11 +1321,11 @@ void SetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * value)
break;
case MON_DATA_NICKNAME_4:
GetSpeciesNameIntoArray(blockA->species, 0, namebuf2);
- FUN_02021EF0(value, namebuf3, POKEMON_NAME_LENGTH + 1);
+ CopyStringToU16Array(value, namebuf3, POKEMON_NAME_LENGTH + 1);
blockB->isNicknamed = StringNotEqual(namebuf2, namebuf3);
// fallthrough
case MON_DATA_NICKNAME_3:
- FUN_02021EF0(value, blockC->nickname, POKEMON_NAME_LENGTH + 1);
+ CopyStringToU16Array(value, blockC->nickname, POKEMON_NAME_LENGTH + 1);
break;
case MON_DATA_UNK_120:
blockC->Unused = VALUE(u8);
@@ -1368,7 +1368,7 @@ void SetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * value)
}
break;
case MON_DATA_OT_NAME_2:
- FUN_02021EF0(value, blockD->otTrainerName, OT_NAME_LENGTH + 1);
+ CopyStringToU16Array(value, blockD->otTrainerName, OT_NAME_LENGTH + 1);
break;
case MON_DATA_EGG_MET_YEAR:
blockD->dateEggReceived[0] = VALUE(u8);
@@ -1422,7 +1422,7 @@ void SetBoxMonDataInternal(struct BoxPokemon * boxmon, int attr, void * value)
break;
case MON_DATA_SPECIES_NAME:
speciesName = GetSpeciesName(blockA->species, 0);
- FUN_02021EF0(speciesName, blockC->nickname, POKEMON_NAME_LENGTH + 1);
+ CopyStringToU16Array(speciesName, blockC->nickname, POKEMON_NAME_LENGTH + 1);
String_dtor(speciesName);
break;
}
@@ -3686,7 +3686,7 @@ BOOL FUN_0206A9AC(struct BoxPokemon * boxmon, struct SaveBlock2 * sb2, u32 heap_
struct String * r6 = String_ctor(OT_NAME_LENGTH + 1, heap_id);
BOOL ret = FALSE;
GetBoxMonData(boxmon, MON_DATA_OT_NAME_2, r6);
- if (myId == otId && myGender == otGender && FUN_02021CE0(r7, r6) == 0)
+ if (myId == otId && myGender == otGender && StringCompare(r7, r6) == 0)
ret = TRUE;
String_dtor(r6);
String_dtor(r7);
diff --git a/arm9/src/unk_0200CA44.c b/arm9/src/unk_0200CA44.c
index 90b07f59..86dac59d 100644
--- a/arm9/src/unk_0200CA44.c
+++ b/arm9/src/unk_0200CA44.c
@@ -7,22 +7,22 @@ extern void FUN_0201B6A0(s32);
THUMB_FUNC void FUN_0200CA44(void (*r0)(void *, void *), void * r1, void * r2)
{
- FUN_0201B60C(gUnknown21C48B8.unk18, r0, r1, r2);
+ FUN_0201B60C(gMain.unk18, r0, r1, r2);
}
THUMB_FUNC void FUN_0200CA60(void (*r0)(void *, void *), void * r1, void * r2)
{
- FUN_0201B60C(gUnknown21C48B8.unk1C, r0, r1, r2);
+ FUN_0201B60C(gMain.unk1C, r0, r1, r2);
}
THUMB_FUNC void FUN_0200CA7C(void (*r0)(void *, void *), void * r1, void * r2)
{
- FUN_0201B60C(gUnknown21C48B8.unk24, r0, r1, r2);
+ FUN_0201B60C(gMain.unk24, r0, r1, r2);
}
THUMB_FUNC void FUN_0200CA98(void (*r0)(void *, void *), void * r1, void * r2)
{
- FUN_0201B60C(gUnknown21C48B8.unk20, r0, r1, r2);
+ FUN_0201B60C(gMain.unk20, r0, r1, r2);
}
THUMB_FUNC void FUN_0200CAB4(s32 unk1)
diff --git a/arm9/src/unk_0201B8B8.c b/arm9/src/unk_0201B8B8.c
index abb92067..c7f77f87 100644
--- a/arm9/src/unk_0201B8B8.c
+++ b/arm9/src/unk_0201B8B8.c
@@ -1,9 +1,9 @@
#include "global.h"
-#include "unk_0201B8B88.h"
+#include "unk_0201B8B8.h"
#pragma thumb on
-const u16 * FUN_0201B8B8(const u16 * r4)
+const u16 * MsgArray_SkipControlCode(const u16 * r4)
{
GF_ASSERT(*r4 == 0xFFFE);
if (*r4 == 0xFFFE) {
@@ -14,18 +14,18 @@ const u16 * FUN_0201B8B8(const u16 * r4)
return r4;
}
-u16 FUN_0201B8E0(const u16 * r4)
+u16 MsgArray_GetControlCode(const u16 * r4)
{
GF_ASSERT(*r4 == 0xFFFE);
return r4[1];
}
-BOOL FUN_0201B8F8(const u16 * r4)
+BOOL MsgArray_ControlCodeIsStrVar(const u16 * r4)
{
- return (FUN_0201B8E0(r4) & 0xFF00) == 0x100;
+ return (MsgArray_GetControlCode(r4) & 0xFF00) == 0x100;
}
-u16 FUN_0201B914(const u16 * r5, u32 r4)
+u16 MsgArray_ControlCodeGetField(const u16 * r5, u32 r4)
{
GF_ASSERT(*r5 == 0xFFFE);
GF_ASSERT(r4 < r5[2]);
diff --git a/arm9/src/unk_02021934.c b/arm9/src/unk_02021934.c
new file mode 100644
index 00000000..cd66a136
--- /dev/null
+++ b/arm9/src/unk_02021934.c
@@ -0,0 +1,367 @@
+#include "global.h"
+#include "string16.h"
+#include "heap.h"
+#include "string_util.h"
+#include "unk_0201B8B8.h"
+
+#pragma thumb on
+
+#define ASSERT_STR16(_str) ({ GF_ASSERT(_str != NULL); GF_ASSERT(_str->magic == STR16_MAGIC); })
+
+void StrAddChar(struct String * str, u16 val);
+
+int StringGetWidth(struct UnkStruct_0202199C * r7, const u16 * arr, u32 r6)
+{
+ int ret = 0;
+ u32 r4 = 0;
+ while (*arr != 0xFFFF)
+ {
+ if (*arr == 0xFFFE)
+ {
+ arr = MsgArray_SkipControlCode(arr);
+ }
+ else if (*arr == 0xE000) // newline
+ {
+ if (ret < r4 - r6)
+ ret = (int)(r4 - r6);
+ r4 = 0;
+ arr++;
+ }
+ else
+ {
+ r4 += (r6 + r7->unk_70(r7, *arr - 1));
+ arr++;
+ }
+ }
+ if (ret < r4 - r6)
+ ret = (int)(r4 - r6);
+ return ret;
+}
+
+int StringGetWidth_SingleLine_HandleClearToControlCode(struct UnkStruct_0202199C * r6, const u16 * arr)
+{
+ int ret = 0;
+ while (*arr != 0xFFFF)
+ {
+ if (*arr == 0xFFFE)
+ {
+ if (MsgArray_GetControlCode(arr) == 515)
+ {
+ ret = MsgArray_ControlCodeGetField(arr, 0) - 12;
+ }
+ arr = MsgArray_SkipControlCode(arr);
+ }
+ else
+ {
+ ret += r6->unk_70(r6, *arr - 1);
+ arr++;
+ }
+ }
+ return ret;
+}
+
+struct String * String_ctor(u32 length, u32 heap_id)
+{
+ struct String * ret = AllocFromHeap(heap_id, length * 2 + 10);
+ if (ret != NULL)
+ {
+ ret->magic = STR16_MAGIC;
+ ret->maxsize = (u16)length;
+ ret->size = 0;
+ ret->data[0] = EOS;
+ }
+ return ret;
+}
+
+void String_dtor(struct String * str)
+{
+ ASSERT_STR16(str);
+ str->magic = STR16_MAGIC | 1;
+ FreeToHeap(str);
+}
+
+void StringSetEmpty(struct String * str)
+{
+ ASSERT_STR16(str);
+ str->size = 0;
+ str->data[0] = EOS;
+}
+
+void StringCopy(struct String * dest, struct String * src)
+{
+ ASSERT_STR16(dest);
+ ASSERT_STR16(src);
+ if (dest->maxsize > src->size)
+ {
+ memcpy(dest->data, src->data, (u32)((src->size + 1) * 2));
+ dest->size = src->size;
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+struct String * StringDup(struct String * src, u32 heap_id)
+{
+ ASSERT_STR16(src);
+ struct String * dest = String_ctor((u32)(src->size + 1), heap_id);
+ if (dest != NULL)
+ StringCopy(dest, src);
+ return dest;
+}
+
+static const u16 sCharset_JP[10] = {
+ 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
+ 0xA7, 0xA8, 0xA9, 0xAA, 0xAB
+};
+
+static const u16 sCharset_EN[10] = {
+ 0x121, 0x122, 0x123, 0x124, 0x125,
+ 0x126, 0x127, 0x128, 0x129, 0x12A
+};
+
+static const u32 sPowersOfTen[10] = {
+ 1,
+ 10,
+ 100,
+ 1000,
+ 10000,
+ 100000,
+ 1000000,
+ 10000000,
+ 100000000,
+ 1000000000
+};
+
+void String16_FormatInteger(struct String * str, int num, u32 ndigits, int strConvMode, BOOL whichCharset)
+{
+ ASSERT_STR16(str);
+
+ const u16 * charbase;
+ BOOL isNegative = (num < 0);
+
+ if (str->maxsize > ndigits + isNegative)
+ {
+ charbase = (whichCharset == 0) ? sCharset_JP : sCharset_EN;
+ StringSetEmpty(str);
+ if (isNegative)
+ {
+ num *= -1;
+ u16 hyphen = (u16)((whichCharset == 0) ? 0x00F1 : 0x01BE);
+ str->data[str->size++] = hyphen;
+ }
+ u32 dividend = sPowersOfTen[ndigits - 1];
+ while (dividend != 0)
+ {
+ u16 digit = (u16)(num / dividend);
+ num -= dividend * digit;
+ if (strConvMode == 2)
+ {
+ u16 value = (u16)((digit < 10) ? charbase[digit] : 0x00E2);
+ str->data[str->size++] = value;
+ }
+ else if (digit != 0 || dividend == 1)
+ {
+ strConvMode = 2;
+ u16 value = (u16)((digit < 10) ? charbase[digit] : 0x00E2);
+ str->data[str->size++] = value;
+ }
+ else if (strConvMode == 1)
+ {
+ u16 value = (u16)((whichCharset == 0) ? 0x0001 : 0x01E2);
+ str->data[str->size++] = value;
+ }
+ dividend /= 10;
+ }
+ str->data[str->size] = EOS;
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+s64 String_atoi(struct String * str, BOOL * flag)
+{
+ s64 ret = 0;
+ s64 pow10 = 1;
+ if (str->size > 18)
+ {
+ return 0;
+ }
+ int ndigits = str->size - 1;
+ while (ndigits >= 0) {
+ // 0
+ s64 digit = str->data[ndigits] - 0x00A2;
+ if (digit >= 10ull)
+ {
+ // 0
+ digit = str->data[ndigits] - 0x0121;
+ if (digit >= 10ull)
+ {
+ *flag = FALSE;
+ return ret;
+ }
+ }
+ digit *= pow10;
+ ret += digit;
+ pow10 *= 10;
+ ndigits--;
+ }
+ *flag = TRUE;
+ return ret;
+}
+
+BOOL StringCompare(struct String * str1, struct String * str2)
+{
+ ASSERT_STR16(str1);
+ ASSERT_STR16(str2);
+
+ for (int i = 0; str1->data[i] == str2->data[i]; i++)
+ {
+ if (str1->data[i] == EOS)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u16 StringGetLength(struct String * str)
+{
+ ASSERT_STR16(str);
+ return str->size;
+}
+
+int StringCountLines(volatile struct String * str)
+{
+ ASSERT_STR16(str);
+
+ int i, nline;
+ for (i = 0, nline = 1; i < str->size; i++)
+ {
+ if (str->data[i] == 0xE000)
+ nline++;
+ }
+ return nline;
+}
+
+void StringGetLineN(struct String * dest, volatile struct String * src, u32 n)
+{
+ ASSERT_STR16(src);
+ ASSERT_STR16(dest);
+
+ int i = 0;
+ if (n != 0)
+ {
+ for (i = 0; i < src->size; i++)
+ {
+ if (src->data[i] == 0xE000 && --n == 0)
+ {
+ i++;
+ break;
+ }
+ }
+ }
+ StringSetEmpty(dest);
+ for (; i < src->size; i++)
+ {
+ u16 c = src->data[i];
+ if (c == 0xE000)
+ break;
+ StrAddChar(dest, c);
+ }
+}
+
+void CopyU16ArrayToString(struct String * str, u16 * buf)
+{
+ ASSERT_STR16(str);
+
+ for (str->size = 0; *buf != EOS;)
+ {
+ if (str->size >= str->maxsize - 1)
+ {
+ GF_ASSERT(0);
+ break;
+ }
+ str->data[str->size++] = *buf++;
+ }
+ str->data[str->size] = EOS;
+}
+
+void CopyU16ArrayToStringN(struct String * str, u16 * buf, u32 length)
+{
+ ASSERT_STR16(str);
+
+ if (length <= str->maxsize)
+ {
+ memcpy(str->data, buf, length * 2);
+ int i;
+ for (i = 0; i < length; i++)
+ {
+ if (str->data[i] == EOS)
+ break;
+ }
+ str->size = (u16)i;
+ if (i == length)
+ {
+ str->data[length - 1] = EOS;
+ }
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+void CopyStringToU16Array(struct String * str, u16 * buf, u32 length)
+{
+ ASSERT_STR16(str);
+
+ if (str->size + 1 <= length)
+ {
+ memcpy(buf, str->data, (u32)((str->size + 1) * 2));
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+u16 * String_c_str(struct String * str)
+{
+ ASSERT_STR16(str);
+
+ return str->data;
+}
+
+void StringCat(struct String * dest, struct String * src)
+{
+ ASSERT_STR16(dest);
+ ASSERT_STR16(src);
+
+ if (dest->size + src->size + 1 <= dest->maxsize)
+ {
+ memcpy(dest->data + dest->size, src->data, (u32)(2 * (src->size + 1)));
+ dest->size += src->size;
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+void StrAddChar(struct String * str, u16 val)
+{
+ ASSERT_STR16(str);
+
+ if (str->size + 1 < str->maxsize)
+ {
+ str->data[str->size++] = val;
+ str->data[str->size] = EOS;
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+void StrUpperFirstChar(struct String * str)
+{
+ ASSERT_STR16(str);
+
+ if (str->size != 0)
+ {
+ // a z
+ if (str->data[0] >= 0x0145 && str->data[0] <= 0x015E)
+ // (a - A)
+ str->data[0] -= 26;
+ }
+}