From 4b97511982ecdecbac166218b86e786c5cb6718b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 25 Apr 2020 21:00:56 -0400 Subject: Split arm9 compilation to subdir --- arm9/src/FUN_02000DF4.c | 12 ++++ arm9/src/main.c | 110 ++++++++++++++++++++++++++++++++ arm9/src/script.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ arm9/src/string_util.c | 153 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 438 insertions(+) create mode 100644 arm9/src/FUN_02000DF4.c create mode 100644 arm9/src/main.c create mode 100644 arm9/src/script.c create mode 100644 arm9/src/string_util.c (limited to 'arm9/src') diff --git a/arm9/src/FUN_02000DF4.c b/arm9/src/FUN_02000DF4.c new file mode 100644 index 00000000..0099480c --- /dev/null +++ b/arm9/src/FUN_02000DF4.c @@ -0,0 +1,12 @@ +#include "global.h" +#include "main.h" + +extern struct Unk2106FA0 gBacklightTop; + +void FUN_02000DF4(void) +{ + gBacklightTop.unk8 = -1; + gBacklightTop.unkC = 0; + gBacklightTop.unk10 = -1; + gBacklightTop.unk14 = 0; +} diff --git a/arm9/src/main.c b/arm9/src/main.c new file mode 100644 index 00000000..bfd6c82e --- /dev/null +++ b/arm9/src/main.c @@ -0,0 +1,110 @@ +#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... +extern struct Unk2106FA0 gUnknown2106FB8; +extern struct Unk21C48B8 gUnknown21C48B8; + +extern s32 gUnk027FFC20; +extern struct { + s32 unk0; + s32 unk4; + u8 unk8; +} gUnk021C4918; + +extern void PM_GetBackLight(); +extern void OS_WaitIrq(); +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) +{ + InitSystemForTheGame(); + InitGraphicMemory(); + FUN_020163BC(); + FUN_02016438(0); + + 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); + 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 diff --git a/arm9/src/script.c b/arm9/src/script.c new file mode 100644 index 00000000..7a7ae894 --- /dev/null +++ b/arm9/src/script.c @@ -0,0 +1,163 @@ +#include "global.h" +#include "script.h" + +u16 ScriptReadHalfword(struct ScriptContext *ctx); + +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)(struct ScriptContext *)) +{ + 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); + +u8 RunScriptCommand(struct ScriptContext *ctx) +{ + if (ctx->mode == 0) + return FALSE; + + switch (ctx->mode) + { + case 0: + return FALSE; + case 2: + if (ctx->nativePtr) + { + if (ctx->nativePtr(ctx) == TRUE) + ctx->mode = 1; + return TRUE; + } + ctx->mode = 1; + case 1: + while (1) + { + u16 cmdCode; + ScrCmdFunc *func; + + if (!ctx->scriptPtr) + { + ctx->mode = 0; + return FALSE; + } + + cmdCode = ScriptReadHalfword(ctx); + u32 cmdTableEnd = (u32)ctx->cmdTableEnd; + if (cmdCode >= cmdTableEnd) + { + ErrorHandling(); + ctx->mode = 0; + return FALSE; + } + + func = &ctx->cmdTable[cmdCode]; + + if ((*func)(ctx) == 1) + break; + } + } + + return TRUE; +} + +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; +} + +u8 ScriptCall(struct ScriptContext *ctx, const u8 *ptr) +{ + u8 ret = ScriptPush(ctx, ctx->scriptPtr); + ctx->scriptPtr = ptr; + return ret; +} + +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; +} diff --git a/arm9/src/string_util.c b/arm9/src/string_util.c new file mode 100644 index 00000000..8f9c96ff --- /dev/null +++ b/arm9/src/string_util.c @@ -0,0 +1,153 @@ +#include "global.h" + +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; + +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 - 1]; 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