pmd-red/src/text.c
2025-02-19 10:21:23 +01:00

3900 lines
99 KiB
C

#include "global.h"
#include "globaldata.h"
#include "bg_palette_buffer.h"
#include "text.h"
#include "decompress.h"
#include "code_8009804.h"
#include "code_800558C.h"
#include "cpu.h"
#include "structs/str_text.h"
#include "file_system.h"
struct CharMapStruct
{
s32 unk0;
struct unkChar *unk4;
};
// data.s
// data2.s
extern const char gUnknown_80B88B0[]; // "font"
extern const char gUnknown_80B88B8[]; // "fontsp"
extern const char gUnknown_80B88C0[]; // "fontsppa"
// system_sbin.s
extern const struct FileArchive gSystemFileArchive;
// Todo fix gUnknown_3000E94 being accessed as s16/u8
extern s16 gUnknown_3000E94[];
EWRAM_DATA UnkTextStruct1 gUnknown_2027370[4] = {0};
EWRAM_DATA static struct CharMapStruct *sCharmaps[2] = {NULL};
EWRAM_DATA static s16 sCharacterSpacing = 0;
EWRAM_DATA u8 gUnknown_202749A[11] = {0};
EWRAM_DATA bool8 gUnknown_20274A5 = FALSE;
EWRAM_DATA static u8 sUnknown_20274A6[6] = {0};
EWRAM_DATA static s32 sCurrentCharmap = 0;
EWRAM_DATA static vu32 sUnknown_20274B0 = 0;
EWRAM_DATA static u32 sUnknown_20274B4[0xEC0] = {0};
EWRAM_DATA static OpenedFile *sCharmapFiles[3] = {NULL};
EWRAM_DATA static UnkTextStruct3 sUnknown_202AFC0 = {0};
EWRAM_DATA static s32 sUnknown_202B020 = 0;
EWRAM_DATA static s32 sUnknown_202B024 = 0;
EWRAM_DATA static s32 sCharHeight[2] = {0};
EWRAM_DATA static u32 sTextShadowMask = 0; // Some text color info is stored; retrieve via "& 0xF"
EWRAM_DATA static u8 sDrawTextShadow = 0;
EWRAM_DATA ALIGNED(4) u16 gUnknown_202B038[4][32][32] = {0};
// These text-related functions were deemed important as they're copied and run from IWRAM for improved performance.
static void sub_8272774(UnkTextStruct1 *txtStructs, s32 id);
static void sub_8272884(UnkTextStruct1 *txtStructs, s32 id);
static void sub_82729B8(UnkTextStruct1 *txtStructs, s32 id);
static void sub_8272A8C(UnkTextStruct1 *txtStructs, s32 id);
void sub_8272760(s32 id);
void sub_8272870(s32 id);
void sub_82729A4(s32 id);
void sub_8272A78(s32 id);
EWRAM_INIT void (*gIwramTextFunc1)(s32 a0) = sub_8272760;
EWRAM_INIT void (*gIwramTextFunc2)(s32 a0) = sub_8272870;
EWRAM_INIT void (*gIwramTextFunc3)(s32 a0) = sub_82729A4;
EWRAM_INIT void (*gIwramTextFunc4)(s32 a0) = sub_8272A78;
// This variable is only used in InitGraphics function, which may or may not belong to text.c
EWRAM_INIT u8 gUnknown_203B090 = 0;
static void SaveUnkTextStructAndXXX_8006438(const UnkTextStruct3 *a0, bool8 a1, bool8 a2, DungeonPos *a3);
static void sub_8006554(UnkTextStruct1 *a0, u32 *a1, u32 *a2, u16 *a3, u32 a4, const UnkTextStruct2 *a5, bool8 a6, u32 a7, DungeonPos *a8, u8 a9);
static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3);
static void sub_80069CC(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4);
static void sub_8006AC4(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4);
static void sub_8006B70(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4);
static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3);
static void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const UnkTextStruct2_sub2 *a3, u16 *a4);
static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5);
static void nullsub_129(u32 a0, s32 x, s32 y, s32 a3, u32 color);
static void sub_8007958(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color);
static void sub_8007AA4(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color);
static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color);
static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color);
static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8);
static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8);
static void DisplayMonPortrait(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4);
static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3);
static void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8);
static void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5);
static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0);
static void sub_800898C(void);
static void sub_80089AC(const UnkTextStruct2 *r4, DungeonPos *r5_Str);
static void PrepareTextbox_8008C6C(UnkTextStruct1 *strArr, u32 strId);
static void xxx_draw_string(UnkTextStruct1 *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing);
static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct UnkDrawStringStruct *sp);
static void sub_8009388(void);
static s32 InterpretColorChar(u8 a0);
static const u32 gUnknown_80B853C[16] =
{
0x66666666,
0x00000000,
0x11111111,
0x22222222,
0x33333333,
0x44444444,
0x55555555,
0x66666666,
0x77777777,
0x88888888,
0x99999999,
0xAAAAAAAA,
0xBBBBBBBB,
0xCCCCCCCC,
0xDDDDDDDD,
0xEEEEEEEE,
};
static const UnkTextStruct3 gUnknown_80B857C =
{
.a0 = {
[0] = {.unk4 = 3},
[1] = {.unk4 = 3},
[2] = {.unk4 = 3},
[3] = {.unk4 = 3},
}
};
static const struct unkShiftData gCharMasksOffsets[8] =
{
[0] = {.bytesA = 0xFFFFFFFF, .bytesB = 0x00000000, .shift_left = 0x00, .shift_right = 0x20},
[1] = {.bytesA = 0x0FFFFFFF, .bytesB = 0xF0000000, .shift_left = 0x04, .shift_right = 0x1C},
[2] = {.bytesA = 0x00FFFFFF, .bytesB = 0xFF000000, .shift_left = 0x08, .shift_right = 0x18},
[3] = {.bytesA = 0x000FFFFF, .bytesB = 0xFFF00000, .shift_left = 0x0C, .shift_right = 0x14},
[4] = {.bytesA = 0x0000FFFF, .bytesB = 0xFFFF0000, .shift_left = 0x10, .shift_right = 0x10},
[5] = {.bytesA = 0x00000FFF, .bytesB = 0xFFFFF000, .shift_left = 0x14, .shift_right = 0x0C},
[6] = {.bytesA = 0x000000FF, .bytesB = 0xFFFFFF00, .shift_left = 0x18, .shift_right = 0x08},
[7] = {.bytesA = 0x0000000F, .bytesB = 0xFFFFFFF0, .shift_left = 0x1C, .shift_right = 0x04},
};
static const u16 gUnknown_80B865C[] =
{
0xFFFF, 0xFFFF, 0xFF, 0xFFFF, 0xFFFF, 0xFF, 0xFFFF,
0xFFFF, 0xFF, 0xFFFF, 0xFFFF, 0xFF, 0xFFFF, 0xFFFF,
0xFF, 0xFFFF, 0xFFFF, 0xFF, 0xFFFF, 0xFFFF, 0xFF, 0xFFFF,
0xFFFF, 0xFF, 0xFFFF, 0xFFFF, 0xFF, 0xFFFF, 0xFFFF,
0xFF, 0, 0, 0, 0, 0, 0
};
// Fallback character with bitmap?
static const struct unkChar gUnknown_80B86A4 =
{
.unk0 = gUnknown_80B865C,
.unk4 = 0x81A1,
.unk6 = 7,
.unk8 = 10,
.fill9 = 0,
.unkA = 0,
.fillB = 0,
};
// Very weird...
UNUSED static const u8 sByte8 = 8;
static const u32 gUnknown_80B86B4[][32] = INCBIN_U32("graphics/warning.4bpp");
static const u8 gKanjiA_file_string[] = "kanji_a";
static const u8 gKanjiB_file_string[] = "kanji_b";
static const u32 gFadeInNone[8] = {0};
static const u32 gFadeInDungeon[8] = {0x88888888, 0x88888888, 0x88888888, 0x88888888, 0x88888888, 0x88888888, 0x88888888, 0x88888888};
static const u32 gUnknown_80B8804[4] = {0, 1, 2, 3};
static const u32 gUnknown_80B8814[4] = {1, 2, 3, 0};
void LoadCharmaps(void)
{
int i;
int j;
int k;
sCurrentCharmap = 0;
sCharmapFiles[0] = OpenFileAndGetFileDataPtr(gKanjiA_file_string, &gSystemFileArchive);
sCharmapFiles[1] = OpenFileAndGetFileDataPtr(gKanjiB_file_string, &gSystemFileArchive);
sCharmaps[0] = (void *) sCharmapFiles[0]->data;
sCharmaps[1] = (void *) sCharmapFiles[1]->data;
sCharHeight[0] = 11;
sCharHeight[1] = 12;
for (k = 0; k < 4; k++) {
gUnknown_2027370[k].unk4 = 0;
gUnknown_2027370[k].unk8 = 0;
gUnknown_2027370[k].unk46 = 0;
}
sCharacterSpacing = 0;
for (i = 0; i < 20; i++) {
gUnknown_202B038[0][i][0] = 0xf279;
gUnknown_202B038[1][i][0] = 0xf27a;
for (j = 1; j < 32; j++) {
gUnknown_202B038[0][i][j] = 0;
gUnknown_202B038[1][i][j] = 0xf27a;
}
}
sDrawTextShadow = 1;
sTextShadowMask = 0x88888888;
gUnknown_203B078 = NULL;
gUnknown_20274A5 = FALSE;
sUnknown_202B020 = 1;
sUnknown_202B024 = 20;
UpdateFadeInTile(0);
}
u32 UpdateFadeInTile(u32 a0)
{
u32 r5 = sUnknown_20274B0;
u32 *r4 = (u32 *)(VRAM + 0x4F40);
const u32 *r2;
sUnknown_20274B0 = a0;
if (a0 == 0 || a0 == 2) {
sub_800CDA8(2);
r2 = gFadeInNone;
}
else {
sub_800CDA8(1);
r2 = gFadeInDungeon;
}
sTextShadowMask = 0x88888888;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
*r4++ = *r2++;
return r5;
}
u32 sub_80063B0(void)
{
return sUnknown_20274B0;
}
UNUSED static u8 UnusedSetTextShadow(u8 a0)
{
u8 retval = sDrawTextShadow;
sDrawTextShadow = a0;
return retval;
}
void SelectCharmap(u32 a0)
{
sCurrentCharmap = a0;
}
void SetCharacterMask(int a0)
{
u32 retval;
if (a0 == 0) {
UNUSED u32 unusedVal = sUnknown_20274B0;
retval = 0x88888888;
}
else {
retval = (a0 & 0xF) | ((a0 & 0xF) << 4); // Must be one line for matching
retval |= ((a0 & 0xF) << 8);
retval |= ((a0 & 0xF) << 12);
retval |= ((a0 & 0xF) << 16);
retval |= ((a0 & 0xF) << 20);
retval |= ((a0 & 0xF) << 24);
retval |= ((a0 & 0xF) << 28);
}
sTextShadowMask = retval;
}
void xxx_call_save_unk_text_struct_800641C(const UnkTextStruct3 *a0, bool8 a1, bool8 a2)
{
DungeonPos r3 = {0, 0};
SaveUnkTextStructAndXXX_8006438(a0, a1, a2, &r3);
}
// https://decomp.me/scratch/xF5Y1
static void SaveUnkTextStructAndXXX_8006438(const UnkTextStruct3 *a0, bool8 a1, bool8 a2, DungeonPos *a3)
{
s32 i;
u32 r9;
r9 = 2;
if (a0 == NULL)
a0 = &gUnknown_80B857C;
if (a2)
sub_8009388();
sub_800898C();
for (i = 0; i < 4; i++) {
sUnknown_202AFC0.a0[i] = a0->a0[i];
if (a0->a0[i].unkC) {
sub_8006554(gUnknown_2027370, (u32 *)VRAM, sUnknown_20274B4, &gUnknown_202B038[0][0][0], gUnknown_80B8804[i], &a0->a0[i], a1, r9, a3, 0);
sub_80089AC(&a0->a0[i], a3);
r9 += a0->a0[i].unkC * a0->a0[i].unk10;
}
}
// Needed to account for weird compiler LDRs
ASM_MATCH_TRICK(gUnknown_203B078);
ASM_MATCH_TRICK(gUnknown_3000E94[0]);
ASM_MATCH_TRICK(gUnknown_20274A5);
gUnknown_203B078 = gUnknown_3000E94;
gUnknown_20274A5 = TRUE;
}
UNUSED static void nullsub_152(void)
{
}
void RestoreUnkTextStruct_8006518(UnkTextStruct3 *unkData)
{
s32 i;
for (i = 0; i < 4; i++)
unkData->a0[i] = sUnknown_202AFC0.a0[i];
}
UNUSED static void nullsub_153(void)
{
}
u32 sub_8006544(u32 index)
{
return gUnknown_80B8814[index];
}
// a1 is a VRAM pointer
static void sub_8006554(UnkTextStruct1 *a0, u32 *a1, u32 *a2, u16 *a3, u32 a4, const UnkTextStruct2 *a5, bool8 a6, u32 a7, DungeonPos *a8, u8 a9)
{
UnkTextStruct1 *t1;
s32 iVar3;
s32 iVar5;
s32 iVar6;
s32 numI;
u32 uVar1;
s32 temp;
s32 i;
s32 j;
t1 = &a0[a4];
iVar3 = a5->pos.x + a8->x;
iVar5 = a5->pos.y + a8->y;
t1->unk0 = iVar3;
t1->unk2 = iVar5;
t1->unk4 = a5->unkC;
t1->unk8 = a5->unk10;
t1->unk6 = a5->unkE;
t1->unkC = a5->unk4;
t1->unk10 = a7;
if (t1->unkC == 6)
t1->unk14 = a7;
else
t1->unk14 = a7 + a5->unk12 * t1->unk4;
t1->unk18 = &a2[t1->unk10 * 8];
t1->unk1C = &a2[t1->unk14 * 8];
t1->unk24 = a5->unk12;
t1->unk28 = &a1[t1->unk14 * 8];
if (t1->unkC == 6)
t1->unk2C = t1->unk4 * (t1->unk6 + a5->unk12) * 32;
else
t1->unk2C = t1->unk4 * t1->unk6 * 32;
t1->unk30 = 0;
t1->unk34 = 0;
t1->unk38 = 0;
t1->unk20 = (t1->unk4 * 8) - 8;
t1->unk45 = t1->unkC == 0;
if (t1->unk8 == 0)
return;
if ((a5->unk0 & 0xA0) != 0x80) {
temp = iVar5 - 1;
if (t1->unkC == 6) {
uVar1 = a6 ? t1->unk14 : 0;
sub_8006E94(t1, temp, uVar1, a5->unk14, a3);
temp = iVar5 + 2;
uVar1 = a6 ? t1->unk14 + t1->unk4 * (a5->unk12 + 2) : 0;
numI = t1->unk6 - 2;
}
else {
sub_800677C(t1, temp, a3, a9);
temp = iVar5;
uVar1 = a6 ? t1->unk14 : 0;
numI = t1->unk6;
}
for (i = 0; i < numI; i++) {
iVar6 = iVar3 - 1;
sub_80069CC(t1, iVar6, temp, i, a3);
iVar6 = iVar3;
for (j = 0; j < t1->unk4; j++) {
sub_8006AC4(t1, iVar6, temp, uVar1, a3);
iVar6++;
if (a6)
uVar1++;
}
sub_8006B70(t1, iVar6, temp, i, a3);
temp++;
}
sub_8006C44(t1, temp, a3, a9);
}
if ((a5->unk0 & 0x80) == 0)
PrepareTextbox_8008C6C(a0, a4);
t1->unk46 = 0;
}
static void sub_800677C(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3)
{
s32 iVar5;
s32 i;
iVar5 = a0->unk0 - 1;
if (a1 > 28)
return;
if (a1 < 0)
return;
switch (a0->unkC) {
case 0:
case 1:
case 2:
case 6:
break;
case 3:
(a2 + a1 * 0x20)[iVar5] = 0xF2D8;
if (a3 != 0)
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF293;
else
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xF2D9;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xF6D8;
if (a3 != 0)
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF693;
else
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
break;
case 4:
(a2 + a1 * 0x20)[iVar5] = 0xF2E8;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xF2E9;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xF6E8;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
break;
case 5:
(a2 + a1 * 0x20)[iVar5] = 0xF2DC;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xF2DD;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xF6DC;
break;
case 7:
(a2 + a1 * 0x20)[iVar5] = 0xF293;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xF297;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xF693;
break;
}
}
static void sub_80069CC(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4)
{
if (a2 > 28)
return;
if (a2 < 0)
return;
switch (a0->unkC) {
case 1:
case 2:
break;
case 0:
if (a3 == 0) {
(a4 + a2 * 0x20)[a1] = 0xF297;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
}
if (a3 == a0->unk6 - 1) {
(a4 + a2 * 0x20)[a1] = 0xFA97;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
}
// Fallthrough
case 3:
case 6:
(a4 + a2 * 0x20)[a1] = 0xF2DA;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
case 4:
(a4 + a2 * 0x20)[a1] = 0xF2EA;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
case 5:
(a4 + a2 * 0x20)[a1] = 0xF2DE;
break;
case 7:
(a4 + a2 * 0x20)[a1] = 0xF2B6;
break;
}
}
static void sub_8006AC4(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4)
{
if (a2 > 28)
return;
if (a2 < 0)
return;
switch (a0->unkC) {
case 2:
(a4 + a2 * 0x20)[a1] = a3 | 0xF000;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF278;
break;
case 0:
case 1:
case 3:
case 4:
case 6:
(a4 + a2 * 0x20)[a1] = a3 | 0xF000;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
case 5:
case 7:
(a4 + a2 * 0x20)[a1] = a3 | 0xF000;
break;
}
}
static void sub_8006B70(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, u16 *a4)
{
if (a2 > 28)
return;
if (a2 < 0)
return;
switch (a0->unkC) {
case 1:
case 2:
break;
case 0:
if (a3 == 0) {
(a4 + a2 * 0x20)[a1] = 0xF697;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
}
if (a3 == a0->unk6 - 1) {
(a4 + a2 * 0x20)[a1] = 0xFE97;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
}
// Fallthrough
case 3:
case 6:
(a4 + a2 * 0x20)[a1] = 0xF6DA;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
case 4:
(a4 + a2 * 0x20)[a1] = 0xF6EA;
(a4 + a2 * 0x20)[a1 + 0x400] = 0xF2DB;
break;
case 5:
(a4 + a2 * 0x20)[a1] = 0xF6DE;
break;
case 7:
(a4 + a2 * 0x20)[a1] = 0xF6B6;
break;
}
}
static void sub_8006C44(UnkTextStruct1 *a0, s32 a1, u16 *a2, u8 a3)
{
s32 iVar5;
s32 i;
iVar5 = a0->unk0 - 1;
if (a1 > 28)
return;
if (a1 < 0)
return;
switch (a0->unkC) {
case 0:
case 1:
case 2:
break;
case 3:
case 6:
(a2 + a1 * 0x20)[iVar5] = 0xFAD8;
if (a3 != 0)
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xFA93;
else
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xFAD9;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xFED8;
if (a3 != 0)
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xFE93;
else
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
break;
case 4:
(a2 + a1 * 0x20)[iVar5] = 0xFAE8;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xFAE9;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xFEE8;
(a2 + a1 * 0x20)[iVar5 + 0x400] = 0xF2DB;
break;
case 5:
(a2 + a1 * 0x20)[iVar5] = 0xFADC;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xFADD;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xFEDC;
break;
case 7:
(a2 + a1 * 0x20)[iVar5] = 0xFA93;
iVar5++;
for (i = 0; i < a0->unk4; i++) {
(a2 + a1 * 0x20)[iVar5] = 0xFA97;
iVar5++;
}
(a2 + a1 * 0x20)[iVar5] = 0xFE93;
break;
}
}
// Not even close but I don't feel like continuing atm https://decomp.me/scratch/F58jg
/*
void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const UnkTextStruct2_sub2 *a3, u16 *a4)
{
s32 bVar1;
s32 iVar2;
s32 iVar3;
s32 sVar4;
u16 *puVar5;
u16 *puVar6;
u16 *puVar7;
s32 iVar8;
u16 *puVar9;
u16 *puVar10;
u16 *puVar11;
s32 local_44;
u32 local_3c;
u16 *local_30;
s32 local_2c;
u16 *local_24;
iVar2 = a0->unk0;
bVar1 = -1;
if (a1 > 28)
return;
if (a1 < 0)
return;
(a4 + a1 * 0x20)[iVar2 - 1] = 0xF278;
(a4 + a1 * 0x20)[iVar2 - 1 + 0x400] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 - 1 + 0x20] = 0xF278;
(a4 + a1 * 0x20)[iVar2 - 1 + 0x420] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 - 1 + 0x40] = 0xF2D8;
(a4 + a1 * 0x20)[iVar2 - 1 + 0x440] = 0xF2DB;
local_2c = iVar2 * 2;
puVar5 = a4 + a1 * 0x20 + iVar2 + 0x40;
puVar7 = a4 + a1 * 0x20 + iVar2 + 0x20;
local_30 = a4 + a1 * 0x20 + iVar2 + 0x400;
puVar11 = a4 + a1 * 0x20 + iVar2 + 0x420;
puVar9 = a4 + a1 * 0x20 + iVar2;
iVar8 = a1 * 0x40;
for (local_3c = 0; local_3c < a3[0]; local_3c++) {
if (local_3c == a3[1]) {
bVar1 = TRUE;
*puVar9 = 0xF2E0;
*local_30 = 0xF2E2;
*puVar7 = 0xF2DA;
*puVar11 = 0xF2DB;
*puVar5 = 0xF6E7;
puVar9[0x440] = 0xF2DB;
puVar5++;
puVar7++;
local_30++;
puVar11++;
puVar9++;
local_2c += 2;
iVar2++;
if (a2 == 0 || ++a2 == 0)
iVar3 = 0;
else
iVar3 = a2 + a0->unk4;
local_24 = a4 + local_2c + iVar8 + 0x80;
puVar10 = a4 + local_2c + iVar8 + 0x40;
puVar6 = a4 + local_2c + iVar8;
for (local_44 = 0; local_44 < a3[2]; local_44++) {
*puVar6 = 0xF2E1;
puVar6[0x400] = 0xF2E2;
*puVar10 = a2 | 0xF000;
puVar6[0x420] = 0xF2DB;
*local_24 = iVar3 | 0xF000;
puVar6[0x440] = 0xF2DB;
local_24++;
puVar10++;
puVar6++;
puVar5++;
puVar7++;
local_30++;
puVar11++;
puVar9++;
local_2c += 2;
iVar2++;
if (a2 != 0)
a2++;
if (iVar3 != 0)
iVar3++;
}
*puVar9 = 0xF6E0;
*local_30 = 0xF2E2;
*puVar7 = 0xF6DA;
*puVar11 = 0xF2DB;
*puVar5 = 0xF2E7;
puVar9[0x440] = 0xF2DB;
}
else {
if (bVar1) {
if ((a3[3] >> (local_3c & 0xFF) & 1) == 0) {
sVar4 = 107;
if (local_3c == a3[0] - 1)
sVar4 = 103;
*puVar9 = (sVar4 + 0x278) | 0xF000;
*puVar7 = 0xF6EF;
*puVar5 = 0xF2D9;
}
else {
sVar4 = 31;
if (local_3c == a3[0] - 1)
sVar4 = 27;
*puVar9 = (sVar4 + 0x278) | 0xF000;
*puVar7 = 0xF6B6;
*puVar5 = 0xF2D9;
}
*local_30 = 0xF27A;
*puVar11 = 0xF6DB;
}
else {
if ((a3[3] >> (local_3c & 0xFF) & 1) == 0) {
sVar4 = 107;
if (local_3c == 0)
sVar4 = 103;
*puVar9 = (sVar4 + 0x278) | 0xF400;
*puVar7 = 0xF2EF;
*puVar5 = 0xF2D9;
}
else {
sVar4 = 31;
if (local_3c == 0)
sVar4 = 27;
*puVar9 = (sVar4 + 0x278) | 0xF400;
*puVar7 = 0xF2B6;
*puVar5 = 0xF2D9;
}
*local_30 = 0xF27A;
*puVar11 = 0xF2DB;
}
puVar9[0x440] = 0xF2DB;
}
local_2c += 2;
local_30++;
iVar2++;
puVar11++;
puVar5++;
puVar7++;
puVar9++;
if (a2 != 0)
a2++;
}
iVar8 = a0->unk0 + a0->unk4;
if (iVar2 < iVar8) {
for (iVar3 = iVar8 - iVar2; iVar3 != 0; iVar3--) {
(a4 + a1 * 0x20)[iVar2 + iVar3] = 0xF278;
(a4 + a1 * 0x20)[iVar2 + 0x400 + iVar3] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 + 0x20 + iVar3] = 0xF278;
(a4 + a1 * 0x20)[iVar2 + 0x420 + iVar3] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 + 0x40 + iVar3] = 0xF2D9;
(a4 + a1 * 0x20)[iVar2 + 0x440 + iVar3] = 0xF2DB;
if (a2 != 0)
a2++;
iVar2 = iVar8;
}
}
(a4 + a1 * 0x20)[iVar2] = 0xF278;
(a4 + a1 * 0x20)[iVar2 + 0x400] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 + 0x20] = 0xF278;
(a4 + a1 * 0x20)[iVar2 + 0x420] = 0xF27A;
(a4 + a1 * 0x20)[iVar2 + 0x40] = 0xF6D8;
(a4 + a1 * 0x20)[iVar2 + 0x440] = 0xF2DB;
}
*/
NAKED
static void sub_8006E94(UnkTextStruct1 *a0, s32 a1, u32 a2, const UnkTextStruct2_sub2 *a3, u16 *a4)
{
asm_unified(
"\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x30\n"
"\tstr r0, [sp]\n"
"\tadds r4, r1, 0\n"
"\tadds r7, r2, 0\n"
"\tstr r3, [sp, 0x4]\n"
"\tmovs r1, 0\n"
"\tldrsh r0, [r0, r1]\n"
"\tmov r10, r0\n"
"\tmovs r2, 0x1\n"
"\tnegs r2, r2\n"
"\tadd r2, r10\n"
"\tmovs r3, 0\n"
"\tstr r3, [sp, 0x8]\n"
"\tcmp r4, 0x1C\n"
"\tble _08006EBE\n"
"\tb _080072FE\n"
"_08006EBE:\n"
"\tcmp r4, 0\n"
"\tbge _08006EC4\n"
"\tb _080072FE\n"
"_08006EC4:\n"
"\tlsls r1, r2, 1\n"
"\tlsls r4, 6\n"
"\tldr r6, [sp, 0x50]\n"
"\tadds r5, r4, r6\n"
"\tadds r1, r5\n"
"\tldr r0, _08006F9C\n"
"\tadds r3, r0, 0\n"
"\tstrh r3, [r1]\n"
"\tmovs r2, 0x80\n"
"\tlsls r2, 4\n"
"\tadds r0, r1, r2\n"
"\tldr r6, _08006FA0\n"
"\tadds r2, r6, 0\n"
"\tstrh r2, [r0]\n"
"\tadds r0, r1, 0\n"
"\tadds r0, 0x40\n"
"\tstrh r3, [r0]\n"
"\tmovs r0, 0x84\n"
"\tlsls r0, 4\n"
"\tadds r0, r1, r0\n"
"\tstrh r2, [r0]\n"
"\tadds r2, r1, 0\n"
"\tadds r2, 0x80\n"
"\tldr r3, _08006FA4\n"
"\tadds r0, r3, 0\n"
"\tstrh r0, [r2]\n"
"\tmovs r6, 0x88\n"
"\tlsls r6, 4\n"
"\tadds r1, r6\n"
"\tldr r2, _08006FA8\n"
"\tadds r0, r2, 0\n"
"\tstrh r0, [r1]\n"
"\tmov r12, r10\n"
"\tmovs r3, 0\n"
"\tstr r4, [sp, 0x18]\n"
"\tldr r4, [sp, 0x4]\n"
"\tldrb r4, [r4]\n"
"\tcmp r3, r4\n"
"\tblt _08006F14\n"
"\tb _08007238\n"
"_08006F14:\n"
"\tadds r2, r5, 0\n"
"\tmov r5, r12\n"
"\tlsls r1, r5, 1\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x80\n"
"\tldr r6, [sp, 0x18]\n"
"\tadds r0, r6, r0\n"
"\tadds r0, r1\n"
"\tmov r9, r0\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x40\n"
"\tadds r0, r6, r0\n"
"\tadds r0, r1\n"
"\tmov r8, r0\n"
"\tldr r4, [sp, 0x50]\n"
"\tmovs r5, 0x80\n"
"\tlsls r5, 4\n"
"\tadds r0, r4, r5\n"
"\tadds r0, r6, r0\n"
"\tadds r0, r1, r0\n"
"\tstr r0, [sp, 0x20]\n"
"\tmovs r6, 0x84\n"
"\tlsls r6, 4\n"
"\tadds r0, r4, r6\n"
"\tldr r4, [sp, 0x18]\n"
"\tadds r0, r4, r0\n"
"\tadds r0, r1\n"
"\tmov r10, r0\n"
"\tadds r4, r1, r2\n"
"\tldr r5, [sp, 0x18]\n"
"\tstr r5, [sp, 0x10]\n"
"\tstr r2, [sp, 0x1C]\n"
"\tstr r1, [sp, 0x24]\n"
"_08006F56:\n"
"\tldr r6, [sp, 0x4]\n"
"\tldrb r6, [r6, 0x1]\n"
"\tcmp r3, r6\n"
"\tbne _08006F60\n"
"\tb _080070C8\n"
"_08006F60:\n"
"\tldr r0, [sp, 0x8]\n"
"\tcmp r0, 0\n"
"\tbne _08007008\n"
"\tldr r1, [sp, 0x4]\n"
"\tldrb r0, [r1, 0x3]\n"
"\tasrs r0, r3\n"
"\tmovs r1, 0x1\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _08006FB8\n"
"\tmovs r1, 0x1F\n"
"\tcmp r3, 0\n"
"\tbne _08006F7C\n"
"\tmovs r1, 0x1B\n"
"_08006F7C:\n"
"\tmovs r2, 0x9E\n"
"\tlsls r2, 2\n"
"\tadds r0, r1, r2\n"
"\tldr r5, _08006FAC\n"
"\tadds r1, r5, 0\n"
"\torrs r0, r1\n"
"\tstrh r0, [r4]\n"
"\tldr r6, _08006FB0\n"
"\tadds r0, r6, 0\n"
"\tmov r1, r8\n"
"\tstrh r0, [r1]\n"
"\tldr r5, _08006FB4\n"
"\tmov r2, r9\n"
"\tstrh r5, [r2]\n"
"\tb _08006FDC\n"
"\t.align 2, 0\n"
"_08006F9C: .4byte 0x0000f278\n"
"_08006FA0: .4byte 0x0000f27a\n"
"_08006FA4: .4byte 0x0000f2d8\n"
"_08006FA8: .4byte 0x0000f2db\n"
"_08006FAC: .4byte 0xfffff400\n"
"_08006FB0: .4byte 0x0000f2b6\n"
"_08006FB4: .4byte 0x0000f2d9\n"
"_08006FB8:\n"
"\tmovs r1, 0x6B\n"
"\tcmp r3, 0\n"
"\tbne _08006FC0\n"
"\tmovs r1, 0x67\n"
"_08006FC0:\n"
"\tmovs r6, 0x9E\n"
"\tlsls r6, 2\n"
"\tadds r0, r1, r6\n"
"\tldr r2, _08006FF4\n"
"\tadds r1, r2, 0\n"
"\torrs r0, r1\n"
"\tstrh r0, [r4]\n"
"\tldr r5, _08006FF8\n"
"\tadds r0, r5, 0\n"
"\tmov r6, r8\n"
"\tstrh r0, [r6]\n"
"\tldr r1, _08006FFC\n"
"\tmov r0, r9\n"
"\tstrh r1, [r0]\n"
"_08006FDC:\n"
"\tldr r2, _08007000\n"
"\tadds r0, r2, 0\n"
"\tldr r5, [sp, 0x20]\n"
"\tstrh r0, [r5]\n"
"\tldr r0, _08007004\n"
"\tmov r6, r10\n"
"\tstrh r0, [r6]\n"
"\tmovs r1, 0x88\n"
"\tlsls r1, 4\n"
"\tadds r0, r4, r1\n"
"\tadds r2, 0x61\n"
"\tb _0800708E\n"
"\t.align 2, 0\n"
"_08006FF4: .4byte 0xfffff400\n"
"_08006FF8: .4byte 0x0000f2ef\n"
"_08006FFC: .4byte 0x0000f2d9\n"
"_08007000: .4byte 0x0000f27a\n"
"_08007004: .4byte 0x0000f2db\n"
"_08007008:\n"
"\tldr r5, [sp, 0x4]\n"
"\tldrb r0, [r5, 0x3]\n"
"\tasrs r0, r3\n"
"\tmovs r1, 0x1\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _0800704C\n"
"\tldrb r0, [r5]\n"
"\tsubs r0, 0x1\n"
"\tmovs r1, 0x1F\n"
"\tcmp r3, r0\n"
"\tbne _08007022\n"
"\tmovs r1, 0x1B\n"
"_08007022:\n"
"\tmovs r6, 0x9E\n"
"\tlsls r6, 2\n"
"\tadds r0, r1, r6\n"
"\tldr r2, _08007040\n"
"\tadds r1, r2, 0\n"
"\torrs r0, r1\n"
"\tstrh r0, [r4]\n"
"\tldr r5, _08007044\n"
"\tadds r0, r5, 0\n"
"\tmov r6, r8\n"
"\tstrh r0, [r6]\n"
"\tldr r1, _08007048\n"
"\tmov r0, r9\n"
"\tstrh r1, [r0]\n"
"\tb _08007076\n"
"\t.align 2, 0\n"
"_08007040: .4byte 0xfffff000\n"
"_08007044: .4byte 0x0000f6b6\n"
"_08007048: .4byte 0x0000f2d9\n"
"_0800704C:\n"
"\tldr r2, [sp, 0x4]\n"
"\tldrb r0, [r2]\n"
"\tsubs r0, 0x1\n"
"\tmovs r1, 0x6B\n"
"\tcmp r3, r0\n"
"\tbne _0800705A\n"
"\tmovs r1, 0x67\n"
"_0800705A:\n"
"\tmovs r5, 0x9E\n"
"\tlsls r5, 2\n"
"\tadds r0, r1, r5\n"
"\tldr r6, _080070B0\n"
"\tadds r1, r6, 0\n"
"\torrs r0, r1\n"
"\tstrh r0, [r4]\n"
"\tldr r1, _080070B4\n"
"\tadds r0, r1, 0\n"
"\tmov r2, r8\n"
"\tstrh r0, [r2]\n"
"\tldr r6, _080070B8\n"
"\tmov r5, r9\n"
"\tstrh r6, [r5]\n"
"_08007076:\n"
"\tldr r1, _080070BC\n"
"\tadds r0, r1, 0\n"
"\tldr r2, [sp, 0x20]\n"
"\tstrh r0, [r2]\n"
"\tldr r5, _080070C0\n"
"\tadds r0, r5, 0\n"
"\tmov r6, r10\n"
"\tstrh r0, [r6]\n"
"\tmovs r1, 0x88\n"
"\tlsls r1, 4\n"
"\tadds r0, r4, r1\n"
"\tldr r2, _080070C4\n"
"_0800708E:\n"
"\tstrh r2, [r0]\n"
"\tmovs r5, 0x2\n"
"\tadd r9, r5\n"
"\tadd r8, r5\n"
"\tldr r6, [sp, 0x20]\n"
"\tadds r6, 0x2\n"
"\tstr r6, [sp, 0x20]\n"
"\tadd r10, r5\n"
"\tadds r4, 0x2\n"
"\tldr r0, [sp, 0x24]\n"
"\tadds r0, 0x2\n"
"\tstr r0, [sp, 0x24]\n"
"\tmovs r1, 0x1\n"
"\tadd r12, r1\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0x14]\n"
"\tb _08007226\n"
"\t.align 2, 0\n"
"_080070B0: .4byte 0xfffff000\n"
"_080070B4: .4byte 0x0000f6ef\n"
"_080070B8: .4byte 0x0000f2d9\n"
"_080070BC: .4byte 0x0000f27a\n"
"_080070C0: .4byte 0x0000f6db\n"
"_080070C4: .4byte 0x0000f2db\n"
"_080070C8:\n"
"\tmovs r2, 0x1\n"
"\tstr r2, [sp, 0x8]\n"
"\tldr r5, _08007128\n"
"\tadds r0, r5, 0\n"
"\tstrh r0, [r4]\n"
"\tldr r6, _0800712C\n"
"\tadds r0, r6, 0\n"
"\tldr r1, [sp, 0x20]\n"
"\tstrh r0, [r1]\n"
"\tldr r2, _08007130\n"
"\tadds r0, r2, 0\n"
"\tmov r5, r8\n"
"\tstrh r0, [r5]\n"
"\tldr r0, _08007134\n"
"\tmov r6, r10\n"
"\tstrh r0, [r6]\n"
"\tldr r1, _08007138\n"
"\tadds r0, r1, 0\n"
"\tmov r2, r9\n"
"\tstrh r0, [r2]\n"
"\tmovs r5, 0x88\n"
"\tlsls r5, 4\n"
"\tadds r0, r4, r5\n"
"\tldr r6, _08007134\n"
"\tstrh r6, [r0]\n"
"\tmovs r0, 0x2\n"
"\tadd r9, r0\n"
"\tadd r8, r0\n"
"\tldr r1, [sp, 0x20]\n"
"\tadds r1, 0x2\n"
"\tstr r1, [sp, 0x20]\n"
"\tadd r10, r0\n"
"\tadds r4, 0x2\n"
"\tldr r2, [sp, 0x24]\n"
"\tadds r2, 0x2\n"
"\tstr r2, [sp, 0x24]\n"
"\tmovs r5, 0x1\n"
"\tadd r12, r5\n"
"\tcmp r7, 0\n"
"\tbeq _0800713C\n"
"\tadds r7, 0x1\n"
"\tcmp r7, 0\n"
"\tbeq _0800713C\n"
"\tldr r6, [sp]\n"
"\tmovs r1, 0x4\n"
"\tldrsh r0, [r6, r1]\n"
"\tadds r2, r7, r0\n"
"\tb _0800713E\n"
"\t.align 2, 0\n"
"_08007128: .4byte 0x0000f2e0\n"
"_0800712C: .4byte 0x0000f2e2\n"
"_08007130: .4byte 0x0000f2da\n"
"_08007134: .4byte 0x0000f2db\n"
"_08007138: .4byte 0x0000f6e7\n"
"_0800713C:\n"
"\tmovs r2, 0\n"
"_0800713E:\n"
"\tmovs r5, 0\n"
"\tstr r5, [sp, 0xC]\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0x14]\n"
"\tldr r6, [sp, 0x4]\n"
"\tldrb r6, [r6, 0x2]\n"
"\tcmp r5, r6\n"
"\tbge _080071E0\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x80\n"
"\tldr r1, [sp, 0x10]\n"
"\tadds r0, r1, r0\n"
"\tldr r3, [sp, 0x24]\n"
"\tadds r0, r3, r0\n"
"\tstr r0, [sp, 0x2C]\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x40\n"
"\tadds r0, r1, r0\n"
"\tadds r5, r3, r0\n"
"\tldr r6, [sp, 0x1C]\n"
"\tadds r3, r6\n"
"_08007168:\n"
"\tldr r1, _08007310\n"
"\tadds r0, r1, 0\n"
"\tstrh r0, [r3]\n"
"\tmovs r6, 0x80\n"
"\tlsls r6, 4\n"
"\tadds r6, r3, r6\n"
"\tstr r6, [sp, 0x28]\n"
"\tadds r1, 0x1\n"
"\tadds r0, r1, 0\n"
"\tstrh r0, [r6]\n"
"\tadds r0, r7, 0\n"
"\tldr r6, _08007314\n"
"\torrs r0, r6\n"
"\tstrh r0, [r5]\n"
"\tmovs r1, 0x84\n"
"\tlsls r1, 4\n"
"\tadds r0, r3, r1\n"
"\tldr r6, _08007318\n"
"\tstrh r6, [r0]\n"
"\tadds r0, r2, 0\n"
"\tldr r1, _08007314\n"
"\torrs r0, r1\n"
"\tldr r6, [sp, 0x2C]\n"
"\tstrh r0, [r6]\n"
"\tmovs r1, 0x88\n"
"\tlsls r1, 4\n"
"\tadds r0, r3, r1\n"
"\tldr r6, _08007318\n"
"\tstrh r6, [r0]\n"
"\tldr r0, [sp, 0x2C]\n"
"\tadds r0, 0x2\n"
"\tstr r0, [sp, 0x2C]\n"
"\tadds r5, 0x2\n"
"\tadds r3, 0x2\n"
"\tmovs r1, 0x2\n"
"\tadd r9, r1\n"
"\tadd r8, r1\n"
"\tldr r6, [sp, 0x20]\n"
"\tadds r6, 0x2\n"
"\tstr r6, [sp, 0x20]\n"
"\tadd r10, r1\n"
"\tadds r4, 0x2\n"
"\tldr r0, [sp, 0x24]\n"
"\tadds r0, 0x2\n"
"\tstr r0, [sp, 0x24]\n"
"\tmovs r1, 0x1\n"
"\tadd r12, r1\n"
"\tcmp r7, 0\n"
"\tbeq _080071CC\n"
"\tadds r7, 0x1\n"
"_080071CC:\n"
"\tcmp r2, 0\n"
"\tbeq _080071D2\n"
"\tadds r2, 0x1\n"
"_080071D2:\n"
"\tldr r6, [sp, 0xC]\n"
"\tadds r6, 0x1\n"
"\tstr r6, [sp, 0xC]\n"
"\tldr r0, [sp, 0x4]\n"
"\tldrb r0, [r0, 0x2]\n"
"\tcmp r6, r0\n"
"\tblt _08007168\n"
"_080071E0:\n"
"\tldr r1, _0800731C\n"
"\tadds r0, r1, 0\n"
"\tstrh r0, [r4]\n"
"\tldr r2, _08007320\n"
"\tadds r0, r2, 0\n"
"\tldr r3, [sp, 0x20]\n"
"\tstrh r0, [r3]\n"
"\tldr r5, _08007324\n"
"\tadds r0, r5, 0\n"
"\tmov r6, r8\n"
"\tstrh r0, [r6]\n"
"\tldr r1, _08007318\n"
"\tmov r0, r10\n"
"\tstrh r1, [r0]\n"
"\tadds r2, 0x5\n"
"\tadds r0, r2, 0\n"
"\tmov r3, r9\n"
"\tstrh r0, [r3]\n"
"\tmovs r5, 0x88\n"
"\tlsls r5, 4\n"
"\tadds r0, r4, r5\n"
"\tstrh r1, [r0]\n"
"\tmovs r6, 0x2\n"
"\tadd r9, r6\n"
"\tadd r8, r6\n"
"\tldr r0, [sp, 0x20]\n"
"\tadds r0, 0x2\n"
"\tstr r0, [sp, 0x20]\n"
"\tadd r10, r6\n"
"\tadds r4, 0x2\n"
"\tldr r1, [sp, 0x24]\n"
"\tadds r1, 0x2\n"
"\tstr r1, [sp, 0x24]\n"
"\tmovs r2, 0x1\n"
"\tadd r12, r2\n"
"_08007226:\n"
"\tcmp r7, 0\n"
"\tbeq _0800722C\n"
"\tadds r7, 0x1\n"
"_0800722C:\n"
"\tldr r3, [sp, 0x14]\n"
"\tldr r5, [sp, 0x4]\n"
"\tldrb r5, [r5]\n"
"\tcmp r3, r5\n"
"\tbge _08007238\n"
"\tb _08006F56\n"
"_08007238:\n"
"\tldr r6, [sp]\n"
"\tmovs r0, 0\n"
"\tldrsh r1, [r6, r0]\n"
"\tmovs r2, 0x4\n"
"\tldrsh r0, [r6, r2]\n"
"\tadds r0, r1, r0\n"
"\tcmp r12, r0\n"
"\tbge _080072BC\n"
"\tldr r3, _08007328\n"
"\tadds r4, r3, 0\n"
"\tmov r8, r0\n"
"\tmov r5, r12\n"
"\tlsls r1, r5, 1\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x80\n"
"\tldr r6, [sp, 0x18]\n"
"\tadds r0, r6, r0\n"
"\tadds r5, r1, r0\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r0, 0x40\n"
"\tadds r0, r6, r0\n"
"\tadds r3, r1, r0\n"
"\tldr r0, [sp, 0x50]\n"
"\tadds r6, r0\n"
"\tadds r2, r1, r6\n"
"\tmovs r1, 0x80\n"
"\tlsls r1, 4\n"
"\tmov r10, r1\n"
"\tmovs r6, 0x84\n"
"\tlsls r6, 4\n"
"\tmov r9, r6\n"
"\tmov r0, r8\n"
"\tmov r1, r12\n"
"\tsubs r0, r1\n"
"\tmov r12, r0\n"
"_0800727E:\n"
"\tstrh r4, [r2]\n"
"\tmov r6, r10\n"
"\tadds r0, r2, r6\n"
"\tldr r1, _0800732C\n"
"\tstrh r1, [r0]\n"
"\tstrh r4, [r3]\n"
"\tmov r6, r9\n"
"\tadds r0, r2, r6\n"
"\tstrh r1, [r0]\n"
"\tadds r1, 0x5F\n"
"\tadds r0, r1, 0\n"
"\tstrh r0, [r5]\n"
"\tmovs r6, 0x88\n"
"\tlsls r6, 4\n"
"\tadds r1, r2, r6\n"
"\tldr r6, _08007318\n"
"\tadds r0, r6, 0\n"
"\tstrh r0, [r1]\n"
"\tadds r5, 0x2\n"
"\tadds r3, 0x2\n"
"\tadds r2, 0x2\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tadd r12, r0\n"
"\tcmp r7, 0\n"
"\tbeq _080072B4\n"
"\tadds r7, 0x1\n"
"_080072B4:\n"
"\tmov r1, r12\n"
"\tcmp r1, 0\n"
"\tbne _0800727E\n"
"\tmov r12, r8\n"
"_080072BC:\n"
"\tmov r2, r12\n"
"\tlsls r1, r2, 1\n"
"\tldr r3, [sp, 0x18]\n"
"\tldr r4, [sp, 0x50]\n"
"\tadds r0, r3, r4\n"
"\tadds r1, r0\n"
"\tldr r5, _08007328\n"
"\tadds r3, r5, 0\n"
"\tstrh r3, [r1]\n"
"\tmovs r6, 0x80\n"
"\tlsls r6, 4\n"
"\tadds r0, r1, r6\n"
"\tldr r4, _0800732C\n"
"\tadds r2, r4, 0\n"
"\tstrh r2, [r0]\n"
"\tadds r0, r1, 0\n"
"\tadds r0, 0x40\n"
"\tstrh r3, [r0]\n"
"\tmovs r5, 0x84\n"
"\tlsls r5, 4\n"
"\tadds r0, r1, r5\n"
"\tstrh r2, [r0]\n"
"\tadds r2, r1, 0\n"
"\tadds r2, 0x80\n"
"\tldr r6, _08007330\n"
"\tadds r0, r6, 0\n"
"\tstrh r0, [r2]\n"
"\tmovs r0, 0x88\n"
"\tlsls r0, 4\n"
"\tadds r1, r0\n"
"\tldr r2, _08007318\n"
"\tadds r0, r2, 0\n"
"\tstrh r0, [r1]\n"
"_080072FE:\n"
"\tadd sp, 0x30\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08007310: .4byte 0x0000f2e1\n"
"_08007314: .4byte 0xfffff000\n"
"_08007318: .4byte 0x0000f2db\n"
"_0800731C: .4byte 0x0000f6e0\n"
"_08007320: .4byte 0x0000f2e2\n"
"_08007324: .4byte 0x0000f6da\n"
"_08007328: .4byte 0x0000f278\n"
"_0800732C: .4byte 0x0000f27a\n"
"_08007330: .4byte 0x0000f6d8");
}
void sub_8007334(s32 a0)
{
s32 i, j;
struct UnkTextStruct1 *textStructPtr = &gUnknown_2027370[a0];
s32 r5 = textStructPtr->unk14;
s32 r6 = textStructPtr->unk2;
for (i = 0; i < textStructPtr->unk6; i++) {
s32 id = textStructPtr->unk0;
for (j = 0; j < textStructPtr->unk4; j++) {
gUnknown_202B038[0][r6][id] &= ~0x3ff;
gUnknown_202B038[0][r6][id] |= r5;
id++;
r5++;
}
r6++;
}
}
UNUSED static void nullsub_154(void)
{
}
void sub_80073B8(s32 a0)
{
UnkTextStruct1 *r1;
r1 = &gUnknown_2027370[a0];
r1->unk3C = &r1->unk1C[(u32)r1->unk2C >> 2];
r1->unk40 = r1->unk1C;
r1->unk46 = 1;
}
UNUSED static void nullsub_155(void)
{
}
void sub_80073E0(s32 a0)
{
UnkTextStruct1 *r1;
r1 = &gUnknown_2027370[a0];
if (r1->unk44 == 0) {
r1->unk30 = &r1->unk28[r1->unk3C - r1->unk1C];
r1->unk34 = r1->unk3C;
r1->unk38 = (r1->unk40 - r1->unk3C + 1) * 4;
if (r1->unk38 >= r1->unk2C)
r1->unk38 = r1->unk2C;
if (r1->unk38 < 0)
r1->unk38 = 0;
}
r1->unk46 = 0;
}
UNUSED static void nullsub_156(void)
{
}
u32 xxx_call_draw_char(s32 x, s32 y, u32 a2, u32 color, u32 a4)
{
return xxx_draw_char(gUnknown_2027370, x, y, a2, color, a4);
}
UNUSED static bool8 sub_8007464(void)
{
return FALSE;
}
static u32 xxx_draw_char(struct UnkTextStruct1 *a0, s32 x, s32 y, u32 a3, u32 color, u32 a5)
{
u32 *r3;
const struct unkShiftData *shiftData;
const struct unkChar *sp0;
const u16 *local_44;
const u16 *sp8;
const u16 *local_3c;
s32 i;
s32 xDiv8, yDiv8;
struct UnkTextStruct1 *r5 = &a0[a5];
s32 sp18 = gUnknown_80B853C[color & 0xF];
u8 var_2C;
u32 r4;
u32 r2;
if (sCurrentCharmap == 1) {
if (a3 == 0x70 || a3 == 0x6A || a3 == 0x71 || a3 == 0x79 || a3 == 0x67)
y += 2;
else if (a3 == 0x8199)
y -= 2;
}
sp0 = GetCharacter(a3);
local_44 = sp0->unk0;
ASM_MATCH_TRICK(local_3c); // stack doesn't match without it
local_3c = sp0->unk0;
sp8 = sp0->unk0 - 3;
if (sDrawTextShadow != 0) {
var_2C = (sp0->unkA >> 1) & 1;
}
else {
var_2C = 0;
}
if (sp0->unkA & 1) {
r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8);
r3 += y - (y / 8 * 8);
shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)];
xDiv8 = x / 8;
yDiv8 = y / 8;
if (yDiv8 < r5->unk8) {
for (i = 0; i < sCharHeight[sCurrentCharmap]; i++) {
r2 = (local_44[1] << 0x10) | (local_44[0]);
if (r2 != 0) {
if (xDiv8 < r5->unk4) {
*r3 |= (shiftData->bytesA & r2) << shiftData->shift_left;
if (r5->unk3C > r3)
r5->unk3C = r3;
if (r5->unk40 < r3)
r5->unk40 = r3;
}
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
r2 &= shiftData->bytesB;
*r3 |= (r2) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
}
r2 = local_44[2];
if (r2 != 0) {
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
if (xDiv8 < r5->unk4 - 2) {
r3 += 16;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 16;
}
}
local_44 += 3;
r3++;
y++;
if (y % 8 == 0) {
r3 += r5->unk20;
yDiv8++;
if (yDiv8 >= r5->unk8)
break;
}
}
}
}
else {
bool8 notFirstIteration = FALSE;
u32 r1;
r3 = r5->unk18 + ((((y / 8) * r5->unk4) + (x / 8)) * 8);
r3 += y - (y / 8 * 8);
shiftData = &gCharMasksOffsets[x - ((x / 8) * 8)];
xDiv8 = x / 8;
yDiv8 = y / 8;
if (yDiv8 < r5->unk8) {
for (i = 0; i < sCharHeight[sCurrentCharmap]; i++) {
r4 = (local_44[1] << 0x10) | (local_44[0]);
r2 = (0x11111111 & r4) + (sp18 & r4);
if (var_2C != 0) {
r1 = ((local_3c[1] << 0x10) | local_3c[0]) << 4;
r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match.
r1 &= ~(r4);
r1 &= sTextShadowMask;
r2 |= (r1);
if (notFirstIteration) {
r1 = (((sp8[1] << 0x10) | sp8[0]) << 4) ^ r4;
r1 &= ~(r4);
r2 |= (r1 & sTextShadowMask);
}
}
if (r2 != 0) {
if (xDiv8 < r5->unk4) {
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk3C > r3)
r5->unk3C = r3;
if (r5->unk40 < r3)
r5->unk40 = r3;
}
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
}
r4 = local_44[2];
r2 = (0x11111111 & r4) + (sp18 & r4);
if (var_2C != 0) {
r1 = (local_3c[2] << 4) | ((local_3c[1] >> 0xC) & 0xF);
r1 |= r4; // This doesn't really do anything since r4 bits are cleared, but it's needed to match.
r1 &= ~(r4);
r1 &= sTextShadowMask;
r2 |= r1;
if (notFirstIteration) {
r1 = ((sp8[2] << 4) | ((sp8[1] >> 0xC) & 0xF)) ^ r4;
r1 &= ~(r4);
r1 &= sTextShadowMask;
r2 |= (r1);
}
}
if (r2 != 0) {
if (xDiv8 < r5->unk4 - 1) {
r3 += 8;
*r3 |= (r2 & shiftData->bytesA) << shiftData->shift_left;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 8;
}
if (xDiv8 < r5->unk4 - 2) {
r3 += 16;
*r3 |= (r2 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < r3)
r5->unk40 = r3;
r3 -= 16;
}
}
notFirstIteration = TRUE;
local_44 += 3;
sp8 += 3;
local_3c += 3;
r3++;
y++;
if (y % 8 == 0) {
r3 += r5->unk20;
yDiv8++;
if (yDiv8 >= r5->unk8)
break;
}
}
}
}
return sp0->unk6 + sCharacterSpacing;
}
void sub_80078A4(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
sub_800792C(a0, x, y, a3, color);
sub_800792C(a0, x, y + 1, a3, sTextShadowMask & 0xF);
}
UNUSED static void sub_80078E8(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
nullsub_129(a0, x, y, a3, color);
nullsub_129(a0, x, y + 1, a3, sTextShadowMask & 0xF);
}
void sub_800792C(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
sub_8007958(gUnknown_2027370, a0, x, y, a3, color);
}
static void nullsub_129(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
}
static void sub_8007958(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color)
{
u32 uVar4;
u32 *dest;
s32 r4;
const struct unkShiftData *shiftData;
UnkTextStruct1 *r5;
s32 r6;
u32 r9;
s32 lol;
r5 = &a0[a1];
r9 = gUnknown_80B853C[color & 0xF];
r4 = y / 8;
dest = r5->unk18 + (((r5->unk4 * r4) + (x / 8)) * 8);
dest += (r4 * -8) + y;
r6 = x / 8;
if (y / 8 >= r5->unk8) {
return;
}
else {
const u32 unkBits[] = {0, 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF, 0xFFFFFFFF};
for (; a4 > 0; a4 -= 8) {
lol = a4;
if (lol > 7)
lol = 8;
shiftData = &gCharMasksOffsets[x + (x / 8 * -8)];
uVar4 = unkBits[lol];
uVar4 = (uVar4 & 0x11111111) + (uVar4 & r9);
if (uVar4 != 0) {
if (r6 < r5->unk4) {
dest[0] |= (shiftData->bytesA & uVar4) << shiftData->shift_left;
if (r5->unk3C > dest)
r5->unk3C = dest;
if (r5->unk40 < dest)
r5->unk40 = dest;
}
if (r6 < r5->unk4 - 1) {
dest += 8;
dest[0] |= (uVar4 & shiftData->bytesB) >> shiftData->shift_right;
if (r5->unk40 < dest)
r5->unk40 = dest;
dest -= 8;
}
}
r6++;
dest += 8;
}
}
}
void sub_8007A78(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
sub_8007AA4(gUnknown_2027370, a0, x, y, a3, color);
}
UNUSED static void nullsub_157(void)
{
}
static void sub_8007AA4(struct UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, u32 color)
{
struct UnkTextStruct1 *r4 = &a0[a1];
u32 ip = gUnknown_80B853C[color & 0xF] + 0x11111111;
const u32 unkBits[] = {0xF, 0xF0, 0xF00, 0xF000, 0xF0000, 0xF00000, 0xF000000, 0xF0000000};
s32 r3 = y / 8;
u32 *dest = r4->unk18 + ((r4->unk4 * r3 + x / 8) * 8);
s32 r2 = x / 8;
dest += r3 * -8 + y;
ip &= unkBits[x & 7];
if (r2 < r4->unk4) {
// This goto looks like a fakematch, but I couldn't get it to work otherwise.
goto LOOP_MIDDLE;
while (1) {
y++;
dest++;
if ((y % 8) == 0)
dest += r4->unk20;
a4--;
LOOP_MIDDLE:
if (a4 <= 0)
return;
if (r3 >= r4->unk8)
return;
dest[0] |= ip;
if (r4->unk3C > dest)
r4->unk3C = dest;
if (r4->unk40 < dest)
r4->unk40 = dest;
}
}
}
void sub_8007B7C(u32 a0, s32 x, s32 y, s32 a3, u32 color)
{
sub_8007BA8(gUnknown_2027370, a0, x, y, a3, color);
}
UNUSED static void nullsub_158(void)
{
}
#ifdef NONMATCHING // https://decomp.me/scratch/AU1bH
static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
{
s32 iVar1; // r1
s32 iVar3;
s32 iVar9; // r8?
u32 *r4;
u32 r5;
u32 r6;
UnkTextStruct1 *ip;
s32 sp4;
s32 sp8;
u32 sp1C; // Used correctly
s32 yeah;
u32 *sp10; // r2?
ip = &a0[a1];
sp8 = y / 8;
if (sp8 >= ip->unk8)
return;
yeah = ip->unk4 * sp8;
r4 = ip->unk18 + ((yeah + x / 8) * 8);
r4 += (sp8 * -8) + y;
for (sp4 = 0; sp4 < color; sp4++) {
sp10 = r4;
iVar1 = x / 8;
for (iVar9 = 0; iVar9 < a4; iVar9 += 8) {
if (iVar1 >= ip->unk4)
break;
r6 = 0xF0000000;
r5 = 0xE0000000;
sp1C = 0;
for (iVar3 = 0; iVar3 < 8; iVar3++) {
if ((sp10[0] & r6) == 0)
sp1C |= r5;
r6 >>= 4;
r5 >>= 4;
}
sp10[0] |= sp1C;
if (ip->unk3C > sp10)
ip->unk3C = sp10;
if (ip->unk40 < sp10)
ip->unk40 = sp10;
sp10 += 8;
iVar1++;
}
y++;
r4++;
if ((y % 8) == 0) {
r4 += ip->unk20;
sp8++;
if (sp8 >= ip->unk8)
return;
}
sp4++;
}
}
#else
NAKED
static void sub_8007BA8(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
{
asm_unified(
"push {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x20\n"
"\tstr r2, [sp]\n"
"\tlsls r2, r1, 3\n"
"\tadds r2, r1\n"
"\tlsls r2, 3\n"
"\tadds r0, r2\n"
"\tmov r12, r0\n"
"\tadds r0, r3, 0\n"
"\tcmp r3, 0\n"
"\tbge _08007BC8\n"
"\tadds r0, r3, 0x7\n"
"_08007BC8:\n"
"\tasrs r0, 3\n"
"\tstr r0, [sp, 0x8]\n"
"\tmov r1, r12\n"
"\tmovs r2, 0x8\n"
"\tldrsh r0, [r1, r2]\n"
"\tldr r4, [sp, 0x8]\n"
"\tcmp r4, r0\n"
"\tbge _08007CC4\n"
"\tmovs r7, 0x4\n"
"\tldrsh r0, [r1, r7]\n"
"\tadds r1, r4, 0\n"
"\tmuls r1, r0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007BE8\n"
"\tadds r0, 0x7\n"
"_08007BE8:\n"
"\tasrs r0, 3\n"
"\tadds r0, r1, r0\n"
"\tlsls r0, 5\n"
"\tmov r2, r12\n"
"\tldr r1, [r2, 0x18]\n"
"\tadds r4, r1, r0\n"
"\tldr r7, [sp, 0x8]\n"
"\tlsls r0, r7, 3\n"
"\tsubs r0, r3, r0\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tmovs r0, 0\n"
"\tstr r0, [sp, 0x4]\n"
"\tldr r1, [sp, 0x44]\n"
"\tcmp r0, r1\n"
"\tbge _08007CC4\n"
"_08007C08:\n"
"\tadds r2, r4, 0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007C12\n"
"\tadds r0, 0x7\n"
"_08007C12:\n"
"\tasrs r1, r0, 3\n"
"\tmovs r7, 0\n"
"\tmov r8, r7\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0xC]\n"
"\tadds r4, 0x4\n"
"\tstr r4, [sp, 0x14]\n"
"\tldr r0, [sp, 0x40]\n"
"\tcmp r8, r0\n"
"\tbge _08007C94\n"
"_08007C26:\n"
"\tmov r3, r12\n"
"\tmovs r4, 0x4\n"
"\tldrsh r0, [r3, r4]\n"
"\tcmp r1, r0\n"
"\tbge _08007C94\n"
"\tmovs r6, 0xF0\n"
"\tlsls r6, 24\n"
"\tmovs r5, 0xE0\n"
"\tlsls r5, 24\n"
"\tmovs r7, 0\n"
"\tstr r7, [sp, 0x1C]\n"
"\tldr r4, [r2]\n"
"\tadds r3, r4, 0\n"
"\tmov r0, r12\n"
"\tldr r0, [r0, 0x3C]\n"
"\tmov r9, r0\n"
"\tmov r7, r12\n"
"\tldr r7, [r7, 0x40]\n"
"\tmov r10, r7\n"
"\tadds r1, 0x1\n"
"\tstr r1, [sp, 0x10]\n"
"\tadds r0, r2, 0\n"
"\tadds r0, 0x20\n"
"\tstr r0, [sp, 0x18]\n"
"\tmovs r1, 0x8\n"
"\tadd r8, r1\n"
"\tmovs r1, 0x7\n"
"_08007C5C:\n"
"\tadds r0, r4, 0\n"
"\tands r0, r6\n"
"\tcmp r0, 0\n"
"\tbne _08007C6A\n"
"\tldr r7, [sp, 0x1C]\n"
"\torrs r7, r5\n"
"\tstr r7, [sp, 0x1C]\n"
"_08007C6A:\n"
"\tlsrs r6, 4\n"
"\tlsrs r5, 4\n"
"\tsubs r1, 0x1\n"
"\tcmp r1, 0\n"
"\tbge _08007C5C\n"
"\tldr r0, [sp, 0x1C]\n"
"\torrs r3, r0\n"
"\tstr r3, [r2]\n"
"\tcmp r9, r2\n"
"\tbls _08007C82\n"
"\tmov r1, r12\n"
"\tstr r2, [r1, 0x3C]\n"
"_08007C82:\n"
"\tcmp r10, r2\n"
"\tbcs _08007C8A\n"
"\tmov r3, r12\n"
"\tstr r2, [r3, 0x40]\n"
"_08007C8A:\n"
"\tldr r1, [sp, 0x10]\n"
"\tldr r2, [sp, 0x18]\n"
"\tldr r4, [sp, 0x40]\n"
"\tcmp r8, r4\n"
"\tblt _08007C26\n"
"_08007C94:\n"
"\tldr r3, [sp, 0xC]\n"
"\tldr r4, [sp, 0x14]\n"
"\tmovs r0, 0x7\n"
"\tands r0, r3\n"
"\tcmp r0, 0\n"
"\tbne _08007CB8\n"
"\tmov r7, r12\n"
"\tldr r0, [r7, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tldr r0, [sp, 0x8]\n"
"\tadds r0, 0x1\n"
"\tstr r0, [sp, 0x8]\n"
"\tmovs r1, 0x8\n"
"\tldrsh r0, [r7, r1]\n"
"\tldr r2, [sp, 0x8]\n"
"\tcmp r2, r0\n"
"\tbge _08007CC4\n"
"_08007CB8:\n"
"\tldr r7, [sp, 0x4]\n"
"\tadds r7, 0x1\n"
"\tstr r7, [sp, 0x4]\n"
"\tldr r0, [sp, 0x44]\n"
"\tcmp r7, r0\n"
"\tblt _08007C08\n"
"_08007CC4:\n"
"\tadd sp, 0x20\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0");
}
#endif // NONMATCHING
UNUSED static void sub_8007CD4(u32 a0, s32 a1, s32 a2, s32 a3, s32 a4)
{
sub_8007D00(gUnknown_2027370, a0, a1, a2, a3, a4);
}
UNUSED static void nullsub_159(void)
{
}
NAKED // Very similar to sub_8007BA8
static void sub_8007D00(UnkTextStruct1 *a0, u32 a1, s32 x, s32 y, s32 a4, s32 color)
{
asm_unified(
"push {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x20\n"
"\tstr r2, [sp]\n"
"\tlsls r2, r1, 3\n"
"\tadds r2, r1\n"
"\tlsls r2, 3\n"
"\tadds r0, r2\n"
"\tmov r12, r0\n"
"\tadds r0, r3, 0\n"
"\tcmp r3, 0\n"
"\tbge _08007D20\n"
"\tadds r0, r3, 0x7\n"
"_08007D20:\n"
"\tasrs r0, 3\n"
"\tstr r0, [sp, 0x8]\n"
"\tmov r1, r12\n"
"\tmovs r2, 0x8\n"
"\tldrsh r0, [r1, r2]\n"
"\tldr r4, [sp, 0x8]\n"
"\tcmp r4, r0\n"
"\tbge _08007E0E\n"
"\tmovs r5, 0x4\n"
"\tldrsh r0, [r1, r5]\n"
"\tadds r1, r4, 0\n"
"\tmuls r1, r0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007D40\n"
"\tadds r0, 0x7\n"
"_08007D40:\n"
"\tasrs r0, 3\n"
"\tadds r0, r1, r0\n"
"\tlsls r0, 5\n"
"\tmov r2, r12\n"
"\tldr r1, [r2, 0x18]\n"
"\tadds r4, r1, r0\n"
"\tldr r5, [sp, 0x8]\n"
"\tlsls r0, r5, 3\n"
"\tsubs r0, r3, r0\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tmovs r0, 0\n"
"\tb _08007E06\n"
"_08007D5A:\n"
"\tadds r2, r4, 0\n"
"\tldr r0, [sp]\n"
"\tcmp r0, 0\n"
"\tbge _08007D64\n"
"\tadds r0, 0x7\n"
"_08007D64:\n"
"\tasrs r1, r0, 3\n"
"\tmovs r5, 0\n"
"\tmov r8, r5\n"
"\tadds r3, 0x1\n"
"\tstr r3, [sp, 0xC]\n"
"\tadds r4, 0x4\n"
"\tstr r4, [sp, 0x14]\n"
"\tldr r0, [sp, 0x40]\n"
"\tcmp r8, r0\n"
"\tbge _08007DE0\n"
"_08007D78:\n"
"\tmov r3, r12\n"
"\tmovs r4, 0x4\n"
"\tldrsh r0, [r3, r4]\n"
"\tcmp r1, r0\n"
"\tbge _08007DE0\n"
"\tmovs r4, 0xF0\n"
"\tlsls r4, 24\n"
"\tmovs r6, 0xE0\n"
"\tlsls r6, 24\n"
"\tmovs r7, 0\n"
"\tldr r5, [r2]\n"
"\tstr r5, [sp, 0x1C]\n"
"\tadds r3, r5, 0\n"
"\tmov r0, r12\n"
"\tldr r0, [r0, 0x3C]\n"
"\tmov r9, r0\n"
"\tmov r5, r12\n"
"\tldr r5, [r5, 0x40]\n"
"\tmov r10, r5\n"
"\tadds r1, 0x1\n"
"\tstr r1, [sp, 0x10]\n"
"\tadds r0, r2, 0\n"
"\tadds r0, 0x20\n"
"\tstr r0, [sp, 0x18]\n"
"\tmovs r1, 0x8\n"
"\tadd r8, r1\n"
"\tmovs r1, 0x7\n"
"_08007DAE:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tands r0, r4\n"
"\tcmp r0, r6\n"
"\tbne _08007DB8\n"
"\torrs r7, r4\n"
"_08007DB8:\n"
"\tlsrs r4, 4\n"
"\tlsrs r6, 4\n"
"\tsubs r1, 0x1\n"
"\tcmp r1, 0\n"
"\tbge _08007DAE\n"
"\tbics r3, r7\n"
"\tstr r3, [r2]\n"
"\tcmp r9, r2\n"
"\tbls _08007DCE\n"
"\tmov r3, r12\n"
"\tstr r2, [r3, 0x3C]\n"
"_08007DCE:\n"
"\tcmp r10, r2\n"
"\tbcs _08007DD6\n"
"\tmov r4, r12\n"
"\tstr r2, [r4, 0x40]\n"
"_08007DD6:\n"
"\tldr r1, [sp, 0x10]\n"
"\tldr r2, [sp, 0x18]\n"
"\tldr r5, [sp, 0x40]\n"
"\tcmp r8, r5\n"
"\tblt _08007D78\n"
"_08007DE0:\n"
"\tldr r3, [sp, 0xC]\n"
"\tldr r4, [sp, 0x14]\n"
"\tmovs r0, 0x7\n"
"\tands r0, r3\n"
"\tcmp r0, 0\n"
"\tbne _08007E02\n"
"\tmov r1, r12\n"
"\tldr r0, [r1, 0x20]\n"
"\tlsls r0, 2\n"
"\tadds r4, r0\n"
"\tldr r2, [sp, 0x8]\n"
"\tadds r2, 0x1\n"
"\tstr r2, [sp, 0x8]\n"
"\tmovs r5, 0x8\n"
"\tldrsh r0, [r1, r5]\n"
"\tcmp r2, r0\n"
"\tbge _08007E0E\n"
"_08007E02:\n"
"\tldr r0, [sp, 0x4]\n"
"\tadds r0, 0x1\n"
"_08007E06:\n"
"\tstr r0, [sp, 0x4]\n"
"\tldr r1, [sp, 0x44]\n"
"\tcmp r0, r1\n"
"\tblt _08007D5A\n"
"_08007E0E:\n"
"\tadd sp, 0x20\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0");
}
void sub_8007E20(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6)
{
sub_8007E64(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a5, a6);
}
UNUSED static void nullsub_160(void)
{
}
static void sub_8007E64(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a2];
a3 /= 8;
a4 /= 8;
a5 /= 8;
a6 /= 8;
a8 *= 4096;
if (a4 < strPtr->unk8) {
s32 id = (strPtr->unk4 * a4) + a3;
u32 *unk18Ptr = &strPtr->unk18[id * 8];
for (i = 0; i < a6; i++) {
s32 xMaybe = a3;
u32 *loopUnk18Ptr = unk18Ptr;
for (j = 0; j < a5; j++) {
if (xMaybe < strPtr->unk4) {
if (strPtr->unk3C > loopUnk18Ptr) {
strPtr->unk3C = loopUnk18Ptr;
}
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *a7;
if (strPtr->unk40 < loopUnk18Ptr) {
strPtr->unk40 = loopUnk18Ptr;
}
a7++;
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF;
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8;
}
else {
loopUnk18Ptr += 8;
a7 += 8;
}
xMaybe++;
}
a4++;
unk18Ptr += strPtr->unk20;
unk18Ptr += 8;
if (a4 >= strPtr->unk8)
break;
}
}
}
static u32 FlipPixelsHorizontally(u32 a0)
{
u32 r0;
r0 = (a0 >> 28) & 0xF;
r0 |= (a0 >> 20) & 0xF0;
r0 |= (a0 >> 12) & 0xF00;
r0 |= (a0 >> 4) & 0xF000;
r0 |= (a0 << 4) & 0xF0000;
r0 |= (a0 << 12) & 0xF00000;
r0 |= (a0 << 20) & 0xF000000;
r0 |= (a0 << 28) & 0xF0000000;
return r0;
}
UNUSED static void sub_8007FEC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 *a5, u32 a6)
{
sub_8008030(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a5, a6);
}
UNUSED static void nullsub_161(void)
{
}
// Similar to sub_8007E64
static void sub_8008030(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 *a7, u32 a8)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a2];
a3 /= 8;
a4 /= 8;
a5 /= 8;
a6 /= 8;
a8 *= 4096;
if (a4 < strPtr->unk8) {
u32 *unk18Ptr = &strPtr->unk18[((strPtr->unk4 * a4) + (a3 + a5)) * 8];
for (i = 0; i < a6; i++) {
s32 xMaybe = a3 + a5;
u32 *loopUnk18Ptr = unk18Ptr;
for (j = 0; j < a5; j++) {
xMaybe--;
loopUnk18Ptr -= 8;
if (xMaybe < strPtr->unk4) {
if (strPtr->unk3C > loopUnk18Ptr) {
strPtr->unk3C = loopUnk18Ptr;
}
loopUnk18Ptr[0] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[1] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[2] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[3] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[4] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[5] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[6] = FlipPixelsHorizontally(*(a7++));
loopUnk18Ptr[7] = FlipPixelsHorizontally(*(a7++));
if (strPtr->unk40 < loopUnk18Ptr + 8) {
strPtr->unk40 = loopUnk18Ptr + 8;
}
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF;
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8;
}
else {
a7 += 8;
}
}
a4++;
unk18Ptr += strPtr->unk20;
unk18Ptr += 8;
if (a4 >= strPtr->unk8)
break;
}
}
}
// Similar to sub_8007E64
UNUSED static void sub_80081A4(s32 a0, s32 a3, s32 a4, s32 a7Id)
{
s32 i, j, a5, a6;
UnkTextStruct1 *strPtr = &gUnknown_2027370[a0];
const u32 *a7 = gUnknown_80B86B4[a7Id];
a3 /= 8;
a4 /= 8;
a5 = 2;
a6 = 2;
if (a4 < strPtr->unk8) {
s32 id = (strPtr->unk4 * a4) + a3;
u32 *unk18Ptr = &strPtr->unk28[id * 8];
for (i = 0; i < a6; i++) {
s32 xMaybe = a3;
u32 *loopUnk18Ptr = unk18Ptr;
for (j = 0; j < a5; j++) {
if (xMaybe < strPtr->unk4) {
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *(a7++);
*(loopUnk18Ptr++) = *a7;
a7++;
}
else {
loopUnk18Ptr += 8;
a7 += 8;
}
xMaybe++;
}
a4++;
unk18Ptr += strPtr->unk20;
unk18Ptr += 8;
if (a4 >= strPtr->unk8)
break;
}
}
}
void DisplayMonPortraitSprite(s32 a0, const u8 *compressedData, s32 a2)
{
DisplayMonPortrait(gUnknown_2027370, gUnknown_202B038[0], a0, compressedData, a2);
}
UNUSED static void nullsub_162(void)
{
}
static void DisplayMonPortrait(UnkTextStruct1 *a0, u16 a1[32][32], s32 a2, const u8 *compressedData, u32 a4)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a2];
a4 *= 4096;
DecompressAT((u8 *)strPtr->unk18, (strPtr->unk4 * 32) * strPtr->unk8, compressedData);
for (i = 0; i < strPtr->unk8; i++) {
for (j = 0; j < strPtr->unk4; j++) {
a1[strPtr->unk2 + i][strPtr->unk0 + j] &= 0xFFF;
a1[strPtr->unk2 + i][strPtr->unk0 + j] |= a4;
}
}
strPtr->unk30 = strPtr->unk28;
strPtr->unk34 = strPtr->unk1C;
strPtr->unk38 = strPtr->unk2C;
strPtr->unk44 = 1;
}
static void sub_8008334(u32 *r7, u32 *r12)
{
s32 i;
u32 r2, r3;
u32 r4, r1;
r4 = *r7;
r1 = *r12;
r3 = 0;
r2 = 0;
for (i = 0; i < 32; i += 4) {
r2 <<= 4;
r3 <<= 4;
r2 |= r4 & 0xF;
r3 |= r1 & 0xF;
r4 >>= 4;
r1 >>= 4;
}
*r7 = r3;
*r12 = r2;
}
void DisplayMonPortraitSpriteFlipped(s32 a0, const u8 *compressedData, s32 a1)
{
DisplayMonPortraitFlipped(gUnknown_2027370, a0, compressedData, a1);
}
UNUSED static void nullsub_163(void)
{
}
static void DisplayMonPortraitFlipped(UnkTextStruct1 *a0, s32 a1, const u8 *compressedData, s32 a3)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a1];
DisplayMonPortraitSprite(a1, compressedData, a3);
for (i = 0; i < strPtr->unk8; i++) {
s32 r8 = strPtr->unk4 / 2;
if (strPtr->unk4 & 1)
r8++;
for (j = 0; j < r8; j++) {
u32 *r4, *r5;
s32 unk4Mul = strPtr->unk4 * i;
r4 = &strPtr->unk18[(unk4Mul + j) * 8];
unk4Mul--;
r5 = &strPtr->unk18[(unk4Mul + (strPtr->unk4 - j)) * 8];
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
sub_8008334(r4++, r5++);
}
}
}
UNUSED static void sub_8008468(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, u32 a6)
{
sub_80084A4(gUnknown_2027370, gUnknown_202B038[0], a0, a1, a2, a3, a4, a6);
}
UNUSED static void nullsub_164(void)
{
}
// Effectively unused
static void sub_80084A4(UnkTextStruct1 *a0, u16 a1[32][32], u32 a2, s32 a3, s32 a4, s32 a5, s32 a6, u32 a8)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a2];
a3 /= 8;
a4 /= 8;
a5 /= 8;
a6 /= 8;
a8 *= 4096;
if (a4 < strPtr->unk8) {
for (i = 0; i < a6; i++) {
s32 xMaybe = a3;
for (j = 0; j < a5; j++) {
if (xMaybe < strPtr->unk4) {
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] &= 0xFFF;
a1[strPtr->unk2 + a4][strPtr->unk0 + xMaybe] |= a8;
}
xMaybe++;
}
a4++;
if (a4 >= strPtr->unk8)
break;
}
}
}
// Oddly similar to sub_803DEC8
const struct unkChar *GetCharacter(s32 chr)
{
s32 r2, r4;
const struct unkChar *ret;
const struct unkChar *strPtr = sCharmaps[sCurrentCharmap]->unk4;
// TODO: create labels for these
if (chr > 63487 && chr < 65535)
{
s32 r2 = chr & 0xFF;
s32 r1 = (chr & 0xFF00) >> 8;
r2 -= 32;
r1 -= 248;
ret = &strPtr[r1 * 224 + r2];
}
else
{
r4 = 0;
r2 = sCharmaps[sCurrentCharmap]->unk0 - 1;
while (r4 < r2) {
s32 r1 = (r4 + r2) / 2;
if (strPtr[r1].unk4 == chr) {
r4 = r1;
break;
}
else if (strPtr[r1].unk4 < chr) {
r4 = r1 + 1;
}
else {
r2 = r1;
}
}
ret = &strPtr[r4];
if (ret->unk4 != chr)
ret = &gUnknown_80B86A4;
}
return ret;
}
static s32 HexDigitValue(u8 chr)
{
if (chr >= '0' && chr <= '9')
return chr - '0';
else if (chr >= 'a' && chr <= 'f')
return (chr - 'a') + 10;
else
return 1;
}
const u8 *xxx_get_next_char_from_string(const u8 *a1, u32 *a0)
{
s32 currChr = *a1;
if (currChr == 0x7E) {
s32 hexDigit;
a1++;
hexDigit = (HexDigitValue(a1[0]) << 4) + HexDigitValue(a1[1]);
if (*a1 != '\0') {
a1++;
if (*a1 != '\0') {
a1++;
}
}
*a0 = hexDigit;
return a1;
}
else if ((currChr >= 0x81 && currChr <= 0x84) || currChr == 0x87) {
*a0 = a1[1] | (a1[0] << 8);
return a1 + 2;
}
else {
*a0 = currChr;
return a1 + 1;
}
}
UNUSED static void nullsub_165(void)
{
}
UNUSED static void nullsub_166(void)
{
}
UNUSED static void nullsub_167(void)
{
}
UNUSED static void nullsub_168(void)
{
}
static const u32 gUnknown_80B8868[] =
{
0, 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF,
0xFFFFFFFF, 0xFFFFFFF0, 0xFFFFFF00, 0xFFFFF000, 0xFFFF0000,
0xFFF00000, 0xFF000000, 0xF0000000
};
UNUSED static void sub_80086C8(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5)
{
u32 *r5;
s32 r2, r0, r1;
UnkTextStruct1 *strPtr = &a0[a1];
if (a2 < 0) {
a4 += a2;
a2 = 0;
}
if (a3 < 0) {
a5 += a3;
a3 = 0;
}
if (a4 + a2 > strPtr->unk4 * 8) {
a4 = (strPtr->unk4 * 8) - a2;
}
if (a3 + a5 > strPtr->unk8 * 8) {
a5 = (strPtr->unk8 * 8) - a3;
}
r2 = strPtr->unk4 * (a3 / 8);
r0 = 8 * (r2 + (a2 / 8));
r1 = a3 - ((a3 / 8) * 8);
r5 = &strPtr->unk18[r0 + r1];
while (a5 > 0) {
u32 *loopPtr;
s32 r4, r6;
loopPtr = r5;
r4 = a4;
r6 = a2;
if (strPtr->unk3C > r5) {
strPtr->unk3C = r5;
}
while (r4 > 0) {
s32 r3;
if (r4 < 8) {
r3 = r4;
*loopPtr &= gUnknown_80B8868[(r4 & 7) + 8];
}
else if ((r6 & 7) != 0) {
r3 = 8 - (r6 & 7);
*loopPtr &= gUnknown_80B8868[r6 & 7];
}
else {
r3 = 8;
*loopPtr = r6 & 7;
}
loopPtr += 8;
r4 -= r3;
r6 += r3;
}
a5--;
a3++;
if (strPtr->unk40 < r5) {
strPtr->unk40 = r5;
}
r5++;
if (!(a3 & 7)) {
r5 = &r5[strPtr->unk20];
}
}
}
void sub_80087EC(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4)
{
sub_8008818(gUnknown_2027370, a0, a1, a2, a3, a4);
}
UNUSED static void nullsub_176(void)
{
}
static void sub_8008818(UnkTextStruct1 *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5)
{
s32 i, j;
UnkTextStruct1 *strPtr = &a0[a1];
s32 a2Div = a2 / 8;
s32 a3Div = a3 / 8;
for (i = 0; i < a5; i += 8) {
u32 *ptr = &strPtr->unk18[((strPtr->unk4 * a3Div) + a2Div) * 8];
for (j = 0; j < a4; j += 8) {
if (strPtr->unk3C > ptr) {
strPtr->unk3C = ptr;
}
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*ptr = 0;
if (strPtr->unk40 < ptr) {
strPtr->unk40 = ptr;
}
ptr++;
}
a3Div++;
}
}
bool8 xxx_call_update_bg_vram(void)
{
bool8 ret = FALSE;
if (gUnknown_20274A5 != 0) {
gUnknown_20274A5 = FALSE;
sub_80099C0();
}
ret = xxx_update_bg_vram(gUnknown_2027370);
return ret;
}
static bool8 xxx_update_bg_vram(UnkTextStruct1 *a0)
{
s32 i, j;
u32 r5;
bool8 ret = FALSE;
for (i = 0; i < 4; i++) {
UnkTextStruct1 *strPtr = &a0[i];
if (strPtr->unk4 == 0)
continue;
r5 = strPtr->unk38;
if (r5 == 0)
continue;
if (strPtr->unk45) {
u32 *r2, *r1;
CpuCopy(strPtr->unk28, strPtr->unk18, 0xD00);
// The reason for void casts is because we want to add 0xD00/r5 directly to pointers. Because pointers are u32, without the casts, it would multiply the value by 4.
r2 = (void *)(strPtr->unk18) + 0xD00;
r1 = (void *)(strPtr->unk28) + 0xD00;
for (j = 0; j < strPtr->unk4; j++) {
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = *(r2++);
*(r1++) = 0xDDDDDDDD;
*(r1++) = 0xEEEEEEEE;
*(r1++) = 0xFFFFFFFF;
r2 += 3;
}
strPtr->unk38 = 0;
}
else {
CpuCopy(strPtr->unk30, strPtr->unk34, r5);
strPtr->unk34 += (r5 / 4);
strPtr->unk30 = (void *)(strPtr->unk30) + r5;
strPtr->unk38 -= r5;
}
if (strPtr->unk38 == 0) {
strPtr->unk44 = 0;
}
ret = TRUE;
}
return ret;
}
static void sub_800898C(void)
{
s32 i;
for (i = 0; i < 161; i++) {
gUnknown_3000E94[i] = 0xF0F0;
}
}
static void sub_80089AC(const UnkTextStruct2 *r4, DungeonPos *r5_Str)
{
u8 *r6;
if (r4->unk0 & 0x40)
return;
r6 = (void*) &gUnknown_3000E94;
if (r4->unk4 == 1) {
s32 r12 = (r4->pos.x + r5_Str->x) * 8;
s32 r5 = (r4->pos.y + r5_Str->y) * 8;
s32 r7 = (r4->pos.x + r5_Str->x + r4->unkC) * 8;
s32 r2 = (r4->pos.y + r5_Str->y + r4->unkE) * 8;
if (r4->unkE != 0) {
if (r5 < 0)
r5 = 0;
if (r2 < 0)
r2 = 0;
if (r5 > 160)
r5 = 160;
if (r2 > 160)
r2 = 160;
while (r5 < r2) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r7;
r6[id] = r12;
}
else {
if (r6[id] < r7) {
r6[id] = r7;
}
id++;
if (r6[id] > r12) {
r6[id] = r12;
}
}
r5++;
}
}
}
else if (r4->unk4 == 6) {
s32 i;
s32 r9 = ((r4->pos.x + r5_Str->x) * 8) - 5;
s32 r5 = ((r4->pos.y + r5_Str->y) * 8) - 4;
s32 var_24 = ((r4->pos.x + r5_Str->x + r4->unkC) * 8) + 5;
s32 r8 = ((r4->pos.y + r5_Str->y + r4->unkE) * 8) + 5;
s32 r12 = ((r4->pos.x + r5_Str->x) * 8) + 3;
const UnkTextStruct2_sub2 *r2 = r4->unk14;
s32 tmp = r2->f2 - 1;
s32 r10 = (((tmp + r2->f0 + 2) * 8) + r12) - 4;
s32 r4 = r9 + ((r2->f1 + 1) * 8);
s32 r7 = (r4 + ((r2->f2 + 2) * 8)) - 4;
if (r5 < 0)
r5 = 0;
if (r8 < 0)
r8 = 0;
if (r5 > 160)
r5 = 160;
if (r8 > 160)
r8 = 160;
for (i = 0; i < 4; i++) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r7;
r6[id] = r4;
}
else {
if (r6[id] < r7) {
r6[id] = r7;
}
id++;
if (r6[id] > r4) {
r6[id] = r4;
}
}
r5++;
}
for (i = 0; i < 8; i++) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r10;
r6[id] = r12;
}
else {
if (r6[id] < r10) {
r6[id] = r10;
}
id++;
if (r6[id] > r12) {
r6[id] = r12;
}
}
r5++;
}
while (r5 < r8) {
s32 id = r5 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = var_24;
r6[id] = r9;
}
else {
if (r6[id] < var_24) {
r6[id] = var_24;
}
id++;
if (r6[id] > r9) {
r6[id] = r9;
}
}
r5++;
}
}
else {
s32 r8 = ((r4->pos.x + r5_Str->x) * 8) - 5;
s32 r3 = ((r4->pos.y + r5_Str->y) * 8) - 5;
s32 r12 = ((r4->pos.x + r5_Str->x + r4->unkC) * 8) + 5;
s32 r5 = ((r4->pos.y + r5_Str->y + r4->unkE) * 8) + 5;
if (r4->unkE != 0) {
if (r4->unk4 == 0) {
r3 += 8;
r5 = ((r4->pos.y + r5_Str->y + r4->unkE) * 8) - 3;
}
if (r3 < 0)
r3 = 0;
if (r5 < 0)
r5 = 0;
if (r3 > 160)
r3 = 160;
if (r5 > 160)
r5 = 160;
while (r3 < r5) {
s32 id = r3 * 2;
if (r6[id] == 240 && r6[id + 1] == 240) {
r6[id++] = r12;
r6[id] = r8;
}
else {
if (r6[id] < r12) {
r6[id] = r12;
}
id++;
if (r6[id] > r8) {
r6[id] = r8;
}
}
r3++;
}
}
}
}
void CallPrepareTextbox_8008C54(u32 strId)
{
PrepareTextbox_8008C6C(gUnknown_2027370, strId);
}
UNUSED static void nullsub_169(void)
{
}
static void PrepareTextbox_8008C6C(UnkTextStruct1 *strArr, u32 strId)
{
s32 i;
UnkTextStruct1 *strPtr = &strArr[strId];
if (!strPtr->unk45) {
s32 count = (strPtr->unk4 * strPtr->unk8) * 32;
for (i = 0; i < count; i += 32) {
CpuClear(&strPtr->unk18[i / 4u], 32);
}
}
else {
s32 count = (strPtr->unk4 * (strPtr->unk8 - 1)) * 32;
u32 *ptr = strPtr->unk18;
for (i = 0; i < strPtr->unk4; i++) {
*(ptr++) = 0xFFFFFFFF;
*(ptr++) = 0xEEEEEEEE;
*(ptr++) = 0xDDDDDDDD;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
*(ptr++) = 0;
}
for (i = 0; i < count; i += 32) {
CpuClear(ptr, 32);
ptr += 8;
}
}
if (strPtr->unkC == 6) {
strPtr->unk46 = 1;
sub_8007958(strArr, strId, 0, 10, strPtr->unk4 * 8, 0xE);
sub_8007958(strArr, strId, 0, 11, strPtr->unk4 * 8, 0xD);
strPtr->unk46 = 0;
}
strPtr->unk30 = strPtr->unk28;
strPtr->unk34 = strPtr->unk1C;
strPtr->unk38 = strPtr->unk2C;
strPtr->unk44 = 1;
}
bool8 sub_8008D8C(u32 strId)
{
UnkTextStruct1 *strPtr = &gUnknown_2027370[strId];
return (strPtr->unk38 != 0);
}
UNUSED static bool8 sub_8008DA8(void)
{
return FALSE;
}
UNUSED static void sub_8008DAC(s32 a0, s32 a1, s32 a2)
{
gUnknown_202B038[0][a1][a0] = a2;
gUnknown_20274A5 = TRUE;
}
void sub_8008DC8(s32 a0, s32 a1, u16 a2, s32 a3)
{
gUnknown_202B038[0][a1][a0] = a2;
gUnknown_202B038[1][a1][a0] = a3;
gUnknown_20274A5 = TRUE;
}
UNUSED static void sub_8008DF4(s32 a0, s32 a1, u8 *a2)
{
u8 r1;
while (1) {
if (*a2 == 0)
break;
r1 = *a2;
if (r1 >= 97 && r1 <= 122) {
r1 -= 32;
}
gUnknown_202B038[0][a1][a0] = 0xF000 | (r1 + 0x258);
a2++;
a0++;
}
gUnknown_20274A5 = TRUE;
}
UNUSED static void sub_8008E58(s32 a0, s32 a1, u8 *a2, s32 a3)
{
u8 r1;
while (1) {
if (*a2 == 0)
break;
r1 = *a2;
if (a3 == 0)
break;
if (r1 >= 97 && r1 <= 122) {
r1 -= 32;
}
gUnknown_202B038[0][a1][a0] = 0xF000 | (r1 + 0x258);
a2++;
a0++;
a3--;
}
gUnknown_20274A5 = TRUE;
}
s32 sub_8008ED0(const u8 *str)
{
s32 ret = 0;
while (1) {
const u8 *strPtr;
u32 chr;
strPtr = xxx_get_next_char_from_string(str, &chr);
str = strPtr;
if (chr == 0)
break;
if (chr == '\r' || chr == '\n')
break;
if (chr == 0x82A0 || chr == 0x82A2)
continue;
if (chr == '\e')
break;
if (chr == '#') {
if (*strPtr == 'n' || *strPtr == '[' || *strPtr == 'P')
break;
switch (*strPtr) {
case '=':
case '~':
str = strPtr + 2;
break;
case 'C':
case 'c':
str += 2;
break;
case 'R':
case 'r':
str++;
break;
case '+':
case 'W':
str = strPtr + 1;
break;
}
}
else if (chr == '`') {
ret += 6;
}
else {
const struct unkChar *ptr = GetCharacter(chr);
if (ptr != NULL) {
ret += ptr->unk6 + sCharacterSpacing;
}
}
}
return ret;
}
void PrintStringOnWindow2(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 lineSpacing)
{
xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, lineSpacing);
}
void PrintStringOnWindow(s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr)
{
xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, 13);
}
UNUSED static void nullsub_170(void)
{
}
// Identical to PrintStringOnWindow
UNUSED static void UnusedPrintStringOnWindow(s32 x, u32 y, const u8 *str, u32 windowId, u32 terminatingChr)
{
xxx_draw_string(gUnknown_2027370, x, y, str, windowId, terminatingChr, 0, 13);
}
UNUSED static void nullsub_171(void)
{
}
static void xxx_draw_string(UnkTextStruct1 *strArr, s32 x, s32 y, const u8 *str, u32 windowId, u32 terminatingChr, s32 characterSpacing, s32 lineSpacing)
{
struct UnkDrawStringStruct sp;
u32 currChr;
sp.unk0 = x;
sp.unk2 = y;
sp.unkC = x;
sp.unk10 = 7;
while (1) {
str = HandleTextFormat(strArr, str, &sp);
str = xxx_get_next_char_from_string(str, &currChr);
if (currChr == '\0' || currChr == terminatingChr)
break;
if (currChr == 0x82A0) {
sCurrentCharmap = 0;
}
else if (currChr == 0x82A2) {
sCurrentCharmap = 1;
}
else if (currChr == '\e') {
break;
}
else if (currChr == '\r' || currChr == '\n') {
sp.unk0 = sp.unkC;
sp.unk2 += lineSpacing;
}
else if (currChr == '\x1D') { // ASCII group separator.
sp.unk0 = sp.unkC;
sp.unk2 += 5;
}
else if (currChr == '`') {
sp.unk0 += 6;
}
else if (characterSpacing == 0) {
sp.unk0 += xxx_draw_char(strArr, sp.unk0, sp.unk2, currChr, sp.unk10, windowId);
}
else {
const struct unkChar *chrPtr = GetCharacter(currChr);
if (chrPtr != NULL) {
s32 x = sp.unk0;
s32 x2 = sCharacterSpacing + 10;
x +=((x2 - chrPtr->unk6) / 2);
xxx_draw_char(strArr, x, sp.unk2, currChr, sp.unk10, windowId);
sp.unk0 += characterSpacing;
}
}
}
}
static const u8 *sub_800915C(s16 *a0, const u8 *str)
{
s32 a = 0;
while (1)
{
if (*str == '.') {
str++;
break;
}
else if (*str >= '0' && *str <= '9') {
a *= 10;
a += (*str - '0');
str++;
}
else {
break;
}
}
*a0 = a;
return str;
}
const u8 *xxx_handle_format_global(const u8 *str, struct UnkDrawStringStruct *unkStrPtr)
{
return HandleTextFormat(gUnknown_2027370, str, unkStrPtr);
}
UNUSED static s32 sub_80091A8(s32 a0)
{
return a0 + 1;
}
static const u8 *HandleTextFormat(UnkTextStruct1 *strArr, const u8 *str, struct UnkDrawStringStruct *sp)
{
while (1) {
if (str[0] == '#') {
if (str[1] == '[') {
const u8 *strBefore = str;
str += 2;
sp->unk21 = 0;
while (*str != '\0') {
if (*str == ']') {
str++;
break;
}
str++;
}
if (sp->unk24 != NULL) {
const u8 *strNew = sp->unk24(strBefore, str, sp);
if (strNew != NULL)
str = strNew;
}
if (sp->unk21 != 0)
break;
}
else if (str[1] == '=') {
sp->unk0 = str[2];
str += 3;
if (*str == '.')
str++;
}
else if (str[1] == 'y') {
sp->unk2 = str[2];
str += 3;
if (*str == '.')
str++;
}
else if (str[1] == '>') {
str = sub_800915C(&sp->unk0, str + 2);
}
else if (str[1] == '.') {
sp->unk0 += str[2];
str += 3;
}
else if (str[1] == 'n') {
sp->unk0 = sp->unkC;
sp->unk2 += 11;
str += 2;
}
else if (str[1] == ':') {
sp->unk4 = sp->unk0;
str += 2;
}
else if (str[1] == ';') {
sp->unk0 = sp->unk4 + str[2];
str += 3;
}
else if (str[1] == '+') {
str += 2;
sp->unk0 = (strArr[0].unk4 * 8) - sub_8008ED0(str);
sp->unk0 /= 2;
}
else if (str[1] == 'C') {
sp->unk14 = sp->unk10;
sp->unk10 = InterpretColorChar(str[2]);
str += 3;
}
else if (str[1] == '_') {
sp->unk14 = sp->unk10;
sp->unk10 = gUnknown_202749A[str[2]];
str += 3;
if (*str == '.')
str++;
}
else if (str[1] == 'R') {
sp->unk10 = sp->unk14;
str += 2;
}
else if (str[1] == 'c') {
sp->unk18 = sp->unk10;
sp->unk10 = InterpretColorChar(str[2]);
str += 3;
}
else if (str[1] == 'r') {
sp->unk10 = sp->unk18;
str += 2;
}
else if (str[1] == 'S') {
sUnknown_20274A6[str[2] & 0x7F] = str[3] & 0x7F;
str += 4;
}
else if (str[1] == 'W') {
str += 2;
sp->unk8 = ((strArr[0].unk0 * 8) + sp->unk0) - 2;
sp->unkA = ((strArr[0].unk2 * 8) + sp->unk2) + 3;
sp->unk20 = 1;
break;
}
else if (str[1] == 'P') {
str += 2;
sp->unk2 = 9999;
sp->unk1C = 0;
sp->unk20 = 1;
break;
}
else if (str[1] == 'p') {
str += 2;
sp->unk2 = 9999;
sp->unk1C = 1;
sp->unk20 = 1;
break;
}
else if (str[1] == '~') {
sp->unk2C = str[2];
sp->unk21 = 1;
str += 3;
}
else {
return str;
}
}
else {
break;
}
}
return str;
}
static void sub_8009388(void)
{
s32 i, j;
gUnknown_202B038[0][0][0] = 0xF279;
gUnknown_202B038[1][0][0] = 0xF27A;
for (i = sUnknown_202B020; i < sUnknown_202B024; i++) {
gUnknown_202B038[0][i][0] = 0xF279;
gUnknown_202B038[1][i][0] = 0xF27A;
for (j = 1; j < 32; j++) {
gUnknown_202B038[0][i][j] = 0;
gUnknown_202B038[1][i][j] = 0xF27A;
}
}
}
void sub_8009408(s32 from, s32 to)
{
s32 i, j;
gUnknown_202B038[0][0][0] = 0xF279;
gUnknown_202B038[1][0][0] = 0xF27A;
for (i = from; i < to; i++) {
gUnknown_202B038[0][i][0] = 0xF279;
gUnknown_202B038[1][i][0] = 0xF27A;
for (j = 1; j < 32; j++) {
gUnknown_202B038[0][i][j] = 0;
gUnknown_202B038[1][i][j] = 0xF27A;
}
}
gUnknown_20274A5 = TRUE;
}
UNUSED static void sub_8009488(s32 strArrId)
{
s32 i, j;
s32 id0, id1;
UnkTextStruct1 *strPtr = &gUnknown_2027370[strArrId];
id0 = strPtr->unk2;
for (i = 0; i < strPtr->unk6; i++) {
id1 = strPtr->unk0;
for (j = 0; j < strPtr->unk4; j++) {
gUnknown_202B038[0][id0][id1] &= 0xFC00;
gUnknown_202B038[1][id0][id1] = 0xF27A;
id1++;
}
id0++;
}
}
UNUSED static void nullsub_172(void)
{
}
void sub_8009524(s32 strArrId)
{
s32 i, j;
UnkTextStruct1 *strPtr = &gUnknown_2027370[strArrId];
s32 id0 = strPtr->unk2 - 1;
for (i = 0; i < strPtr->unk6 + 2; i++) {
s32 id1 = strPtr->unk0 - 1;
for (j = 0; j < strPtr->unk4 + 2; j++) {
gUnknown_202B038[0][id0][id1] &= 0xFC00;
gUnknown_202B038[1][id0][id1] = 0xF27A;
id1++;
}
id0++;
}
}
UNUSED static void nullsub_173(void)
{
}
void sub_80095CC(s32 a0, s32 a1)
{
sUnknown_202B020 = a0;
sUnknown_202B024 = a1;
}
UNUSED static void nullsub_174(void)
{
}
s32 sub_80095E4(s32 a0, s32 a1)
{
s32 r1;
if (a1 == 0)
a1 = 10;
r1 = a0 * a1;
if ((r1 % 8) != 0)
return (r1 / 8) + 1;
else
return r1 / 8;
}
// Same as sub_80095E4 except it doesn't check for a1 == 0
s32 sub_8009614(s32 a0, s32 a1)
{
s32 r1;
r1 = a0 * a1;
if ((r1 % 8) != 0)
return (r1 / 8) + 1;
else
return r1 / 8;
}
static s32 InterpretColorChar(u8 a0)
{
if (a0 < 16)
return a0;
if (a0 >= '0' && a0 <= '?')
return a0 - '0';
switch (a0) {
case 'H':
case 'I':
return 4;
case 'E':
case 'S':
case 'T':
return 15;
case 'G':
case 'M':
return 5;
case 'C':
case 'D':
case 'N':
return 6;
case 'W':
return 2;
}
return 7;
}
struct FontData {
u32 size;
u8 dataArray[136 * 32];
};
struct FontSpData {
u32 size;
u8 dataArray[16 * 32];
};
void InitGraphics(void)
{
u32 count;
OpenedFile *file;
u32 *dest;
struct FontData *font;
struct FontSpData *fontSp;
#ifdef NONMATCHING
RGB *data;
u32 size;
const struct FileArchive *arc;
#else
register RGB *data asm("r4");
register u32 size asm("r5");
register const struct FileArchive *arc asm("r4");
#endif
gUnknown_203B090 = 1;
dest = (u32 *)VRAM;
for(count = 0; count < 0x6000; count++)
{
*dest++ = 0;
}
dest = (u32 *)PLTT;
for(count = 0; count < 0x100; count++)
{
*dest++ = 0;
}
dest = (u32 *)OAM;
for(count = 0; count < 0x100; count++)
{
*dest++ = 0x00a000a0;
}
arc = &gSystemFileArchive;
file = OpenFileAndGetFileDataPtr(gUnknown_80B88B0, arc);
font = (struct FontData *)(file->data);
size = font->size;
CpuCopy((u32 *)0x06004f00, font->dataArray, size * 32);
CloseFile(file);
file = OpenFileAndGetFileDataPtr(gUnknown_80B88B8, arc);
fontSp = (struct FontSpData *)(file->data);
size = fontSp->size;
CpuCopy((u32 *)0x06017e00, fontSp->dataArray, size * 32);
CloseFile(file);
InitFontPalette();
file = OpenFileAndGetFileDataPtr(gUnknown_80B88C0, arc);
data = (RGB *)file->data;
for(count = 0; (s32)count < 0x10; data++, count++)
{
SetBGPaletteBufferColorArray(0x1F0 + count, data);
}
CloseFile(file);
TransferBGPaletteBuffer();
}
// These functions run from IWRAM for improved performance.
IWRAM_INIT void sub_8272760(s32 id)
{
sub_8272774(gUnknown_2027370, id);
}
IWRAM_INIT static void sub_8272774(UnkTextStruct1 *txtStructs, s32 id)
{
UnkTextStruct1 *txtStructPtr = &txtStructs[id];
if (txtStructPtr->unk8 > 0) {
s32 i, j;
u32 *dstPtr;
s32 n;
s32 id8, id9;
if (txtStructPtr->unkC == 6) {
s32 unk4 = txtStructPtr->unk4;
s32 dstAdd = ((txtStructPtr->unk24 + 2) * 8);
dstAdd *= unk4;
dstPtr = txtStructPtr->unk18 + dstAdd;
n = txtStructPtr->unk8 - 2;
}
else {
dstPtr = txtStructPtr->unk18;
n = txtStructPtr->unk8;
}
id8 = txtStructPtr->unk20 + 8;
id9 = txtStructPtr->unk20 + 9;
for (i = 0; i < txtStructPtr->unk4; i++) {
s32 to = n - 1;
u32 *loopPtr = dstPtr;
for (j = 0; j < to; j++) {
loopPtr[0] = loopPtr[2];
loopPtr[1] = loopPtr[3];
loopPtr[2] = loopPtr[4];
loopPtr[3] = loopPtr[5];
loopPtr[4] = loopPtr[6];
loopPtr[5] = loopPtr[7];
loopPtr[6] = loopPtr[id8];
loopPtr[7] = loopPtr[id9];
loopPtr += id8;
}
loopPtr[0] = loopPtr[2];
loopPtr[1] = loopPtr[3];
loopPtr[2] = loopPtr[4];
loopPtr[3] = loopPtr[5];
loopPtr[4] = loopPtr[6];
loopPtr[5] = loopPtr[7];
loopPtr[6] = 0;
loopPtr[7] = 0;
dstPtr += 8;
}
txtStructPtr->unk30 = txtStructPtr->unk28;
txtStructPtr->unk34 = txtStructPtr->unk1C;
txtStructPtr->unk38 = txtStructPtr->unk2C;
txtStructPtr->unk44 = 1;
}
}
IWRAM_INIT void sub_8272870(s32 id)
{
sub_8272884(gUnknown_2027370, id);
}
IWRAM_INIT static void sub_8272884(UnkTextStruct1 *txtStructs, s32 id)
{
UnkTextStruct1 *txtStructPtr = &txtStructs[id];
if (txtStructPtr->unk8 > 0) {
s32 i, j;
u32 *dstPtr;
s32 n;
s32 id8;
s32 unk4, unk8, dstAdd;
if (txtStructPtr->unkC == 6) {
n = txtStructPtr->unk8 - 2;
}
else {
n = txtStructPtr->unk8;
}
unk8 = txtStructPtr->unk8 - 1;
unk4 =txtStructPtr->unk4;
dstAdd = (unk8 * unk4) * 8;
dstPtr = txtStructPtr->unk18 + dstAdd;
id8 = txtStructPtr->unk20 + 8;
for (i = 0; i < txtStructPtr->unk4; i++) {
u32 lastTwo = 0;
s32 to = n - 1;
u32 *loopPtr = dstPtr;
if (n < 2) {
loopPtr[7] = loopPtr[5];
loopPtr[6] = loopPtr[4];
loopPtr[5] = loopPtr[3];
loopPtr[4] = loopPtr[2];
loopPtr[3] = loopPtr[1];
loopPtr[2] = loopPtr[0];
loopPtr[1] = lastTwo;
loopPtr[0] = lastTwo;
}
else {
u32 *ptr8 = dstPtr - id8;
for (j = 0; j < to; j++) {
loopPtr[7] = loopPtr[5];
loopPtr[6] = loopPtr[4];
loopPtr[5] = loopPtr[3];
loopPtr[4] = loopPtr[2];
loopPtr[3] = loopPtr[1];
loopPtr[2] = loopPtr[0];
loopPtr[1] = ptr8[7];
loopPtr[0] = ptr8[6];
loopPtr -= id8;
ptr8 -= id8;
}
loopPtr[7] = loopPtr[5];
loopPtr[6] = loopPtr[4];
loopPtr[5] = loopPtr[3];
loopPtr[4] = loopPtr[2];
loopPtr[3] = loopPtr[1];
loopPtr[2] = loopPtr[0];
loopPtr[1] = 0;
loopPtr[0] = 0;
}
dstPtr += 8;
}
txtStructPtr->unk30 = txtStructPtr->unk28;
txtStructPtr->unk34 = txtStructPtr->unk1C;
txtStructPtr->unk38 = txtStructPtr->unk2C;
txtStructPtr->unk44 = 1;
}
}
IWRAM_INIT void sub_82729A4(s32 id)
{
sub_82729B8(gUnknown_2027370, id);
}
IWRAM_INIT static void sub_82729B8(UnkTextStruct1 *txtStructs, s32 id)
{
s32 i, j;
UnkTextStruct1 *txtStructPtr = &txtStructs[id];
u32 *dstPtr = txtStructPtr->unk18;
s32 id8 = txtStructPtr->unk20 + 8;
s32 id9 = txtStructPtr->unk20 + 9;
for (i = 0; i < txtStructPtr->unk4; i++) {
u32 *loopPtr;
dstPtr[3] = dstPtr[5];
dstPtr[4] = dstPtr[6];
dstPtr[5] = dstPtr[7];
dstPtr[6] = dstPtr[id8];
dstPtr[7] = dstPtr[id9];
loopPtr = dstPtr + id8;
for (j = 0; j < 5; j++) {
loopPtr[0] = loopPtr[2];
loopPtr[1] = loopPtr[3];
loopPtr[2] = loopPtr[4];
loopPtr[3] = loopPtr[5];
loopPtr[4] = loopPtr[6];
loopPtr[5] = loopPtr[7];
loopPtr[6] = loopPtr[id8];
loopPtr[7] = loopPtr[id9];
loopPtr += id8;
}
loopPtr[0] = loopPtr[2];
loopPtr[1] = loopPtr[3];
loopPtr[2] = loopPtr[4];
loopPtr[3] = loopPtr[5];
loopPtr[4] = 0;
loopPtr[5] = 0;
loopPtr[6] = 0;
loopPtr[7] = 0;
dstPtr += 8;
}
txtStructPtr->unk30 = txtStructPtr->unk28;
txtStructPtr->unk34 = txtStructPtr->unk1C;
txtStructPtr->unk38 = txtStructPtr->unk2C;
txtStructPtr->unk44 = 1;
}
IWRAM_INIT void sub_8272A78(s32 id)
{
sub_8272A8C(gUnknown_2027370, id);
}
IWRAM_INIT static void sub_8272A8C(UnkTextStruct1 *txtStructs, s32 id)
{
s32 i, j;
UnkTextStruct1 *txtStructPtr = &txtStructs[id];
u32 *dstPtr = txtStructPtr->unk18;
s32 id8 = txtStructPtr->unk20 + 8;
for (i = 0; i < txtStructPtr->unk4; i++) {
u32 *loopPtr;
dstPtr[3] = 0;
dstPtr[4] = dstPtr[5];
dstPtr[5] = dstPtr[6];
dstPtr[6] = dstPtr[7];
dstPtr[7] = dstPtr[id8];
loopPtr = dstPtr + id8;
for (j = 0; j < 5; j++) {
loopPtr[0] = loopPtr[1];
loopPtr[1] = loopPtr[2];
loopPtr[2] = loopPtr[3];
loopPtr[3] = loopPtr[4];
loopPtr[4] = loopPtr[5];
loopPtr[5] = loopPtr[6];
loopPtr[6] = loopPtr[7];
loopPtr[7] = loopPtr[id8];
loopPtr += id8;
}
loopPtr[0] = loopPtr[1];
loopPtr[1] = loopPtr[2];
loopPtr[2] = loopPtr[3];
loopPtr[3] = loopPtr[4];
loopPtr[4] = loopPtr[5];
loopPtr[5] = loopPtr[6];
loopPtr[6] = loopPtr[7];
loopPtr[7] = 0;
dstPtr += 8;
}
txtStructPtr->unk30 = txtStructPtr->unk28;
txtStructPtr->unk34 = txtStructPtr->unk1C;
txtStructPtr->unk38 = txtStructPtr->unk2C;
txtStructPtr->unk44 = 1;
}
// Needed to match, because without it the alignment is different.
IWRAM_INIT static UNUSED u8 sMatchAlignment = 0;