diff --git a/.github/workflows/VerifyAllVersions.yml b/.github/workflows/VerifyAllVersions.yml index 96c04499..05d8a235 100644 --- a/.github/workflows/VerifyAllVersions.yml +++ b/.github/workflows/VerifyAllVersions.yml @@ -7,7 +7,7 @@ on: branches: [master] jobs: - verify-build: + verify-all-versions: runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index f67ad5a5..3e042e97 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ 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 7, 2025, this is our current score: +As of May 9, 2025, this is our current score:     Decomp progress: 85.73% @@ -117,7 +117,7 @@ s32 is_drumstick_unlocked(void) { ``` -As of May 7, 2025, this is our current score: +As of May 9, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) @@ -125,7 +125,7 @@ As of May 7, 2025, this is our current score: # Decompiled functions: 1883 # GLOBAL_ASM remaining: 68 # NON_MATCHING functions: 7 - # NON_EQUIVALENT WIP functions: 25 + # NON_EQUIVALENT WIP functions: 26 ---------------------------- Game Status ---------------------------- Balloons: 39/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 diff --git a/include/structs.h b/include/structs.h index b5cae4b4..96b2f150 100644 --- a/include/structs.h +++ b/include/structs.h @@ -4,11 +4,9 @@ /* Note: Structs are not complete, take them with a grain of salt. */ #include "types.h" -#include "enums.h" #include "level_object_entries.h" #include "object_properties.h" #include "gbi.h" -#include "PR/libaudio.h" #include "audio.h" typedef struct Vec4f { @@ -491,7 +489,8 @@ typedef struct LevelHeader { /* 0x9D */ u8 bgColorRed; /* 0x9E */ u8 bgColorGreen; /* 0x9F */ u8 bgColorBlue; - /* 0xA0 */ s16 unkA0; + /* 0xA0 */ u8 unkA0; + /* 0xA1 */ u8 unkA1; /* 0xA2 */ s8 unkA2; /* 0xA3 */ s8 unkA3; /* 0xA4 */ TextureHeader *unkA4; @@ -1701,8 +1700,7 @@ typedef struct Object_68 { ObjectModel *objModel; TextureHeader *texHeader; }; - /* 0x04 */ Vertex *vertices[2]; - /* 0x0C */ s32 *unkC; + /* 0x04 */ Vertex *vertices[3]; /* 0x10 */ s16 animationID; /* 0x12 */ s16 animationFrame; /* 0x14 */ s16 animationFrameCount; diff --git a/m2c_all.sh b/m2c_all.sh new file mode 100755 index 00000000..31e10279 --- /dev/null +++ b/m2c_all.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Make the m2cfiles dir if it doesn't already exist +mkdir -p m2cfiles + +# Find all .s files in the asm directory and its subdirectories +find asm/nonmatchings -type f -name "*.s" | while read ASMFILE; do + # Extract the filename without extension and path + FILENAME=$(basename "$ASMFILE" .s) + + echo "Processing $FILENAME from $ASMFILE" + + # Create the output file with the required header + echo '#include "../ctx.c"\n' > "m2cfiles/$FILENAME.c" + + # Run the m2c command with the extracted filename + .venv/bin/python3 tools/m2c/m2c.py --target mips-ido-c --pointer-style right --context ctx.c -f "$FILENAME" "$ASMFILE" >> "m2cfiles/$FILENAME.c" + + echo "Created m2cfiles/$FILENAME.c" +done diff --git a/src/audio.c b/src/audio.c index ee444a6a..6b1d171f 100644 --- a/src/audio.c +++ b/src/audio.c @@ -2,7 +2,6 @@ #include "memory.h" #include "types.h" -#include "macros.h" #include "asset_enums.h" #include "asset_loading.h" #include "audiomgr.h" @@ -73,7 +72,7 @@ SoundHandle gRacerSoundMask; /******************************/ /** - * Allocate memory for all of the audio systems, including sequence data, sound data and heaps. + * Allocate memory for all the audio systems, including sequence data, sound data and heaps. * Afterwards, set up the audio thread and start it. */ void audio_init(OSSched *sc) { @@ -498,27 +497,26 @@ void music_channel_reset_all(void) { } } -UNUSED u8 func_80001358(u8 arg0, u8 arg1, s32 arg2) { +UNUSED u8 func_80001358(u8 chan1, u8 chan2, s32 arg2) { u8 val_1f; - u8 val_1e; + u8 vol; s32 updatedVol; - // u8 fadeIn_chan = arg0; - if (!(arg0 == 100)) { - val_1f = arg2 + alCSPGetChlVol(gMusicPlayer, arg0); + if (chan1 != 100) { + val_1f = arg2 + alCSPGetChlVol(gMusicPlayer, chan1); if (val_1f > 127) { val_1f = 127; } - alCSPSetChlVol(gMusicPlayer, arg0, val_1f); + alCSPSetChlVol(gMusicPlayer, chan1, val_1f); } - if (arg1 != 100) { - updatedVol = alCSPGetChlVol(gMusicPlayer, arg1); - val_1e = (updatedVol > arg2) ? updatedVol - arg2 : 0; - alCSPSetChlVol(gMusicPlayer, arg1, val_1e); - return val_1e; + if (chan2 != 100) { + updatedVol = alCSPGetChlVol(gMusicPlayer, chan2); + vol = (updatedVol > arg2) ? updatedVol - arg2 : 0; + alCSPSetChlVol(gMusicPlayer, chan2, vol); + return vol; } else { - return 127 - val_1f; + return 127 - val_1f; //!@bug: This could be uninitialized! } } diff --git a/src/audio_spatial.c b/src/audio_spatial.c index a19f2906..0bccc86b 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -219,6 +219,7 @@ void audspat_update_all(Object **objList, s32 numObjects, s32 updateRate) { sndp_set_param(audioPoint->soundHandle, AL_SNDP_VOL_EVT, audioPoint->volume * 256); sndp_set_param(audioPoint->soundHandle, AL_SNDP_PITCH_EVT, *(s32 *) &pitch1); pan2 = audspat_calculate_spatial_pan(dx, dz, cameras[0].trans.rotation.y_rotation); + // This can never be true if (numCameras != 1) { pan2 = 64; } @@ -660,7 +661,7 @@ s32 audspat_line_validate(u8 lineID) { } for (i = 0; i < line->numSegments; i++) { - //@bug should be *(coords + 0), *(coords + 1), *(coords + 2) + //!@bug: should be *(coords + 0), *(coords + 1), *(coords + 2) if (*coords + 0 == -100000.0 || *coords + 1 == -100000.0 || *coords + 2 == -100000.0) { ret = FALSE; } @@ -688,7 +689,7 @@ s32 audspat_reverb_validate(u8 reverbLineID) { } for (i = 0; i < line->numSegments; i++) { - //@bug should be *(coords + 0), *(coords + 1), *(coords + 2) + //!@bug: should be *(coords + 0), *(coords + 1), *(coords + 2) if (*coords == -100000.0 || *coords + 1 == -100000.0 || *coords + 2 == -100000.0) { ret = FALSE; } diff --git a/src/audiomgr.c b/src/audiomgr.c index 43897b66..eb5b0c18 100644 --- a/src/audiomgr.c +++ b/src/audiomgr.c @@ -377,7 +377,7 @@ static s32 __amDMA(s32 addr, s32 len, UNUSED void *state) { AMDMABuffer *dmaPtr, *lastDmaPtr; UNUSED s32 pad; - lastDmaPtr = 0; + lastDmaPtr = NULL; delta = addr & 1; dmaPtr = dmaState.firstUsed; addrEnd = addr + len; @@ -408,7 +408,7 @@ static s32 __amDMA(s32 addr, s32 len, UNUSED void *state) { } /* - * if you get here and dmaPtr is null, send back the a bogus + * if you get here and dmaPtr is null, send back a bogus * pointer, it's better than nothing */ if (!dmaPtr) { @@ -486,7 +486,7 @@ static void __clearAudioDMA(void) { /* * Don't block here. If dma's aren't complete, you've had an audio - * overrun. (Bad news, but go for it anyway, and try and recover. + * overrun. (Bad news, but go for it anyway, and try and recover.) */ for (i = 0; i < nextDMA; i++) { if (osRecvMesg(&audDMAMessageQ, (OSMesg *) &iomsg, OS_MESG_NOBLOCK) == -1) { diff --git a/src/audiosfx.c b/src/audiosfx.c index 6412baff..dea3bf45 100644 --- a/src/audiosfx.c +++ b/src/audiosfx.c @@ -427,7 +427,7 @@ void sndp_handle_event(SoundPlayer *sndp, ALSndpEvent *event) { sndp_play(event->retrigger.bank, event->retrigger.soundIndex, soundState->userHandle); if (newSound != NULL) { sndp_set_param(newSound, AL_SNDP_VOL_EVT, soundState->volume); - if ((!event) && (!event)) {} // Fake + if (!event && !event) {} // Fake sndp_set_param(newSound, AL_SNDP_PAN_EVT, soundState->pan); sndp_set_param(newSound, AL_SNDP_FX_EVT, soundState->fxmix); sndp_set_param(newSound, AL_SNDP_PITCH_EVT, *(s32 *) &soundState->pitch); diff --git a/src/audiosfx.h b/src/audiosfx.h index f8e5da9b..28cd649b 100644 --- a/src/audiosfx.h +++ b/src/audiosfx.h @@ -73,7 +73,7 @@ typedef struct SoundPlayer { ALEventQueue evtq; ALEvent nextEvent; ALSynth *drvr; - u32 lastSoundState; + ALSoundState *lastSoundState; ALSoundState *soundStatesArray; s32 maxSystemSoundChannels; s32 maxActiveSounds; diff --git a/src/fade_transition.c b/src/fade_transition.c index 293ce955..ae3f2d5f 100644 --- a/src/fade_transition.c +++ b/src/fade_transition.c @@ -229,7 +229,7 @@ s32 transition_begin(FadeTransition *transition) { gCurFadeTransition = transition->type & 0x3F; gTransitionInvert = transition->type & FADE_FLAG_INVERT; sLevelTransitionDelayTimer = 0; - if (!gTransitionFadeIn && !sLevelTransitionDelayTimer) { + if (!gTransitionFadeIn && sLevelTransitionDelayTimer == 0) { sLevelTransitionDelayTimer = 2; } if (sTransitionFadeTimer > 0) { @@ -837,9 +837,9 @@ void transition_init_blank(UNUSED FadeTransition *transition) { * Shifts the colours of the transition over time while the timer ticks down. */ void transition_update_blank(s32 updateRate) { - s32 var_v0 = FALSE; - do { - var_v0 = TRUE; + s32 breakout = FALSE; + while (!breakout) { + breakout = TRUE; if (sTransitionFadeTimer > 0) { gLastFadeRed += gLastFadeRedStep * updateRate; gLastFadeGreen += gLastFadeGreenStep * updateRate; @@ -861,7 +861,7 @@ void transition_update_blank(s32 updateRate) { } } } - } while (var_v0 == FALSE); + } } /** diff --git a/src/game.c b/src/game.c index f0ccc952..a840ef67 100644 --- a/src/game.c +++ b/src/game.c @@ -1,22 +1,14 @@ #include "game.h" -#include -#include -#include #include "memory.h" #include "types.h" #include "macros.h" #include "structs.h" -#include "f3ddkr.h" #include "asset_enums.h" #include "asset_loading.h" #include "menu.h" #include "video.h" #include "set_rsp_segment.h" -#include "gzip.h" -#include "printf.h" -#include "thread0_epc.h" -#include "thread30_bgload.h" #include "weather.h" #include "audio.h" #include "objects.h" @@ -24,22 +16,11 @@ #include "save_data.h" #include "rcp_dkr.h" #include "audiosfx.h" -#include "audiomgr.h" #include "lights.h" #include "textures_sprites.h" -#include "PR/os_internal.h" -#include "printf.h" -#include "fade_transition.h" -#include "borders.h" #include "audio_spatial.h" #include "tracks.h" -#include "game_text.h" -#include "game_ui.h" -#include "main.h" -#include "object_models.h" #include "racer.h" -#include "particles.h" -#include "math_util.h" #include "joypad.h" #include "common.h" diff --git a/src/game_text.c b/src/game_text.c index adb43706..485407a4 100644 --- a/src/game_text.c +++ b/src/game_text.c @@ -186,10 +186,10 @@ void find_next_subtitle(void) { done = TRUE; } gCurrentTextProperties++; - new_var3 = (new_var2 = gCurrentTextProperties[0]); + new_var2 = gCurrentTextProperties[0]; if (gCurrentTextProperties[0] == 10) { gCurrentTextProperties++; - } else if (new_var3 == 12) { + } else if (new_var2 == 12) { gCurrentTextProperties++; done = TRUE; } diff --git a/src/game_ui.c b/src/game_ui.c index 93a9217a..b7c522e6 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -1834,7 +1834,7 @@ void hud_speedometre(Object *obj, UNUSED s32 updateRate) { sRecordVel = vel; } vel *= 4.0f; - //!@Bug: Planes and hovercraft use drift_direction for something else, applying this unintentionally. + //!@bug: Planes and hovercraft use drift_direction for something else, applying this unintentionally. if (racer->drift_direction != 0) { vel += 7.0f; } diff --git a/src/gzip.c b/src/gzip.c index d82ab158..cca8e921 100644 --- a/src/gzip.c +++ b/src/gzip.c @@ -37,7 +37,7 @@ s32 byteswap32(u8 *arg0) { value = *arg0++; value |= (*arg0++ << 8); value |= (*arg0++ << 16); - value |= (*arg0++ << 24); + value |= (*arg0 << 24); return value; } diff --git a/src/joypad.c b/src/joypad.c index e56c6396..2e3633ef 100644 --- a/src/joypad.c +++ b/src/joypad.c @@ -91,7 +91,7 @@ s32 input_update(s32 saveDataFlags, s32 updateRate) { if (saveDataFlags & SAVE_DATA_FLAG_ERASE_SAVE_DATA) { erase_save_file(SAVE_DATA_FLAG_WRITE_SAVE_FILE_NUMBER(saveDataFlags), settings); } - // @bug These next two if statements check the same bits + //!@bug: These next two if statements check the same bits // as the ones used to set the save file number to read from. if (saveDataFlags & SAVE_DATA_FLAG_READ_EEPROM_SETTINGS) { read_eeprom_settings(get_eeprom_settings_pointer()); diff --git a/src/main.c b/src/main.c index 4e50ef29..a98d27a4 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,6 @@ #include "main.h" #include "thread0_epc.h" #include "game.h" -#include "libultra/src/libc/rmonPrintf.h" #include "stacks.h" /************ .bss ************/ diff --git a/src/memory.c b/src/memory.c index 647a51e8..9e08bbad 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,7 +1,6 @@ #include "memory.h" #include "printf.h" #include "thread0_epc.h" -#include "joypad.h" #include "math_util.h" /************ .bss ************/ @@ -135,7 +134,7 @@ MemoryPoolSlot *mempool_slot_find(MemoryPools poolIndex, s32 size, u32 colourTag stubbed_printf("*** mmAlloc: size = 0 ***\n"); } pool = &gMemoryPools[poolIndex]; - if ((pool->curNumSlots + 1) == (*pool).maxNumSlots) { + if (pool->maxNumSlots == pool->curNumSlots + 1) { interrupts_enable(intFlags); stubbed_printf("*** mm Error *** ---> No more slots available.\n"); return NULL; diff --git a/src/menu.c b/src/menu.c index 52d46c71..7446c371 100644 --- a/src/menu.c +++ b/src/menu.c @@ -7352,7 +7352,6 @@ void gameselect_render(UNUSED s32 updateRate) { if (gMenuDelay > -22 && gMenuDelay < 22) { fade = gOptionBlinkTimer * 8; - fade = fade; if (fade > 255) { fade = 511 - fade; } @@ -7441,7 +7440,6 @@ s32 menu_game_select_loop(s32 updateRate) { if ((gMenuDelay == 0) && (gOpacityDecayTimer == 0)) { playerInputs = input_pressed(PLAYER_ONE); playerYDir = gControllersYAxisDirection[0]; - playerInputs = playerInputs; if (gNumberOfActivePlayers == 2) { playerInputs |= input_pressed(1); playerYDir += gControllersYAxisDirection[1]; diff --git a/src/object_functions.c b/src/object_functions.c index 71736df0..d7dc88a0 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -25,7 +25,6 @@ #include "fade_transition.h" #include "audio_vehicle.h" #include "object_models.h" -#include "libultra/src/libc/rmonPrintf.h" #include "collision.h" #include "joypad.h" #include "printf.h" @@ -197,7 +196,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { Object_Racer *racer; UNUSED s32 pad2[6]; ObjectInteraction *interactObj; - s32 soundMask; + SoundHandle soundMask; f32 waveHeight; someObj = obj->properties.fireball.obj; diff --git a/src/object_models.c b/src/object_models.c index 361ed06c..6dfe609c 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -7,7 +7,6 @@ #include "asset_loading.h" #include "textures_sprites.h" #include "racer.h" -#include "save_data.h" #include "objects.h" #define MODEL_LOADED_MAX 70 diff --git a/src/objects.c b/src/objects.c index ba49fe42..02483201 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1789,7 +1789,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { } var_v1 = FALSE; if (objType == 0) { - for (var_a2 = var_a2; var_a2 < assetCount; var_a2++) { + for (; var_a2 < assetCount; var_a2++) { if (assetCount) {} // FAKEMATCH? if (var_a2 == 0 && arg1 & 4) { curObj->unk68[var_a2] = NULL; @@ -1803,14 +1803,14 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { } } } else if (objType == 4) { - for (var_a2 = var_a2; var_a2 < assetCount; var_a2++) { + for (; var_a2 < assetCount; var_a2++) { curObj->unk68[var_a2] = (Object_68 *) load_texture(curObj->segment.header->modelIds[var_a2]); if (curObj->unk68[var_a2] == NULL) { var_v1 = TRUE; } } } else { - for (var_a2 = var_a2; var_a2 < assetCount; var_a2++) { + for (; var_a2 < assetCount; var_a2++) { curObj->unk68[var_a2] = (Object_68 *) func_8007C12C(curObj->segment.header->modelIds[var_a2], 10); if (curObj->unk68[var_a2] == NULL) { var_v1 = TRUE; @@ -3384,11 +3384,11 @@ void func_800135B8(Object *boostObj) { ObjectTransform_800135B8 objTransform; Object_Boost_Inner *boostData; Object_Boost *boost; - UnkAsset_800135B8 *asset; + Asset20 *asset; s32 hasTexture; s32 idx; - idx = (boostObj->properties.common.unk4 >> 0x1C) & 0xF; + idx = (boostObj->properties.common.unk4 >> 28) & 0xF; boost = &boostObj->unk64->boost; switch (D_8011B048[idx]) { case 0: @@ -3401,7 +3401,7 @@ void func_800135B8(Object *boostObj) { boostData = &boost->unk48; break; } - asset = (UnkAsset_800135B8 *) get_misc_asset(20); + asset = (Asset20 *) get_misc_asset(ASSET_MISC_20); asset = &asset[D_8011B058[idx]]; object_do_player_tumble((Object *) boostObj->properties.common.unk0); camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, @@ -3410,7 +3410,7 @@ void func_800135B8(Object *boostObj) { objTransform.trans.x_position = boostData->position.x; objTransform.trans.y_position = boostData->position.y; objTransform.trans.z_position = boostData->position.z; - objTransform.trans.scale = boostData->unkC + (boostData->unk10 * coss_f(boost->unk72 << 0xC)); + objTransform.trans.scale = boostData->unkC + (boostData->unk10 * coss_f(boost->unk72 << 12)); if (boost->unk70 < 2) { objTransform.trans.scale *= boost->unk74; } @@ -3424,13 +3424,15 @@ void func_800135B8(Object *boostObj) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, - (Object *) &objTransform, asset->unk78, 0x10A); + (Object *) &objTransform, asset->unk78, + (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE)); if (boost->unk70 == 2) { - material_set(&gObjectCurrDisplayList, asset->unk7C, 0xE, 0); + material_set(&gObjectCurrDisplayList, asset->unk7C, + (RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_FOG_ACTIVE), 0); if (asset->unk7C != NULL) { - hasTexture = 1; + hasTexture = TRUE; } else { - hasTexture = 0; + hasTexture = FALSE; } vtx = &gBoostVerts[gBoostVertFlip][(boostObj->properties.common.unk4 >> 14) & 0x3FFF]; diff --git a/src/objects.h b/src/objects.h index 8e096fcd..2053228c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -5,9 +5,7 @@ #include "structs.h" #include "f3ddkr.h" #include "object_functions.h" -#include "libc/math.h" #include "camera.h" -#include "lights.h" #include "particles.h" @@ -314,13 +312,6 @@ typedef struct ObjectTransform_800135B8 { s16 unk18; } ObjectTransform_800135B8; -/* Size: 0x80 bytes */ -typedef struct UnkAsset_800135B8 { - u8 pad0[0x78]; - unk80068514_arg4 *unk78; - TextureHeader *unk7C; -} UnkAsset_800135B8; - typedef struct unk8001A7D8_arg0 { u8 pad0[4]; s32 *unk4; diff --git a/src/printf.c b/src/printf.c index 4133572b..3a41d800 100644 --- a/src/printf.c +++ b/src/printf.c @@ -2,7 +2,6 @@ #include "types.h" #include "macros.h" #include "f3ddkr.h" -#include "thread0_epc.h" #include "stdarg.h" #include "textures_sprites.h" #include "rcp_dkr.h" diff --git a/src/racer.c b/src/racer.c index e0939e72..7929796b 100644 --- a/src/racer.c +++ b/src/racer.c @@ -1993,7 +1993,6 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { if (angle > 0x8000) { angle -= 0xFFFF; } - angle = angle; if (angle < -0x8000) { angle += 0xFFFF; } diff --git a/src/screen_asset.c b/src/screen_asset.c index e6346878..af3f31c8 100644 --- a/src/screen_asset.c +++ b/src/screen_asset.c @@ -1,5 +1,4 @@ #include "screen_asset.h" -#include "libultra/src/libc/rmonPrintf.h" // Render settings for the screens Gfx gRdpSetModeScreenAsset[] = { diff --git a/src/stacks.c b/src/stacks.c deleted file mode 100644 index f4703e9f..00000000 --- a/src/stacks.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "stacks.h" - -#include "types.h" -#include "macros.h" - -// This file only contains .bss variables and needs to be located just before -// waves.c; that is why this is "located" at 0x800B7D1F. - -/************ .bss ************/ - -UNUSED u8 D_80129AB0[0x100]; -u16 D_80129BB0[512]; // epcStack? -s32 gObjectStackTrace[3]; - -/******************************/ diff --git a/src/stacks.h b/src/stacks.h index 7d79593c..554f7afb 100644 --- a/src/stacks.h +++ b/src/stacks.h @@ -4,6 +4,8 @@ #include "types.h" #define STACK_EPC 0x1000 +#define STACK_EPCINFO1 0x200 +#define STACK_EPCINFO2 0x400 #define STACK_IDLE 0x100 #define STACK_SCHED 0x2000 #define STACK_AUD 0x3010 @@ -12,8 +14,4 @@ #define STACKSIZE(x) (x / sizeof(u64)) -extern u8 D_80129AB0[0x100]; -extern u16 D_80129BB0[512]; -extern s32 gObjectStackTrace[3]; - #endif diff --git a/src/thread0_epc.c b/src/thread0_epc.c index f2ada301..b8d1a5d4 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -7,7 +7,6 @@ #include "printf.h" #include "objects.h" #include "joypad.h" -#include "game.h" #include "stacks.h" #include "PR/os_internal_thread.h" #include "PRinternal/rmonint.h" @@ -26,6 +25,10 @@ OSMesgQueue gEPCMesgQueue; OSMesg gEPCMesgBuf[8]; OSMesg gEPCPIBuf[8]; OSMesgQueue gEPCPIQueue; +epcInfo gEpcInfo; +u64 gEpcInfoStack1[STACKSIZE(STACK_EPCINFO1)]; +u64 gEpcInfoStack2[STACKSIZE(STACK_EPCINFO2)]; +s32 gObjectStackTrace[3]; /** * Start the exception program counter thread. @@ -36,7 +39,7 @@ void thread0_create(void) { osCreateThread(&gEPCThread, 0, thread0_Main, 0, &gEPCStack[STACKSIZE(STACK_EPC)], OS_PRIORITY_MAX); osStartThread(&gEPCThread); - for (i = 0; i < 3; i++) { + for (i = 0; i < ARRAY_COUNT(gObjectStackTrace); i++) { gObjectStackTrace[i] = -1; } } @@ -200,17 +203,19 @@ void update_object_stack_trace(s32 index, s32 value) { } } +#ifndef _ALIGN128 +#define _ALIGN128(a) (((u32) (a) + 0x7F) & ~(u32) 0x7F) +#endif + /** * Called as a check to see if render_epc_lock_up_display should be called. */ s32 get_lockup_status(void) { s32 fileNum; s32 controllerIndex = 0; - s64 sp420[128]; // Overwrite epcStack? - s64 sp220[64]; - u8 dataFromControllerPak[512]; // Looks to be sizeof(epcInfo), aligned to 64 - extern epcInfo gEpcInfo; - extern s32 D_801299B0[64]; + u64 sp420[STACKSIZE(STACK_EPCINFO2)]; // Overwrite epcStack? + u64 sp220[STACKSIZE(STACK_EPCINFO1)]; + u8 dataFromControllerPak[_ALIGN128(sizeof(epcInfo))]; if (sLockupStatus != -1) { return sLockupStatus; @@ -219,11 +224,12 @@ s32 get_lockup_status(void) { // Looks like it reads EpcInfo data from the controller pak, which is interesting if ((get_si_device_status(controllerIndex) == CONTROLLER_PAK_GOOD) && (get_file_number(controllerIndex, "CORE", "", &fileNum) == CONTROLLER_PAK_GOOD) && - (read_data_from_controller_pak(controllerIndex, fileNum, dataFromControllerPak, 0x800) == + (read_data_from_controller_pak(controllerIndex, fileNum, dataFromControllerPak, + sizeof(sp420) + sizeof(sp220) + sizeof(dataFromControllerPak)) == CONTROLLER_PAK_GOOD)) { bcopy(&dataFromControllerPak, &gEpcInfo, sizeof(epcInfo)); - bcopy(&sp220, &D_801299B0, sizeof(sp220)); - bcopy(&sp420, &D_80129BB0, sizeof(sp420)); + bcopy(&sp220, &gEpcInfoStack1, sizeof(sp220)); + bcopy(&sp420, &gEpcInfoStack2, sizeof(sp420)); sLockupStatus = 1; } start_reading_controller_data(controllerIndex); @@ -247,7 +253,7 @@ void mode_lockup(s32 updateRate) { } } -#define GET_REG(reg) (s32) gEpcInfo.reg +#define GET_REG(reg) (s32) epcinfo->reg /** * Draw onscreen the four pages of the crash screen. @@ -256,28 +262,24 @@ void mode_lockup(s32 updateRate) { * Page 4 appears to show the data of the EPC stack itself? */ void render_epc_lock_up_display(void) { - u16 *temp; + epcInfo *epcinfo; char *objStatusString[3] = { "setup", "control", "print" }; s32 offset; s32 s3; s32 j; s32 i; - static epcInfo gEpcInfo; - static s32 D_801299B0[64]; - s3 = 0; - set_render_printf_position(16, 32); - switch (sLockupPage) { case EPC_PAGE_REGISTER: - gObjectStackTrace[OBJECT_SPAWN] = gEpcInfo.objectStackTrace[OBJECT_SPAWN]; - gObjectStackTrace[OBJECT_UPDATE] = gEpcInfo.objectStackTrace[OBJECT_UPDATE]; - gObjectStackTrace[OBJECT_DRAW] = gEpcInfo.objectStackTrace[OBJECT_DRAW]; - if (gEpcInfo.unk128[-2] == -1U) { // TODO: find better solution. This should be gEpcInfo.cause - render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); + epcinfo = &gEpcInfo; + gObjectStackTrace[OBJECT_SPAWN] = epcinfo->objectStackTrace[OBJECT_SPAWN]; + gObjectStackTrace[OBJECT_UPDATE] = epcinfo->objectStackTrace[OBJECT_UPDATE]; + gObjectStackTrace[OBJECT_DRAW] = epcinfo->objectStackTrace[OBJECT_DRAW]; + if (epcinfo->cause == 0xFFFFFFFF) { + render_printf(" epc\t\t0x%08x\n", epcinfo->epc); render_printf(" cause\t\tmmAlloc(%d,0x%8x)\n", GET_REG(a0), GET_REG(a1)); - for (i = 0; i < 3; i++) { + for (i = 0; i < ARRAY_COUNT(gObjectStackTrace); i++) { if (gObjectStackTrace[i] != OBJECT_CLEAR) { if (!s3) { s3 = TRUE; @@ -288,58 +290,59 @@ void render_epc_lock_up_display(void) { } render_printf("\n"); render_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - break; - } - render_printf(" Fault in thread %d\n", gEpcInfo.thread[0]); - render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); - render_printf(" cause\t\t0x%08x\n", gEpcInfo.cause); - render_printf(" sr\t\t0x%08x\n", gEpcInfo.sr); - render_printf(" badvaddr\t0x%08x\n", gEpcInfo.badvaddr); - for (i = 0; i < 3; i++) { - if (gObjectStackTrace[i] != OBJECT_CLEAR) { - if (!s3) { - s3 = TRUE; - render_printf(" object\t\t"); + } else { + render_printf(" Fault in thread %d\n", epcinfo->thread[GET_REG(t9) * 0]); // fake GET_REG + render_printf(" epc\t\t0x%08x\n", epcinfo->epc); + render_printf(" cause\t\t0x%08x\n", epcinfo->cause); + render_printf(" sr\t\t0x%08x\n", epcinfo->sr); + render_printf(" badvaddr\t0x%08x\n", epcinfo->badvaddr); + for (i = 0; i < ARRAY_COUNT(gObjectStackTrace); i++) { + if (gObjectStackTrace[i] != OBJECT_CLEAR) { + if (!s3) { + s3 = TRUE; + render_printf(" object\t\t"); + } + render_printf("%s %d ", objStatusString[i], gObjectStackTrace[i]); } - render_printf("%s %d ", objStatusString[i], gObjectStackTrace[i]); } + render_printf("\n"); + render_printf(" at 0x%08x v0 0x%08x v1 0x%08x\n", GET_REG(at), GET_REG(v0), GET_REG(v1)); + render_printf(" a0 0x%08x a1 0x%08x a2 0x%08x\n", GET_REG(a0), GET_REG(a1), GET_REG(a2)); + render_printf(" a3 0x%08x t0 0x%08x t1 0x%08x\n", GET_REG(a3), GET_REG(t0), GET_REG(t1)); + render_printf(" t2 0x%08x t3 0x%08x t4 0x%08x\n", GET_REG(t2), GET_REG(t3), GET_REG(t4)); + render_printf(" t5 0x%08x t6 0x%08x t7 0x%08x\n", GET_REG(t5), GET_REG(t6), GET_REG(t7)); + render_printf(" s0 0x%08x s1 0x%08x s2 0x%08x\n", GET_REG(s0), GET_REG(s1), GET_REG(s2)); + render_printf(" s3 0x%08x s4 0x%08x s5 0x%08x\n", GET_REG(s3), GET_REG(s4), GET_REG(s5)); + render_printf(" s6 0x%08x s7 0x%08x t8 0x%08x\n", GET_REG(s6), GET_REG(s7), GET_REG(t8)); + render_printf(" t9 0x%08x gp 0x%08x sp 0x%08x\n", GET_REG(t9), GET_REG(gp), GET_REG(sp)); + render_printf(" s8 0x%08x ra 0x%08x\n\n", GET_REG(s8), GET_REG(ra)); } - render_printf("\n"); - render_printf(" at 0x%08x v0 0x%08x v1 0x%08x\n", GET_REG(at), GET_REG(v0), GET_REG(v1)); - render_printf(" a0 0x%08x a1 0x%08x a2 0x%08x\n", GET_REG(a0), GET_REG(a1), GET_REG(a2)); - render_printf(" a3 0x%08x t0 0x%08x t1 0x%08x\n", GET_REG(a3), GET_REG(t0), GET_REG(t1)); - render_printf(" t2 0x%08x t3 0x%08x t4 0x%08x\n", GET_REG(t2), GET_REG(t3), GET_REG(t4)); - render_printf(" t5 0x%08x t6 0x%08x t7 0x%08x\n", GET_REG(t5), GET_REG(t6), GET_REG(t7)); - render_printf(" s0 0x%08x s1 0x%08x s2 0x%08x\n", GET_REG(s0), GET_REG(s1), GET_REG(s2)); - render_printf(" s3 0x%08x s4 0x%08x s5 0x%08x\n", GET_REG(s3), GET_REG(s4), GET_REG(s5)); - render_printf(" s6 0x%08x s7 0x%08x t8 0x%08x\n", GET_REG(s6), GET_REG(s7), GET_REG(t8)); - render_printf(" t9 0x%08x gp 0x%08x sp 0x%08x\n", GET_REG(t9), GET_REG(gp), GET_REG(sp)); - render_printf(" s8 0x%08x ra 0x%08x\n\n", GET_REG(s8), GET_REG(ra)); break; - case EPC_PAGE_STACK_TOP: - case EPC_PAGE_STACK_MIDDLE: + case EPC_PAGE_STACK_TOP: /* fall through */ + case EPC_PAGE_STACK_MIDDLE: /* fall through */ case EPC_PAGE_STACK_BOTTOM: offset = (sLockupPage - 1) * 48; - for (j = (s32) &D_801299B0[offset], i = 0; i < 16; i++) { - render_printf(" %08x %08x %08x\n", ((u8 **) j)[0], ((u8 **) j)[16], ((u8 **) j)[32]); - j = (s32) ((s32 *) j + 1); + for (i = 0; i < 16; i++) { + render_printf(" %08x %08x %08x\n", ((u16 **) &gEpcInfoStack1)[offset], + ((u16 **) &gEpcInfoStack1)[offset + 16], ((u16 **) &gEpcInfoStack1)[offset + 32]); + offset++; } break; case EPC_PAGE_UNK04: offset = (sLockupPage - 4) * 128; - for (temp = (u16 *) &D_80129BB0[offset], i = 0; i < 16; i++) { + for (i = 0; i < 16; i++) { render_printf(" "); for (j = 0; j < 8; j++) { - render_printf("%04x ", temp[0]); - temp++; + render_printf("%04x ", (((u16 *) &gEpcInfoStack2)[offset])); + offset++; } render_printf("\n"); } break; case EPC_PAGE_EXIT: sLockupPage = 0; - return; + break; default: - return; + break; } } diff --git a/src/thread0_epc.h b/src/thread0_epc.h index 61eb37f3..d8f4fa3c 100644 --- a/src/thread0_epc.h +++ b/src/thread0_epc.h @@ -50,7 +50,7 @@ typedef struct epcInfo { /* 0x114 */ s32 unk114; /* 0x118 */ s32 sr; /* 0x11C */ s32 epc; -/* 0x120 */ s32 cause; +/* 0x120 */ u32 cause; /* 0x124 */ s32 badvaddr; /* 0x128 */ u32 unk128[2]; /* 0x130 */ f32 objectStackTrace[3]; diff --git a/src/tracks.c b/src/tracks.c index fc3f794c..789faeb2 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -15,7 +15,6 @@ #include "game_ui.h" #include "weather.h" #include "particles.h" -#include "libultra/src/libc/rmonPrintf.h" #include "objects.h" #include "math_util.h" #include "printf.h" @@ -510,8 +509,6 @@ void func_800257D0(void) { } #ifdef NON_MATCHING -void func_80026070(LevelModelSegmentBoundingBox *, f32, f32, f32); -void func_80026430(LevelModelSegment *, f32, f32, f32); // URL: https://decomp.me/scratch/Hz4qp void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex) { s16 i; @@ -553,14 +550,15 @@ void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex) { i = 0; for (; i < numberOfSegments; i++) { - bbox = &gCurrentLevelModel->segmentsBoundingBoxes[segmentIds[i]]; + LevelModel *levelModel = gCurrentLevelModel; // fake ? + bbox = &levelModel->segmentsBoundingBoxes[segmentIds[i]]; sum = 0; sum += bbox->x1 * yCameraSins + yCameraCoss * bbox->z1 + temp_f22 <= 0.0; sum += yCameraSins * bbox->x2 + yCameraCoss * bbox->z1 + temp_f22 <= 0.0; sum += bbox->x1 * yCameraSins + yCameraCoss * bbox->z2 + temp_f22 <= 0.0; sum += yCameraSins * bbox->x2 + yCameraCoss * bbox->z2 + temp_f22 <= 0.0; if (sum & 3) { - func_80026430(&gCurrentLevelModel->segments[segmentIds[i]], yCameraSins, yCameraCoss, temp_f22); + func_80026430(&levelModel->segments[segmentIds[i]], yCameraSins, yCameraCoss, temp_f22); if (gCurrentLevelModel->segments[segmentIds[i]].unk3C & 2) { func_80026070(bbox, yCameraSins, yCameraCoss, temp_f22); } @@ -970,14 +968,15 @@ void func_80026E54(s16 arg0, s8 *arg1, f32 arg2, f32 arg3) { s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { Vertex *verts; Triangle *tris; - u8 triIndex; - s32 vertZ1; - s32 vertX2; - s32 vertZ2; - s32 vertX1; + s32 triIndex; + s16 vertZ1; + s16 vertX2; + s16 vertZ2; + s16 vertX1; s32 colour_r; s32 colour_g; s32 colour_b; + s32 colour_a; if (D_8011D4B8 >= D_8011D4BC) { return 0; @@ -993,6 +992,7 @@ s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { colour_r = D_8011B0E1; colour_g = D_8011B0E2; colour_b = D_8011B0E3; + colour_a = 0xFF; vertX1 = arg2 * D_8011D4A0 + D_8011D4AC; vertZ1 = arg2 * D_8011D4A4 + D_8011D4B0; @@ -1001,39 +1001,39 @@ s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { verts = gSceneCurrVertexList; verts->x = vertX1; - verts->y = arg0[0] + 2; + verts->y = arg0[0] + 2.0f; verts->z = vertZ1; verts->r = colour_r; verts->g = colour_g; verts->b = colour_b; - verts->a = 255; + verts->a = colour_a; verts++; verts->x = vertX2; - verts->y = arg0[1] + 2; + verts->y = arg0[1] + 2.0f; verts->z = vertZ2; verts->r = colour_r; verts->g = colour_g; verts->b = colour_b; - verts->a = 255; + verts->a = colour_a; verts++; verts->x = vertX1; - verts->y = arg1[0] - 2; + verts->y = arg1[0] - 2.0f; verts->z = vertZ1; verts->r = colour_r; verts->g = colour_g; verts->b = colour_b; - verts->a = 255; + verts->a = colour_a; verts++; verts->x = vertX2; - verts->y = arg1[1] - 2; + verts->y = arg1[1] - 2.0f; verts->z = vertZ2; verts->r = colour_r; verts->g = colour_g; verts->b = colour_b; - verts->a = 255; + verts->a = colour_a; verts++; gSceneCurrVertexList = verts; @@ -1043,7 +1043,7 @@ s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { tris->flags = BACKFACE_DRAW; tris->vi0 = triIndex + 2; tris->vi1 = triIndex + 1; - tris->vi2 = triIndex; + tris->vi2 = triIndex + 0; tris->uv0.u = 0x3E0; tris->uv0.v = 0x3E0; tris->uv1.u = 0x3E0; @@ -1352,9 +1352,184 @@ void set_skydome_visbility(s32 renderSky) { gSceneRenderSkyDome = renderSky; } +#ifdef NON_EQUIVALENT +// This function creates the flashy sky effect in the wizpig 2 race. // init_skydome -// https://decomp.me/scratch/80umh +// https://decomp.me/scratch/F52TP +void func_80028050(void) { + // sp154 ? + s32 uCoordMask; // sp150 ? + s32 vCoordMask; // sp14C + s16 uCoords[9]; // sp128 + s16 vCoords[9]; // sp114 + f32 yRotCos; // sp10C + f32 yRotSin; + f32 xPositions[9]; // spDC + f32 zPositions[9]; // spB8 + f32 spB4; + s8 *sp7C; + s32 sp78; + TextureHeader *sp74; + f32 sp48; + f32 sp3C; + f32 sp38; + f32 sp2C; + ObjectSegment *objSeg; + s16 temp_a1; + s16 temp_v0_2; + s16 temp_v1_2; + Vertex *verts; + Triangle *tris; + s8 *var_t2; + s8 *var_v0; + u8 *var_v0_3; + u32 var_a2; + u32 var_a3; + s32 i; + s16 yPos; + + verts = gSceneCurrVertexList; + tris = gSceneCurrTriList; + objSeg = get_active_camera_segment(); + sp74 = gCurrentLevelHeader2->unkA4; + uCoordMask = (sp74->width << 5) - 1; + vCoordMask = (sp74->height << 5) - 1; + yRotCos = coss_f(-objSeg->trans.rotation.y_rotation); + yRotSin = sins_f(-objSeg->trans.rotation.y_rotation); + + xPositions[0] = -(yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spDC OK + zPositions[0] = -(yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spB8 OK + + zPositions[1] = (yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spE0 OK + xPositions[1] = -(yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spBC OK + + xPositions[2] = (yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spE4 OK + zPositions[2] = (yRotSin * 1280.0f) - (yRotCos * 1280.0f); // spC0 OK + + xPositions[3] = -(yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spE8 OK + zPositions[3] = (yRotSin * 1280.0f) + (yRotCos * 1280.0f); // spC4 OK + + xPositions[4] = 0.0f; // spEC OK + zPositions[4] = 0.0f; // spC8 OK + + xPositions[5] = -(yRotSin * 1280.0f) - (2.0f * (yRotCos * 1280.0f)); // spF0 + zPositions[5] = (yRotCos * 1280.0f) - (2.0f * (yRotSin * 1280.0f)); // spCC + + zPositions[6] = -(2.0f * (yRotSin * 1280.0f)) - (yRotCos * 1280.0f); // spF4 + xPositions[6] = (yRotSin * 1280.0f) - (2.0f * (yRotCos * 1280.0f)); // spD0 + + xPositions[7] = (yRotSin * 1280.0f) + (2.0f * (yRotCos * 1280.0f)); // spF8 + zPositions[7] = (2.0f * (yRotSin * 1280.0f)) - (yRotCos * 1280.0f); // spD4 + + xPositions[8] = -(yRotSin * 1280.0f) + (2.0f * (yRotCos * 1280.0f)); // spFC + zPositions[8] = (2.0f * (yRotSin * 1280.0f)) + (yRotCos * 1280.0f); // spD8 + + sp38 = (f32) (sp74->width * 16 * gCurrentLevelHeader2->unkA0); + temp_v0_2 = + ((s32) (objSeg->trans.x_position * ((1280.0f * 0.25f) / sp38)) + ((s16) gCurrentLevelHeader2->unkA8 >> 4)) & + uCoordMask; + sp48 = (f32) (sp74->height * 16 * gCurrentLevelHeader2->unkA1); + temp_v1_2 = + ((s32) (objSeg->trans.z_position * ((1280.0f * 0.25f) / sp48)) + ((s16) gCurrentLevelHeader2->unkAA >> 4)) & + vCoordMask; + + uCoords[0] = (s32) (-(sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v0_2; + vCoords[0] = (s32) ((sp48 * yRotCos) - (sp38 * yRotSin)) + temp_v1_2; + + uCoords[1] = (s32) ((sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v0_2; + vCoords[1] = (s32) (-(sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v1_2; + + uCoords[2] = (s32) ((sp38 * yRotSin) + (sp48 * yRotCos)) + temp_v0_2; + vCoords[2] = (s32) ((sp38 * yRotSin) - (sp48 * yRotCos)) + temp_v1_2; + + uCoords[3] = (s32) ((sp48 * yRotCos) - (sp38 * yRotSin)) + temp_v0_2; + vCoords[3] = (s32) ((sp38 * yRotSin) + (sp48 * yRotCos)) + temp_v1_2; + + uCoords[4] = temp_v0_2; + vCoords[4] = temp_v1_2; + + uCoords[5] = (s32) (-(sp38 * yRotSin) - (2.0f * (sp48 * yRotCos))) + temp_v0_2; + vCoords[5] = (s32) ((sp48 * yRotCos) - (2.0f * (sp38 * yRotSin))) + temp_v1_2; + + uCoords[6] = (s32) ((sp38 * yRotSin) - (2.0f * (sp48 * yRotCos))) + temp_v0_2; + vCoords[6] = (s32) (-(2.0f * (sp38 * yRotSin)) - (sp48 * yRotCos)) + temp_v1_2; + + uCoords[7] = (s32) ((sp38 * yRotSin) + (2.0f * (sp48 * yRotCos))) + temp_v0_2; + vCoords[7] = (s32) ((2.0f * (sp38 * yRotSin)) - (sp48 * yRotCos)) + temp_v1_2; + + uCoords[8] = (s32) ((2.0f * (sp48 * yRotCos)) - (sp38 * yRotSin)) + temp_v0_2; + vCoords[8] = (s32) ((2.0f * (sp38 * yRotSin)) + (sp48 * yRotCos)) + temp_v1_2; + + matrix_world_origin(&gSceneCurrDisplayList, &gSceneCurrMatrix); + var_t2 = gCurrentLevelHeader2->unk74[0]; + var_a2 = 0xFFFFFFFF; + if (var_t2 != (s8 *) -1) { + var_v0 = gCurrentLevelHeader2->unk74[1]; + if (var_v0 == (s8 *) -1) { + var_v0 = var_t2; + } + } else { + var_v0 = sp78; + var_t2 = NULL; + } + var_a3 = 0xFFFFFF00; + if (var_t2 != NULL) { + var_a2 = var_t2[0x10]; + var_a3 = var_v0[0x10] & ~0xFF; + } + sp7C = var_t2; + gfx_init_basic_xlu(&gSceneCurrDisplayList, 1, var_a2, var_a3); + sp74 = (TextureHeader *) set_animated_texture_header(sp74, D_8011B110 << 8); + gDkrDmaDisplayList(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(sp74->cmd), sp74->numberOfCommands); + gSPVertexDKR(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(gSceneCurrVertexList), 9, 0); + gSPPolygon(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(gSceneCurrTriList), 8, 1); + gDPPipeSync(gSceneCurrDisplayList++); + if (var_t2 != NULL) { + gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetEnvColor(gSceneCurrDisplayList++, 255, 255, 255, 0); + } + rendermode_reset(&gSceneCurrDisplayList); + + yPos = objSeg->trans.y_position + 192.0f; + for (i = 0; i < 9; i++) { + verts->y = yPos; + verts->x = objSeg->trans.x_position + xPositions[i]; + verts->z = objSeg->trans.z_position + zPositions[i]; + verts->r = 255; + verts->g = 255; + verts->b = 255; + verts->a = (i <= 4) ? 255 : 0; + verts++; + } + + var_v0_3 = D_800DC92C; + for (i = 0; i < 8; i++) { + tris->flags = 0x40; + + tris->vi0 = *var_v0_3; + tris->uv0.u = uCoords[*var_v0_3]; + tris->uv0.v = vCoords[*var_v0_3]; + var_v0_3++; + + tris->vi1 = *var_v0_3; + tris->uv1.u = uCoords[*var_v0_3]; + tris->uv1.v = vCoords[*var_v0_3]; + var_v0_3++; + + tris->vi2 = *var_v0_3; + tris->uv2.u = uCoords[*var_v0_3]; + tris->uv2.v = vCoords[*var_v0_3]; + var_v0_3++; + + tris++; + } + + gSceneCurrVertexList = verts; + gSceneCurrTriList = tris; +} +#else #pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_80028050.s") +#endif /** * Instead of drawing the skydome with textures, draw a solid coloured background. @@ -1727,9 +1902,10 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { s32 endPos; s32 batchFlags; s32 textureFlags; + //! @bug: batchInfo is uninitalized numberVertices = (batchInfo + 1)->verticesOffset - batchInfo->verticesOffset; segment = &gCurrentLevelModel->segments[segmentId]; - sp78 = (nonOpaque && gWaveBlockCount) ? (func_800B9228(segment)) : (0); + sp78 = (nonOpaque && gWaveBlockCount) ? func_800B9228(segment) : 0; if (nonOpaque) { startPos = segment->numberofOpaqueBatches; endPos = segment->numberOfBatches; diff --git a/src/tracks.h b/src/tracks.h index eca9a621..797bb420 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -201,6 +201,8 @@ void slowly_change_fog(s32 fogIdx, s32 red, s32 green, s32 blue, s32 near, s32 f s32 func_8002FD74(f32 x0, f32 z0, f32 x1, f32 x2, s32 count, Vec4f *arg5); void func_80026C14(s16 arg0, s16 arg1, s32 arg2); void func_80026E54(s16 arg0, s8 *arg1, f32 arg2, f32 arg3); +void func_80026070(LevelModelSegmentBoundingBox *arg0, f32 arg1, f32 arg2, f32 arg3); +void func_80026430(LevelModelSegment *segment, f32 arg1, f32 arg2, f32 arg3); void free_track(void); void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex); diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index 8319d9cf..a032942b 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -4,7 +4,6 @@ #include "macros.h" #include "math_util.h" #include "objects.h" -#include "object_functions.h" #include "audio_spatial.h" #include "racer.h" #include "particles.h" diff --git a/ver/splat/dkr.jpn.v79.yaml b/ver/splat/dkr.jpn.v79.yaml index 7746ba82..a9319261 100644 --- a/ver/splat/dkr.jpn.v79.yaml +++ b/ver/splat/dkr.jpn.v79.yaml @@ -421,7 +421,6 @@ segments: - { type: .bss, vram: 0x80129730, name: particles } - { type: .bss, vram: 0x80129750, name: printf } - { type: .bss, vram: 0x8012A090, name: thread0_epc } - - { type: .bss, vram: 0x8012B560, name: stacks } - { type: .bss, vram: 0x8012BA70, name: waves } - { type: .bss, vram: 0x8012C1E0, name: fade_transition } - { type: .bss, vram: 0x8012C230, name: game_text } diff --git a/ver/splat/dkr.pal.v77.yaml b/ver/splat/dkr.pal.v77.yaml index ca878e28..266b1c6a 100644 --- a/ver/splat/dkr.pal.v77.yaml +++ b/ver/splat/dkr.pal.v77.yaml @@ -421,7 +421,6 @@ segments: - { type: .bss, vram: 0x80127D10, name: particles } - { type: .bss, vram: 0x80127D30, name: printf } - { type: .bss, vram: 0x80128670, name: thread0_epc } - - { type: .bss, vram: 0x80129B40, name: stacks } - { type: .bss, vram: 0x8012A050, name: waves } - { type: .bss, vram: 0x8012A7C0, name: fade_transition } - { type: .bss, vram: 0x8012A810, name: game_text } diff --git a/ver/splat/dkr.pal.v80.yaml b/ver/splat/dkr.pal.v80.yaml index 721665cd..3a2d9903 100644 --- a/ver/splat/dkr.pal.v80.yaml +++ b/ver/splat/dkr.pal.v80.yaml @@ -421,7 +421,6 @@ segments: - { type: .bss, vram: 0x801282D0, name: particles } - { type: .bss, vram: 0x801282F0, name: printf } - { type: .bss, vram: 0x80128C30, name: thread0_epc } - - { type: .bss, vram: 0x8012A100, name: stacks } - { type: .bss, vram: 0x8012A610, name: waves } - { type: .bss, vram: 0x8012AD80, name: fade_transition } - { type: .bss, vram: 0x8012ADD0, name: game_text } diff --git a/ver/splat/dkr.us.v77.yaml b/ver/splat/dkr.us.v77.yaml index ff063743..82ace25e 100644 --- a/ver/splat/dkr.us.v77.yaml +++ b/ver/splat/dkr.us.v77.yaml @@ -421,7 +421,6 @@ segments: - { type: .bss, vram: 0x80127C80, name: particles } - { type: .bss, vram: 0x80127CA0, name: printf } - { type: .bss, vram: 0x801285E0, name: thread0_epc } - - { type: .bss, vram: 0x80129AB0, name: stacks } - { type: .bss, vram: 0x80129FC0, name: waves } - { type: .bss, vram: 0x8012A730, name: fade_transition } - { type: .bss, vram: 0x8012A780, name: game_text } diff --git a/ver/splat/dkr.us.v80.yaml b/ver/splat/dkr.us.v80.yaml index 84798adb..e08c340b 100644 --- a/ver/splat/dkr.us.v80.yaml +++ b/ver/splat/dkr.us.v80.yaml @@ -421,7 +421,6 @@ segments: - { type: .bss, vram: 0x80128240, name: particles } - { type: .bss, vram: 0x80128260, name: printf } - { type: .bss, vram: 0x80128BA0, name: thread0_epc } - - { type: .bss, vram: 0x8012A070, name: stacks } - { type: .bss, vram: 0x8012A580, name: waves } - { type: .bss, vram: 0x8012ACF0, name: fade_transition } - { type: .bss, vram: 0x8012AD40, name: game_text } diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index eccff6e5..114d6214 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -2871,6 +2871,7 @@ dDebugFontSettings = 0x800E4AA8; sLockupStatus = 0x800E4B10; sLockupPage = 0x800E4B14; sLockupDelay = 0x800E4B18; +objStatusString = 0x800E4B1C; // size:0xC // waves.c .data D_800E3040 = 0x800E4B30; @@ -4479,11 +4480,8 @@ gEPCMesgBuf = 0x8012B258; gEPCPIBuf = 0x8012B278; gEPCPIQueue = 0x8012B298; gEpcInfo = 0x8012B2B0; // size:0x1B0 -D_801299B0 = 0x8012B460; // size:0x100 - -// stacks .bss -D_80129AB0 = 0x8012B560; // size:0x100 -D_80129BB0 = 0x8012B660; // size:0x400 +gEpcInfoStack1 = 0x8012B460; // size:0x200 +gEpcInfoStack2 = 0x8012B660; // size:0x400 gObjectStackTrace = 0x8012BA60; // size:0x10 // waves .bss diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index f53f70b6..d562e83a 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -2698,6 +2698,7 @@ dDebugFontSettings = 0x800E3048; sLockupStatus = 0x800E30B0; sLockupPage = 0x800E30B4; sLockupDelay = 0x800E30B8; +objStatusString = 0x800E30BC; // size:0xC D_800E3040 = 0x800E30D0; D_800E3044 = 0x800E30D4; D_800E3048 = 0x800E30D8; @@ -4158,9 +4159,8 @@ gEPCMesgBuf = 0x80129838; gEPCPIBuf = 0x80129858; gEPCPIQueue = 0x80129878; gEpcInfo = 0x80129890; // size:0x1B0 -D_801299B0 = 0x80129A40; // size:0x100 -D_80129AB0 = 0x80129B40; // size:0x100 -D_80129BB0 = 0x80129C40; // size:0x400 +gEpcInfoStack1 = 0x80129A40; // size:0x200 +gEpcInfoStack2 = 0x80129C40; // size:0x400 gObjectStackTrace = 0x8012A040; // size:0x10 gWaveDL = 0x8012A050; D_80129FC4 = 0x8012A054; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 1ebfd0a2..8c80f1cb 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -2627,6 +2627,7 @@ dDebugFontSettings = 0x800E35D8; sLockupStatus = 0x800E3640; sLockupPage = 0x800E3644; sLockupDelay = 0x800E3648; +objStatusString = 0x800E364C; // size:0xC D_800E3040 = 0x800E3660; D_800E3044 = 0x800E3664; D_800E3048 = 0x800E3668; @@ -4093,9 +4094,8 @@ gEPCMesgBuf = 0x80129DF8; gEPCPIBuf = 0x80129E18; gEPCPIQueue = 0x80129E38; gEpcInfo = 0x80129E50; // size:0x1B0 -D_801299B0 = 0x8012A000; // size:0x100 -D_80129AB0 = 0x8012A100; // size:0x100 -D_80129BB0 = 0x8012A200; // size:0x400 +gEpcInfoStack1 = 0x8012A000; // size:0x200 +gEpcInfoStack2 = 0x8012A200; // size:0x400 gObjectStackTrace = 0x8012A600; // size:0x10 gWaveDL = 0x8012A610; D_80129FC4 = 0x8012A614; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 7758a1a7..c52bcb12 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -2853,6 +2853,7 @@ dDebugFontSettings = 0x800E2FB8; sLockupStatus = 0x800E3020; sLockupPage = 0x800E3024; sLockupDelay = 0x800E3028; +objStatusString = 0x800E302C; // size:0xC // waves.c .data D_800E3040 = 0x800E3040; @@ -4599,11 +4600,8 @@ gEPCMesgBuf = 0x801297A8; gEPCPIBuf = 0x801297C8; gEPCPIQueue = 0x801297E8; gEpcInfo = 0x80129800; // size:0x1B0 -D_801299B0 = 0x801299B0; // size:0x100 - -// stacks .bss -D_80129AB0 = 0x80129AB0; // size:0x100 -D_80129BB0 = 0x80129BB0; // size:0x400 +gEpcInfoStack1 = 0x801299B0; // size:0x200 +gEpcInfoStack2 = 0x80129BB0; // size:0x400 gObjectStackTrace = 0x80129FB0; // size:0x10 // waves .bss diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index ddbc684e..f5664e11 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -2624,6 +2624,7 @@ dDebugFontSettings = 0x800E3548; sLockupStatus = 0x800E35B0; sLockupPage = 0x800E35B4; sLockupDelay = 0x800E35B8; +objStatusString = 0x800E35BC; // size:0xC D_800E3040 = 0x800E35D0; D_800E3044 = 0x800E35D4; D_800E3048 = 0x800E35D8; @@ -4088,9 +4089,8 @@ gEPCMesgBuf = 0x80129D68; gEPCPIBuf = 0x80129D88; gEPCPIQueue = 0x80129DA8; gEpcInfo = 0x80129DC0; // size:0x1B0 -D_801299B0 = 0x80129F70; // size:0x100 -D_80129AB0 = 0x8012A070; // size:0x100 -D_80129BB0 = 0x8012A170; // size:0x400 +gEpcInfoStack1 = 0x80129F70; // size:0x200 +gEpcInfoStack2 = 0x8012A170; // size:0x400 gObjectStackTrace = 0x8012A570; // size:0x10 gWaveDL = 0x8012A580; D_80129FC4 = 0x8012A584; diff --git a/ver/symbols/undefined_syms.txt b/ver/symbols/undefined_syms.txt index 0f08ffa7..c0acf5a5 100644 --- a/ver/symbols/undefined_syms.txt +++ b/ver/symbols/undefined_syms.txt @@ -1,10 +1,3 @@ -/* These seem to be needed because of some weird match things going on. - The exact address isn't the same for each region, so I'm doing a hacky - offset from the previous BSS variable that is declared */ - -gEpcInfo = gEPCPIQueue + 0x18; -D_801299B0 = gEpcInfo + 0x1B0; - /* We have to define these addresses because they're hasm and share space with the coss funcs. */ sins_s16 = coss_s16 + 0x4; diff --git a/yaml.patch b/yaml.patch deleted file mode 100644 index 8e9a1b26..00000000 --- a/yaml.patch +++ /dev/null @@ -1,70 +0,0 @@ -diff --git a/ver/splat/dkr.jpn.v79.yaml b/ver/splat/dkr.jpn.v79.yaml -index d7dc18b4..7746ba82 100644 ---- a/ver/splat/dkr.jpn.v79.yaml -+++ b/ver/splat/dkr.jpn.v79.yaml -@@ -357,7 +357,8 @@ segments: - - [0xEAEA0, .rodata, weather] - - [0xEAEF0, .rodata, particles] - - [0xEB2B0, .rodata, printf] -- - [0xEB520, .rodata, thread0_epc] -+ - [0xEB520, .rodata, ../libultra/src/debug/assert] -+ - [0xEB580, .rodata, thread0_epc] - - [0xEB810, .rodata, waves] - - [0xEB980, .rodata, fade_transition] - - [0xEB9E0, .rodata, game_text] -diff --git a/ver/splat/dkr.pal.v77.yaml b/ver/splat/dkr.pal.v77.yaml -index fa473994..ca878e28 100644 ---- a/ver/splat/dkr.pal.v77.yaml -+++ b/ver/splat/dkr.pal.v77.yaml -@@ -357,7 +357,8 @@ segments: - - [0xE9480, .rodata, weather] - - [0xE94D0, .rodata, particles] - - [0xE9890, .rodata, printf] -- - [0xE9B00, .rodata, thread0_epc] -+ - [0xE9B00, .rodata, ../libultra/src/debug/assert] -+ - [0xE9B60, .rodata, thread0_epc] - - [0xE9DF0, .rodata, waves] - - [0xE9F60, .rodata, fade_transition] - - [0xE9FC0, .rodata, game_text] -diff --git a/ver/splat/dkr.pal.v80.yaml b/ver/splat/dkr.pal.v80.yaml -index 9e9c77b8..721665cd 100644 ---- a/ver/splat/dkr.pal.v80.yaml -+++ b/ver/splat/dkr.pal.v80.yaml -@@ -357,7 +357,8 @@ segments: - - [0xE9A00, .rodata, weather] - - [0xE9A50, .rodata, particles] - - [0xE9E10, .rodata, printf] -- - [0xEA080, .rodata, thread0_epc] -+ - [0xEA080, .rodata, ../libultra/src/debug/assert] -+ - [0xEA0E0, .rodata, thread0_epc] - - [0xEA370, .rodata, waves] - - [0xEA4E0, .rodata, fade_transition] - - [0xEA540, .rodata, game_text] -diff --git a/ver/splat/dkr.us.v77.yaml b/ver/splat/dkr.us.v77.yaml -index 6e2a76e0..ff063743 100644 ---- a/ver/splat/dkr.us.v77.yaml -+++ b/ver/splat/dkr.us.v77.yaml -@@ -357,7 +357,8 @@ segments: - - [0xE93F0, .rodata, weather] - - [0xE9440, .rodata, particles] - - [0xE9800, .rodata, printf] -- - [0xE9A70, .rodata, thread0_epc] -+ - [0xE9A70, .rodata, ../libultra/src/debug/assert] -+ - [0xE9AD0, .rodata, thread0_epc] - - [0xE9D60, .rodata, waves] - - [0xE9ED0, .rodata, fade_transition] - - [0xE9F30, .rodata, game_text] -diff --git a/ver/splat/dkr.us.v80.yaml b/ver/splat/dkr.us.v80.yaml -index 45295de7..84798adb 100644 ---- a/ver/splat/dkr.us.v80.yaml -+++ b/ver/splat/dkr.us.v80.yaml -@@ -357,7 +357,8 @@ segments: - - [0xE9970, .rodata, weather] - - [0xE99C0, .rodata, particles] - - [0xE9D80, .rodata, printf] -- - [0xE9FF0, .rodata, thread0_epc] -+ - [0xE9FF0, .rodata, ../libultra/src/debug/assert] -+ - [0xEA050, .rodata, thread0_epc] - - [0xEA2E0, .rodata, waves] - - [0xEA450, .rodata, fade_transition] - - [0xEA4B0, .rodata, game_text]