diff options
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/main.c | 38 | ||||
-rw-r--r-- | arm9/src/msgdata.c | 10 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 14 | ||||
-rw-r--r-- | arm9/src/unk_0200CA44.c | 8 | ||||
-rw-r--r-- | arm9/src/unk_0201B8B8.c | 12 | ||||
-rw-r--r-- | arm9/src/unk_02021934.c | 367 |
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; + } +} |