summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/unk_020030E8.c708
1 files changed, 708 insertions, 0 deletions
diff --git a/arm9/src/unk_020030E8.c b/arm9/src/unk_020030E8.c
new file mode 100644
index 00000000..771faab2
--- /dev/null
+++ b/arm9/src/unk_020030E8.c
@@ -0,0 +1,708 @@
+#include "global.h"
+#include "MI_memory.h"
+#include "unk_02002F08.h"
+#include "unk_0200CA44.h"
+#include "unk_020030E8.h"
+
+
+
+
+extern void *FUN_020222E8();
+extern void *FUN_020222F8();
+extern void *FUN_02022308();
+extern void *FUN_02022310();
+extern int abs(int);
+
+
+THUMB_FUNC void FUN_02003108(struct UnkStruct_02002F08 *param0, u32 param1, u16 param2, u32 param3)
+{
+ GF_ASSERT(param2 * 2 + param3 <= param0->unk000[param1].unk08);
+
+ u16 *r1;
+ switch (param1)
+ {
+ case 0:
+ r1 = FUN_020222E8();
+ break;
+ case 1:
+ r1 = FUN_020222F8();
+ break;
+ case 2:
+ r1 = FUN_02022308();
+ break;
+ case 3:
+ r1 = FUN_02022310();
+ break;
+ default:
+ GF_ASSERT(FALSE);
+ return;
+ }
+
+ FUN_02003054(param0, r1 + param2, param1, param2, (u16)param3);
+}
+
+THUMB_FUNC void FUN_0200317C(NarcId narcId, s32 memberId, u32 heap_id, u32 size, u16 offset, void *dest)
+{
+ NNSG2dPaletteData *pltData;
+
+ void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id);
+ GF_ASSERT(ptr != NULL);
+
+ if (size == 0)
+ {
+ size = pltData->szByte;
+ }
+
+ MI_CpuCopy16(pltData->pRawData + offset * 2, dest, size);
+
+ FreeToHeap(ptr);
+}
+
+THUMB_FUNC void FUN_020031B8(struct UnkStruct_02002F08 *param0, u32 param1, u16 param2, u32 param3, u16 param4, u16 param5)
+{
+
+ MI_CpuCopy16(param0->unk000[param1].unk00 + param2, param0->unk000[param3].unk00 + param4, param5);
+ MI_CpuCopy16(param0->unk000[param1].unk00 + param2, param0->unk000[param3].unk04 + param4, param5);
+}
+
+THUMB_FUNC u16 *FUN_020031FC(struct UnkStruct_02002F08 *param0, u32 param1)
+{
+ return param0->unk000[param1].unk00;
+}
+
+THUMB_FUNC u16 *FUN_02003204(struct UnkStruct_02002F08 *param0, u32 param1)
+{
+ return param0->unk000[param1].unk04;
+}
+
+
+
+
+
+
+
+
+THUMB_FUNC u32 FUN_02003210(struct UnkStruct_02002F08 *param0, u16 param1, u16 param2, s16 param3, u8 param6, u8 param7, u16 param8)
+{
+
+ u16 stc = param2;
+ u32 r6 = 0;
+
+ for (u8 r4 = 0; r4 < 14; r4++)
+ {
+ if (FUN_02003314(param1, r4) != 1)
+ {
+ continue;
+ }
+
+ if (FUN_02003314(param0->unk118_2, r4) != 0)
+ {
+ continue;
+ }
+
+ FUN_02003368(r4, &param0->unk000[r4], &param2);
+
+ FUN_020033A4(&param0->unk000[r4].unk0c, param2, param3, param6, param7, param8);
+
+ FUN_02003328(param0, r4);
+
+ if (r4 >= 4)
+ {
+ FUN_0200359C(param0, r4, 0x100);
+ }
+ else
+ {
+ FUN_0200359C(param0, r4, 0x10);
+ }
+
+ param2 = stc;
+ r6 = 1;
+ }
+
+ if (r6 == 1)
+ {
+ param0->unk118_2 |= param1;
+ if (param0->unk11a_e == 0)
+ {
+ param0->unk11a_e = 1;
+
+ param0->unk118_0 = 1;
+ param0->unk11c = 0;
+
+ //wtf is that?
+ FUN_0200CA44((void (*)(u32, struct TextPrinter *))FUN_02003464, (struct TextPrinter *)param0, (u32)(-2));
+ }
+ }
+
+ return r6;
+}
+
+THUMB_FUNC u8 FUN_02003314(u16 param0, u16 param1)
+{
+ u32 r3 = 1;
+ if ((param0 & (1 << param1)) == 0)
+ {
+ r3 = 0;
+ }
+
+ return (u8)r3;
+}
+
+THUMB_FUNC void FUN_02003328(struct UnkStruct_02002F08 *param0, u16 param1)
+{
+ if (FUN_02003314(param0->unk11a_0, param1) != 1)
+ {
+ param0->unk11a_0 |= 1 << param1;
+ }
+}
+
+THUMB_FUNC void FUN_02003368(s32 param0, struct UnkStruct_02002F08_sub *param1, u16 *param2)
+{
+ u8 r0;
+ if (param0 < 4)
+ {
+ r0 = (u8)(param1->unk08 >> 5);
+ }
+ else
+ {
+ r0 = (u8)(param1->unk08 >> 9);
+ }
+
+ u16 r4 = 0;
+ for (u8 i = 0; i < r0; i++)
+ {
+ r4 += 1 << i;
+ }
+
+ *param2 &= r4;
+}
+
+
+
+THUMB_FUNC void FUN_020033A4(struct UnkStruct_02002F08_sub_sub *param0, u16 param1, s16 param2, u8 param3, u8 param4, u16 param5)
+{
+ if (param2 < 0)
+ {
+ param0->unk06_0 = abs(param2) + 2;
+ param0->unk02_0 = 0;
+ }
+ else
+ {
+ param0->unk06_0 = 2;
+ param0->unk02_0 = param2;
+ }
+
+ param0->unk00 = param1;
+ param0->unk02_6 = param3;
+ param0->unk02_b = param4;
+ param0->unk04_0 = param5;
+
+ param0->unk06_4 = param0->unk02_0;
+
+ if (param3 < param4)
+ {
+ param0->unk04_f = 0;
+ return;
+ }
+ param0->unk04_f = 1;
+}
+
+
+
+
+THUMB_FUNC void FUN_02003464(u32 param0, struct UnkStruct_02002F08 *param1)
+{
+ if (param1->unk11c == 1)
+ {
+ param1->unk11c = 0;
+ param1->unk11a_0 = 0;
+ param1->unk118_2 = 0;
+ param1->unk11a_e = 0;
+ FUN_0200CAB4((s32)param0);
+ return;
+ }
+
+ if (param1->unk118_0 == 1)
+ {
+ param1->unk11a_0 = param1->unk118_2;
+ FUN_02003500(param1);
+ FUN_02003520(param1);
+
+ if (param1->unk118_2 == 0)
+ {
+ param1->unk11a_e = 0;
+ FUN_0200CAB4((s32)param0);
+ }
+ }
+}
+
+
+
+THUMB_FUNC void FUN_02003500(struct UnkStruct_02002F08 *param0)
+{
+ for (u8 i = 0; i < 4; i++)
+ {
+ FUN_02003540(param0, i, 0x10);
+ }
+}
+
+THUMB_FUNC void FUN_02003520(struct UnkStruct_02002F08 *param0)
+{
+ for (u8 i = 4; i < 14; i++)
+ {
+ FUN_02003540(param0, i, 0x100);
+ }
+}
+
+THUMB_FUNC void FUN_02003540(struct UnkStruct_02002F08 *param0, u8 param1, u32 param2)
+{
+ if (FUN_02003314(param0->unk118_2, param1) != 0)
+ {
+ if (param0->unk000[param1].unk0c.unk06_4 < param0->unk000[param1].unk0c.unk02_0)
+ {
+ param0->unk000[param1].unk0c.unk06_4++;
+ return;
+ }
+
+ param0->unk000[param1].unk0c.unk06_4 = 0;
+ FUN_0200359C(param0, param1, param2);
+ }
+}
+
+
+
+
+THUMB_FUNC void FUN_0200359C(struct UnkStruct_02002F08 *param0, u32 param1, u32 param2)
+{
+
+ for (u32 r6 = 0; r6 < 0x10; r6++)
+ {
+ if (FUN_02003314(param0->unk000[param1].unk0c.unk00, (u16)r6) != 0)
+ {
+ FUN_020035F8(param0->unk000[param1].unk00 + param2 * r6, param0->unk000[param1].unk04 + param2 * r6, &param0->unk000[param1].unk0c, param2);
+ }
+ }
+
+ FUN_02003684(param0, (u8)param1, &param0->unk000[param1].unk0c);
+}
+
+THUMB_FUNC void FUN_020035F8(u16 *param0, u16 *param1, struct UnkStruct_02002F08_sub_sub *param2, u32 param3)
+{
+ for (u32 i = 0; i < param3; i++)
+ {
+ u8 lo = (u8)((param0[i] & 0x1f) + ((((param2->unk04_0 & 0x1f) - (param0[i] & 0x1f)) * param2->unk02_6) >> 4));
+
+ u8 hi = (u8)(((param0[i] >> 10) & 0x1f) + (((((param2->unk04_0 >> 10) & 0x1f) - ((param0[i] >> 10) & 0x1f)) * param2->unk02_6) >> 4));
+ u8 mid = (u8)(((param0[i] >> 5) & 0x1f) + (((((param2->unk04_0 >> 5) & 0x1f) - ((param0[i] >> 5) & 0x1f)) * param2->unk02_6) >> 4));
+
+ param1[i] = (u16)((hi << 10) | (mid << 5) | lo);
+ }
+}
+
+THUMB_FUNC void FUN_02003684(struct UnkStruct_02002F08 *param0, u8 param1, struct UnkStruct_02002F08_sub_sub *param2)
+{
+ s16 r4;
+ if (param2->unk02_6 == param2->unk02_b)
+ {
+ if ((param0->unk118_2 & (1 << param1)) == 0)
+ {
+ return;
+ }
+
+ param0->unk118_2 ^= (1 << param1);
+
+ return;
+ }
+
+ if (param2->unk04_f == 0)
+ {
+ r4 = (s16)param2->unk02_6;
+ r4 += param2->unk06_0;
+ if (r4 > param2->unk02_b)
+ {
+ r4 = (s16)param2->unk02_b;
+ }
+
+ param2->unk02_6 = r4;
+ return;
+ }
+
+ r4 = (s16)param2->unk02_6;
+ r4 -= param2->unk06_0;
+ if (r4 < param2->unk02_b)
+ {
+ r4 = (s16)param2->unk02_b;
+ }
+
+ param2->unk02_6 = r4;
+}
+
+THUMB_FUNC void FUN_0200372C(struct UnkStruct_02002F08 *param0)
+{
+ if (param0->unk11a_f == 0 && param0->unk118_0 != 1)
+ {
+ return;
+ }
+
+ for (s32 r5 = 0; r5 < 14; r5++)
+ {
+ if (param0->unk11a_f != 0 || (param0->unk000[r5].unk04 != 0 && FUN_02003314(param0->unk11a_0, (u16)r5) != 0))
+ {
+ DC_FlushRange(param0->unk000[r5].unk04, param0->unk000[r5].unk08);
+
+ switch (r5)
+ {
+ case 0:
+ GX_LoadBGPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ break;
+ case 1:
+ GXS_LoadBGPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ break;
+ case 2:
+ GX_LoadOBJPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ break;
+ case 3:
+ GXS_LoadOBJPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ break;
+ case 4:
+ GX_BeginLoadBGExtPltt();
+ GX_LoadBGExtPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ GX_EndLoadBGExtPltt();
+ break;
+ case 5:
+ GX_BeginLoadBGExtPltt();
+ GX_LoadBGExtPltt(param0->unk000[r5].unk04, 0x2000, param0->unk000[r5].unk08);
+ GX_EndLoadBGExtPltt();
+ break;
+ case 6:
+ GX_BeginLoadBGExtPltt();
+ GX_LoadBGExtPltt(param0->unk000[r5].unk04, 0x4000, param0->unk000[r5].unk08);
+ GX_EndLoadBGExtPltt();
+ break;
+ case 7:
+ GX_BeginLoadBGExtPltt();
+ GX_LoadBGExtPltt(param0->unk000[r5].unk04, 0x6000, param0->unk000[r5].unk08);
+ GX_EndLoadBGExtPltt();
+ break;
+ case 8:
+ GXS_BeginLoadBGExtPltt();
+ GXS_LoadBGExtPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ GXS_EndLoadBGExtPltt();
+ break;
+ case 9:
+ GXS_BeginLoadBGExtPltt();
+ GXS_LoadBGExtPltt(param0->unk000[r5].unk04, 0x2000, param0->unk000[r5].unk08);
+ GXS_EndLoadBGExtPltt();
+ break;
+ case 10:
+ GXS_BeginLoadBGExtPltt();
+ GXS_LoadBGExtPltt(param0->unk000[r5].unk04, 0x4000, param0->unk000[r5].unk08);
+ GXS_EndLoadBGExtPltt();
+ break;
+ case 11:
+ GXS_BeginLoadBGExtPltt();
+ GXS_LoadBGExtPltt(param0->unk000[r5].unk04, 0x6000, param0->unk000[r5].unk08);
+ GXS_EndLoadBGExtPltt();
+ break;
+ case 12:
+ GX_BeginLoadOBJExtPltt();
+ GX_LoadOBJExtPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ GX_EndLoadOBJExtPltt();
+ break;
+ case 13:
+ GXS_BeginLoadOBJExtPltt();
+ GXS_LoadOBJExtPltt(param0->unk000[r5].unk04, 0, param0->unk000[r5].unk08);
+ GXS_EndLoadOBJExtPltt();
+ break;
+ }
+ }
+ }
+
+ param0->unk11a_0 = param0->unk118_2;
+ if (param0->unk11a_0 == 0)
+ {
+ param0->unk118_0 = 0;
+ }
+}
+
+THUMB_FUNC u16 FUN_020038E4(struct UnkStruct_02002F08 *param0)
+{
+ return param0->unk118_2;
+}
+
+THUMB_FUNC void FUN_020038F0(struct UnkStruct_02002F08 *param0, u32 param1)
+{
+ param0->unk11a_f = param1;
+}
+
+THUMB_FUNC void FUN_02003914(struct UnkStruct_02002F08 *param0, u32 param1, u32 param2, u16 param3, u16 param4, u16 param5)
+{
+ GF_ASSERT(param5 * 2 <= param0->unk000[param1].unk08);
+ if (param2 - 1 <= 1)
+ {
+ MI_CpuFill16(&param0->unk000[param1].unk00[param4], param3, (u32)((param5 - param4) * 2));
+ }
+
+ if (param2 == 0 || param2 == 2)
+ {
+ MI_CpuFill16(&param0->unk000[param1].unk04[param4], param3, (u32)((param5 - param4) * 2));
+ }
+}
+
+#ifdef NONMATCHING
+THUMB_FUNC void FUN_02003974(u16 *param0, u16 *param1, u16 param2, u8 param3, u16 param4)
+{
+ s32 r12 = ((u32)(param4 << 0x1b)) >> 0x1b;
+ s32 lr = ((u32)(param4 << 0x16)) >> 0x1b;
+ s32 st8 = ((u32)(param4 << 0x11)) >> 0x1b;
+ s32 lo, mid, hi;
+
+ for (u16 i = 0; i < param2; i++)
+ {
+ lo = (((u32)(param0[i] << 0x1b)) >> 0x1b);
+ mid = (((u32)(param0[i] << 0x16)) >> 0x1b);
+ hi = (((u32)(param0[i] << 0x11)) >> 0x1b);
+
+ param1[i] = (lo + ((r12 - lo) * param3) >> 4) | (mid + ((lr - mid) * param3) >> 4) << 5 | (hi + ((st8 - hi) * param3) >> 4) << 10;
+ }
+}
+#else
+asm void FUN_02003974(u16 *param0, u16 *param1, u16 param2, u8 param3, u16 param4)
+{
+ // clang-format off
+ push {r4-r7, lr}
+ sub sp, #0xc
+ str r0, [sp, #0x0]
+ add r0, sp, #0x10
+ ldrh r0, [r0, #0x10]
+ str r1, [sp, #0x4]
+ add r7, r2, #0x0
+ lsl r1, r0, #0x1b
+ lsr r1, r1, #0x1b
+ mov r12, r1
+ lsl r1, r0, #0x16
+ lsl r0, r0, #0x11
+ lsr r1, r1, #0x1b
+ lsr r0, r0, #0x1b
+ mov r2, #0x0
+ mov lr, r1
+ str r0, [sp, #0x8]
+ cmp r7, #0x0
+ bls _020039E2
+_0200399A:
+ ldr r0, [sp, #0x0]
+ lsl r6, r2, #0x1
+ ldrh r4, [r0, r6]
+ lsl r0, r4, #0x1b
+ lsr r1, r0, #0x1b
+ lsl r0, r4, #0x16
+ lsl r4, r4, #0x11
+ lsr r5, r4, #0x1b
+ ldr r4, [sp, #0x8]
+ lsr r0, r0, #0x1b
+ sub r4, r4, r5
+ mul r4, r3
+ asr r4, r4, #0x4
+ add r4, r5, r4
+ lsl r5, r4, #0xa
+ mov r4, r12
+ sub r4, r4, r1
+ mul r4, r3
+ asr r4, r4, #0x4
+ add r1, r1, r4
+ mov r4, lr
+ sub r4, r4, r0
+ mul r4, r3
+ asr r4, r4, #0x4
+ add r0, r0, r4
+ lsl r0, r0, #0x5
+ orr r0, r1
+ add r1, r5, #0x0
+ orr r1, r0
+ ldr r0, [sp, #0x4]
+ strh r1, [r0, r6]
+ add r0, r2, #0x1
+ lsl r0, r0, #0x10
+ lsr r2, r0, #0x10
+ cmp r2, r7
+ blo _0200399A
+_020039E2:
+ add sp, #0xc
+ pop {r4-r7, pc}
+ // clang-format on
+}
+#endif
+
+THUMB_FUNC void FUN_020039E8(struct UnkStruct_02002F08 *param0, u32 param1, u16 param2, u16 param3, u8 param4, u16 param5)
+{
+ BOOL r0 = FALSE;
+ if (param0->unk000[param1].unk00 != 0 && param0->unk000[param1].unk04 != 0)
+ {
+ r0 = TRUE;
+ }
+
+ GF_ASSERT(r0);
+
+ FUN_02003974(param0->unk000[param1].unk00 + param2, param0->unk000[param1].unk04 + param2, param3, param4, param5);
+}
+
+THUMB_FUNC void FUN_02003A30(u16 *param0, u16 *param1, u16 param2, u8 param3, u16 param4)
+{
+ while (param2 != 0)
+ {
+ if ((param2 & 1) != 0)
+ {
+ FUN_02003974(param0, param1, 0x10, param3, param4);
+ }
+
+ param2 >>= 1;
+ param1 += 0x10;
+ param0 += 0x10;
+ }
+}
+
+THUMB_FUNC void FUN_02003A64(struct UnkStruct_02002F08 *param0, u32 param1, u16 param2, u8 param3, u16 param4)
+{
+ u32 r4 = 0;
+ BOOL r0 = FALSE;
+ if (param0->unk000[param1].unk00 != 0 && param0->unk000[param1].unk04 != 0)
+ {
+ r0 = TRUE;
+ }
+
+ GF_ASSERT(r0);
+
+ while (param2 != 0)
+ {
+ if ((param2 & 1) != 0)
+ {
+ FUN_020039E8(param0, param1, (u16)r4, 0x10, param3, param4);
+ }
+
+ param2 >>= 1;
+ r4 += 0x10;
+ }
+}
+
+#ifdef NONMATCHING
+THUMB_FUNC void FUN_02003AC4(u16 *param0, u16 param1, u32 param2, u32 param3, u32 param4)
+{
+ s32 r4, lo, mid, hi, add;
+ for (r4 = 0; r4 < param1; r4++)
+ {
+ lo = ((param0[r4]) & 0x1f);
+ mid = ((param0[r4] >> 5) & 0x1f);
+ hi = ((param0[r4] >> 10) & 0x1f);
+
+ add = (lo * 0x4c + mid * 0x97 + hi * 0x1d) >> 8;
+
+ lo = (u16)(add * param2) >> 8;
+ mid = (u16)(add * param3) >> 8;
+ hi = (u16)(add * param4) >> 8;
+
+ if (lo > 0x1f)
+ {
+ lo = 0x1f;
+ }
+ if (mid > 0x1f)
+ {
+ mid = 0x1f;
+ }
+ if (hi > 0x1f)
+ {
+ hi = 0x1f;
+ }
+
+ param0[r4] = (hi << 10) | (mid << 5) | lo;
+ }
+}
+#else
+asm void FUN_02003AC4(u16 *param0, u16 param1, u32 param2, u32 param3, u32 param4)
+{
+ // clang-format off
+ push {r3-r7, lr}
+ mov lr, r1
+ mov r12, r2
+ add r7, r3, #0x0
+ mov r4, #0x0
+ cmp r1, #0x0
+ ble _02003B3C
+ ldr r6, [sp, #0x18]
+_02003AD4:
+ ldrh r3, [r0, #0x0]
+ mov r1, #0x1f
+ add r2, r3, #0x0
+ asr r5, r3, #0xa
+ and r2, r1
+ and r5, r1
+ mov r1, #0x1d
+ mul r1, r5
+ mov r5, #0x4c
+ mul r5, r2
+ asr r3, r3, #0x5
+ mov r2, #0x1f
+ and r3, r2
+ mov r2, #0x97
+ mul r2, r3
+ add r2, r5, r2
+ add r1, r1, r2
+ asr r3, r1, #0x8
+ mov r1, r12
+ add r2, r1, #0x0
+ mul r2, r3
+ lsl r1, r2, #0x10
+ lsr r1, r1, #0x10
+ asr r2, r1, #0x8
+ add r1, r7, #0x0
+ mul r1, r3
+ mul r3, r6
+ lsl r1, r1, #0x10
+ lsl r3, r3, #0x10
+ lsr r1, r1, #0x10
+ lsr r3, r3, #0x10
+ asr r1, r1, #0x8
+ asr r3, r3, #0x8
+ cmp r2, #0x1f
+ ble _02003B1C
+ mov r2, #0x1f
+_02003B1C:
+ cmp r1, #0x1f
+ ble _02003B22
+ mov r1, #0x1f
+_02003B22:
+ cmp r3, #0x1f
+ ble _02003B28
+ mov r3, #0x1f
+_02003B28:
+ lsl r3, r3, #0xa
+ lsl r1, r1, #0x5
+ orr r1, r3
+ orr r1, r2
+ strh r1, [r0, #0x0]
+ add r4, r4, #0x1
+ mov r1, lr
+ add r0, r0, #0x2
+ cmp r4, r1
+ blt _02003AD4
+_02003B3C:
+ pop {r3-r7, pc}
+ // clang-format on
+}
+#endif
+
+THUMB_FUNC void FUN_02003B40(struct UnkStruct_02002F08 *param0, NarcId narcId, s32 memberId, u32 heap_id, u32 param4, u32 param5, u16 param6, u32 param7, u32 param8, u32 param9)
+{
+ NNSG2dPaletteData *pltData;
+ void *ptr = GfGfxLoader_GetPlttData(narcId, memberId, &pltData, heap_id);
+ GF_ASSERT(ptr != NULL);
+
+ if (param5 == 0)
+ {
+ param5 = pltData->szByte;
+ }
+
+ FUN_02003AC4(pltData->pRawData, 0x10, param7, param8, param9);
+ FUN_02003054(param0, pltData->pRawData, param4, param6, (u16)param5);
+
+ FreeToHeap(ptr);
+}