From e8cea378292f91719c02d589baa1358d659d62db Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Wed, 15 Apr 2020 12:09:59 -0400 Subject: sub to FUN --- src/FUN_02000DF4.c | 24 ++++++++++++++++++++++++ src/sub_02000DF4.c | 24 ------------------------ 2 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 src/FUN_02000DF4.c delete mode 100644 src/sub_02000DF4.c (limited to 'src') diff --git a/src/FUN_02000DF4.c b/src/FUN_02000DF4.c new file mode 100644 index 00000000..c4532fdd --- /dev/null +++ b/src/FUN_02000DF4.c @@ -0,0 +1,24 @@ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; +typedef signed char s8; +typedef signed short s16; +typedef signed long s32; + +struct Unk2106FA0 { + u8 filler0[0x8]; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; +}; + +extern struct Unk2106FA0 gUnknown2106FA0; + +void FUN_02000DF4(void) +{ + gUnknown2106FA0.unk8 = -1; + gUnknown2106FA0.unkC = 0; + gUnknown2106FA0.unk10 = -1; + gUnknown2106FA0.unk14 = 0; +} diff --git a/src/sub_02000DF4.c b/src/sub_02000DF4.c deleted file mode 100644 index a0c58183..00000000 --- a/src/sub_02000DF4.c +++ /dev/null @@ -1,24 +0,0 @@ -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; -typedef signed char s8; -typedef signed short s16; -typedef signed long s32; - -struct Unk2106FA0 { - u8 filler0[0x8]; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; -}; - -extern struct Unk2106FA0 gUnknown2106FA0; - -void sub_02000DF4(void) -{ - gUnknown2106FA0.unk8 = -1; - gUnknown2106FA0.unkC = 0; - gUnknown2106FA0.unk10 = -1; - gUnknown2106FA0.unk14 = 0; -} -- cgit v1.2.3 From 239b0b1d4343f987936019c76abb2bc7ff815fee Mon Sep 17 00:00:00 2001 From: Mor Date: Sat, 18 Apr 2020 17:32:11 +0300 Subject: rudimentary matching decompilation of NitroMain --- src/main.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/main.c (limited to 'src') diff --git a/src/main.c b/src/main.c new file mode 100644 index 00000000..844d069d --- /dev/null +++ b/src/main.c @@ -0,0 +1,151 @@ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; +typedef signed char s8; +typedef signed short s16; +typedef signed long s32; + +struct Unk2106FA0 +{ + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; + s32 unk18; + s32 unk1C; + s32 unk20; +}; + +struct Unk21C48B8 +{ + void (*unk0)(s32); + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; + s32 unk18; + s32 unk1C; + s32 unk20; + s32 unk24; + s32 unk28; + s32 unk2C; + s32 unk30; + s32 unk34; + s32 unk38; + u8 filler3C[0xC]; + s32 unk48; + u8 filler4C[0x20]; + s32 unk6C; +}; + +extern struct Unk2106FA0 gUnknown2106FA0; +extern struct Unk2106FA0 gUnknown2106FA0_2; // same as the first one, it's referenced twice in the constant pool... +extern struct Unk2106FA0 gUnknown2106FB8; +extern struct Unk21C48B8 gUnknown21C48B8; + +extern s32 gUnk027FFC20; +extern struct { + s32 unk0; + s32 unk4; + u8 unk8; +} gUnk021C4918; + +extern void FUN_020D50D8(); +extern void FUN_020C9C0C(); +extern void FUN_02016438(s32); + +extern const s32 CONST_3F; // 0x0000003F +extern const s32 CONST_34; // 0x00000034 + +extern struct Unk21DBE18 gUnk021DBE18; +extern struct Unk21DBE18 gUnk021D76C8; + + +void NitroMain(void) +{ + FUN_02016014(); + FUN_02016148(); + FUN_020163BC(); + FUN_02016438(0); + + FUN_020D50D8(&gUnknown2106FA0_2, 0); // should be blx please + + FUN_02022294(); + FUN_0201259C(); + FUN_02000DF4(); + FUN_02002C14(); + FUN_02002C50(0, 3); + FUN_02002C50(1, 3); + FUN_02002C50(3, 3); + gUnknown2106FA0.unk18 = -1; + gUnknown2106FA0.unk20 = FUN_0202254C(); + FUN_02003B98(FUN_02029EF8(gUnknown2106FA0.unk20), FUN_02023900(gUnknown2106FA0.unk20)); + FUN_02020AFC(); + if (FUN_020337E8(3) == 3) + FUN_02034188(3, 0); + if (FUN_020227FC(gUnknown2106FA0.unk20) == 0) + { + FUN_02089D90(0); + } + else + { + switch (gUnk027FFC20) + { + case 0: + gUnknown2106FA0.unk1C = 0; + FUN_02000E7C(&CONST_3F, &gUnk021DBE18); + break; + case 1: + gUnknown2106FA0.unk1C = 1; + FUN_02000E7C(&CONST_34, &gUnk021D76C8); + break; + default: + FUN_02020C2C(); + break; + } + } + gUnknown21C48B8.unk6C = 1; + gUnknown21C48B8.unk30 = 0; + FUN_02000FA4(); + FUN_0200A2AC(); + FUN_02015E30(); + gUnknown2106FA0.unk4 = 0; + for (;;) + { + FUN_02000EE8(); + FUN_02000FE8(); + FUN_02016464(); + if ((gUnknown21C48B8.unk38 & 0x30C) == 0x30C && !gUnk021C4918.unk8) // soft reset? + { + FUN_02000F18(0); // soft reset? + } + if (FUN_0202FB80()) + { + FUN_02000E0C(); + FUN_0201B5CC(gUnknown21C48B8.unk18); + FUN_0201B5CC(gUnknown21C48B8.unk24); + if (!gUnknown21C48B8.unk30) + { + FUN_020C9C0C(1, 1); + gUnknown21C48B8.unk2C++; + } + } + FUN_020125D4(); + FUN_02015E60(); + FUN_020222C4(); + FUN_0201B5CC(gUnknown21C48B8.unk24); + FUN_020C9C0C(1, 1); + gUnknown21C48B8.unk2C++; + gUnknown21C48B8.unk30 = 0; + FUN_0200A318(); + FUN_0200E2D8(); + if (gUnknown21C48B8.unk0) + gUnknown21C48B8.unk0(gUnknown21C48B8.unk4); + FUN_02003C10(); + FUN_0201B5CC(gUnknown21C48B8.unk20); + } +} \ No newline at end of file -- cgit v1.2.3 From 1359eb179bf7a94a37c51c2e735b17a49e0719a0 Mon Sep 17 00:00:00 2001 From: Mor Date: Sat, 18 Apr 2020 18:27:34 +0300 Subject: fixed c tabs and names --- src/FUN_02000DF4.c | 10 ++-- src/main.c | 166 ++++++++++++++++++++++++++--------------------------- 2 files changed, 88 insertions(+), 88 deletions(-) (limited to 'src') diff --git a/src/FUN_02000DF4.c b/src/FUN_02000DF4.c index c4532fdd..f62d1bf8 100644 --- a/src/FUN_02000DF4.c +++ b/src/FUN_02000DF4.c @@ -13,12 +13,12 @@ struct Unk2106FA0 { s32 unk14; }; -extern struct Unk2106FA0 gUnknown2106FA0; +extern struct Unk2106FA0 gBacklightTop; void FUN_02000DF4(void) { - gUnknown2106FA0.unk8 = -1; - gUnknown2106FA0.unkC = 0; - gUnknown2106FA0.unk10 = -1; - gUnknown2106FA0.unk14 = 0; + gBacklightTop.unk8 = -1; + gBacklightTop.unkC = 0; + gBacklightTop.unk10 = -1; + gBacklightTop.unk14 = 0; } diff --git a/src/main.c b/src/main.c index 844d069d..fa31dde5 100644 --- a/src/main.c +++ b/src/main.c @@ -42,8 +42,8 @@ struct Unk21C48B8 s32 unk6C; }; -extern struct Unk2106FA0 gUnknown2106FA0; -extern struct Unk2106FA0 gUnknown2106FA0_2; // same as the first one, it's referenced twice in the constant pool... +extern struct Unk2106FA0 gBacklightTop; +extern struct Unk2106FA0 gBacklightTop_2; // same as the first one, it's referenced twice in the constant pool... extern struct Unk2106FA0 gUnknown2106FB8; extern struct Unk21C48B8 gUnknown21C48B8; @@ -54,8 +54,8 @@ extern struct { u8 unk8; } gUnk021C4918; -extern void FUN_020D50D8(); -extern void FUN_020C9C0C(); +extern void PM_GetBackLight(); +extern void OS_WaitIrq(); extern void FUN_02016438(s32); extern const s32 CONST_3F; // 0x0000003F @@ -67,85 +67,85 @@ extern struct Unk21DBE18 gUnk021D76C8; void NitroMain(void) { - FUN_02016014(); - FUN_02016148(); - FUN_020163BC(); - FUN_02016438(0); + InitSystemForTheGame(); + InitGraphicMemory(); + FUN_020163BC(); + FUN_02016438(0); - FUN_020D50D8(&gUnknown2106FA0_2, 0); // should be blx please + PM_GetBackLight(&gBacklightTop_2, 0); - FUN_02022294(); - FUN_0201259C(); - FUN_02000DF4(); - FUN_02002C14(); - FUN_02002C50(0, 3); - FUN_02002C50(1, 3); - FUN_02002C50(3, 3); - gUnknown2106FA0.unk18 = -1; - gUnknown2106FA0.unk20 = FUN_0202254C(); - FUN_02003B98(FUN_02029EF8(gUnknown2106FA0.unk20), FUN_02023900(gUnknown2106FA0.unk20)); - FUN_02020AFC(); - if (FUN_020337E8(3) == 3) - FUN_02034188(3, 0); - if (FUN_020227FC(gUnknown2106FA0.unk20) == 0) - { - FUN_02089D90(0); - } - else - { - switch (gUnk027FFC20) - { - case 0: - gUnknown2106FA0.unk1C = 0; - FUN_02000E7C(&CONST_3F, &gUnk021DBE18); - break; - case 1: - gUnknown2106FA0.unk1C = 1; - FUN_02000E7C(&CONST_34, &gUnk021D76C8); - break; - default: - FUN_02020C2C(); - break; - } - } - gUnknown21C48B8.unk6C = 1; - gUnknown21C48B8.unk30 = 0; - FUN_02000FA4(); - FUN_0200A2AC(); - FUN_02015E30(); - gUnknown2106FA0.unk4 = 0; - for (;;) - { - FUN_02000EE8(); - FUN_02000FE8(); - FUN_02016464(); - if ((gUnknown21C48B8.unk38 & 0x30C) == 0x30C && !gUnk021C4918.unk8) // soft reset? - { - FUN_02000F18(0); // soft reset? - } - if (FUN_0202FB80()) - { - FUN_02000E0C(); - FUN_0201B5CC(gUnknown21C48B8.unk18); - FUN_0201B5CC(gUnknown21C48B8.unk24); - if (!gUnknown21C48B8.unk30) - { - FUN_020C9C0C(1, 1); - gUnknown21C48B8.unk2C++; - } - } - FUN_020125D4(); - FUN_02015E60(); - FUN_020222C4(); - FUN_0201B5CC(gUnknown21C48B8.unk24); - FUN_020C9C0C(1, 1); - gUnknown21C48B8.unk2C++; - gUnknown21C48B8.unk30 = 0; - FUN_0200A318(); - FUN_0200E2D8(); - if (gUnknown21C48B8.unk0) - gUnknown21C48B8.unk0(gUnknown21C48B8.unk4); - FUN_02003C10(); - FUN_0201B5CC(gUnknown21C48B8.unk20); - } + FUN_02022294(); + FUN_0201259C(); + FUN_02000DF4(); + FUN_02002C14(); + FUN_02002C50(0, 3); + FUN_02002C50(1, 3); + FUN_02002C50(3, 3); + gBacklightTop.unk18 = -1; + gBacklightTop.unk20 = FUN_0202254C(); + FUN_02003B98(FUN_02029EF8(gBacklightTop.unk20), LoadPlayerDataAddress(gBacklightTop.unk20)); + FUN_02020AFC(); + if (FUN_020337E8(3) == 3) + FUN_02034188(3, 0); + if (FUN_020227FC(gBacklightTop.unk20) == 0) + { + FUN_02089D90(0); + } + else + { + switch (gUnk027FFC20) + { + case 0: + gBacklightTop.unk1C = 0; + FUN_02000E7C(&CONST_3F, &gUnk021DBE18); + break; + case 1: + gBacklightTop.unk1C = 1; + FUN_02000E7C(&CONST_34, &gUnk021D76C8); + break; + default: + ErrorHandling(); + break; + } + } + gUnknown21C48B8.unk6C = 1; + gUnknown21C48B8.unk30 = 0; + FUN_02000FA4(); + FUN_0200A2AC(); + FUN_02015E30(); + gBacklightTop.unk4 = 0; + for (;;) + { + FUN_02000EE8(); + FUN_02000FE8(); + FUN_02016464(); + if ((gUnknown21C48B8.unk38 & 0x30C) == 0x30C && !gUnk021C4918.unk8) // soft reset? + { + FUN_02000F18(0); // soft reset? + } + if (FUN_0202FB80()) + { + FUN_02000E0C(); + FUN_0201B5CC(gUnknown21C48B8.unk18); + FUN_0201B5CC(gUnknown21C48B8.unk24); + if (!gUnknown21C48B8.unk30) + { + OS_WaitIrq(1, 1); + gUnknown21C48B8.unk2C++; + } + } + FUN_020125D4(); + FUN_02015E60(); + FUN_020222C4(); + FUN_0201B5CC(gUnknown21C48B8.unk24); + OS_WaitIrq(1, 1); + gUnknown21C48B8.unk2C++; + gUnknown21C48B8.unk30 = 0; + FUN_0200A318(); + FUN_0200E2D8(); + if (gUnknown21C48B8.unk0) + gUnknown21C48B8.unk0(gUnknown21C48B8.unk4); + FUN_02003C10(); + FUN_0201B5CC(gUnknown21C48B8.unk20); + } } \ No newline at end of file -- cgit v1.2.3 From 95090b7c1f27818f5f01d7b1da2296a6887d03a9 Mon Sep 17 00:00:00 2001 From: Mor Date: Sat, 18 Apr 2020 18:29:07 +0300 Subject: fixed struct definition indentation --- src/main.c | 62 +++++++++++++++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index fa31dde5..d703331d 100644 --- a/src/main.c +++ b/src/main.c @@ -8,38 +8,38 @@ typedef signed long s32; struct Unk2106FA0 { - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; - s32 unk20; + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; + s32 unk18; + s32 unk1C; + s32 unk20; }; struct Unk21C48B8 { - void (*unk0)(s32); - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; - s32 unk20; - s32 unk24; - s32 unk28; - s32 unk2C; - s32 unk30; - s32 unk34; - s32 unk38; - u8 filler3C[0xC]; - s32 unk48; - u8 filler4C[0x20]; - s32 unk6C; + void (*unk0)(s32); + s32 unk4; + s32 unk8; + s32 unkC; + s32 unk10; + s32 unk14; + s32 unk18; + s32 unk1C; + s32 unk20; + s32 unk24; + s32 unk28; + s32 unk2C; + s32 unk30; + s32 unk34; + s32 unk38; + u8 filler3C[0xC]; + s32 unk48; + u8 filler4C[0x20]; + s32 unk6C; }; extern struct Unk2106FA0 gBacklightTop; @@ -49,9 +49,9 @@ extern struct Unk21C48B8 gUnknown21C48B8; extern s32 gUnk027FFC20; extern struct { - s32 unk0; - s32 unk4; - u8 unk8; + s32 unk0; + s32 unk4; + u8 unk8; } gUnk021C4918; extern void PM_GetBackLight(); -- cgit v1.2.3 From d8023c624dee2afdbf05df33c33f4bcd88faa68f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 18 Apr 2020 19:36:30 -0400 Subject: include flags --- src/FUN_02000DF4.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'src') diff --git a/src/FUN_02000DF4.c b/src/FUN_02000DF4.c index c4532fdd..65bc63da 100644 --- a/src/FUN_02000DF4.c +++ b/src/FUN_02000DF4.c @@ -1,9 +1,4 @@ -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; -typedef signed char s8; -typedef signed short s16; -typedef signed long s32; +#include "nitro.h" struct Unk2106FA0 { u8 filler0[0x8]; -- cgit v1.2.3 From d866013b4e5e57f185c45ede44b38cb4d654fed4 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 20 Apr 2020 10:23:05 -0400 Subject: update mwasmarm patcher and decompile string_util.c (thanks Demki) --- src/string_util.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 src/string_util.c (limited to 'src') diff --git a/src/string_util.c b/src/string_util.c new file mode 100644 index 00000000..891d945c --- /dev/null +++ b/src/string_util.c @@ -0,0 +1,143 @@ +#include "nitro.h" + +extern u32 gPowersOfTen[]; // at 0x20ECB24 +extern u16 gDigitTable[]; // at 0x20ECB08 + +static const u16 EOS = 0xFFFF; + +void StringCopy(u16 *dest, const u16 *src) +{ + u16 c = *src; + while (c != EOS) + { + src++; + *dest = c; + c = *src; + dest++; + } + *dest = EOS; +} + +u16 *StringCopyN(u16 *dest, const u16 *src, u32 num) +{ + u32 copied = 0; + if (num > copied) + { + u16 *p = dest; + do + { + u16 c = *src; + copied++; + src++; + *p = c; + p++; + } while (num > copied); + } + return dest + num; +} + +u32 StringLength(const u16 *s) +{ + u16 c = *s; + u32 len = 0; + while (c != EOS) + { + s++; + c = *s; + len++; + } + return len; +} + +BOOL StringNotEqual(const u16 *s1, const u16 *s2) +{ + for (; *s1 == *s2; s1++, s2++) + { + if (*s1 == EOS) + return FALSE; + } + return TRUE; +} + +BOOL StringNotEqualN(const u16 *s1, const u16 *s2, u32 num) +{ + u16 c1, c2; + c2 = *s2; + c1 = *s1; + while (c1 == c2) + { + if (num == 0) + { + return FALSE; + } + if (*s1 == EOS && *s2 == EOS) + { + return FALSE; + } + s1++; + s2++; + c2 = *s2; + c1 = *s1; + num--; + } + return TRUE; +} + +u16 *StringFill(u16 *dest, u16 value, u32 num) +{ + u32 copied = 0; + if (num > copied) + { + u16 *p = dest; + do + { + copied++; + *p = value; + p++; + } while (copied < num); + } + return dest + copied; +} + +u16 *StringFillEOS(u16 *dest, u32 num) +{ + return StringFill(dest, EOS, num); +} + +enum PrintingMode +{ + NORMAL, + PAD_SPACE, + PAD_ZEROES +}; + +const u16 NON_DIGIT = 0xE2; + +u16 *ConvertUIntToDecimalString(u16 *dest, u32 value, enum PrintingMode mode, u32 n) +{ + for (u32 x = gPowersOfTen[n]; + x != 0; + x = x / 10) + { + u16 res = value / x; + value = value - x * res; + if (mode == PAD_ZEROES) + { + *dest = res >= 10 ? NON_DIGIT : gDigitTable[res]; + dest++; + } + else if (res != 0 || x == 1) + { + mode = PAD_ZEROES; + *dest = res >= 10 ? NON_DIGIT : gDigitTable[res]; + dest++; + } + else if (mode == PAD_SPACE) + { + *dest = 1; + dest++; + } + } + *dest = EOS; + return dest; +} -- cgit v1.2.3 From 388dbcaef64532c14fb94b9e649f297ffe08e221 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 20 Apr 2020 10:53:18 -0400 Subject: update string_util.c --- src/string_util.c | 51 ++++++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/string_util.c b/src/string_util.c index 891d945c..2159210d 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -1,15 +1,14 @@ #include "nitro.h" extern u32 gPowersOfTen[]; // at 0x20ECB24 -extern u16 gDigitTable[]; // at 0x20ECB08 +extern u16 gDigitTable[]; // at 0x20ECB08 static const u16 EOS = 0xFFFF; void StringCopy(u16 *dest, const u16 *src) { u16 c = *src; - while (c != EOS) - { + while (c != EOS) { src++; *dest = c; c = *src; @@ -21,11 +20,9 @@ void StringCopy(u16 *dest, const u16 *src) u16 *StringCopyN(u16 *dest, const u16 *src, u32 num) { u32 copied = 0; - if (num > copied) - { + if (num > copied) { u16 *p = dest; - do - { + do { u16 c = *src; copied++; src++; @@ -40,8 +37,7 @@ u32 StringLength(const u16 *s) { u16 c = *s; u32 len = 0; - while (c != EOS) - { + while (c != EOS) { s++; c = *s; len++; @@ -51,8 +47,7 @@ u32 StringLength(const u16 *s) BOOL StringNotEqual(const u16 *s1, const u16 *s2) { - for (; *s1 == *s2; s1++, s2++) - { + for (; *s1 == *s2; s1++, s2++) { if (*s1 == EOS) return FALSE; } @@ -64,14 +59,11 @@ BOOL StringNotEqualN(const u16 *s1, const u16 *s2, u32 num) u16 c1, c2; c2 = *s2; c1 = *s1; - while (c1 == c2) - { - if (num == 0) - { + while (c1 == c2) { + if (num == 0) { return FALSE; } - if (*s1 == EOS && *s2 == EOS) - { + if (*s1 == EOS && *s2 == EOS) { return FALSE; } s1++; @@ -86,11 +78,9 @@ BOOL StringNotEqualN(const u16 *s1, const u16 *s2, u32 num) u16 *StringFill(u16 *dest, u16 value, u32 num) { u32 copied = 0; - if (num > copied) - { + if (num > copied) { u16 *p = dest; - do - { + do { copied++; *p = value; p++; @@ -104,8 +94,7 @@ u16 *StringFillEOS(u16 *dest, u32 num) return StringFill(dest, EOS, num); } -enum PrintingMode -{ +enum PrintingMode { NORMAL, PAD_SPACE, PAD_ZEROES @@ -115,25 +104,17 @@ const u16 NON_DIGIT = 0xE2; u16 *ConvertUIntToDecimalString(u16 *dest, u32 value, enum PrintingMode mode, u32 n) { - for (u32 x = gPowersOfTen[n]; - x != 0; - x = x / 10) - { + for (u32 x = gPowersOfTen[n]; x != 0; x = x / 10) { u16 res = value / x; value = value - x * res; - if (mode == PAD_ZEROES) - { + if (mode == PAD_ZEROES) { *dest = res >= 10 ? NON_DIGIT : gDigitTable[res]; dest++; - } - else if (res != 0 || x == 1) - { + } else if (res != 0 || x == 1) { mode = PAD_ZEROES; *dest = res >= 10 ? NON_DIGIT : gDigitTable[res]; dest++; - } - else if (mode == PAD_SPACE) - { + } else if (mode == PAD_SPACE) { *dest = 1; dest++; } -- cgit v1.2.3 From 84e6fbb44f67343e587b8b5758bca0671f01bf8c Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Mon, 20 Apr 2020 13:11:51 -0400 Subject: migrate data symbols to string_util.c --- src/string_util.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/string_util.c b/src/string_util.c index 2159210d..7d755cb9 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -1,7 +1,36 @@ #include "nitro.h" -extern u32 gPowersOfTen[]; // at 0x20ECB24 -extern u16 gDigitTable[]; // at 0x20ECB08 +u16 gDigitTable[] = { + 0xA2, + 0xA3, + 0xA4, + 0xA5, + 0xA6, + 0xA7, + 0xA8, + 0xA9, + 0xAA, + 0xAB, + 0xAC, + 0xAD, + 0xAE, + 0xAF, + 0xB0, + 0xB1 +}; + +s32 gPowersOfTen[] = { + 1, + 10, + 100, + 1000, + 10000, + 100000, + 1000000, + 10000000, + 100000000, + 1000000000, +}; static const u16 EOS = 0xFFFF; @@ -104,7 +133,7 @@ const u16 NON_DIGIT = 0xE2; u16 *ConvertUIntToDecimalString(u16 *dest, u32 value, enum PrintingMode mode, u32 n) { - for (u32 x = gPowersOfTen[n]; x != 0; x = x / 10) { + for (u32 x = gPowersOfTen[n - 1]; x != 0; x = x / 10) { u16 res = value / x; value = value - x * res; if (mode == PAD_ZEROES) { -- cgit v1.2.3 From 43eb982a80c45fe26f1cbbc23285c4d8a2cc64b4 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 20 Apr 2020 20:57:00 -0400 Subject: Create include/ directory and move main.h structs there --- src/FUN_02000DF4.c | 11 ++--------- src/main.c | 45 ++------------------------------------------- src/string_util.c | 2 +- 3 files changed, 5 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/FUN_02000DF4.c b/src/FUN_02000DF4.c index 0cc1c2dd..0099480c 100644 --- a/src/FUN_02000DF4.c +++ b/src/FUN_02000DF4.c @@ -1,12 +1,5 @@ -#include "nitro.h" - -struct Unk2106FA0 { - u8 filler0[0x8]; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; -}; +#include "global.h" +#include "main.h" extern struct Unk2106FA0 gBacklightTop; diff --git a/src/main.c b/src/main.c index d703331d..bfd6c82e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,46 +1,5 @@ - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned long u32; -typedef signed char s8; -typedef signed short s16; -typedef signed long s32; - -struct Unk2106FA0 -{ - s32 unk0; - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; - s32 unk20; -}; - -struct Unk21C48B8 -{ - void (*unk0)(s32); - s32 unk4; - s32 unk8; - s32 unkC; - s32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; - s32 unk20; - s32 unk24; - s32 unk28; - s32 unk2C; - s32 unk30; - s32 unk34; - s32 unk38; - u8 filler3C[0xC]; - s32 unk48; - u8 filler4C[0x20]; - s32 unk6C; -}; +#include "global.h" +#include "main.h" extern struct Unk2106FA0 gBacklightTop; extern struct Unk2106FA0 gBacklightTop_2; // same as the first one, it's referenced twice in the constant pool... diff --git a/src/string_util.c b/src/string_util.c index 7d755cb9..8f9c96ff 100644 --- a/src/string_util.c +++ b/src/string_util.c @@ -1,4 +1,4 @@ -#include "nitro.h" +#include "global.h" u16 gDigitTable[] = { 0xA2, -- cgit v1.2.3 From b2059ca1ad5c95fb60b5502d84656aee0b1ce01e Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Tue, 21 Apr 2020 11:46:50 -0400 Subject: decompile script.c --- src/script.c | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 src/script.c (limited to 'src') diff --git a/src/script.c b/src/script.c new file mode 100644 index 00000000..e354ec9c --- /dev/null +++ b/src/script.c @@ -0,0 +1,229 @@ +#include "nitro.h" +#include "script.h" + +void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) +{ + u32 i; + + ctx->mode = 0; + ctx->scriptPtr = 0; + ctx->stackDepth = 0; + ctx->nativePtr = 0; + ctx->cmdTable = cmdTable; + ctx->cmdTableEnd = cmdTableEnd; + + for (i = 0; i < 4; i++) + ctx->data[i] = 0; + + for (i = 0; i < 20; i++) + ctx->stack[i] = 0; + + ctx->unk74 = 0; +} + +u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) +{ + ctx->scriptPtr = ptr; + ctx->mode = 1; + return 1; +} + +void SetupNativeScript(struct ScriptContext *ctx, u8 (*ptr)(void)) +{ + ctx->mode = 2; + ctx->nativePtr = ptr; +} + +void StopScript(struct ScriptContext *ctx) +{ + ctx->mode = 0; + ctx->scriptPtr = 0; +} + +void FUN_02038B6C(struct ScriptContext *ctx, int r1) +{ + ctx->unk74 = r1; +} + +extern void ErrorHandling(void); + +#ifdef NONMATCHING +u8 RunScriptCommand(struct ScriptContext *ctx) +{ + struct ScriptContext *localCtx = ctx; + + if (localCtx->mode == 0) + return FALSE; + + switch (localCtx->mode) + { + case 0: + return FALSE; + case 2: + if (localCtx->nativePtr) + { + if (localCtx->nativePtr() == TRUE) + localCtx->mode = 1; + return TRUE; + } + localCtx->mode = 1; + case 1: + while (1) + { + u16 cmdCode; + ScrCmdFunc *func; + + if (!localCtx->scriptPtr) + { + localCtx->mode = 0; + return FALSE; + } + + cmdCode = ScriptReadHalfword(localCtx); + if ((u32)localCtx->cmdTableEnd >= cmdCode) + { + ErrorHandling(); + localCtx->mode = 0; + return FALSE; + } + + func = &localCtx->cmdTable[cmdCode]; + + if ((*func)(localCtx) == 1) + break; + } + } + + return TRUE; +} +#else +u8 RunScriptCommand(struct ScriptContext *ctx) +{ + __asm { + add r4, r0, #0x0 + ldrb r1, [r4, #0x1] + cmp r1, #0x0 + bne _02038B7E + mov r0, #0x0 + pop {r4, pc} + _02038B7E: + beq _02038B8A + cmp r1, #0x1 + beq _02038BA6 + cmp r1, #0x2 + beq _02038B8E + b _02038BD8 + _02038B8A: + mov r0, #0x0 + pop {r4, pc} + _02038B8E: + ldr r1, [r4, #0x4] + cmp r1, #0x0 + beq _02038BA2 + blx r1 + cmp r0, #0x1 + bne _02038B9E + mov r0, #0x1 + strb r0, [r4, #0x1] + _02038B9E: + mov r0, #0x1 + pop {r4, pc} + _02038BA2: + mov r0, #0x1 + strb r0, [r4, #0x1] + // for some reason it adds a b _02038BA6 here + _02038BA6: + ldr r0, [r4, #0x8] + cmp r0, #0x0 + bne _02038BB2 + mov r0, #0x0 + strb r0, [r4, #0x1] + pop {r4, pc} + _02038BB2: + add r0, r4, #0x0 + bl ScriptReadHalfword + add r1, r0, #0x0 + ldr r0, [r4, #0x60] + cmp r1, r0 + blo _02038BCA + bl ErrorHandling + mov r0, #0x0 + strb r0, [r4, #0x1] + pop {r4, pc} + _02038BCA: + ldr r2, [r4, #0x5c] + lsl r1, r1, #0x2 + ldr r1, [r2, r1] + add r0, r4, #0x0 + blx r1 + cmp r0, #0x1 + bne _02038BA6 + _02038BD8: + mov r0, #0x1 + } +} +#endif + +u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) +{ + if (ctx->stackDepth + 1 >= 20) + { + return 1; + } + else + { + ctx->stack[ctx->stackDepth] = ptr; + ctx->stackDepth++; + return 0; + } +} + +const u8 *ScriptPop(struct ScriptContext *ctx) +{ + if (ctx->stackDepth == 0) + return NULL; + + ctx->stackDepth--; + return ctx->stack[ctx->stackDepth]; +} + +void ScriptJump(struct ScriptContext *ctx, const u8 *ptr) +{ + ctx->scriptPtr = ptr; +} + +void ScriptCall(struct ScriptContext *ctx, const u8 *ptr) +{ + ScriptPush(ctx, ctx->scriptPtr); + ctx->scriptPtr = ptr; +} + +void ScriptReturn(struct ScriptContext *ctx) +{ + ctx->scriptPtr = ScriptPop(ctx); +} + +u16 ScriptReadHalfword(struct ScriptContext *ctx) +{ + u16 value = *(ctx->scriptPtr++); + value += *(ctx->scriptPtr++) << 8; + return value; +} + +u32 ScriptReadWord(struct ScriptContext *ctx) +{ + u32 value0 = *(ctx->scriptPtr++); + u32 value1 = *(ctx->scriptPtr++); + u32 value2 = *(ctx->scriptPtr++); + u32 value3 = *(ctx->scriptPtr++); + u32 retVal = 0; + + retVal += value3; + retVal <<= 8; + retVal += value2; + retVal <<= 8; + retVal += value1; + retVal <<= 8; + retVal += value0; + return retVal; +} -- cgit v1.2.3 From fb6be2fb9463b1542e4cc839627b2d2d1bb0afbe Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Tue, 21 Apr 2020 12:03:53 -0400 Subject: fix various issues and NONMATCHING. Thanks Demki! --- src/script.c | 84 ++++++++---------------------------------------------------- 1 file changed, 10 insertions(+), 74 deletions(-) (limited to 'src') diff --git a/src/script.c b/src/script.c index e354ec9c..e8b8ee60 100644 --- a/src/script.c +++ b/src/script.c @@ -1,6 +1,8 @@ #include "nitro.h" #include "script.h" +u16 ScriptReadHalfword(struct ScriptContext *ctx); + void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) { u32 i; @@ -28,7 +30,7 @@ u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) return 1; } -void SetupNativeScript(struct ScriptContext *ctx, u8 (*ptr)(void)) +void SetupNativeScript(struct ScriptContext *ctx, u8 (*ptr)(struct ScriptContext *)) { ctx->mode = 2; ctx->nativePtr = ptr; @@ -47,7 +49,6 @@ void FUN_02038B6C(struct ScriptContext *ctx, int r1) extern void ErrorHandling(void); -#ifdef NONMATCHING u8 RunScriptCommand(struct ScriptContext *ctx) { struct ScriptContext *localCtx = ctx; @@ -62,7 +63,7 @@ u8 RunScriptCommand(struct ScriptContext *ctx) case 2: if (localCtx->nativePtr) { - if (localCtx->nativePtr() == TRUE) + if (localCtx->nativePtr(ctx) == TRUE) localCtx->mode = 1; return TRUE; } @@ -80,10 +81,11 @@ u8 RunScriptCommand(struct ScriptContext *ctx) } cmdCode = ScriptReadHalfword(localCtx); - if ((u32)localCtx->cmdTableEnd >= cmdCode) + u32 cmdTableEnd = (u32)localCtx->cmdTableEnd; + if (cmdCode >= cmdTableEnd) { ErrorHandling(); - localCtx->mode = 0; + localCtx->mode = 0; return FALSE; } @@ -96,73 +98,6 @@ u8 RunScriptCommand(struct ScriptContext *ctx) return TRUE; } -#else -u8 RunScriptCommand(struct ScriptContext *ctx) -{ - __asm { - add r4, r0, #0x0 - ldrb r1, [r4, #0x1] - cmp r1, #0x0 - bne _02038B7E - mov r0, #0x0 - pop {r4, pc} - _02038B7E: - beq _02038B8A - cmp r1, #0x1 - beq _02038BA6 - cmp r1, #0x2 - beq _02038B8E - b _02038BD8 - _02038B8A: - mov r0, #0x0 - pop {r4, pc} - _02038B8E: - ldr r1, [r4, #0x4] - cmp r1, #0x0 - beq _02038BA2 - blx r1 - cmp r0, #0x1 - bne _02038B9E - mov r0, #0x1 - strb r0, [r4, #0x1] - _02038B9E: - mov r0, #0x1 - pop {r4, pc} - _02038BA2: - mov r0, #0x1 - strb r0, [r4, #0x1] - // for some reason it adds a b _02038BA6 here - _02038BA6: - ldr r0, [r4, #0x8] - cmp r0, #0x0 - bne _02038BB2 - mov r0, #0x0 - strb r0, [r4, #0x1] - pop {r4, pc} - _02038BB2: - add r0, r4, #0x0 - bl ScriptReadHalfword - add r1, r0, #0x0 - ldr r0, [r4, #0x60] - cmp r1, r0 - blo _02038BCA - bl ErrorHandling - mov r0, #0x0 - strb r0, [r4, #0x1] - pop {r4, pc} - _02038BCA: - ldr r2, [r4, #0x5c] - lsl r1, r1, #0x2 - ldr r1, [r2, r1] - add r0, r4, #0x0 - blx r1 - cmp r0, #0x1 - bne _02038BA6 - _02038BD8: - mov r0, #0x1 - } -} -#endif u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) { @@ -192,10 +127,11 @@ void ScriptJump(struct ScriptContext *ctx, const u8 *ptr) ctx->scriptPtr = ptr; } -void ScriptCall(struct ScriptContext *ctx, const u8 *ptr) +u8 ScriptCall(struct ScriptContext *ctx, const u8 *ptr) { - ScriptPush(ctx, ctx->scriptPtr); + u8 ret = ScriptPush(ctx, ctx->scriptPtr); ctx->scriptPtr = ptr; + return ret; } void ScriptReturn(struct ScriptContext *ctx) -- cgit v1.2.3 From 6ceaabc28c712f82c6100f8288af66774bfdbb82 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Tue, 21 Apr 2020 12:15:56 -0400 Subject: make consistent with gen 3's version again --- src/script.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/script.c b/src/script.c index e8b8ee60..0a9a85cf 100644 --- a/src/script.c +++ b/src/script.c @@ -51,47 +51,45 @@ extern void ErrorHandling(void); u8 RunScriptCommand(struct ScriptContext *ctx) { - struct ScriptContext *localCtx = ctx; - - if (localCtx->mode == 0) + if (ctx->mode == 0) return FALSE; - switch (localCtx->mode) + switch (ctx->mode) { case 0: return FALSE; case 2: - if (localCtx->nativePtr) + if (ctx->nativePtr) { - if (localCtx->nativePtr(ctx) == TRUE) - localCtx->mode = 1; + if (ctx->nativePtr(ctx) == TRUE) + ctx->mode = 1; return TRUE; } - localCtx->mode = 1; + ctx->mode = 1; case 1: while (1) { u16 cmdCode; ScrCmdFunc *func; - if (!localCtx->scriptPtr) + if (!ctx->scriptPtr) { - localCtx->mode = 0; + ctx->mode = 0; return FALSE; } - cmdCode = ScriptReadHalfword(localCtx); - u32 cmdTableEnd = (u32)localCtx->cmdTableEnd; + cmdCode = ScriptReadHalfword(ctx); + u32 cmdTableEnd = (u32)ctx->cmdTableEnd; if (cmdCode >= cmdTableEnd) { ErrorHandling(); - localCtx->mode = 0; + ctx->mode = 0; return FALSE; } - func = &localCtx->cmdTable[cmdCode]; + func = &ctx->cmdTable[cmdCode]; - if ((*func)(localCtx) == 1) + if ((*func)(ctx) == 1) break; } } -- cgit v1.2.3 From 60afa5c0b4ec79efa583540f078ccd3fbd09f155 Mon Sep 17 00:00:00 2001 From: red031000 Date: Tue, 21 Apr 2020 19:03:27 +0100 Subject: simplify includes --- src/script.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/script.c b/src/script.c index 0a9a85cf..7a7ae894 100644 --- a/src/script.c +++ b/src/script.c @@ -1,4 +1,4 @@ -#include "nitro.h" +#include "global.h" #include "script.h" u16 ScriptReadHalfword(struct ScriptContext *ctx); -- cgit v1.2.3