diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/debug/start_menu_debug.c | 169 |
1 files changed, 38 insertions, 131 deletions
diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c index f64de18e9..0520e7118 100644 --- a/src/debug/start_menu_debug.c +++ b/src/debug/start_menu_debug.c @@ -344,7 +344,15 @@ extern const u8 Str_839BD2C[]; extern const u8 Str_839BD4C[]; static u8 gUnknown_030006B8; -UNUSED static const s32 * gUnknown_030006BC; + +struct DebugBuildDateInfo { + s32 max; + s32 digitMultiplier; + s32 numDigits; + s32 offset; +}; + +static const struct DebugBuildDateInfo *gDebugBuildDate; static u8 gUnknown_030006C0; static u8 gUnknown_030006C1; static const u8 * gUnknown_030006C4; @@ -1380,144 +1388,43 @@ u8 DebugMenu_8077C14(void) const u8 Str_839BFDC[] = DTR(" じかん ふん びょう", " HOURS MINUTES SECONDS"); -const s32 gUnknown_Debug_839BFE8[] = { - 99, 10, 2, 23, - 99, 10, 2, 26 +static const struct DebugBuildDateInfo gDebugBuildDateInfo[] = { + { 99, 10, 2, 23 }, + { 99, 10, 2, 26 } }; -#ifdef NONMATCHING -void DebugMenu_8077C3C(const char * a0, u8 * a1) +// Parses the version code in a highly inefficient and unsafe way. +void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out) { - // Register allocation swap - // Intended: r7 = a1, r6 = gUnknown_030006BC[2] - // Observed: r6 = a1, r7 = gUnknown_030006BC[2] - int i; - - gUnknown_030006BC = gUnknown_Debug_839BFE8; - *a1++ = CHAR_SPACE; - *a1++ = CHAR_SPACE; - - for (i = 0; i < 2; i++, gUnknown_030006BC += 4) - { - u32 r5 = 0; - int r2; - int r4; - for (r2 = gUnknown_030006BC[1], r4 = 0; r4 < gUnknown_030006BC[2]; r4++, r2 /= 10) - r5 += (a0[gUnknown_030006BC[3] + r4] - '0') * r2; - if (gUnknown_030006BC[0] < r5) - r5 = gUnknown_030006BC[0]; - a1 = ConvertIntToDecimalStringN(a1, r5, STR_CONV_MODE_LEADING_ZEROS, gUnknown_030006BC[2]); - } - a1[0] = a0[29] - 'A' + CHAR_A; - if (a1[0] > 0xf6) - a1[0] = 0xf6; - a1[1] = EOS; -} -#else -NAKED void DebugMenu_8077C3C(const char * a0, u8 * a1) -{ - asm("\tpush\t{r4, r5, r6, r7, lr}\n" - "\tmov\tr7, sl\n" - "\tmov\tr6, r9\n" - "\tmov\tr5, r8\n" - "\tpush\t{r5, r6, r7}\n" - "\tadd\tsp, sp, #0xfffffffc\n" - "\tmov\tsl, r0\n" - "\tadd\tr7, r1, #0\n" - "\tldr\tr0, ._271 @ gUnknown_030006BC\n" - "\tldr\tr1, ._271 + 4 @ gUnknown_Debug_839BFE8\n" - "\tstr\tr1, [r0]\n" - "\tmov\tr1, #0x0\n" - "\tstrb\tr1, [r7]\n" - "\tadd\tr7, r7, #0x1\n" - "\tstrb\tr1, [r7]\n" - "\tadd\tr7, r7, #0x1\n" - "\tmov\tr3, #0x0\n" - "\tmov\tr8, r0\n" - "._269:\n" - "\tmov\tr5, #0x0\n" - "\tldr\tr1, ._271 @ gUnknown_030006BC\n" - "\tldr\tr0, [r1]\n" - "\tldr\tr2, [r0, #0x4]\n" - "\tmov\tr4, #0x0\n" - "\tldr\tr1, [r0, #0x8]\n" - "\tadd\tr3, r3, #0x1\n" - "\tmov\tr9, r3\n" - "\tcmp\tr5, r1\n" - "\tbge\t._266\t@cond_branch\n" - "\tadd\tr3, r0, #0\n" - "\tadd\tr6, r1, #0\n" - "._267:\n" - "\tldr\tr0, [r3, #0xc]\n" - "\tadd\tr0, r0, r4\n" - "\tadd r0, r0, sl\n" - "\tldrb\tr0, [r0]\n" - "\tsub\tr0, r0, #0x30\n" - "\tmul\tr0, r0, r2\n" - "\tadd\tr5, r5, r0\n" - "\tadd\tr4, r4, #0x1\n" - "\tadd\tr0, r2, #0\n" - "\tmov\tr1, #0xa\n" - "\tstr\tr3, [sp]\n" - "\tbl\t__divsi3\n" - "\tadd\tr2, r0, #0\n" - "\tldr\tr3, [sp]\n" - "\tcmp\tr4, r6\n" - "\tblt\t._267\t@cond_branch\n" - "._266:\n" - "\tmov\tr0, r8\n" - "\tldr\tr1, [r0]\n" - "\tldr\tr0, [r1]\n" - "\tcmp\tr0, r5\n" - "\tbcs\t._268\t@cond_branch\n" - "\tadd\tr5, r0, #0\n" - "._268:\n" - "\tldrb\tr3, [r1, #0x8]\n" - "\tadd\tr0, r7, #0\n" - "\tadd\tr1, r5, #0\n" - "\tmov\tr2, #0x2\n" - "\tbl\tConvertIntToDecimalStringN\n" - "\tadd\tr7, r0, #0\n" - "\tmov\tr3, r9\n" - "\tmov\tr1, r8\n" - "\tldr\tr0, [r1]\n" - "\tadd\tr0, r0, #0x10\n" - "\tstr\tr0, [r1]\n" - "\tcmp\tr3, #0x1\n" - "\tble\t._269\t@cond_branch\n" - "\tmov\tr1, sl\n" - "\tldrb\tr0, [r1, #0x1d]\n" - "\tadd\tr0, r0, #0x7a\n" - "\tstrb\tr0, [r7]\n" - "\tlsl\tr0, r0, #0x18\n" - "\tlsr\tr0, r0, #0x18\n" - "\tcmp\tr0, #0xf6\n" - "\tbls\t._270\t@cond_branch\n" - "\tmov\tr0, #0xf6\n" - "\tstrb\tr0, [r7]\n" - "._270:\n" - "\tmov\tr0, #0xff\n" - "\tstrb\tr0, [r7, #0x1]\n" - "\tadd\tsp, sp, #0x4\n" - "\tpop\t{r3, r4, r5}\n" - "\tmov\tr8, r3\n" - "\tmov\tr9, r4\n" - "\tmov\tsl, r5\n" - "\tpop\t{r4, r5, r6, r7}\n" - "\tpop\t{r0}\n" - "\tbx\tr0\n" - "._272:\n" - "\t.align\t2, 0\n" - "._271:\n" - "\t.word\tgUnknown_030006BC \n" - "\t.word\tgUnknown_Debug_839BFE8\n"); + // Prevents register allocation swap + // Intended: r7 = out, r6 = gDebugBuildDate->numDigits + // Observed: r6 = out, r7 = gDebugBuildDate->numDigits + asm(""); + + gDebugBuildDate = gDebugBuildDateInfo; + *out++ = CHAR_SPACE; + *out++ = CHAR_SPACE; + for (i = 0; i < 2; i++, gDebugBuildDate++) + { + int j; + int mul; + u32 date = 0; + for (mul = gDebugBuildDate->digitMultiplier, j = 0; j < gDebugBuildDate->numDigits; j++, mul /= 10) + date += (buildDateStr[gDebugBuildDate->offset + j] - '0') * mul; + if (gDebugBuildDate->max < date) + date = gDebugBuildDate->max; + out = ConvertIntToDecimalStringN(out, date, STR_CONV_MODE_LEADING_ZEROS, gDebugBuildDate->numDigits); + } + out[0] = buildDateStr[29] - 'A' + CHAR_A; + if (out[0] > 0xf6) // prevent special characters + out[0] = 0xf6; + out[1] = EOS; } -#endif void debug_sub_8077CF4(u8 x, u8 y) { - DebugMenu_8077C3C(BuildDateTime, gStringVar4); + DebugMenu_ConvertBuildDate(BuildDateTime, gStringVar4); Menu_PrintText(gStringVar4, x, y); } |