diff --git a/README.md b/README.md index b3e45f58..0e610c43 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of May 13, 2025, this is our current score: +As of May 14, 2025, this is our current score: -    Decomp progress: 87.49% +    Decomp progress: 87.61%     Documentation progress: 56.95% @@ -117,13 +117,13 @@ s32 is_drumstick_unlocked(void) { ``` -As of May 13, 2025, this is our current score: +As of May 14, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 87.49% Complete (88.41% NON_MATCHING) --------------- - # Decompiled functions: 1892 - # GLOBAL_ASM remaining: 59 + --------------- 87.61% Complete (88.53% NON_MATCHING) --------------- + # Decompiled functions: 1893 + # GLOBAL_ASM remaining: 58 # NON_MATCHING functions: 6 # NON_EQUIVALENT WIP functions: 18 ---------------------------- Game Status ---------------------------- diff --git a/src/printf.c b/src/printf.c index 3a41d800..4aecec4c 100644 --- a/src/printf.c +++ b/src/printf.c @@ -350,91 +350,87 @@ UNUSED s32 debug_text_width(const char *format, ...) { return stringLength; } -#ifdef NON_EQUIVALENT -s32 func_800B653C(Gfx **dList, char *buffer) { - char *bufferSave; - s32 var_a1; +s32 func_800B653C(Gfx **dList, u8 *buffer) { + u8 *bufferCopy; s32 xOffset; - char *nextBuffer; - char red; - char green; - char blue; - char alpha; + u8 red; + u8 green; + u8 blue; + u8 alpha; + u8 bufferValue; - bufferSave = buffer; - nextBuffer = buffer + 1; - while (*buffer != NULL) { + bufferCopy = buffer; + bufferValue = *buffer; + buffer++; + while (bufferValue != NULL) { xOffset = 0; - if (*buffer >= 11) { - if (*buffer >= 0x21) { - switch (*buffer) { - case 0x83: - D_80127CB4 = 0; - break; - case 0x84: - D_80127CB4 = 1; - break; - case 0x81: - red = *nextBuffer++; - green = *nextBuffer++; - blue = *nextBuffer++; - alpha = *nextBuffer++; - if (gDebugTextOn) { - gDPSetEnvColor((*dList)++, red, green, blue, alpha); - } - break; - case 0x85: - red = *nextBuffer++; - green = *nextBuffer++; - blue = *nextBuffer++; - alpha = *nextBuffer++; - if (!gDebugTextOn) { - gDPSetPrimColor((*dList)++, 0, 0, red, green, blue, alpha); - } - break; - case 0x82: - if (!gDebugTextOn) { - debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); - } - gDebugTextX = *nextBuffer++; - gDebugTextX |= *nextBuffer++ << 8; - gDebugTextY = *nextBuffer++; - gDebugTextY |= *nextBuffer++ << 8; - D_80127CB0 = gDebugTextX; - D_80127CB2 = gDebugTextY; - break; + switch (bufferValue) { + case 0x83: + D_80127CB4 = 0; + break; + case 0x84: + D_80127CB4 = 1; + break; + case 0x81: + red = buffer[0]; + green = buffer[1]; + blue = buffer[2]; + alpha = buffer[3]; + buffer += 4; + if (gDebugTextOn) { + gDPSetEnvColor((*dList)++, red, green, blue, alpha); } - } else { + break; + case 0x85: + red = buffer[0]; + green = buffer[1]; + blue = buffer[2]; + alpha = buffer[3]; + buffer += 4; + if (!gDebugTextOn) { + gDPSetPrimColor((*dList)++, 0, 0, red, green, blue, alpha); + } + break; + case 0x82: + if (!gDebugTextOn) { + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); + } + gDebugTextX = buffer[0]; + gDebugTextX |= buffer[1] << 8; + gDebugTextY = buffer[2]; + gDebugTextY |= buffer[3] << 8; + D_80127CB0 = gDebugTextX; + D_80127CB2 = gDebugTextY; + buffer += 4; + break; + case 0x20: xOffset = 6; - if (*buffer != 0x20) { - xOffset = debug_text_character(dList, *buffer); + break; + case 10: + if (!gDebugTextOn) { + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); } - } - } else { - switch (*buffer) { - case 10: - if (!gDebugTextOn) { - debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); - } - debug_text_newline(); - D_80127CB0 = gDebugTextX; - D_80127CB2 = gDebugTextY; - break; - case 9: - if (!(gDebugTextX % 32)) { - xOffset = 32; - } else { - xOffset = 32 - (gDebugTextX % 32); - } - break; - } + debug_text_newline(); + D_80127CB0 = gDebugTextX; + D_80127CB2 = gDebugTextY; + break; + case 9: + if (!(gDebugTextX % 32)) { + xOffset = 32; + } else { + xOffset = 32 - (gDebugTextX % 32); + } + break; + default: + xOffset = debug_text_character(dList, bufferValue); + break; } - var_a1 = gDebugScreenWidth - 16; - if (D_80127CB4 != 0 && *buffer >= 32 && *buffer < 0x80) { + + if (D_80127CB4 != 0 && bufferValue >= 32 && bufferValue < 0x80) { xOffset = 7; } gDebugTextX += xOffset; - if (var_a1 < gDebugTextX) { + if ((gDebugScreenWidth - 16) < gDebugTextX) { if (!gDebugTextOn) { debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); } @@ -442,13 +438,12 @@ s32 func_800B653C(Gfx **dList, char *buffer) { D_80127CB0 = gDebugTextX; D_80127CB2 = gDebugTextY; } - *buffer = *nextBuffer++; + bufferValue = *buffer; + buffer++; } - return nextBuffer - bufferSave; + + return buffer - bufferCopy; } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/printf/func_800B653C.s") -#endif /** * Render the background for the debug text. diff --git a/src/printf.h b/src/printf.h index e8592a6c..4bc1e47a 100644 --- a/src/printf.h +++ b/src/printf.h @@ -58,7 +58,7 @@ void debug_text_bounds(void); void debug_text_origin(void); void debug_text_newline(void); -s32 func_800B653C(Gfx**, char*); +s32 func_800B653C(Gfx**, u8*); int vsprintf(char *s, const char *fmt, ...); #endif