summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-02-06 21:48:15 -0800
committerGitHub <noreply@github.com>2018-02-06 21:48:15 -0800
commit6eaadfc62e89a25c2de674aebf69f077c491580f (patch)
tree0e957de1b15e584812065f6228317656d6611187 /src
parenta395cd7e53ed33634eef4df22814da4ba96a3357 (diff)
parentdcd35c895cb1c5680f92360cb084e6924ed3b76f (diff)
Merge pull request #498 from PikalaxALT/unk_text_8095904
Unk text 8095904
Diffstat (limited to 'src')
-rw-r--r--src/unk_text_8095904.c266
1 files changed, 266 insertions, 0 deletions
diff --git a/src/unk_text_8095904.c b/src/unk_text_8095904.c
new file mode 100644
index 000000000..4b190bdaa
--- /dev/null
+++ b/src/unk_text_8095904.c
@@ -0,0 +1,266 @@
+#include "global.h"
+#include "text.h"
+#include "string_util.h"
+
+// static types
+
+// static declarations
+
+// rodata
+
+extern const u32 gFont3LatinGlyphs[];
+
+// text
+
+#ifdef NONMATCHING
+void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
+{
+ u16 strlen = StringLength(src);
+ if (bgOverride == 0)
+ {
+ u16 i;
+ for (i = 0; i < strlen; i++)
+ {
+ const u8 *glyphs = (const u8 *)(gFont3LatinGlyphs + ((src[i] & 0xfff0) * 16) + ((src[i] & 0xf) * 8));
+ CpuCopy16(glyphs, dest, 32);
+ CpuCopy16(glyphs + 0x200, dest + width, 32);
+ dest += 32;
+ }
+ }
+ else
+ {
+ u16 i; // sp18
+ u16 r9 = 0;
+ u8 bgHi = bg << 4;
+ u16 size = strlen * 32;
+ for (i = 0; i < 2; i++)
+ {
+ u16 j;
+ for (j = 0; j < strlen; j++) // r5
+ {
+ const u32 *glyphs = (const u8 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8));
+
+ u16 k; // r6
+ for (k = 0; k < 32; k++)
+ {
+ u8 r3 = *glyphs & 0xf0;
+ u8 r2 = *glyphs & 0x0f;
+ if (r3 == 0)
+ {
+ r3 = bgHi;
+ }
+ if (r2 == 0)
+ {
+ r2 = bg;
+ }
+ buffer[r9++] = r3 | r2;
+ glyphs++;
+ }
+ }
+ CpuCopy16(buffer, dest, size);
+ dest += width;
+ r9 = 0;
+ }
+ }
+}
+#else
+__attribute__((naked)) void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
+{
+ 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, 0x1C\n"
+ "\tstr r0, [sp]\n"
+ "\tadds r7, r1, 0\n"
+ "\tadds r4, r2, 0\n"
+ "\tldr r0, [sp, 0x3C]\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tlsls r3, 16\n"
+ "\tlsrs r3, 16\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0x8]\n"
+ "\tldr r0, [sp]\n"
+ "\tbl StringLength\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tcmp r4, 0\n"
+ "\tbne _08095988\n"
+ "\tmovs r5, 0\n"
+ "\tcmp r5, r8\n"
+ "\tbcs _08095A2E\n"
+ "_0809593E:\n"
+ "\tldr r1, [sp]\n"
+ "\tadds r0, r1, r5\n"
+ "\tldrb r2, [r0]\n"
+ "\tldr r0, _08095980 @ =0x0000fff0\n"
+ "\tands r0, r2\n"
+ "\tlsls r0, 6\n"
+ "\tmovs r1, 0xF\n"
+ "\tands r2, r1\n"
+ "\tlsls r2, 5\n"
+ "\tadds r0, r2\n"
+ "\tldr r1, _08095984 @ =gFont3LatinGlyphs\n"
+ "\tadds r4, r0, r1\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r7, 0\n"
+ "\tmovs r2, 0x10\n"
+ "\tbl CpuSet\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 2\n"
+ "\tadds r0, r4, r2\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tadds r1, r7, r3\n"
+ "\tmovs r2, 0x10\n"
+ "\tbl CpuSet\n"
+ "\tadds r7, 0x20\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tcmp r5, r8\n"
+ "\tbcc _0809593E\n"
+ "\tb _08095A2E\n"
+ "\t.align 2, 0\n"
+ "_08095980: .4byte 0x0000fff0\n"
+ "_08095984: .4byte gFont3LatinGlyphs\n"
+ "_08095988:\n"
+ "\tmovs r0, 0\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, [sp, 0x8]\n"
+ "\tlsls r0, r1, 28\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tmov r2, r8\n"
+ "\tlsls r0, r2, 21\n"
+ "\tmovs r1, 0\n"
+ "\tlsrs r0, 1\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "_0809599E:\n"
+ "\tmovs r5, 0\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tadds r3, r7, r3\n"
+ "\tstr r3, [sp, 0x14]\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tstr r0, [sp, 0x18]\n"
+ "\tcmp r5, r8\n"
+ "\tbcs _08095A12\n"
+ "\tmovs r2, 0xF\n"
+ "\tmov r12, r2\n"
+ "\tlsls r1, 9\n"
+ "\tldr r0, _08095A40 @ =gFont3LatinGlyphs\n"
+ "\tadds r1, r0\n"
+ "\tmov r10, r1\n"
+ "_080959BA:\n"
+ "\tldr r3, [sp]\n"
+ "\tadds r0, r3, r5\n"
+ "\tldrb r1, [r0]\n"
+ "\tldr r0, _08095A44 @ =0x0000fff0\n"
+ "\tands r0, r1\n"
+ "\tlsls r0, 6\n"
+ "\tmov r2, r12\n"
+ "\tands r1, r2\n"
+ "\tlsls r1, 5\n"
+ "\tadds r0, r1\n"
+ "\tmov r3, r10\n"
+ "\tadds r4, r0, r3\n"
+ "\tmovs r6, 0\n"
+ "\tadds r5, 0x1\n"
+ "_080959D6:\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r3, 0xF0\n"
+ "\tands r3, r0\n"
+ "\tmov r2, r12\n"
+ "\tands r2, r0\n"
+ "\tcmp r3, 0\n"
+ "\tbne _080959E6\n"
+ "\tldr r3, [sp, 0xC]\n"
+ "_080959E6:\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080959EC\n"
+ "\tldr r2, [sp, 0x8]\n"
+ "_080959EC:\n"
+ "\tmov r0, r9\n"
+ "\tadds r1, r0, 0x1\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r1, 16\n"
+ "\tmov r9, r1\n"
+ "\tldr r1, [sp, 0x40]\n"
+ "\tadds r0, r1, r0\n"
+ "\torrs r3, r2\n"
+ "\tstrb r3, [r0]\n"
+ "\tadds r4, 0x1\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tcmp r6, 0x1F\n"
+ "\tbls _080959D6\n"
+ "\tlsls r0, r5, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tcmp r5, r8\n"
+ "\tbcc _080959BA\n"
+ "_08095A12:\n"
+ "\tldr r0, [sp, 0x40]\n"
+ "\tadds r1, r7, 0\n"
+ "\tldr r3, [sp, 0x10]\n"
+ "\tlsrs r2, r3, 16\n"
+ "\tbl CpuSet\n"
+ "\tldr r7, [sp, 0x14]\n"
+ "\tmovs r0, 0\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, [sp, 0x18]\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0x1\n"
+ "\tbls _0809599E\n"
+ "_08095A2E:\n"
+ "\tadd sp, 0x1C\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"
+ "_08095A40: .4byte gFont3LatinGlyphs\n"
+ "_08095A44: .4byte 0x0000fff0");
+}
+#endif
+
+void unref_sub_8095A48(const u8 *src, u8 *dest, u8 bgOverride, u8 width, u8 *buffer)
+{
+ u8 tmpBuffer[5];
+ bool8 r6 = FALSE;
+ while (!r6)
+ {
+ u16 i;
+ for (i = 0; i < 4; i++)
+ {
+ if (*src == EOS)
+ {
+ if (i == 0)
+ {
+ return;
+ }
+ r6 = TRUE;
+ break;
+ }
+ else
+ {
+ tmpBuffer[i] = *src++;
+ }
+ }
+ while (i < 4)
+ {
+ tmpBuffer[i++] = 0;
+ }
+ tmpBuffer[i] = EOS;
+ sub_8095904(tmpBuffer, dest, bgOverride, 0x80, width, buffer);
+ dest += 0x100;
+ }
+}