summaryrefslogtreecommitdiff
path: root/arm9/modules/21/src
diff options
context:
space:
mode:
authorRevo <projectrevotpp@hotmail.com>2020-12-11 16:16:25 -0500
committerGitHub <noreply@github.com>2020-12-11 16:16:25 -0500
commitd45ebc4547e7d8e253f848a010bf6c430a55ba75 (patch)
treeed5a090638ecf4e2f7e437af16cfc416a2af28df /arm9/modules/21/src
parent80caebd738c642db675a37685a2d89338196dd35 (diff)
parent12c64ee79eabced2a1cc1fc83209be37142bc44c (diff)
Merge pull request #304 from red031000/master
decompile mod21
Diffstat (limited to 'arm9/modules/21/src')
-rw-r--r--arm9/modules/21/src/mod21_02254854.c199
-rw-r--r--arm9/modules/21/src/mod21_02254A6C.c187
-rw-r--r--arm9/modules/21/src/module_21_sinit.c13
3 files changed, 386 insertions, 13 deletions
diff --git a/arm9/modules/21/src/mod21_02254854.c b/arm9/modules/21/src/mod21_02254854.c
new file mode 100644
index 00000000..fe285936
--- /dev/null
+++ b/arm9/modules/21/src/mod21_02254854.c
@@ -0,0 +1,199 @@
+#include "global.h"
+#include "heap.h"
+#include "unk_0200CA44.h"
+#include "mod21_02254854.h"
+
+extern void GF_RTC_CopyTime(u32 *param0);
+
+u8 const MOD21_02254D80[] = { 0x10, 0xAF, 0x10, 0xCF };
+extern BOOL MOD20_02254130(void *param0, BOOL param1, void *param2, UnkStruct02254854 *param3, u32 param4);
+extern void MOD20_02252C14(u32 param0, BOOL param1);
+
+extern void MOD20_02254198(BOOL param0);
+extern void MOD20_022529A0(u32 param0);
+
+extern void MOD20_0225298C(u32 param0);
+
+extern void Poketch_InitApp(void *func1, void *func2);
+
+THUMB_FUNC static void MOD21_02254840(void)
+{
+ Poketch_InitApp(MOD21_02254854, MOD21_0225496C);
+}
+
+#define NitroStaticInit MOD21_02254840
+#include "sinit.h"
+
+THUMB_FUNC BOOL MOD21_02254854(UnkStruct02254854 **param0, u32 param1, u32 param2, u32 param3)
+{
+ UnkStruct02254854 *alloced = (UnkStruct02254854 *)AllocFromHeap(8, sizeof(UnkStruct02254854));
+ if (alloced != NULL)
+ {
+ if (MOD21_0225489C(alloced, param1, param2, param3) && FUN_0200CA44((void (*)(u32, void *))MOD21_02254930, alloced, (void *)1))
+ {
+ *param0 = alloced;
+ return TRUE;
+ }
+ FreeToHeap(alloced);
+ }
+ return FALSE;
+}
+
+THUMB_FUNC BOOL MOD21_0225489C(UnkStruct02254854 *param0, u32 param1, u32 param2, u32 param3)
+{
+#pragma unused (param2, param3) //not sure, please check
+ if (MOD21_02254A6C((UnkStruct02254A6C *)&param0->Unk24, param0->Unk14)) //todo fix
+ {
+ param0->bytearray[0] = 0;
+ param0->bytearray[1] = 0;
+ param0->bytearray[2] = 0;
+ param0->bytearray[3] = 1;
+ param0->bytearray[6] = 0;
+ param0->Unk20 = 0;
+ GF_RTC_CopyTime(param0->Unk14);
+ if (param0->Unk14[0] >= 0x18)
+ {
+ param0->Unk14[0] = param0->Unk14[0] % 0x18;
+ }
+ if (param0->Unk14[1] >= 0x3c)
+ {
+ param0->Unk14[0] = param0->Unk14[0] % 0x3c;
+ }
+ param0->bytearray[5] = (u8)param0->Unk14[1];
+ param0->Unk10 = MOD20_02254130((void *)MOD21_02254D80, TRUE, MOD21_02254974, param0, 8);
+ if (param0->Unk10 == FALSE)
+ {
+ return FALSE;
+ }
+ param0->Unk28 = param1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+BOOL (* const MOD21_02254D84[])(UnkStruct02254854 *) = { MOD21_022549A4, MOD21_022549E4, MOD21_02254A38 };
+
+THUMB_FUNC void MOD21_02254918(UnkStruct02254854 *param0)
+{
+ MOD21_02254B04(param0->Unk24);
+ MOD20_02254198(param0->Unk10);
+ FreeToHeap((void *)param0);
+}
+
+THUMB_FUNC void MOD21_02254930(u32 param0, UnkStruct02254854 *param1)
+{
+ if (param1->bytearray[0] >= 3)
+ {
+ return;
+ }
+ MOD20_02252C14(param1->Unk28, param1->Unk10);
+ if (!MOD21_02254D84[param1->bytearray[0]](param1))
+ {
+ return;
+ }
+ MOD21_02254918(param1);
+ FUN_0200CAB4((s32)param0);
+ MOD20_022529A0(param1->Unk28);
+}
+
+THUMB_FUNC void MOD21_0225496C(UnkStruct02254854 *param0)
+{
+ param0->bytearray[2] = 1;
+}
+
+THUMB_FUNC void MOD21_02254974(u32 param0, u32 param1, u32 param2, UnkStruct02254854 * param3)
+{
+#pragma unused (param0, param1)
+ switch (param2)
+ {
+ case 1:
+ param3->Unk20 = 1;
+ param3->bytearray[6] = 1;
+ return;
+ case 0:
+ param3->Unk20 = 0;
+ param3->bytearray[6] = 1;
+ return;
+ default:
+ return;
+ }
+}
+
+THUMB_FUNC void MOD21_02254990(UnkStruct02254854 * param0, u8 param1)
+{
+ if (param0->bytearray[2] == 0)
+ {
+ param0->bytearray[0] = param1;
+ }
+ else
+ {
+ param0->bytearray[0] = 2;
+ }
+ param0->bytearray[1] = 0;
+}
+
+THUMB_FUNC BOOL MOD21_022549A4(UnkStruct02254854 * param0)
+{
+ switch (param0->bytearray[1])
+ {
+ case 0:
+ MOD21_02254B10(param0->Unk24, 0);
+ param0->bytearray[1]++;
+ break;
+ case 1:
+ if (MOD21_02254B34(param0->Unk24, 0) == FALSE)
+ {
+ break;
+ }
+ MOD20_0225298C(param0->Unk28);
+ MOD21_02254990(param0, 1);
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC BOOL MOD21_022549E4(UnkStruct02254854 * param0)
+{
+ if (param0->bytearray[2])
+ {
+ MOD21_02254990(param0, 2);
+ return FALSE;
+ }
+ if (param0->bytearray[6])
+ {
+ param0->bytearray[6] = 0;
+ MOD21_02254B10(param0->Unk24, 2);
+ }
+ if (MOD21_02254B34(param0->Unk24, 1))
+ {
+ param0->bytearray[5] = (u8)param0->Unk14[1];
+ GF_RTC_CopyTime(param0->Unk14);
+ if (param0->bytearray[5] != param0->Unk14[1])
+ {
+ MOD21_02254B10(param0->Unk24, 1);
+ }
+ }
+ return FALSE;
+}
+
+THUMB_FUNC BOOL MOD21_02254A38(UnkStruct02254854 * param0)
+{
+ switch (param0->bytearray[1])
+ {
+ case 0:
+ MOD21_02254B10(param0->Unk24, 3);
+ param0->bytearray[1]++;
+ break;
+ case 1:
+ if (MOD21_02254B40(param0->Unk24))
+ {
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/arm9/modules/21/src/mod21_02254A6C.c b/arm9/modules/21/src/mod21_02254A6C.c
new file mode 100644
index 00000000..1dcbe4b8
--- /dev/null
+++ b/arm9/modules/21/src/mod21_02254A6C.c
@@ -0,0 +1,187 @@
+#include "global.h"
+#include "heap.h"
+#include "mod21_02254A6C.h"
+#include "MI_memory.h"
+
+extern void MOD20_022536F4(u32 *param0, u32 param1);
+extern u32 MOD20_02252D34(void);
+extern void *FUN_02006BDC(u32 param0, u32 param1, u32 param2, void *param3, u32 param4);
+extern void MOD20_022537E0(void *param0, u32 param1, void *param2, u32 param3, void *param4, u32 param5, u32 param6);
+
+UnkOverlayStruct1 const MOD21_02254DAC[] = {
+ { 0, MOD21_02254B60, 0 },
+ { 1, MOD21_02254BF4, 0 },
+ { 2, MOD21_02254C14, 0 },
+ { 3, MOD21_02254C40, 0 },
+ { 0, NULL, 0 }
+};
+
+extern BOOL MOD20_02253794(void *param0, u32 param1);
+extern BOOL MOD20_022537B8(void *param0);
+extern UnkStruct02254A6C *MOD20_022538A0(void *param0);
+extern BOOL MOD20_02253888(void *param0, void *param1);
+
+//todo datatype
+u8 const MOD21_02254D90[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+extern void FUN_02016C18(u32 param0, u32 param1, void *param2, u32 param3);
+extern void FUN_0200687C(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 param6, u32 param7);
+extern void FUN_020068C8(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 param6, u32 param7);
+extern void MOD20_02252D7C(u32 param0, u32 param1);
+extern void FUN_02017CD0(u32 param0, u32 param1);
+extern void FUN_020178A0(u32 param0, u32 param1);
+
+extern void FUN_02018170(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 *param6, u8 param7, u32 param8, u32 param9, u32 param10);
+
+extern void MOD11_02252DB4(u32 param0, u32 param1);
+
+THUMB_FUNC BOOL MOD21_02254A6C(UnkStruct02254A6C *param0, void *param1)
+{
+ UnkStruct02254A6C *strct = (UnkStruct02254A6C *)AllocFromHeap(8, 3 << 8);
+ u32 sp4;
+ if (strct != NULL)
+ {
+ MOD20_022536F4(strct->Unk08, 8);
+ strct->Unk00 = param1;
+ strct->Unk04 = MOD20_02252D34();
+ void *res = FUN_02006BDC(12, 0x19, 1, &sp4, 8);
+ if (res == 0)
+ {
+ FreeToHeap(strct);
+ return FALSE;
+ }
+ MOD21_02254AD4((void *)(sp4 + 0xc), strct->Unk30);
+ FreeToHeap(res);
+ param0->Unk00 = strct;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void MOD21_02254AD4(void *param0, void *param1)
+{
+ s32 i = 0;
+ for (u32 r6 = 9 << 6; i < 9; r6 -= 0x30)
+ {
+ MI_CpuCopy16(param0, param1, 0x40);
+ MI_CpuCopy16((void *)((u32)param0 + r6), (void *)((u32)param1 + 0x40), 0x10);
+ i++;
+ param0 = (void *)((u32)param0 + 0x40);
+ param1 = (void *)((u32)param1 + 0x50);
+ }
+}
+
+THUMB_FUNC void MOD21_02254B04(void *param0)
+{
+ if (param0 != NULL)
+ {
+ FreeToHeap(param0);
+ }
+}
+
+THUMB_FUNC void MOD21_02254B10(u32 *param0, u32 param1)
+{
+ MOD20_022537E0(MOD21_02254DAC, param1, param0, *param0, (void *)(param0 + 2), 2, 8);
+}
+
+THUMB_FUNC BOOL MOD21_02254B34(void *param0, u32 param1)
+{
+ return MOD20_02253794((void *)((u32)param0 + 8), param1);
+}
+
+THUMB_FUNC BOOL MOD21_02254B40(void *param0)
+{
+ return MOD20_022537B8((void *)((u32)param0 + 8));
+}
+
+THUMB_FUNC BOOL MOD21_02254B4C(void *param0)
+{
+ return MOD20_02253888((void *)((u32)MOD20_022538A0(param0) + 8), param0);
+}
+
+THUMB_FUNC BOOL MOD21_02254B60(u32 param0, void *param1)
+{
+#pragma unused (param0)
+ UnkStruct02254A6C *strct = MOD20_022538A0(param1);
+ FUN_02016C18(strct->Unk04, 6, MOD21_02254D90, 0);
+ FUN_0200687C(12, 23, strct->Unk04, 6, 0, 0, 1, 8);
+ FUN_020068C8(12, 24, strct->Unk04, 6, 0, 0, 1, 8);
+ MOD20_02252D7C(0, 0);
+ MOD21_02254C5C(strct);
+ FUN_02017CD0(strct->Unk04, 6);
+ u32 r3 = reg_GXS_DB_DISPCNT;
+ u32 r2 = reg_GXS_DB_DISPCNT;
+ vu32 tmp = r3; //unused? wtf
+ u32 r0 = ~0x1F00 & r2;
+ r2 = r3 << 19; //cast with shift? can't replicate both though
+ r3 = r2 >> 27;
+ r2 = 4 | r3;
+ r2 <<= 8;
+ r0 |= r2;
+ reg_GXS_DB_DISPCNT = r0;
+ return MOD21_02254B4C(param1);
+}
+
+THUMB_FUNC BOOL MOD21_02254BF4(u32 param0, void *param1)
+{
+#pragma unused (param0)
+ UnkStruct02254A6C *strct = MOD20_022538A0(param1);
+ MOD21_02254C5C(strct);
+ FUN_02017CD0(strct->Unk04, 6);
+ return MOD21_02254B4C(param1);
+}
+
+THUMB_FUNC BOOL MOD21_02254C14(u32 param0, void *param1)
+{
+#pragma unused (param0)
+ UnkStruct02254A6C *strct = MOD20_022538A0(param1);
+ if (strct->Unk00->Unk0C)
+ {
+ MOD11_02252DB4(0, 0);
+ }
+ else
+ {
+ MOD20_02252D7C(0, 0);
+ }
+ return MOD21_02254B4C(param1);
+}
+
+THUMB_FUNC BOOL MOD21_02254C40(u32 param0, void *param1)
+{
+#pragma unused (param0)
+ UnkStruct02254A6C *strct = MOD20_022538A0(param1);
+ FUN_020178A0(strct->Unk04, 6);
+ return MOD21_02254B4C(param1);
+}
+
+THUMB_FUNC void MOD21_02254C5C(UnkStruct02254A6C *param0)
+{
+ u32 tmp = (u32)param0->Unk00->Unk00;
+ reg_CP_DIVCNT = 0;
+ (*(vu32 *)REG_DIV_NUMER_ADDR) = tmp;
+ reg_CP_DIV_DENOM = 10;
+ while (reg_CP_DIVCNT & ((u32)&reg_CP_DIVCNT >> 0xb)) { }
+
+ u32 regaddr = (u32)&reg_CP_DIV_RESULT_L;
+ u32 divResult = *(u32 *)regaddr;
+ while (reg_CP_DIVCNT & (regaddr >> 0xb)) { }
+
+ u32 divRemRes = reg_CP_DIVREM_RESULT_L;
+ FUN_02018170(param0->Unk04, 6, 3, 7, 4, 9, param0->Unk30, (u8)(divResult << 2), 0, 40, 9);
+ FUN_02018170(param0->Unk04, 6, 8, 7, 4, 9, param0->Unk30, (u8)(divRemRes << 2), 0, 40, 9);
+
+ tmp = param0->Unk00->Unk04;
+ reg_CP_DIVCNT = 0;
+ (*(vu32 *)REG_DIV_NUMER_ADDR) = tmp;
+ reg_CP_DIV_DENOM = 10;
+
+ while (reg_CP_DIVCNT & ((u32)&reg_CP_DIVCNT >> 0xb)) { }
+
+ divResult = *(u32 *)regaddr;
+ while (reg_CP_DIVCNT & (regaddr >> 0xb)) { }
+
+ divRemRes = reg_CP_DIVREM_RESULT_L;
+ FUN_02018170(param0->Unk04, 6, 15, 7, 4, 9, param0->Unk30, (u8)(divResult << 2), 0, 40, 9);
+ FUN_02018170(param0->Unk04, 6, 20, 7, 4, 9, param0->Unk30, (u8)(divRemRes << 2), 0, 40, 9);
+}
diff --git a/arm9/modules/21/src/module_21_sinit.c b/arm9/modules/21/src/module_21_sinit.c
deleted file mode 100644
index 2af569ec..00000000
--- a/arm9/modules/21/src/module_21_sinit.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "global.h"
-
-extern void Poketch_InitApp(void *func1, void *func2);
-extern void MOD21_02254854();
-extern void MOD21_0225496C();
-
-THUMB_FUNC static void MOD21_02254840(void)
-{
- Poketch_InitApp(MOD21_02254854, MOD21_0225496C);
-}
-
-#define NitroStaticInit MOD21_02254840
-#include "sinit.h"