diff --git a/Makefile b/Makefile index 53afa224..5c102e1a 100755 --- a/Makefile +++ b/Makefile @@ -256,6 +256,12 @@ $(BUILD_DIR)/$(LIBULTRA_DIR)/src/audio/env.c.o: MIPSISET := -mips1 $(BUILD_DIR)/$(LIBULTRA_DIR)/%.c.o: CC_WARNINGS := -w $(BUILD_DIR)/$(LIBULTRA_DIR)/%.c.o: CC_CHECK := : +ifeq ($(COMPILER),ido) +# Allow dollar sign to be used in var names for this file alone +# It allows us to return the current stack pointer +$(BUILD_DIR)/$(SRC_DIR)/get_stack_pointer.c.o: OPT_FLAGS += -dollar +endif + ### Targets ifeq ($(COMPILER),gcc) diff --git a/README.md b/README.md index 95735154..e9cb68d9 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ 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 April 23, 2025, this is our current score: +As of April 24, 2025, this is our current score:     Decomp progress: 80.40% -    Documentation progress: 53.78% +    Documentation progress: 53.79% --- @@ -117,12 +117,12 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 23, 2025, this is our current score: +As of April 24, 2025, this is our current score: ``` ======================================================== ADVENTURE ONE (ASM -> C Decompilation) -------- 80.40% Complete (82.97% NON_MATCHING) --------- - # Decompiled functions: 1858 + # Decompiled functions: 1859 # GLOBAL_ASM remaining: 92 # NON_MATCHING functions: 12 # NON_EQUIVALENT WIP functions: 31 @@ -133,9 +133,9 @@ As of April 23, 2025, this is our current score: We are racing in the rematch against Smokey. (Lap 1/3) ======================================================== ADVENTURE TWO (Cleanup & Documentation) - ------------------- 53.78% Complete -------------------- - # Documented functions: 1136 - # Undocumented remaining: 517 + ------------------- 53.79% Complete -------------------- + # Documented functions: 1138 + # Undocumented remaining: 516 --------------------- Game Status ---------------------- Balloons: 26/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 diff --git a/src/camera.c b/src/camera.c index c6077f6f..2b350f0a 100644 --- a/src/camera.c +++ b/src/camera.c @@ -224,6 +224,7 @@ s32 get_viewport_count(void) { /** * Return the index of the active view. * 0-3 is players 1-4, and 4-7 is the same, but with 4 added on for cutscenes. + * Official Name: camGetMode */ s32 get_current_viewport(void) { return gActiveCameraID; diff --git a/src/game.c b/src/game.c index e2cb9dbe..9a0f8589 100644 --- a/src/game.c +++ b/src/game.c @@ -640,6 +640,7 @@ u8 get_current_level_race_type(void) { /** * Return the header data of the current level. + * Official Name: levelGetLevel */ LevelHeader *get_current_level_header(void) { return gCurrentLevelHeader; diff --git a/src/get_stack_pointer.c b/src/get_stack_pointer.c new file mode 100644 index 00000000..3b88af35 --- /dev/null +++ b/src/get_stack_pointer.c @@ -0,0 +1,21 @@ +#include "memory.h" + +#ifdef __sgi +/** + * Uses IDO specific -dollar compiler flag to get the current stack pointer. + * Official Name: diCpuTraceCurrentStack + */ +StackInfo *stack_pointer(void) { + return (StackInfo *) __$sp; +} +#else +/** + * Uses GCC specific code to get the current stack pointer. + * Official Name: diCpuTraceCurrentStack + */ +StackInfo *stack_pointer(void) { + register StackInfo *sp; + asm volatile ("move %0, $sp\n": "=r"(sp)); + return sp; +} +#endif diff --git a/src/hasm/get_stack_pointer.s b/src/hasm/get_stack_pointer.s deleted file mode 100644 index 73663d65..00000000 --- a/src/hasm/get_stack_pointer.s +++ /dev/null @@ -1,15 +0,0 @@ -.include "macro.inc" - -/* assembler directives */ -.set noat /* allow manual use of $at */ -.set noreorder /* don't insert nops after branches */ -.set gp=64 /* allow use of 64-bit general purpose registers */ - -.section .text, "ax" - -/* Generated by spimdisasm 1.30.0 */ - -leaf stack_pointer -jr $ra -or $v0, $sp, $zero -.end stack_pointer diff --git a/src/memory.c b/src/memory.c index 614fb05d..647a51e8 100644 --- a/src/memory.c +++ b/src/memory.c @@ -290,7 +290,6 @@ void mempool_free_queue_clear(void) { /** * Searches the memory pools for a slot matching the given address. * If a slot is found, free it. - * Official name: heapFree */ void mempool_free_addr(u8 *address) { s32 slotIndex; @@ -499,6 +498,7 @@ void mempool_slot_clear(MemoryPools poolIndex, s32 slotIndex) { /** * Return the address of the first slot of a given memory pool. + * Official Name: mmGetSlotPtr */ UNUSED MemoryPoolSlot *get_memory_pool_address(MemoryPools poolIndex) { return gMemoryPools[poolIndex].slots; diff --git a/src/objects.c b/src/objects.c index 4a49d132..7fbc2315 100644 --- a/src/objects.c +++ b/src/objects.c @@ -287,7 +287,7 @@ s32 D_8011AED4; s16 gTajChallengeType; Object *(*gCameraObjList)[CAMCONTROL_COUNT]; // Camera objects with a maximum of 20 s32 gCameraObjCount; // The number of camera objects in the above list -Object *(*gRacers)[10]; +Object *(*gRacers)[10]; // Official Name: playerlist // Similar to gRacers, but sorts the pointer by the players' current position in the race. Object **gRacersByPosition; // Similar to gRacers, but sorts the pointer by controller ports 1-4, then CPUs. @@ -5007,6 +5007,7 @@ s32 get_checkpoint_count(void) { /** * Returns the group of racer objects. + * Official Name: objGetPlayerlist */ Object **get_racer_objects(s32 *numRacers) { *numRacers = gNumRacers; diff --git a/src/thread0_epc.c b/src/thread0_epc.c index 6eb6e9e6..edb1edf4 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -10,6 +10,7 @@ #include "game.h" #include "stacks.h" #include "PR/os_internal_thread.h" +#include "PRinternal/rmonint.h" /************ .rodata ************/ @@ -49,14 +50,15 @@ void thread0_create(void) { /** * Main thread for the epc lockup screen. Thread 0. + * Official Name: diCpuThread */ void thread0_Main(UNUSED void *unused) { s32 sp34; s32 s0 = 0; osCreateMesgQueue(&D_80129790, D_801297A8, ARRAY_COUNT(D_801297A8)); - osSetEventMesg(OS_EVENT_FAULT, &D_80129790, (OSMesg) 8); - osSetEventMesg(OS_EVENT_CPU_BREAK, &D_80129790, (OSMesg) 2); + osSetEventMesg(OS_EVENT_FAULT, &D_80129790, (OSMesg) RMON_MESG_FAULT); + osSetEventMesg(OS_EVENT_CPU_BREAK, &D_80129790, (OSMesg) RMON_MESG_CPU_BREAK); osCreatePiManager(150, &D_801297E8, D_801297C8, ARRAY_COUNT(D_801297C8)); while (1) { @@ -66,11 +68,11 @@ void thread0_Main(UNUSED void *unused) { continue; } s0 |= sp34; - if ((s0 & 8) == 0 && (s0 & 2) == 0) { + if (!(s0 & RMON_MESG_FAULT) && !(s0 & RMON_MESG_CPU_BREAK)) { continue; } #endif - s0 &= ~8; + s0 &= ~RMON_MESG_FAULT; stubbed_printf(">fault< "); enable_interupts_on_main(); stop_all_threads_except_main(); @@ -279,7 +281,7 @@ void render_epc_lock_up_display(void) { gObjectStackTrace[OBJECT_SPAWN] = gEpcInfo.objectStackTrace[OBJECT_SPAWN]; gObjectStackTrace[OBJECT_UPDATE] = gEpcInfo.objectStackTrace[OBJECT_UPDATE]; gObjectStackTrace[OBJECT_DRAW] = gEpcInfo.objectStackTrace[OBJECT_DRAW]; - if (((u32 *) gEpcInfo.objectStackTrace)[-4] == -1U) { // TODO: find better solution + if (gEpcInfo.unk128[-2] == -1U) { // TODO: find better solution. This should be gEpcInfo.cause render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); render_printf(" cause\t\tmmAlloc(%d,0x%8x)\n", GET_REG(a0), GET_REG(a1)); for (i = 0; i < 3; i++) { diff --git a/src/thread0_epc.h b/src/thread0_epc.h index d24bdbcd..61eb37f3 100644 --- a/src/thread0_epc.h +++ b/src/thread0_epc.h @@ -52,8 +52,7 @@ typedef struct epcInfo { /* 0x11C */ s32 epc; /* 0x120 */ s32 cause; /* 0x124 */ s32 badvaddr; -/* 0x128 */ s32 unk128; -/* 0x12C */ s32 unk12C; +/* 0x128 */ u32 unk128[2]; /* 0x130 */ f32 objectStackTrace[3]; /* 0x13C */ u8 pad13C[0x74]; } epcInfo; diff --git a/src/tracks.c b/src/tracks.c index c5d931a3..e828c9b4 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -3503,6 +3503,7 @@ void func_800304C8(Vec4f *arg0) { /** * Instantly update current fog properties. + * Official Name: trackSetFog */ void set_fog(s32 fogIdx, s16 near, s16 far, u8 red, u8 green, u8 blue) { s32 tempNear; @@ -3545,6 +3546,7 @@ void set_fog(s32 fogIdx, s16 near, s16 far, u8 red, u8 green, u8 blue) { /** * Writes the current fog settings to the arguments. * Pre-shifts the data, so the raw values are correct. + * Official Name: trackGetFog */ void get_fog_settings(s32 playerID, s16 *near, s16 *far, u8 *r, u8 *g, u8 *b) { *near = gFogData[playerID].fog.near >> 16; @@ -3557,6 +3559,7 @@ void get_fog_settings(s32 playerID, s16 *near, s16 *far, u8 *r, u8 *g, u8 *b) { /** * Sets the fog of the player ID to the default values. * Current fog attributes are rightshifted 16 bytes. + * Official Name: trackSetFogOff */ void reset_fog(s32 playerID) { gFogData[playerID].addFog.near = 0; @@ -3615,6 +3618,7 @@ void apply_fog(s32 playerID) { * Sets the active viewport's fog target when passed through. * Used in courses to make less, or more dense. * @bug: Timer doesn't account for PAL, meaning fog will scroll 20% slower on PAL systems. + * Official Name: trackChangeFog */ void obj_loop_fogchanger(Object *obj) { s32 nearTemp; @@ -3708,6 +3712,7 @@ void obj_loop_fogchanger(Object *obj) { /** * Set the fog properties from the current values to the target, over a time specified by switchTimer. * @bug: Timer doesn't account for PAL, meaning fog will scroll 20% slower on PAL systems. + * Official Name: trackFadeFog */ void slowly_change_fog(s32 fogIdx, s32 red, s32 green, s32 blue, s32 near, s32 far, s32 switchTimer) { s32 temp; diff --git a/src/waves.c b/src/waves.c index 56b261b4..80e9adae 100644 --- a/src/waves.c +++ b/src/waves.c @@ -948,7 +948,7 @@ void func_800BA8E4(Gfx **dList, MatrixS **mtx, s32 arg2) { s32 var_t0; ObjectTransform spE4; LevelModel_Alternate *spE0; - s32 i; // spDC + s32 i; TextureHeader *tex1; TextureHeader *tex2; diff --git a/src/weather.c b/src/weather.c index 5548348b..67d334a7 100644 --- a/src/weather.c +++ b/src/weather.c @@ -852,6 +852,7 @@ void rain_set(s32 lightningFrequency, s32 opacity, f32 time) { /** * If it's currently raining, update the fog levels to match the intensity of the storm. + * Official Name: rainSetFog */ void rain_fog(void) { s32 a, b; diff --git a/ver/splat/dkr.jpn.v79.yaml b/ver/splat/dkr.jpn.v79.yaml index 854b6fdf..d7dc18b4 100644 --- a/ver/splat/dkr.jpn.v79.yaml +++ b/ver/splat/dkr.jpn.v79.yaml @@ -95,7 +95,7 @@ segments: - [0xB5B40, c, printf] - [0xB8140, c, ../libultra/src/debug/assert] - [0xB8150, c, thread0_epc] - - [0xB8F10, hasm, hasm/get_stack_pointer] + - [0xB8F10, c, get_stack_pointer] - [0xB8F20, c, waves] - [0xC1370, c, fade_transition] - [0xC3BF0, c, game_text] diff --git a/ver/splat/dkr.pal.v77.yaml b/ver/splat/dkr.pal.v77.yaml index c8961014..fa473994 100644 --- a/ver/splat/dkr.pal.v77.yaml +++ b/ver/splat/dkr.pal.v77.yaml @@ -95,7 +95,7 @@ segments: - [0xB55D0, c, printf] - [0xB7BD0, c, ../libultra/src/debug/assert] - [0xB7BE0, c, thread0_epc] - - [0xB89A0, hasm, hasm/get_stack_pointer] + - [0xB89A0, c, get_stack_pointer] - [0xB89B0, c, waves] - [0xC0E00, c, fade_transition] - [0xC3680, c, game_text] diff --git a/ver/splat/dkr.pal.v80.yaml b/ver/splat/dkr.pal.v80.yaml index e2577302..9e9c77b8 100644 --- a/ver/splat/dkr.pal.v80.yaml +++ b/ver/splat/dkr.pal.v80.yaml @@ -95,7 +95,7 @@ segments: - [0xB5B30, c, printf] - [0xB8130, c, ../libultra/src/debug/assert] - [0xB8140, c, thread0_epc] - - [0xB8EC0, hasm, hasm/get_stack_pointer] + - [0xB8EC0, c, get_stack_pointer] - [0xB8ED0, c, waves] - [0xC1320, c, fade_transition] - [0xC3BA0, c, game_text] diff --git a/ver/splat/dkr.us.v77.yaml b/ver/splat/dkr.us.v77.yaml index e006a99f..6e2a76e0 100644 --- a/ver/splat/dkr.us.v77.yaml +++ b/ver/splat/dkr.us.v77.yaml @@ -95,7 +95,7 @@ segments: - [0xB5540, c, printf] - [0xB7B40, c, ../libultra/src/debug/assert] - [0xB7B50, c, thread0_epc] - - [0xB8910, hasm, hasm/get_stack_pointer] + - [0xB8910, c, get_stack_pointer] - [0xB8920, c, waves] - [0xC0D70, c, fade_transition] - [0xC35F0, c, game_text] diff --git a/ver/splat/dkr.us.v80.yaml b/ver/splat/dkr.us.v80.yaml index f3080a2f..45295de7 100644 --- a/ver/splat/dkr.us.v80.yaml +++ b/ver/splat/dkr.us.v80.yaml @@ -95,7 +95,7 @@ segments: - [0xB5AA0, c, printf] - [0xB80A0, c, ../libultra/src/debug/assert] - [0xB80B0, c, thread0_epc] - - [0xB8E30, hasm, hasm/get_stack_pointer] + - [0xB8E30, c, get_stack_pointer] - [0xB8E40, c, waves] - [0xC1290, c, fade_transition] - [0xC3B10, c, game_text]