From 39c01d4f5e1988667b652fe4e1779435270b9da0 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Fri, 21 Feb 2025 09:23:36 -0500 Subject: [PATCH] Splat changes (#462) * Merge changes from splat where it makes sense at this stage. * Update score, and script for what seems like new map file style. * format * Fix accidental inclusion of version specific details. * Match camera_init * Update Score * Near match for func_80046524 * Format * Woops, it's NON_MATCHING * Missed button pressed value * Work on documenting func_80046524 * MAtch func_80046524 * Match func_80046524 * Minor changes * Fix warnings in func_80046524 * format.py * Update README * Match func_800230D0 * Fix UB in mode_init_taj_race --- Makefile | 6 +- README.md | 20 +- asm/entrypoint.s | 4 +- asm/non_matchings/camera/camera_init.s | 122 ----- asm/non_matchings/objects/func_800230D0.s | 223 --------- .../textures_sprites/func_8007BF34.s | 138 ------ asm/non_matchings/tracks/func_800278E8.s | 352 ------------- asm/non_matchings/tracks/func_8002E234.s | 468 ------------------ include/PR/libultra.h | 4 + include/PR/os_pi.h | 4 +- include/common.h | 57 +++ include/macros.h | 15 + include/structs.h | 2 +- lib/src/mips1/os/osCreatePiManager.c | 96 ++-- lib/src/os/__osLeoInterrupt.c | 4 + lib/src/os/osEpiRawStartDma.c | 2 +- lib/src/os/osInitialize.c | 1 + lib/src/os/osPiRawStartDma.c | 2 +- lib/src/os/osViMgr.c | 2 - src/audio.c | 7 +- src/audio_assert.c | 3 - src/audio_spatial.c | 2 +- src/audiomgr.c | 25 +- src/audiosfx.c | 8 + src/camera.c | 33 +- src/fade_transition.c | 2 +- src/font.c | 16 +- src/game.c | 3 +- src/game_text.c | 9 +- src/game_ui.c | 65 +-- src/memory.c | 20 +- src/menu.h | 48 +- src/object_functions.c | 35 +- src/object_models.c | 3 +- src/objects.c | 112 ++++- src/printf.c | 101 ++++ src/racer.c | 68 ++- src/racer.h | 4 +- src/rcp.h | 2 +- src/save_data.c | 15 +- src/save_data.h | 2 +- src/stacks.h | 2 +- src/textures_sprites.c | 42 +- src/textures_sprites.h | 2 +- src/thread0_epc.c | 2 +- src/thread30_track_loading.c | 11 +- src/thread3_main.c | 10 +- src/thread3_main.h | 2 +- src/tracks.c | 390 +++++++++++++-- src/tracks.h | 2 +- src/video.c | 26 +- src/waves.c | 20 +- src/weather.c | 4 +- src/weather.h | 10 +- tools/python/first_diff.py | 275 ++-------- tools/python/score.py | 4 +- 56 files changed, 982 insertions(+), 1925 deletions(-) delete mode 100644 asm/non_matchings/camera/camera_init.s delete mode 100644 asm/non_matchings/objects/func_800230D0.s delete mode 100644 asm/non_matchings/textures_sprites/func_8007BF34.s delete mode 100644 asm/non_matchings/tracks/func_800278E8.s delete mode 100644 asm/non_matchings/tracks/func_8002E234.s create mode 100644 include/common.h diff --git a/Makefile b/Makefile index 8f43ab3d..d55a52ba 100755 --- a/Makefile +++ b/Makefile @@ -12,9 +12,13 @@ VERSION := us_1.0 NON_MATCHING ?= 0 $(eval $(call validate-option,NON_MATCHING,0 1)) +LIBULTRA_VERSION_DEFINE := -DBUILD_VERSION=4 -DBUILD_VERSION_STRING=\"2.0G\" -DRAREDIFFS + ifeq ($(VERSION),us_1.0) DEFINES += VERSION_US_1_0=1 DEFINES += F3DDKR_GBI=1 + DEFINES += _FINALROM=1 + DEFINES += TARGET_N64=1 endif ifeq ($(NON_EQUIVALENT),1) DEFINES += NON_EQUIVALENT=1 @@ -155,7 +159,7 @@ OPT_FLAGS := -O2 -Xfullwarn #include -Xfullwarn here since it's not supported wi INCLUDE_DIRS := include $(BUILD_DIR) $(BUILD_DIR)/include src include/libc . -C_DEFINES := $(foreach d,$(DEFINES),-D$(d)) +C_DEFINES := $(foreach d,$(DEFINES),-D$(d)) $(LIBULTRA_VERSION_DEFINE) -D_MIPS_SZLONG=32 DEF_INC_CFLAGS := $(foreach i,$(INCLUDE_DIRS),-I$(i)) $(C_DEFINES) diff --git a/README.md b/README.md index 95a07fca..37387004 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 Currently, only the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is supported. US 1.1, EU 1.0, EU 1.1, and JP are not supported at this time. -As of February 14, 2025, this is our current score: +As of February 18, 2025, this is our current score: -    Decomp progress: 67.74% +    Decomp progress: 70.26%     Documentation progress: 49.72% @@ -126,20 +126,20 @@ s32 is_drumstick_unlocked(void) { ``` -As of February 14th, 2025, this is our current score: +As of February 18th, 2025, this is our current score: ``` ============================================= ADVENTURE ONE (ASM -> C Decompilation) - --- 67.74% Complete (70.43% NON_MATCHING) --- - # Decompiled functions: 1695 - # GLOBAL_ASM remaining: 150 - # NON_MATCHING functions: 16 - # NON_EQUIVALENT WIP functions: 47 + --- 70.26% Complete (72.90% NON_MATCHING) --- + # Decompiled functions: 1706 + # GLOBAL_ASM remaining: 139 + # NON_MATCHING functions: 15 + # NON_EQUIVALENT WIP functions: 44 ---------------- Game Status ---------------- - Balloons: 32/47, Keys: 3/4, Trophies: 3/5 + Balloons: 34/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 3/4, Wizpig Amulets: 3/4 --------------------------------------------- - We are racing in Greenwood Village. (Lap 3/3) + We are racing in Haunted Woods. (Lap 2/3) ============================================= ADVENTURE TWO (Cleanup & Documentation) -------------- 49.72% Complete -------------- diff --git a/asm/entrypoint.s b/asm/entrypoint.s index 56da3980..05ab2405 100644 --- a/asm/entrypoint.s +++ b/asm/entrypoint.s @@ -11,9 +11,9 @@ glabel entrypoint .ent entrypoint -/* 001000 80000400 3C08800F */ lui $t0, %hi(gBssSectionStart) # $t0, 0x800f +/* 001000 80000400 3C08800F */ lui $t0, %hi(gAudioHeapStack) # $t0, 0x800f /* 001004 80000404 3C090004 */ lui $t1, %hi(__BSS_SECTION_SIZE) # lui $t1, 4 -/* 001008 80000408 2508BF60 */ addiu $t0, %lo(gBssSectionStart) # addiu $t0, $t0, -0x40a0 +/* 001008 80000408 2508BF60 */ addiu $t0, %lo(gAudioHeapStack) # addiu $t0, $t0, -0x40a0 /* 00100C 8000040C 35291490 */ ori $t1, %lo(__BSS_SECTION_SIZE) # ori $t1, $t1, 0x1490 .L80000410: /* 001010 80000410 2129FFF8 */ addi $t1, $t1, -8 diff --git a/asm/non_matchings/camera/camera_init.s b/asm/non_matchings/camera/camera_init.s deleted file mode 100644 index e30a6854..00000000 --- a/asm/non_matchings/camera/camera_init.s +++ /dev/null @@ -1,122 +0,0 @@ -.late_rodata -glabel D_800E709C -.float 15000.0 - -.text -glabel camera_init -/* 066AA0 80065EA0 3C048012 */ lui $a0, %hi(D_80120DA0) # $a0, 0x8012 -/* 066AA4 80065EA4 24030001 */ li $v1, 1 -/* 066AA8 80065EA8 3C0F8012 */ lui $t7, %hi(gModelMatrixF) # $t7, 0x8012 -/* 066AAC 80065EAC 25EF0D70 */ addiu $t7, %lo(gModelMatrixF) # addiu $t7, $t7, 0xd70 -/* 066AB0 80065EB0 00037080 */ sll $t6, $v1, 2 -/* 066AB4 80065EB4 24840DA0 */ addiu $a0, %lo(D_80120DA0) # addiu $a0, $a0, 0xda0 -/* 066AB8 80065EB8 01CF1021 */ addu $v0, $t6, $t7 -/* 066ABC 80065EBC 0003C980 */ sll $t9, $v1, 6 -/* 066AC0 80065EC0 3C018012 */ lui $at, %hi(gModelMatrixF) # $at, 0x8012 -/* 066AC4 80065EC4 AC240D70 */ sw $a0, %lo(gModelMatrixF)($at) -/* 066AC8 80065EC8 00994021 */ addu $t0, $a0, $t9 -/* 066ACC 80065ECC 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* 066AD0 80065ED0 AC480000 */ sw $t0, ($v0) -/* 066AD4 80065ED4 246A0001 */ addiu $t2, $v1, 1 -/* 066AD8 80065ED8 000A5980 */ sll $t3, $t2, 6 -/* 066ADC 80065EDC 24680003 */ addiu $t0, $v1, 3 -/* 066AE0 80065EE0 246E0002 */ addiu $t6, $v1, 2 -/* 066AE4 80065EE4 AFB1002C */ sw $s1, 0x2c($sp) -/* 066AE8 80065EE8 000E7980 */ sll $t7, $t6, 6 -/* 066AEC 80065EEC 00084980 */ sll $t1, $t0, 6 -/* 066AF0 80065EF0 AFB20030 */ sw $s2, 0x30($sp) -/* 066AF4 80065EF4 AFB00028 */ sw $s0, 0x28($sp) -/* 066AF8 80065EF8 00895021 */ addu $t2, $a0, $t1 -/* 066AFC 80065EFC 008FC021 */ addu $t8, $a0, $t7 -/* 066B00 80065F00 008B6021 */ addu $t4, $a0, $t3 -/* 066B04 80065F04 3C118012 */ lui $s1, %hi(gActiveCameraID) # $s1, 0x8012 -/* 066B08 80065F08 AFBF0034 */ sw $ra, 0x34($sp) -/* 066B0C 80065F0C AC4C0004 */ sw $t4, 4($v0) -/* 066B10 80065F10 AC580008 */ sw $t8, 8($v0) -/* 066B14 80065F14 AC4A000C */ sw $t2, 0xc($v0) -/* 066B18 80065F18 26310CE4 */ addiu $s1, %lo(gActiveCameraID) # addiu $s1, $s1, 0xce4 -/* 066B1C 80065F1C 00008025 */ move $s0, $zero -/* 066B20 80065F20 24120008 */ li $s2, 8 -/* 066B24 80065F24 240B00B4 */ li $t3, 180 -.L80065F28: -/* 066B28 80065F28 AE300000 */ sw $s0, ($s1) -/* 066B2C 80065F2C AFAB0014 */ sw $t3, 0x14($sp) -/* 066B30 80065F30 240400C8 */ li $a0, 200 -/* 066B34 80065F34 240500C8 */ li $a1, 200 -/* 066B38 80065F38 240600C8 */ li $a2, 200 -/* 066B3C 80065F3C 00003825 */ move $a3, $zero -/* 066B40 80065F40 0C0198F7 */ jal camera_reset -/* 066B44 80065F44 AFA00010 */ sw $zero, 0x10($sp) -/* 066B48 80065F48 26100001 */ addiu $s0, $s0, 1 -/* 066B4C 80065F4C 1612FFF6 */ bne $s0, $s2, .L80065F28 -/* 066B50 80065F50 240B00B4 */ li $t3, 180 -/* 066B54 80065F54 3C018012 */ lui $at, %hi(gCutsceneCameraActive) # $at, 0x8012 -/* 066B58 80065F58 A0200D14 */ sb $zero, %lo(gCutsceneCameraActive)($at) -/* 066B5C 80065F5C AE200000 */ sw $zero, ($s1) -/* 066B60 80065F60 3C018012 */ lui $at, %hi(gModelMatrixStackPos) # $at, 0x8012 -/* 066B64 80065F64 AC200D1C */ sw $zero, %lo(gModelMatrixStackPos)($at) -/* 066B68 80065F68 3C018012 */ lui $at, %hi(gCameraMatrixPos) # $at, 0x8012 -/* 066B6C 80065F6C AC200D20 */ sw $zero, %lo(gCameraMatrixPos)($at) -/* 066B70 80065F70 3C018012 */ lui $at, %hi(gNumberOfViewports) # $at, 0x8012 -/* 066B74 80065F74 AC200CE0 */ sw $zero, %lo(gNumberOfViewports)($at) -/* 066B78 80065F78 3C018012 */ lui $at, %hi(gSpriteAnimOff) # $at, 0x8012 -/* 066B7C 80065F7C AC200D0C */ sw $zero, %lo(gSpriteAnimOff)($at) -/* 066B80 80065F80 3C018012 */ lui $at, %hi(D_80120D18) # $at, 0x8012 -/* 066B84 80065F84 AC200D18 */ sw $zero, %lo(D_80120D18)($at) -/* 066B88 80065F88 3C04800E */ lui $a0, %hi(gAntiPiracyViewport) # $a0, 0x800e -/* 066B8C 80065F8C 3C018012 */ lui $at, %hi(gAdjustViewportHeight) # $at, 0x8012 -/* 066B90 80065F90 2484D060 */ addiu $a0, %lo(gAntiPiracyViewport) # addiu $a0, $a0, -0x2fa0 -/* 066B94 80065F94 3C03A460 */ lui $v1, (0xA4600010 >> 16) # lui $v1, 0xa460 -/* 066B98 80065F98 A0200D15 */ sb $zero, %lo(gAdjustViewportHeight)($at) -/* 066B9C 80065F9C 34630010 */ ori $v1, (0xA4600010 & 0xFFFF) # ori $v1, $v1, 0x10 -/* 066BA0 80065FA0 A0800000 */ sb $zero, ($a0) -/* 066BA4 80065FA4 8C620000 */ lw $v0, ($v1) -/* 066BA8 80065FA8 3C0EB000 */ lui $t6, %hi(D_B0000578) # $t6, 0xb000 -/* 066BAC 80065FAC 304C0003 */ andi $t4, $v0, 3 -/* 066BB0 80065FB0 11800006 */ beqz $t4, .L80065FCC -/* 066BB4 80065FB4 3C108012 */ lui $s0, %hi(gPerspectiveMatrixF) # $s0, 0x8012 -.L80065FB8: -/* 066BB8 80065FB8 8C620000 */ lw $v0, ($v1) -/* 066BBC 80065FBC 00000000 */ nop -/* 066BC0 80065FC0 304D0003 */ andi $t5, $v0, 3 -/* 066BC4 80065FC4 15A0FFFC */ bnez $t5, .L80065FB8 -/* 066BC8 80065FC8 00000000 */ nop -.L80065FCC: -/* 066BCC 80065FCC 8DCF0578 */ lw $t7, %lo(D_B0000578)($t6) -/* 066BD0 80065FD0 34018965 */ li $at, 0x8965 -/* 066BD4 80065FD4 31F8FFFF */ andi $t8, $t7, 0xffff -/* 066BD8 80065FD8 13010003 */ beq $t8, $at, .L80065FE8 -/* 066BDC 80065FDC 26100EE0 */ addiu $s0, %lo(gPerspectiveMatrixF) # addiu $s0, $s0, 0xee0 -/* 066BE0 80065FE0 24190001 */ li $t9, 1 -/* 066BE4 80065FE4 A0990000 */ sb $t9, ($a0) -.L80065FE8: -/* 066BE8 80065FE8 3C014120 */ li $at, 0x41200000 # 10.000000 -/* 066BEC 80065FEC 44812000 */ mtc1 $at, $f4 -/* 066BF0 80065FF0 3C01800E */ lui $at, %hi(D_800E709C) # $at, 0x800e -/* 066BF4 80065FF4 C426709C */ lwc1 $f6, %lo(D_800E709C)($at) -/* 066BF8 80065FF8 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 066BFC 80065FFC 44814000 */ mtc1 $at, $f8 -/* 066C00 80066000 3C058012 */ lui $a1, %hi(perspNorm) # $a1, 0x8012 -/* 066C04 80066004 3C073FAA */ lui $a3, (0x3FAAAAAB >> 16) # lui $a3, 0x3faa -/* 066C08 80066008 34E7AAAB */ ori $a3, (0x3FAAAAAB & 0xFFFF) # ori $a3, $a3, 0xaaab -/* 066C0C 8006600C 24A50D6C */ addiu $a1, %lo(perspNorm) # addiu $a1, $a1, 0xd6c -/* 066C10 80066010 02002025 */ move $a0, $s0 -/* 066C14 80066014 3C064270 */ lui $a2, 0x4270 -/* 066C18 80066018 E7A40010 */ swc1 $f4, 0x10($sp) -/* 066C1C 8006601C E7A60014 */ swc1 $f6, 0x14($sp) -/* 066C20 80066020 0C033248 */ jal guPerspectiveF -/* 066C24 80066024 E7A80018 */ swc1 $f8, 0x18($sp) -/* 066C28 80066028 3C058012 */ lui $a1, %hi(gProjectionMatrixS) # $a1, 0x8012 -/* 066C2C 8006602C 24A50FE0 */ addiu $a1, %lo(gProjectionMatrixS) # addiu $a1, $a1, 0xfe0 -/* 066C30 80066030 0C01BE1C */ jal f32_matrix_to_s16_matrix -/* 066C34 80066034 02002025 */ move $a0, $s0 -/* 066C38 80066038 3C014270 */ li $at, 0x42700000 # 60.000000 -/* 066C3C 8006603C 44815000 */ mtc1 $at, $f10 -/* 066C40 80066040 8FBF0034 */ lw $ra, 0x34($sp) -/* 066C44 80066044 3C018012 */ lui $at, %hi(gCurCamFOV) # $at, 0x8012 -/* 066C48 80066048 8FB00028 */ lw $s0, 0x28($sp) -/* 066C4C 8006604C 8FB1002C */ lw $s1, 0x2c($sp) -/* 066C50 80066050 8FB20030 */ lw $s2, 0x30($sp) -/* 066C54 80066054 27BD0038 */ addiu $sp, $sp, 0x38 -/* 066C58 80066058 03E00008 */ jr $ra -/* 066C5C 8006605C E42A0D10 */ swc1 $f10, %lo(gCurCamFOV)($at) diff --git a/asm/non_matchings/objects/func_800230D0.s b/asm/non_matchings/objects/func_800230D0.s deleted file mode 100644 index d4f3ec32..00000000 --- a/asm/non_matchings/objects/func_800230D0.s +++ /dev/null @@ -1,223 +0,0 @@ -glabel func_800230D0 -/* 023CD0 800230D0 27BDFFA0 */ addiu $sp, $sp, -0x60 -/* 023CD4 800230D4 3C028012 */ lui $v0, %hi(gNumberOfCheckpoints) # $v0, 0x8012 -/* 023CD8 800230D8 8C42AED0 */ lw $v0, %lo(gNumberOfCheckpoints)($v0) -/* 023CDC 800230DC AFB10018 */ sw $s1, 0x18($sp) -/* 023CE0 800230E0 AFB00014 */ sw $s0, 0x14($sp) -/* 023CE4 800230E4 00808025 */ move $s0, $a0 -/* 023CE8 800230E8 00A08825 */ move $s1, $a1 -/* 023CEC 800230EC 14400032 */ bnez $v0, .L800231B8 -/* 023CF0 800230F0 AFBF001C */ sw $ra, 0x1c($sp) -/* 023CF4 800230F4 3C078012 */ lui $a3, %hi(gObjectCount) # $a3, 0x8012 -/* 023CF8 800230F8 24E7AE5C */ addiu $a3, %lo(gObjectCount) # addiu $a3, $a3, -0x51a4 -/* 023CFC 800230FC 8CE40000 */ lw $a0, ($a3) -/* 023D00 80023100 00004025 */ move $t0, $zero -/* 023D04 80023104 1880002A */ blez $a0, .L800231B0 -/* 023D08 80023108 00001025 */ move $v0, $zero -/* 023D0C 8002310C 3C058012 */ lui $a1, %hi(gObjPtrList) # $a1, 0x8012 -/* 023D10 80023110 24A5AE58 */ addiu $a1, %lo(gObjPtrList) # addiu $a1, $a1, -0x51a8 -/* 023D14 80023114 2406000B */ li $a2, 11 -.L80023118: -/* 023D18 80023118 8CAE0000 */ lw $t6, ($a1) -/* 023D1C 8002311C 00027880 */ sll $t7, $v0, 2 -/* 023D20 80023120 01CFC021 */ addu $t8, $t6, $t7 -/* 023D24 80023124 8F030000 */ lw $v1, ($t8) -/* 023D28 80023128 00000000 */ nop -/* 023D2C 8002312C 84790006 */ lh $t9, 6($v1) -/* 023D30 80023130 00000000 */ nop -/* 023D34 80023134 33298000 */ andi $t1, $t9, 0x8000 -/* 023D38 80023138 15200018 */ bnez $t1, .L8002319C -/* 023D3C 8002313C 00000000 */ nop -/* 023D40 80023140 846A0048 */ lh $t2, 0x48($v1) -/* 023D44 80023144 00000000 */ nop -/* 023D48 80023148 14CA0014 */ bne $a2, $t2, .L8002319C -/* 023D4C 8002314C 00000000 */ nop -/* 023D50 80023150 8C6B0078 */ lw $t3, 0x78($v1) -/* 023D54 80023154 00000000 */ nop -/* 023D58 80023158 15600011 */ bnez $t3, .L800231A0 -/* 023D5C 8002315C 24420001 */ addiu $v0, $v0, 1 -/* 023D60 80023160 C464000C */ lwc1 $f4, 0xc($v1) -/* 023D64 80023164 00000000 */ nop -/* 023D68 80023168 E604000C */ swc1 $f4, 0xc($s0) -/* 023D6C 8002316C C4660010 */ lwc1 $f6, 0x10($v1) -/* 023D70 80023170 00000000 */ nop -/* 023D74 80023174 E6060010 */ swc1 $f6, 0x10($s0) -/* 023D78 80023178 C4680014 */ lwc1 $f8, 0x14($v1) -/* 023D7C 8002317C 00000000 */ nop -/* 023D80 80023180 E6080014 */ swc1 $f8, 0x14($s0) -/* 023D84 80023184 846C002E */ lh $t4, 0x2e($v1) -/* 023D88 80023188 00000000 */ nop -/* 023D8C 8002318C A60C002E */ sh $t4, 0x2e($s0) -/* 023D90 80023190 8CE40000 */ lw $a0, ($a3) -/* 023D94 80023194 00000000 */ nop -/* 023D98 80023198 00801025 */ move $v0, $a0 -.L8002319C: -/* 023D9C 8002319C 24420001 */ addiu $v0, $v0, 1 -.L800231A0: -/* 023DA0 800231A0 0044082A */ slt $at, $v0, $a0 -/* 023DA4 800231A4 1420FFDC */ bnez $at, .L80023118 -/* 023DA8 800231A8 00000000 */ nop -/* 023DAC 800231AC AFA3002C */ sw $v1, 0x2c($sp) -.L800231B0: -/* 023DB0 800231B0 1000001E */ b .L8002322C -/* 023DB4 800231B4 8604002E */ lh $a0, 0x2e($s0) -.L800231B8: -/* 023DB8 800231B8 00026900 */ sll $t5, $v0, 4 -/* 023DBC 800231BC 3C0E8012 */ lui $t6, %hi(gTrackCheckpoints) # $t6, 0x8012 -/* 023DC0 800231C0 8DCEAECC */ lw $t6, %lo(gTrackCheckpoints)($t6) -/* 023DC4 800231C4 01A26823 */ subu $t5, $t5, $v0 -/* 023DC8 800231C8 000D6880 */ sll $t5, $t5, 2 -/* 023DCC 800231CC 3C01420C */ li $at, 0x420C0000 # 35.000000 -/* 023DD0 800231D0 01AE4021 */ addu $t0, $t5, $t6 -/* 023DD4 800231D4 44810000 */ mtc1 $at, $f0 -/* 023DD8 800231D8 C510FFCC */ lwc1 $f16, -0x34($t0) -/* 023DDC 800231DC C50AFFD4 */ lwc1 $f10, -0x2c($t0) -/* 023DE0 800231E0 46008482 */ mul.s $f18, $f16, $f0 -/* 023DE4 800231E4 2508FFC4 */ addiu $t0, $t0, -0x3c -/* 023DE8 800231E8 46125101 */ sub.s $f4, $f10, $f18 -/* 023DEC 800231EC E604000C */ swc1 $f4, 0xc($s0) -/* 023DF0 800231F0 C5060014 */ lwc1 $f6, 0x14($t0) -/* 023DF4 800231F4 C60C000C */ lwc1 $f12, 0xc($s0) -/* 023DF8 800231F8 E6060010 */ swc1 $f6, 0x10($s0) -/* 023DFC 800231FC C5100000 */ lwc1 $f16, ($t0) -/* 023E00 80023200 C5080018 */ lwc1 $f8, 0x18($t0) -/* 023E04 80023204 46008282 */ mul.s $f10, $f16, $f0 -/* 023E08 80023208 C60E0010 */ lwc1 $f14, 0x10($s0) -/* 023E0C 8002320C 460A4480 */ add.s $f18, $f8, $f10 -/* 023E10 80023210 E6120014 */ swc1 $f18, 0x14($s0) -/* 023E14 80023214 8E060014 */ lw $a2, 0x14($s0) -/* 023E18 80023218 0C00A7C6 */ jal get_level_segment_index_from_position -/* 023E1C 8002321C AFA8005C */ sw $t0, 0x5c($sp) -/* 023E20 80023220 8FA8005C */ lw $t0, 0x5c($sp) -/* 023E24 80023224 A602002E */ sh $v0, 0x2e($s0) -/* 023E28 80023228 8604002E */ lh $a0, 0x2e($s0) -.L8002322C: -/* 023E2C 8002322C 8E05000C */ lw $a1, 0xc($s0) -/* 023E30 80023230 8E060014 */ lw $a2, 0x14($s0) -/* 023E34 80023234 AFA8005C */ sw $t0, 0x5c($sp) -/* 023E38 80023238 0C00AEAC */ jal func_8002BAB0 -/* 023E3C 8002323C 27A70030 */ addiu $a3, $sp, 0x30 -/* 023E40 80023240 8FA3002C */ lw $v1, 0x2c($sp) -/* 023E44 80023244 8FA8005C */ lw $t0, 0x5c($sp) -/* 023E48 80023248 10400005 */ beqz $v0, .L80023260 -/* 023E4C 8002324C 00027880 */ sll $t7, $v0, 2 -/* 023E50 80023250 03AFC021 */ addu $t8, $sp, $t7 -/* 023E54 80023254 C704002C */ lwc1 $f4, 0x2c($t8) -/* 023E58 80023258 00000000 */ nop -/* 023E5C 8002325C E6040010 */ swc1 $f4, 0x10($s0) -.L80023260: -/* 023E60 80023260 C606000C */ lwc1 $f6, 0xc($s0) -/* 023E64 80023264 00000000 */ nop -/* 023E68 80023268 E626005C */ swc1 $f6, 0x5c($s1) -/* 023E6C 8002326C C6100010 */ lwc1 $f16, 0x10($s0) -/* 023E70 80023270 00000000 */ nop -/* 023E74 80023274 E6300060 */ swc1 $f16, 0x60($s1) -/* 023E78 80023278 C6080014 */ lwc1 $f8, 0x14($s0) -/* 023E7C 8002327C 11000008 */ beqz $t0, .L800232A0 -/* 023E80 80023280 E6280064 */ swc1 $f8, 0x64($s1) -/* 023E84 80023284 C50C0000 */ lwc1 $f12, ($t0) -/* 023E88 80023288 C50E0008 */ lwc1 $f14, 8($t0) -/* 023E8C 8002328C 0C01C1D4 */ jal arctan2_f -/* 023E90 80023290 AFA8005C */ sw $t0, 0x5c($sp) -/* 023E94 80023294 8FA8005C */ lw $t0, 0x5c($sp) -/* 023E98 80023298 10000004 */ b .L800232AC -/* 023E9C 8002329C A62201A0 */ sh $v0, 0x1a0($s1) -.L800232A0: -/* 023EA0 800232A0 84790000 */ lh $t9, ($v1) -/* 023EA4 800232A4 00000000 */ nop -/* 023EA8 800232A8 A63901A0 */ sh $t9, 0x1a0($s1) -.L800232AC: -/* 023EAC 800232AC A2200192 */ sb $zero, 0x192($s1) -/* 023EB0 800232B0 3C0A8012 */ lui $t2, %hi(gNumberOfCheckpoints) # $t2, 0x8012 -/* 023EB4 800232B4 8D4AAED0 */ lw $t2, %lo(gNumberOfCheckpoints)($t2) -/* 023EB8 800232B8 82290193 */ lb $t1, 0x193($s1) -/* 023EBC 800232BC 862C01A0 */ lh $t4, 0x1a0($s1) -/* 023EC0 800232C0 012A0019 */ multu $t1, $t2 -/* 023EC4 800232C4 3C014170 */ li $at, 0x41700000 # 15.000000 -/* 023EC8 800232C8 44810000 */ mtc1 $at, $f0 -/* 023ECC 800232CC 2401FFFF */ li $at, -1 -/* 023ED0 800232D0 00005812 */ mflo $t3 -/* 023ED4 800232D4 A62B0190 */ sh $t3, 0x190($s1) -/* 023ED8 800232D8 C60A000C */ lwc1 $f10, 0xc($s0) -/* 023EDC 800232DC A60C0000 */ sh $t4, ($s0) -/* 023EE0 800232E0 E62A00D8 */ swc1 $f10, 0xd8($s1) -/* 023EE4 800232E4 C6120010 */ lwc1 $f18, 0x10($s0) -/* 023EE8 800232E8 00000000 */ nop -/* 023EEC 800232EC 46009100 */ add.s $f4, $f18, $f0 -/* 023EF0 800232F0 E62400DC */ swc1 $f4, 0xdc($s1) -/* 023EF4 800232F4 C6060014 */ lwc1 $f6, 0x14($s0) -/* 023EF8 800232F8 00000000 */ nop -/* 023EFC 800232FC E62600E0 */ swc1 $f6, 0xe0($s1) -/* 023F00 80023300 C610000C */ lwc1 $f16, 0xc($s0) -/* 023F04 80023304 00000000 */ nop -/* 023F08 80023308 E63000E4 */ swc1 $f16, 0xe4($s1) -/* 023F0C 8002330C C6080010 */ lwc1 $f8, 0x10($s0) -/* 023F10 80023310 00000000 */ nop -/* 023F14 80023314 46004280 */ add.s $f10, $f8, $f0 -/* 023F18 80023318 E62A00E8 */ swc1 $f10, 0xe8($s1) -/* 023F1C 8002331C C6120014 */ lwc1 $f18, 0x14($s0) -/* 023F20 80023320 00000000 */ nop -/* 023F24 80023324 E63200EC */ swc1 $f18, 0xec($s1) -/* 023F28 80023328 C604000C */ lwc1 $f4, 0xc($s0) -/* 023F2C 8002332C 00000000 */ nop -/* 023F30 80023330 E62400F0 */ swc1 $f4, 0xf0($s1) -/* 023F34 80023334 C6060010 */ lwc1 $f6, 0x10($s0) -/* 023F38 80023338 00000000 */ nop -/* 023F3C 8002333C 46003400 */ add.s $f16, $f6, $f0 -/* 023F40 80023340 E63000F4 */ swc1 $f16, 0xf4($s1) -/* 023F44 80023344 C6080014 */ lwc1 $f8, 0x14($s0) -/* 023F48 80023348 00000000 */ nop -/* 023F4C 8002334C E62800F8 */ swc1 $f8, 0xf8($s1) -/* 023F50 80023350 C60A000C */ lwc1 $f10, 0xc($s0) -/* 023F54 80023354 00000000 */ nop -/* 023F58 80023358 E62A00FC */ swc1 $f10, 0xfc($s1) -/* 023F5C 8002335C C6120010 */ lwc1 $f18, 0x10($s0) -/* 023F60 80023360 00000000 */ nop -/* 023F64 80023364 46009100 */ add.s $f4, $f18, $f0 -/* 023F68 80023368 44800000 */ mtc1 $zero, $f0 -/* 023F6C 8002336C E6240100 */ swc1 $f4, 0x100($s1) -/* 023F70 80023370 C6060014 */ lwc1 $f6, 0x14($s0) -/* 023F74 80023374 00000000 */ nop -/* 023F78 80023378 E6260104 */ swc1 $f6, 0x104($s1) -/* 023F7C 8002337C 8E0D004C */ lw $t5, 0x4c($s0) -/* 023F80 80023380 C610000C */ lwc1 $f16, 0xc($s0) -/* 023F84 80023384 00000000 */ nop -/* 023F88 80023388 E5B00004 */ swc1 $f16, 4($t5) -/* 023F8C 8002338C 8E0E004C */ lw $t6, 0x4c($s0) -/* 023F90 80023390 C6080010 */ lwc1 $f8, 0x10($s0) -/* 023F94 80023394 00000000 */ nop -/* 023F98 80023398 E5C80008 */ swc1 $f8, 8($t6) -/* 023F9C 8002339C 8E0F004C */ lw $t7, 0x4c($s0) -/* 023FA0 800233A0 C60A0014 */ lwc1 $f10, 0x14($s0) -/* 023FA4 800233A4 00000000 */ nop -/* 023FA8 800233A8 E5EA000C */ swc1 $f10, 0xc($t7) -/* 023FAC 800233AC E620002C */ swc1 $f0, 0x2c($s1) -/* 023FB0 800233B0 E6200030 */ swc1 $f0, 0x30($s1) -/* 023FB4 800233B4 E600001C */ swc1 $f0, 0x1c($s0) -/* 023FB8 800233B8 E6000024 */ swc1 $f0, 0x24($s0) -/* 023FBC 800233BC 823801D7 */ lb $t8, 0x1d7($s1) -/* 023FC0 800233C0 86240000 */ lh $a0, ($s1) -/* 023FC4 800233C4 A23801D6 */ sb $t8, 0x1d6($s1) -/* 023FC8 800233C8 1081000F */ beq $a0, $at, .L80023408 -/* 023FCC 800233CC 8FBF001C */ lw $ra, 0x1c($sp) -/* 023FD0 800233D0 0C01997A */ jal set_active_camera -/* 023FD4 800233D4 AFA8005C */ sw $t0, 0x5c($sp) -/* 023FD8 800233D8 0C01A73F */ jal get_active_camera_segment_no_cutscenes -/* 023FDC 800233DC 00000000 */ nop -/* 023FE0 800233E0 C612000C */ lwc1 $f18, 0xc($s0) -/* 023FE4 800233E4 8FA8005C */ lw $t0, 0x5c($sp) -/* 023FE8 800233E8 E452000C */ swc1 $f18, 0xc($v0) -/* 023FEC 800233EC C6040010 */ lwc1 $f4, 0x10($s0) -/* 023FF0 800233F0 00000000 */ nop -/* 023FF4 800233F4 E4440010 */ swc1 $f4, 0x10($v0) -/* 023FF8 800233F8 C6060014 */ lwc1 $f6, 0x14($s0) -/* 023FFC 800233FC 00000000 */ nop -/* 024000 80023400 E4460014 */ swc1 $f6, 0x14($v0) -/* 024004 80023404 8FBF001C */ lw $ra, 0x1c($sp) -.L80023408: -/* 024008 80023408 8FB00014 */ lw $s0, 0x14($sp) -/* 02400C 8002340C 8FB10018 */ lw $s1, 0x18($sp) -/* 024010 80023410 27BD0060 */ addiu $sp, $sp, 0x60 -/* 024014 80023414 03E00008 */ jr $ra -/* 024018 80023418 01001025 */ move $v0, $t0 - diff --git a/asm/non_matchings/textures_sprites/func_8007BF34.s b/asm/non_matchings/textures_sprites/func_8007BF34.s deleted file mode 100644 index b004327e..00000000 --- a/asm/non_matchings/textures_sprites/func_8007BF34.s +++ /dev/null @@ -1,138 +0,0 @@ -glabel func_8007BF34 -/* 07CB34 8007BF34 3C078012 */ lui $a3, %hi(gCurrentRenderFlags) # $a3, 0x8012 -/* 07CB38 8007BF38 24E76374 */ addiu $a3, %lo(gCurrentRenderFlags) # addiu $a3, $a3, 0x6374 -/* 07CB3C 8007BF3C 8CEE0000 */ lw $t6, ($a3) -/* 07CB40 8007BF40 3C088012 */ lui $t0, %hi(gForceFlags) # $t0, 0x8012 -/* 07CB44 8007BF44 14AE0005 */ bne $a1, $t6, .L8007BF5C -/* 07CB48 8007BF48 25086382 */ addiu $t0, %lo(gForceFlags) # addiu $t0, $t0, 0x6382 -/* 07CB4C 8007BF4C 850F0000 */ lh $t7, ($t0) -/* 07CB50 8007BF50 00000000 */ nop -/* 07CB54 8007BF54 11E00073 */ beqz $t7, .L8007C124 -/* 07CB58 8007BF58 00000000 */ nop -.L8007BF5C: -/* 07CB5C 8007BF5C 8C820000 */ lw $v0, ($a0) -/* 07CB60 8007BF60 3C19E700 */ lui $t9, 0xe700 -/* 07CB64 8007BF64 24580008 */ addiu $t8, $v0, 8 -/* 07CB68 8007BF68 AC980000 */ sw $t8, ($a0) -/* 07CB6C 8007BF6C AC400004 */ sw $zero, 4($v0) -/* 07CB70 8007BF70 AC590000 */ sw $t9, ($v0) -/* 07CB74 8007BF74 8CE30000 */ lw $v1, ($a3) -/* 07CB78 8007BF78 3C088012 */ lui $t0, %hi(gForceFlags) # $t0, 0x8012 -/* 07CB7C 8007BF7C 00034900 */ sll $t1, $v1, 4 -/* 07CB80 8007BF80 05200005 */ bltz $t1, .L8007BF98 -/* 07CB84 8007BF84 25086382 */ addiu $t0, %lo(gForceFlags) # addiu $t0, $t0, 0x6382 -/* 07CB88 8007BF88 850A0000 */ lh $t2, ($t0) -/* 07CB8C 8007BF8C 00000000 */ nop -/* 07CB90 8007BF90 1140000A */ beqz $t2, .L8007BFBC -/* 07CB94 8007BF94 00000000 */ nop -.L8007BF98: -/* 07CB98 8007BF98 8C820000 */ lw $v0, ($a0) -/* 07CB9C 8007BF9C 3C0CB700 */ lui $t4, 0xb700 -/* 07CBA0 8007BFA0 244B0008 */ addiu $t3, $v0, 8 -/* 07CBA4 8007BFA4 AC8B0000 */ sw $t3, ($a0) -/* 07CBA8 8007BFA8 3C0D0001 */ lui $t5, 1 -/* 07CBAC 8007BFAC AC4D0004 */ sw $t5, 4($v0) -/* 07CBB0 8007BFB0 AC4C0000 */ sw $t4, ($v0) -/* 07CBB4 8007BFB4 8CE30000 */ lw $v1, ($a3) -/* 07CBB8 8007BFB8 00000000 */ nop -.L8007BFBC: -/* 07CBBC 8007BFBC 3C0F8012 */ lui $t7, %hi(gBlockedRenderFlags) # $t7, 0x8012 -/* 07CBC0 8007BFC0 8DEF6378 */ lw $t7, %lo(gBlockedRenderFlags)($t7) -/* 07CBC4 8007BFC4 3C01F7FF */ lui $at, (0xF7FFFFFF >> 16) # lui $at, 0xf7ff -/* 07CBC8 8007BFC8 3421FFFF */ ori $at, (0xF7FFFFFF & 0xFFFF) # ori $at, $at, 0xffff -/* 07CBCC 8007BFCC 00A17024 */ and $t6, $a1, $at -/* 07CBD0 8007BFD0 01E0C027 */ not $t8, $t7 -/* 07CBD4 8007BFD4 01D82824 */ and $a1, $t6, $t8 -/* 07CBD8 8007BFD8 30A20002 */ andi $v0, $a1, 2 -/* 07CBDC 8007BFDC 30790002 */ andi $t9, $v1, 2 -/* 07CBE0 8007BFE0 17220005 */ bne $t9, $v0, .L8007BFF8 -/* 07CBE4 8007BFE4 2401F7FF */ li $at, -2049 -/* 07CBE8 8007BFE8 85090000 */ lh $t1, ($t0) -/* 07CBEC 8007BFEC 00000000 */ nop -/* 07CBF0 8007BFF0 11200011 */ beqz $t1, .L8007C038 -/* 07CBF4 8007BFF4 00000000 */ nop -.L8007BFF8: -/* 07CBF8 8007BFF8 10400009 */ beqz $v0, .L8007C020 -/* 07CBFC 8007BFFC 3C0EB600 */ lui $t6, 0xb600 -/* 07CC00 8007C000 8C820000 */ lw $v0, ($a0) -/* 07CC04 8007C004 3C0BB700 */ lui $t3, 0xb700 -/* 07CC08 8007C008 244A0008 */ addiu $t2, $v0, 8 -/* 07CC0C 8007C00C AC8A0000 */ sw $t2, ($a0) -/* 07CC10 8007C010 240C0001 */ li $t4, 1 -/* 07CC14 8007C014 AC4C0004 */ sw $t4, 4($v0) -/* 07CC18 8007C018 10000007 */ b .L8007C038 -/* 07CC1C 8007C01C AC4B0000 */ sw $t3, ($v0) -.L8007C020: -/* 07CC20 8007C020 8C820000 */ lw $v0, ($a0) -/* 07CC24 8007C024 240F0001 */ li $t7, 1 -/* 07CC28 8007C028 244D0008 */ addiu $t5, $v0, 8 -/* 07CC2C 8007C02C AC8D0000 */ sw $t5, ($a0) -/* 07CC30 8007C030 AC4F0004 */ sw $t7, 4($v0) -/* 07CC34 8007C034 AC4E0000 */ sw $t6, ($v0) -.L8007C038: -/* 07CC38 8007C038 A5000000 */ sh $zero, ($t0) -/* 07CC3C 8007C03C ACE50000 */ sw $a1, ($a3) -/* 07CC40 8007C040 3C19800E */ lui $t9, %hi(gSpriteOpaque) # $t9, 0x800e -/* 07CC44 8007C044 8F39E7C4 */ lw $t9, %lo(gSpriteOpaque)($t9) -/* 07CC48 8007C048 00A1C024 */ and $t8, $a1, $at -/* 07CC4C 8007C04C 17200023 */ bnez $t9, .L8007C0DC -/* 07CC50 8007C050 03002825 */ move $a1, $t8 -/* 07CC54 8007C054 8CE90000 */ lw $t1, ($a3) -/* 07CC58 8007C058 3C0B0702 */ lui $t3, (0x07020010 >> 16) # lui $t3, 0x702 -/* 07CC5C 8007C05C 312A0200 */ andi $t2, $t1, 0x200 -/* 07CC60 8007C060 11400011 */ beqz $t2, .L8007C0A8 -/* 07CC64 8007C064 356B0010 */ ori $t3, (0x07020010 & 0xFFFF) # ori $t3, $t3, 0x10 -/* 07CC68 8007C068 8C820000 */ lw $v0, ($a0) -/* 07CC6C 8007C06C 00186843 */ sra $t5, $t8, 1 -/* 07CC70 8007C070 31AE0001 */ andi $t6, $t5, 1 -/* 07CC74 8007C074 000E7900 */ sll $t7, $t6, 4 -/* 07CC78 8007C078 3C018000 */ lui $at, 0x8000 -/* 07CC7C 8007C07C 3C19800E */ lui $t9, %hi(dRenderSettingsSpriteCld) # $t9, 0x800e -/* 07CC80 8007C080 2739E848 */ addiu $t9, %lo(dRenderSettingsSpriteCld) # addiu $t9, $t9, -0x17b8 -/* 07CC84 8007C084 01E1C021 */ addu $t8, $t7, $at -/* 07CC88 8007C088 3C0C0702 */ lui $t4, (0x07020010 >> 16) # lui $t4, 0x702 -/* 07CC8C 8007C08C 244B0008 */ addiu $t3, $v0, 8 -/* 07CC90 8007C090 AC8B0000 */ sw $t3, ($a0) -/* 07CC94 8007C094 358C0010 */ ori $t4, (0x07020010 & 0xFFFF) # ori $t4, $t4, 0x10 -/* 07CC98 8007C098 03194821 */ addu $t1, $t8, $t9 -/* 07CC9C 8007C09C AC490004 */ sw $t1, 4($v0) -/* 07CCA0 8007C0A0 1000001B */ b .L8007C110 -/* 07CCA4 8007C0A4 AC4C0000 */ sw $t4, ($v0) -.L8007C0A8: -/* 07CCA8 8007C0A8 8C820000 */ lw $v0, ($a0) -/* 07CCAC 8007C0AC 24ACFFF0 */ addiu $t4, $a1, -0x10 -/* 07CCB0 8007C0B0 000C6900 */ sll $t5, $t4, 4 -/* 07CCB4 8007C0B4 3C018000 */ lui $at, 0x8000 -/* 07CCB8 8007C0B8 3C0F800E */ lui $t7, %hi(dRenderSettingsSpriteXlu) # $t7, 0x800e -/* 07CCBC 8007C0BC 25EFE868 */ addiu $t7, %lo(dRenderSettingsSpriteXlu) # addiu $t7, $t7, -0x1798 -/* 07CCC0 8007C0C0 01A17021 */ addu $t6, $t5, $at -/* 07CCC4 8007C0C4 244A0008 */ addiu $t2, $v0, 8 -/* 07CCC8 8007C0C8 AC8A0000 */ sw $t2, ($a0) -/* 07CCCC 8007C0CC 01CFC021 */ addu $t8, $t6, $t7 -/* 07CCD0 8007C0D0 AC580004 */ sw $t8, 4($v0) -/* 07CCD4 8007C0D4 1000000E */ b .L8007C110 -/* 07CCD8 8007C0D8 AC4B0000 */ sw $t3, ($v0) -.L8007C0DC: -/* 07CCDC 8007C0DC 8C820000 */ lw $v0, ($a0) -/* 07CCE0 8007C0E0 00055100 */ sll $t2, $a1, 4 -/* 07CCE4 8007C0E4 3C018000 */ lui $at, 0x8000 -/* 07CCE8 8007C0E8 3C0C800E */ lui $t4, %hi(dRenderSettingsCommon) # $t4, 0x800e -/* 07CCEC 8007C0EC 24590008 */ addiu $t9, $v0, 8 -/* 07CCF0 8007C0F0 AC990000 */ sw $t9, ($a0) -/* 07CCF4 8007C0F4 258CE8E8 */ addiu $t4, %lo(dRenderSettingsCommon) # addiu $t4, $t4, -0x1718 -/* 07CCF8 8007C0F8 01415821 */ addu $t3, $t2, $at -/* 07CCFC 8007C0FC 3C090702 */ lui $t1, (0x07020010 >> 16) # lui $t1, 0x702 -/* 07CD00 8007C100 35290010 */ ori $t1, (0x07020010 & 0xFFFF) # ori $t1, $t1, 0x10 -/* 07CD04 8007C104 016C6821 */ addu $t5, $t3, $t4 -/* 07CD08 8007C108 AC4D0004 */ sw $t5, 4($v0) -/* 07CD0C 8007C10C AC490000 */ sw $t1, ($v0) -.L8007C110: -/* 07CD10 8007C110 3C018012 */ lui $at, %hi(gCurrentTextureHeader) # $at, 0x8012 -/* 07CD14 8007C114 AC20637C */ sw $zero, %lo(gCurrentTextureHeader)($at) -/* 07CD18 8007C118 3C018012 */ lui $at, %hi(gUsingTexture) # $at, 0x8012 -/* 07CD1C 8007C11C 240E0001 */ li $t6, 1 -/* 07CD20 8007C120 A42E6380 */ sh $t6, %lo(gUsingTexture)($at) -.L8007C124: -/* 07CD24 8007C124 03E00008 */ jr $ra -/* 07CD28 8007C128 00000000 */ nop - diff --git a/asm/non_matchings/tracks/func_800278E8.s b/asm/non_matchings/tracks/func_800278E8.s deleted file mode 100644 index 4017383c..00000000 --- a/asm/non_matchings/tracks/func_800278E8.s +++ /dev/null @@ -1,352 +0,0 @@ -glabel func_800278E8 -/* 0284E8 800278E8 27BDFF90 */ addiu $sp, $sp, -0x70 -/* 0284EC 800278EC AFBF001C */ sw $ra, 0x1c($sp) -/* 0284F0 800278F0 AFA40070 */ sw $a0, 0x70($sp) -/* 0284F4 800278F4 AFB10018 */ sw $s1, 0x18($sp) -/* 0284F8 800278F8 AFB00014 */ sw $s0, 0x14($sp) -/* 0284FC 800278FC 0C006E9D */ jal get_racer_objects -/* 028500 80027900 27A40038 */ addiu $a0, $sp, 0x38 -/* 028504 80027904 8FAE0038 */ lw $t6, 0x38($sp) -/* 028508 80027908 00001825 */ move $v1, $zero -/* 02850C 8002790C 19C00031 */ blez $t6, .L800279D4 -/* 028510 80027910 00003025 */ move $a2, $zero -/* 028514 80027914 00408025 */ move $s0, $v0 -.L80027918: -/* 028518 80027918 8E020000 */ lw $v0, ($s0) -/* 02851C 8002791C 00000000 */ nop -/* 028520 80027920 10400028 */ beqz $v0, .L800279C4 -/* 028524 80027924 8FAE0038 */ lw $t6, 0x38($sp) -/* 028528 80027928 8C510064 */ lw $s1, 0x64($v0) -/* 02852C 8002792C 27A50030 */ addiu $a1, $sp, 0x30 -/* 028530 80027930 822F01FD */ lb $t7, 0x1fd($s1) -/* 028534 80027934 00000000 */ nop -/* 028538 80027938 AFAF0030 */ sw $t7, 0x30($sp) -/* 02853C 8002793C 8E040000 */ lw $a0, ($s0) -/* 028540 80027940 AFA60034 */ sw $a2, 0x34($sp) -/* 028544 80027944 0C006F75 */ jal spectate_nearest -/* 028548 80027948 AFA30040 */ sw $v1, 0x40($sp) -/* 02854C 8002794C 8FB80030 */ lw $t8, 0x30($sp) -/* 028550 80027950 823901D8 */ lb $t9, 0x1d8($s1) -/* 028554 80027954 8FA30040 */ lw $v1, 0x40($sp) -/* 028558 80027958 8FA60034 */ lw $a2, 0x34($sp) -/* 02855C 8002795C 13200009 */ beqz $t9, .L80027984 -/* 028560 80027960 A23801FD */ sb $t8, 0x1fd($s1) -/* 028564 80027964 862801AC */ lh $t0, 0x1ac($s1) -/* 028568 80027968 24010001 */ li $at, 1 -/* 02856C 8002796C 15010015 */ bne $t0, $at, .L800279C4 -/* 028570 80027970 8FAE0038 */ lw $t6, 0x38($sp) -/* 028574 80027974 AFB1003C */ sw $s1, 0x3c($sp) -/* 028578 80027978 8E090000 */ lw $t1, ($s0) -/* 02857C 8002797C 10000010 */ b .L800279C0 -/* 028580 80027980 AFA90048 */ sw $t1, 0x48($sp) -.L80027984: -/* 028584 80027984 14600005 */ bnez $v1, .L8002799C -/* 028588 80027988 00000000 */ nop -/* 02858C 8002798C 8E0A0000 */ lw $t2, ($s0) -/* 028590 80027990 02201825 */ move $v1, $s1 -/* 028594 80027994 1000000A */ b .L800279C0 -/* 028598 80027998 AFAA004C */ sw $t2, 0x4c($sp) -.L8002799C: -/* 02859C 8002799C 862B01AE */ lh $t3, 0x1ae($s1) -/* 0285A0 800279A0 846C01AE */ lh $t4, 0x1ae($v1) -/* 0285A4 800279A4 00000000 */ nop -/* 0285A8 800279A8 016C082A */ slt $at, $t3, $t4 -/* 0285AC 800279AC 10200005 */ beqz $at, .L800279C4 -/* 0285B0 800279B0 8FAE0038 */ lw $t6, 0x38($sp) -/* 0285B4 800279B4 8E0D0000 */ lw $t5, ($s0) -/* 0285B8 800279B8 02201825 */ move $v1, $s1 -/* 0285BC 800279BC AFAD004C */ sw $t5, 0x4c($sp) -.L800279C0: -/* 0285C0 800279C0 8FAE0038 */ lw $t6, 0x38($sp) -.L800279C4: -/* 0285C4 800279C4 24C60001 */ addiu $a2, $a2, 1 -/* 0285C8 800279C8 00CE082A */ slt $at, $a2, $t6 -/* 0285CC 800279CC 1420FFD2 */ bnez $at, .L80027918 -/* 0285D0 800279D0 26100004 */ addiu $s0, $s0, 4 -.L800279D4: -/* 0285D4 800279D4 10600005 */ beqz $v1, .L800279EC -/* 0285D8 800279D8 8FB1003C */ lw $s1, 0x3c($sp) -/* 0285DC 800279DC 8FA5004C */ lw $a1, 0x4c($sp) -/* 0285E0 800279E0 10000004 */ b .L800279F4 -/* 0285E4 800279E4 00608825 */ move $s1, $v1 -/* 0285E8 800279E8 8FB1003C */ lw $s1, 0x3c($sp) -.L800279EC: -/* 0285EC 800279EC 8FA50048 */ lw $a1, 0x48($sp) -/* 0285F0 800279F0 00000000 */ nop -.L800279F4: -/* 0285F4 800279F4 822401FD */ lb $a0, 0x1fd($s1) -/* 0285F8 800279F8 0C006F65 */ jal spectate_object -/* 0285FC 800279FC AFA50054 */ sw $a1, 0x54($sp) -/* 028600 80027A00 3C0F8012 */ lui $t7, %hi(D_8011B104) # $t7, 0x8012 -/* 028604 80027A04 8DEFB104 */ lw $t7, %lo(D_8011B104)($t7) -/* 028608 80027A08 823801FD */ lb $t8, 0x1fd($s1) -/* 02860C 80027A0C 8FA50054 */ lw $a1, 0x54($sp) -/* 028610 80027A10 11F80005 */ beq $t7, $t8, .L80027A28 -/* 028614 80027A14 00408025 */ move $s0, $v0 -/* 028618 80027A18 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 02861C 80027A1C 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028620 80027A20 1000000E */ b .L80027A5C -/* 028624 80027A24 ACE00000 */ sw $zero, ($a3) -.L80027A28: -/* 028628 80027A28 3C038012 */ lui $v1, %hi(D_8011B100) # $v1, 0x8012 -/* 02862C 80027A2C 2463B100 */ addiu $v1, %lo(D_8011B100) # addiu $v1, $v1, -0x4f00 -/* 028630 80027A30 8C790000 */ lw $t9, ($v1) -/* 028634 80027A34 86280000 */ lh $t0, ($s1) -/* 028638 80027A38 00000000 */ nop -/* 02863C 80027A3C 13280007 */ beq $t9, $t0, .L80027A5C -/* 028640 80027A40 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028644 80027A44 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028648 80027A48 240900B4 */ li $t1, 180 -/* 02864C 80027A4C ACE90000 */ sw $t1, ($a3) -/* 028650 80027A50 862A0000 */ lh $t2, ($s1) -/* 028654 80027A54 00000000 */ nop -/* 028658 80027A58 AC6A0000 */ sw $t2, ($v1) -.L80027A5C: -/* 02865C 80027A5C 104000ED */ beqz $v0, .L80027E14 -/* 028660 80027A60 8FBF001C */ lw $ra, 0x1c($sp) -/* 028664 80027A64 0C01A73F */ jal get_active_camera_segment_no_cutscenes -/* 028668 80027A68 AFA50054 */ sw $a1, 0x54($sp) -/* 02866C 80027A6C C604000C */ lwc1 $f4, 0xc($s0) -/* 028670 80027A70 8FA50054 */ lw $a1, 0x54($sp) -/* 028674 80027A74 E444000C */ swc1 $f4, 0xc($v0) -/* 028678 80027A78 C6060010 */ lwc1 $f6, 0x10($s0) -/* 02867C 80027A7C C44A000C */ lwc1 $f10, 0xc($v0) -/* 028680 80027A80 E4460010 */ swc1 $f6, 0x10($v0) -/* 028684 80027A84 C6080014 */ lwc1 $f8, 0x14($s0) -/* 028688 80027A88 C4520010 */ lwc1 $f18, 0x10($v0) -/* 02868C 80027A8C E4480014 */ swc1 $f8, 0x14($v0) -/* 028690 80027A90 C4A40010 */ lwc1 $f4, 0x10($a1) -/* 028694 80027A94 C4B0000C */ lwc1 $f16, 0xc($a1) -/* 028698 80027A98 46049181 */ sub.s $f6, $f18, $f4 -/* 02869C 80027A9C 46105081 */ sub.s $f2, $f10, $f16 -/* 0286A0 80027AA0 E7A60064 */ swc1 $f6, 0x64($sp) -/* 0286A4 80027AA4 C4480014 */ lwc1 $f8, 0x14($v0) -/* 0286A8 80027AA8 C4AA0014 */ lwc1 $f10, 0x14($a1) -/* 0286AC 80027AAC 46021402 */ mul.s $f16, $f2, $f2 -/* 0286B0 80027AB0 460A4381 */ sub.s $f14, $f8, $f10 -/* 0286B4 80027AB4 E7A20068 */ swc1 $f2, 0x68($sp) -/* 0286B8 80027AB8 E7AE0060 */ swc1 $f14, 0x60($sp) -/* 0286BC 80027ABC 460E7482 */ mul.s $f18, $f14, $f14 -/* 0286C0 80027AC0 AFA20058 */ sw $v0, 0x58($sp) -/* 0286C4 80027AC4 0C0326B4 */ jal sqrtf -/* 0286C8 80027AC8 46128300 */ add.s $f12, $f16, $f18 -/* 0286CC 80027ACC 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 0286D0 80027AD0 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 0286D4 80027AD4 8CEB0000 */ lw $t3, ($a3) -/* 0286D8 80027AD8 8FA30058 */ lw $v1, 0x58($sp) -/* 0286DC 80027ADC C7A20068 */ lwc1 $f2, 0x68($sp) -/* 0286E0 80027AE0 C7AE0060 */ lwc1 $f14, 0x60($sp) -/* 0286E4 80027AE4 1160008C */ beqz $t3, .L80027D18 -/* 0286E8 80027AE8 46000306 */ mov.s $f12, $f0 -/* 0286EC 80027AEC 444CF800 */ cfc1 $t4, $31 -/* 0286F0 80027AF0 AFA30058 */ sw $v1, 0x58($sp) -/* 0286F4 80027AF4 35810003 */ ori $at, $t4, 3 -/* 0286F8 80027AF8 38210002 */ xori $at, $at, 2 -/* 0286FC 80027AFC 44C1F800 */ ctc1 $at, $31 -/* 028700 80027B00 E7AC005C */ swc1 $f12, 0x5c($sp) -/* 028704 80027B04 46001124 */ cvt.w.s $f4, $f2 -/* 028708 80027B08 44CCF800 */ ctc1 $t4, $31 -/* 02870C 80027B0C 44042000 */ mfc1 $a0, $f4 -/* 028710 80027B10 00000000 */ nop -/* 028714 80027B14 444DF800 */ cfc1 $t5, $31 -/* 028718 80027B18 00000000 */ nop -/* 02871C 80027B1C 35A10003 */ ori $at, $t5, 3 -/* 028720 80027B20 38210002 */ xori $at, $at, 2 -/* 028724 80027B24 44C1F800 */ ctc1 $at, $31 -/* 028728 80027B28 00000000 */ nop -/* 02872C 80027B2C 460071A4 */ cvt.w.s $f6, $f14 -/* 028730 80027B30 44053000 */ mfc1 $a1, $f6 -/* 028734 80027B34 44CDF800 */ ctc1 $t5, $31 -/* 028738 80027B38 0C01C19B */ jal atan2s -/* 02873C 80027B3C 00000000 */ nop -/* 028740 80027B40 8FA30058 */ lw $v1, 0x58($sp) -/* 028744 80027B44 00027023 */ negu $t6, $v0 -/* 028748 80027B48 84660000 */ lh $a2, ($v1) -/* 02874C 80027B4C 34018000 */ li $at, 32768 -/* 028750 80027B50 01C68023 */ subu $s0, $t6, $a2 -/* 028754 80027B54 02018021 */ addu $s0, $s0, $at -/* 028758 80027B58 00107C00 */ sll $t7, $s0, 0x10 -/* 02875C 80027B5C 000FC403 */ sra $t8, $t7, 0x10 -/* 028760 80027B60 34018001 */ li $at, 32769 -/* 028764 80027B64 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028768 80027B68 C7AC005C */ lwc1 $f12, 0x5c($sp) -/* 02876C 80027B6C 0301082A */ slt $at, $t8, $at -/* 028770 80027B70 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028774 80027B74 14200007 */ bnez $at, .L80027B94 -/* 028778 80027B78 03008025 */ move $s0, $t8 -/* 02877C 80027B7C 3C08FFFF */ lui $t0, (0xFFFF0001 >> 16) # lui $t0, 0xffff -/* 028780 80027B80 35080001 */ ori $t0, (0xFFFF0001 & 0xFFFF) # ori $t0, $t0, 1 -/* 028784 80027B84 0018C823 */ negu $t9, $t8 -/* 028788 80027B88 01198023 */ subu $s0, $t0, $t9 -/* 02878C 80027B8C 00104C00 */ sll $t1, $s0, 0x10 -/* 028790 80027B90 00098403 */ sra $s0, $t1, 0x10 -.L80027B94: -/* 028794 80027B94 8CEB0000 */ lw $t3, ($a3) -/* 028798 80027B98 3C014334 */ li $at, 0x43340000 # 180.000000 -/* 02879C 80027B9C 448B4000 */ mtc1 $t3, $f8 -/* 0287A0 80027BA0 44818000 */ mtc1 $at, $f16 -/* 0287A4 80027BA4 468042A0 */ cvt.s.w $f10, $f8 -/* 0287A8 80027BA8 3C014180 */ li $at, 0x41800000 # 16.000000 -/* 0287AC 80027BAC 44812000 */ mtc1 $at, $f4 -/* 0287B0 80027BB0 46105483 */ div.s $f18, $f10, $f16 -/* 0287B4 80027BB4 44904000 */ mtc1 $s0, $f8 -/* 0287B8 80027BB8 00000000 */ nop -/* 0287BC 80027BBC 468042A0 */ cvt.s.w $f10, $f8 -/* 0287C0 80027BC0 46122182 */ mul.s $f6, $f4, $f18 -/* 0287C4 80027BC4 00000000 */ nop -/* 0287C8 80027BC8 46065403 */ div.s $f16, $f10, $f6 -/* 0287CC 80027BCC 444CF800 */ cfc1 $t4, $31 -/* 0287D0 80027BD0 00000000 */ nop -/* 0287D4 80027BD4 35810003 */ ori $at, $t4, 3 -/* 0287D8 80027BD8 38210002 */ xori $at, $at, 2 -/* 0287DC 80027BDC 44C1F800 */ ctc1 $at, $31 -/* 0287E0 80027BE0 00000000 */ nop -/* 0287E4 80027BE4 46008124 */ cvt.w.s $f4, $f16 -/* 0287E8 80027BE8 44CCF800 */ ctc1 $t4, $31 -/* 0287EC 80027BEC 440E2000 */ mfc1 $t6, $f4 -/* 0287F0 80027BF0 00000000 */ nop -/* 0287F4 80027BF4 4458F800 */ cfc1 $t8, $31 -/* 0287F8 80027BF8 00CE7821 */ addu $t7, $a2, $t6 -/* 0287FC 80027BFC 37010003 */ ori $at, $t8, 3 -/* 028800 80027C00 A46F0000 */ sh $t7, ($v1) -/* 028804 80027C04 38210002 */ xori $at, $at, 2 -/* 028808 80027C08 44C1F800 */ ctc1 $at, $31 -/* 02880C 80027C0C C7B20064 */ lwc1 $f18, 0x64($sp) -/* 028810 80027C10 AFA30058 */ sw $v1, 0x58($sp) -/* 028814 80027C14 46009224 */ cvt.w.s $f8, $f18 -/* 028818 80027C18 44D8F800 */ ctc1 $t8, $31 -/* 02881C 80027C1C 44044000 */ mfc1 $a0, $f8 -/* 028820 80027C20 00000000 */ nop -/* 028824 80027C24 4448F800 */ cfc1 $t0, $31 -/* 028828 80027C28 00000000 */ nop -/* 02882C 80027C2C 35010003 */ ori $at, $t0, 3 -/* 028830 80027C30 38210002 */ xori $at, $at, 2 -/* 028834 80027C34 44C1F800 */ ctc1 $at, $31 -/* 028838 80027C38 00000000 */ nop -/* 02883C 80027C3C 460062A4 */ cvt.w.s $f10, $f12 -/* 028840 80027C40 44055000 */ mfc1 $a1, $f10 -/* 028844 80027C44 44C8F800 */ ctc1 $t0, $31 -/* 028848 80027C48 0C01C19B */ jal atan2s -/* 02884C 80027C4C 00000000 */ nop -/* 028850 80027C50 8FA30058 */ lw $v1, 0x58($sp) -/* 028854 80027C54 34018001 */ li $at, 32769 -/* 028858 80027C58 84640002 */ lh $a0, 2($v1) -/* 02885C 80027C5C 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028860 80027C60 00448023 */ subu $s0, $v0, $a0 -/* 028864 80027C64 0010CC00 */ sll $t9, $s0, 0x10 -/* 028868 80027C68 00194C03 */ sra $t1, $t9, 0x10 -/* 02886C 80027C6C 0121082A */ slt $at, $t1, $at -/* 028870 80027C70 01208025 */ move $s0, $t1 -/* 028874 80027C74 14200007 */ bnez $at, .L80027C94 -/* 028878 80027C78 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 02887C 80027C7C 3C0BFFFF */ lui $t3, (0xFFFF0001 >> 16) # lui $t3, 0xffff -/* 028880 80027C80 356B0001 */ ori $t3, (0xFFFF0001 & 0xFFFF) # ori $t3, $t3, 1 -/* 028884 80027C84 00095023 */ negu $t2, $t1 -/* 028888 80027C88 016A8023 */ subu $s0, $t3, $t2 -/* 02888C 80027C8C 00106400 */ sll $t4, $s0, 0x10 -/* 028890 80027C90 000C8403 */ sra $s0, $t4, 0x10 -.L80027C94: -/* 028894 80027C94 8CEE0000 */ lw $t6, ($a3) -/* 028898 80027C98 3C014334 */ li $at, 0x43340000 # 180.000000 -/* 02889C 80027C9C 448E3000 */ mtc1 $t6, $f6 -/* 0288A0 80027CA0 44812000 */ mtc1 $at, $f4 -/* 0288A4 80027CA4 46803420 */ cvt.s.w $f16, $f6 -/* 0288A8 80027CA8 3C014180 */ li $at, 0x41800000 # 16.000000 -/* 0288AC 80027CAC 44814000 */ mtc1 $at, $f8 -/* 0288B0 80027CB0 46048483 */ div.s $f18, $f16, $f4 -/* 0288B4 80027CB4 44903000 */ mtc1 $s0, $f6 -/* 0288B8 80027CB8 00000000 */ nop -/* 0288BC 80027CBC 46803420 */ cvt.s.w $f16, $f6 -/* 0288C0 80027CC0 46124282 */ mul.s $f10, $f8, $f18 -/* 0288C4 80027CC4 00000000 */ nop -/* 0288C8 80027CC8 460A8103 */ div.s $f4, $f16, $f10 -/* 0288CC 80027CCC 444FF800 */ cfc1 $t7, $31 -/* 0288D0 80027CD0 00000000 */ nop -/* 0288D4 80027CD4 35E10003 */ ori $at, $t7, 3 -/* 0288D8 80027CD8 38210002 */ xori $at, $at, 2 -/* 0288DC 80027CDC 44C1F800 */ ctc1 $at, $31 -/* 0288E0 80027CE0 00000000 */ nop -/* 0288E4 80027CE4 46002224 */ cvt.w.s $f8, $f4 -/* 0288E8 80027CE8 44084000 */ mfc1 $t0, $f8 -/* 0288EC 80027CEC 44CFF800 */ ctc1 $t7, $31 -/* 0288F0 80027CF0 0088C821 */ addu $t9, $a0, $t0 -/* 0288F4 80027CF4 A4790002 */ sh $t9, 2($v1) -/* 0288F8 80027CF8 8CE90000 */ lw $t1, ($a3) -/* 0288FC 80027CFC 8FAB0070 */ lw $t3, 0x70($sp) -/* 028900 80027D00 00000000 */ nop -/* 028904 80027D04 012B5023 */ subu $t2, $t1, $t3 -/* 028908 80027D08 05410035 */ bgez $t2, .L80027DE0 -/* 02890C 80027D0C ACEA0000 */ sw $t2, ($a3) -/* 028910 80027D10 10000033 */ b .L80027DE0 -/* 028914 80027D14 ACE00000 */ sw $zero, ($a3) -.L80027D18: -/* 028918 80027D18 444DF800 */ cfc1 $t5, $31 -/* 02891C 80027D1C AFA30058 */ sw $v1, 0x58($sp) -/* 028920 80027D20 35A10003 */ ori $at, $t5, 3 -/* 028924 80027D24 38210002 */ xori $at, $at, 2 -/* 028928 80027D28 44C1F800 */ ctc1 $at, $31 -/* 02892C 80027D2C E7AC005C */ swc1 $f12, 0x5c($sp) -/* 028930 80027D30 460014A4 */ cvt.w.s $f18, $f2 -/* 028934 80027D34 44CDF800 */ ctc1 $t5, $31 -/* 028938 80027D38 44049000 */ mfc1 $a0, $f18 -/* 02893C 80027D3C 00000000 */ nop -/* 028940 80027D40 444EF800 */ cfc1 $t6, $31 -/* 028944 80027D44 00000000 */ nop -/* 028948 80027D48 35C10003 */ ori $at, $t6, 3 -/* 02894C 80027D4C 38210002 */ xori $at, $at, 2 -/* 028950 80027D50 44C1F800 */ ctc1 $at, $31 -/* 028954 80027D54 00000000 */ nop -/* 028958 80027D58 460071A4 */ cvt.w.s $f6, $f14 -/* 02895C 80027D5C 44053000 */ mfc1 $a1, $f6 -/* 028960 80027D60 44CEF800 */ ctc1 $t6, $31 -/* 028964 80027D64 0C01C19B */ jal atan2s -/* 028968 80027D68 00000000 */ nop -/* 02896C 80027D6C 4448F800 */ cfc1 $t0, $31 -/* 028970 80027D70 8FA30058 */ lw $v1, 0x58($sp) -/* 028974 80027D74 340F8000 */ li $t7, 32768 -/* 028978 80027D78 C7AC005C */ lwc1 $f12, 0x5c($sp) -/* 02897C 80027D7C 01E2C023 */ subu $t8, $t7, $v0 -/* 028980 80027D80 35010003 */ ori $at, $t0, 3 -/* 028984 80027D84 38210002 */ xori $at, $at, 2 -/* 028988 80027D88 A4780000 */ sh $t8, ($v1) -/* 02898C 80027D8C C7B00064 */ lwc1 $f16, 0x64($sp) -/* 028990 80027D90 44C1F800 */ ctc1 $at, $31 -/* 028994 80027D94 00000000 */ nop -/* 028998 80027D98 460082A4 */ cvt.w.s $f10, $f16 -/* 02899C 80027D9C 44C8F800 */ ctc1 $t0, $31 -/* 0289A0 80027DA0 44045000 */ mfc1 $a0, $f10 -/* 0289A4 80027DA4 00000000 */ nop -/* 0289A8 80027DA8 4459F800 */ cfc1 $t9, $31 -/* 0289AC 80027DAC 00000000 */ nop -/* 0289B0 80027DB0 37210003 */ ori $at, $t9, 3 -/* 0289B4 80027DB4 38210002 */ xori $at, $at, 2 -/* 0289B8 80027DB8 44C1F800 */ ctc1 $at, $31 -/* 0289BC 80027DBC 00000000 */ nop -/* 0289C0 80027DC0 46006124 */ cvt.w.s $f4, $f12 -/* 0289C4 80027DC4 44052000 */ mfc1 $a1, $f4 -/* 0289C8 80027DC8 44D9F800 */ ctc1 $t9, $31 -/* 0289CC 80027DCC 0C01C19B */ jal atan2s -/* 0289D0 80027DD0 00000000 */ nop -/* 0289D4 80027DD4 8FA30058 */ lw $v1, 0x58($sp) -/* 0289D8 80027DD8 00000000 */ nop -/* 0289DC 80027DDC A4620002 */ sh $v0, 2($v1) -.L80027DE0: -/* 0289E0 80027DE0 A4600004 */ sh $zero, 4($v1) -/* 0289E4 80027DE4 C62E003C */ lwc1 $f14, 0x3c($s1) -/* 0289E8 80027DE8 C46C000C */ lwc1 $f12, 0xc($v1) -/* 0289EC 80027DEC 8C660014 */ lw $a2, 0x14($v1) -/* 0289F0 80027DF0 0C00A7C6 */ jal get_level_segment_index_from_position -/* 0289F4 80027DF4 AFA30058 */ sw $v1, 0x58($sp) -/* 0289F8 80027DF8 8FA30058 */ lw $v1, 0x58($sp) -/* 0289FC 80027DFC 3C018012 */ lui $at, %hi(D_8011B104) # $at, 0x8012 -/* 028A00 80027E00 A4620034 */ sh $v0, 0x34($v1) -/* 028A04 80027E04 822901FD */ lb $t1, 0x1fd($s1) -/* 028A08 80027E08 00000000 */ nop -/* 028A0C 80027E0C AC29B104 */ sw $t1, %lo(D_8011B104)($at) -/* 028A10 80027E10 8FBF001C */ lw $ra, 0x1c($sp) -.L80027E14: -/* 028A14 80027E14 8FB00014 */ lw $s0, 0x14($sp) -/* 028A18 80027E18 8FB10018 */ lw $s1, 0x18($sp) -/* 028A1C 80027E1C 03E00008 */ jr $ra -/* 028A20 80027E20 27BD0070 */ addiu $sp, $sp, 0x70 - diff --git a/asm/non_matchings/tracks/func_8002E234.s b/asm/non_matchings/tracks/func_8002E234.s deleted file mode 100644 index 8f8d0fe5..00000000 --- a/asm/non_matchings/tracks/func_8002E234.s +++ /dev/null @@ -1,468 +0,0 @@ -.late_rodata -glabel D_800E5F48 -.float 1.4 -glabel D_800E5F4C -.float 0.714 -glabel D_800E5F50 -.float 0.005 - -.text -glabel func_8002E234 -/* 02EE34 8002E234 27BDFF00 */ addiu $sp, $sp, -0x100 -/* 02EE38 8002E238 444EF800 */ cfc1 $t6, $31 -/* 02EE3C 8002E23C AFBF0044 */ sw $ra, 0x44($sp) -/* 02EE40 8002E240 35C10003 */ ori $at, $t6, 3 -/* 02EE44 8002E244 AFB60040 */ sw $s6, 0x40($sp) -/* 02EE48 8002E248 AFB5003C */ sw $s5, 0x3c($sp) -/* 02EE4C 8002E24C AFB40038 */ sw $s4, 0x38($sp) -/* 02EE50 8002E250 AFB30034 */ sw $s3, 0x34($sp) -/* 02EE54 8002E254 AFB20030 */ sw $s2, 0x30($sp) -/* 02EE58 8002E258 AFB1002C */ sw $s1, 0x2c($sp) -/* 02EE5C 8002E25C AFB00028 */ sw $s0, 0x28($sp) -/* 02EE60 8002E260 38210002 */ xori $at, $at, 2 -/* 02EE64 8002E264 44C1F800 */ ctc1 $at, $31 -/* 02EE68 8002E268 C4840010 */ lwc1 $f4, 0x10($a0) -/* 02EE6C 8002E26C 848F0048 */ lh $t7, 0x48($a0) -/* 02EE70 8002E270 460021A4 */ cvt.w.s $f6, $f4 -/* 02EE74 8002E274 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 02EE78 8002E278 24120001 */ li $s2, 1 -/* 02EE7C 8002E27C 44103000 */ mfc1 $s0, $f6 -/* 02EE80 8002E280 44819000 */ mtc1 $at, $f18 -/* 02EE84 8002E284 44CEF800 */ ctc1 $t6, $31 -/* 02EE88 8002E288 0080A825 */ move $s5, $a0 -/* 02EE8C 8002E28C 164F000F */ bne $s2, $t7, .L8002E2CC -/* 02EE90 8002E290 00A0B025 */ move $s6, $a1 -/* 02EE94 8002E294 0C0270C3 */ jal get_filtered_cheats -/* 02EE98 8002E298 E7B2006C */ swc1 $f18, 0x6c($sp) -/* 02EE9C 8002E29C C7B2006C */ lwc1 $f18, 0x6c($sp) -/* 02EEA0 8002E2A0 30580010 */ andi $t8, $v0, 0x10 -/* 02EEA4 8002E2A4 13000005 */ beqz $t8, .L8002E2BC -/* 02EEA8 8002E2A8 30590020 */ andi $t9, $v0, 0x20 -/* 02EEAC 8002E2AC 3C01800E */ lui $at, %hi(D_800E5F48) # $at, 0x800e -/* 02EEB0 8002E2B0 C4325F48 */ lwc1 $f18, %lo(D_800E5F48)($at) -/* 02EEB4 8002E2B4 10000006 */ b .L8002E2D0 -/* 02EEB8 8002E2B8 3C014000 */ lui $at, 0x4000 -.L8002E2BC: -/* 02EEBC 8002E2BC 13200003 */ beqz $t9, .L8002E2CC -/* 02EEC0 8002E2C0 3C01800E */ lui $at, %hi(D_800E5F4C) # $at, 0x800e -/* 02EEC4 8002E2C4 C4325F4C */ lwc1 $f18, %lo(D_800E5F4C)($at) -/* 02EEC8 8002E2C8 00000000 */ nop -.L8002E2CC: -/* 02EECC 8002E2CC 3C014000 */ li $at, 0x40000000 # 2.000000 -.L8002E2D0: -/* 02EED0 8002E2D0 44814000 */ mtc1 $at, $f8 -/* 02EED4 8002E2D4 3C118012 */ lui $s1, %hi(D_8011D0C8) # $s1, 0x8012 -/* 02EED8 8002E2D8 3C138012 */ lui $s3, %hi(D_8011D0C4) # $s3, 0x8012 -/* 02EEDC 8002E2DC 2673D0C4 */ addiu $s3, %lo(D_8011D0C4) # addiu $s3, $s3, -0x2f3c -/* 02EEE0 8002E2E0 2631D0C8 */ addiu $s1, %lo(D_8011D0C8) # addiu $s1, $s1, -0x2f38 -/* 02EEE4 8002E2E4 AE750000 */ sw $s5, ($s3) -/* 02EEE8 8002E2E8 12C00042 */ beqz $s6, .L8002E3F4 -/* 02EEEC 8002E2EC E6280000 */ swc1 $f8, ($s1) -/* 02EEF0 8002E2F0 3C018012 */ lui $at, %hi(D_8011D0B8) # $at, 0x8012 -/* 02EEF4 8002E2F4 AC20D0B8 */ sw $zero, %lo(D_8011D0B8)($at) -/* 02EEF8 8002E2F8 3C088012 */ lui $t0, %hi(D_8011D364) # $t0, 0x8012 -/* 02EEFC 8002E2FC 8D08D364 */ lw $t0, %lo(D_8011D364)($t0) -/* 02EF00 8002E300 8EA90058 */ lw $t1, 0x58($s5) -/* 02EF04 8002E304 00000000 */ nop -/* 02EF08 8002E308 A5280008 */ sh $t0, 8($t1) -/* 02EF0C 8002E30C 8EA20058 */ lw $v0, 0x58($s5) -/* 02EF10 8002E310 00000000 */ nop -/* 02EF14 8002E314 8445000C */ lh $a1, 0xc($v0) -/* 02EF18 8002E318 8C440004 */ lw $a0, 4($v0) -/* 02EF1C 8002E31C 00055200 */ sll $t2, $a1, 8 -/* 02EF20 8002E320 01402825 */ move $a1, $t2 -/* 02EF24 8002E324 0C01ED1B */ jal set_animated_texture_header -/* 02EF28 8002E328 E7B2006C */ swc1 $f18, 0x6c($sp) -/* 02EF2C 8002E32C 3C018012 */ lui $at, %hi(D_8011D0C0) # $at, 0x8012 -/* 02EF30 8002E330 AC22D0C0 */ sw $v0, %lo(D_8011D0C0)($at) -/* 02EF34 8002E334 8EAB0040 */ lw $t3, 0x40($s5) -/* 02EF38 8002E338 3C148012 */ lui $s4, %hi(D_8011D0CE) # $s4, 0x8012 -/* 02EF3C 8002E33C 856C0048 */ lh $t4, 0x48($t3) -/* 02EF40 8002E340 2694D0CE */ addiu $s4, %lo(D_8011D0CE) # addiu $s4, $s4, -0x2f32 -/* 02EF44 8002E344 01906821 */ addu $t5, $t4, $s0 -/* 02EF48 8002E348 A68D0000 */ sh $t5, ($s4) -/* 02EF4C 8002E34C 8EAE0040 */ lw $t6, 0x40($s5) -/* 02EF50 8002E350 3C198012 */ lui $t9, %hi(gWaveBlockCount) # $t9, 0x8012 -/* 02EF54 8002E354 85CF0046 */ lh $t7, 0x46($t6) -/* 02EF58 8002E358 8F39D384 */ lw $t9, %lo(gWaveBlockCount)($t9) -/* 02EF5C 8002E35C C7B2006C */ lwc1 $f18, 0x6c($sp) -/* 02EF60 8002E360 3C018012 */ lui $at, %hi(D_8011D0CC) # $at, 0x8012 -/* 02EF64 8002E364 01F0C021 */ addu $t8, $t7, $s0 -/* 02EF68 8002E368 13200006 */ beqz $t9, .L8002E384 -/* 02EF6C 8002E36C A438D0CC */ sh $t8, %lo(D_8011D0CC)($at) -/* 02EF70 8002E370 0C019884 */ jal get_viewport_count -/* 02EF74 8002E374 E7B2006C */ swc1 $f18, 0x6c($sp) -/* 02EF78 8002E378 C7B2006C */ lwc1 $f18, 0x6c($sp) -/* 02EF7C 8002E37C 1C400004 */ bgtz $v0, .L8002E390 -/* 02EF80 8002E380 00000000 */ nop -.L8002E384: -/* 02EF84 8002E384 44805000 */ mtc1 $zero, $f10 -/* 02EF88 8002E388 00000000 */ nop -/* 02EF8C 8002E38C E62A0000 */ swc1 $f10, ($s1) -.L8002E390: -/* 02EF90 8002E390 8EA80058 */ lw $t0, 0x58($s5) -/* 02EF94 8002E394 3C038012 */ lui $v1, %hi(D_8011D0D8) # $v1, 0x8012 -/* 02EF98 8002E398 C5040000 */ lwc1 $f4, ($t0) -/* 02EF9C 8002E39C 2463D0D8 */ addiu $v1, %lo(D_8011D0D8) # addiu $v1, $v1, -0x2f28 -/* 02EFA0 8002E3A0 46122182 */ mul.s $f6, $f4, $f18 -/* 02EFA4 8002E3A4 3C014120 */ li $at, 0x41200000 # 10.000000 -/* 02EFA8 8002E3A8 44814000 */ mtc1 $at, $f8 -/* 02EFAC 8002E3AC 3C018012 */ lui $at, %hi(D_8011D0DC) # $at, 0x8012 -/* 02EFB0 8002E3B0 E4660000 */ swc1 $f6, ($v1) -/* 02EFB4 8002E3B4 C4700000 */ lwc1 $f16, ($v1) -/* 02EFB8 8002E3B8 3C028012 */ lui $v0, %hi(D_8011D0F0) # $v0, 0x8012 -/* 02EFBC 8002E3BC 46088002 */ mul.s $f0, $f16, $f8 -/* 02EFC0 8002E3C0 2442D0F0 */ addiu $v0, %lo(D_8011D0F0) # addiu $v0, $v0, -0x2f10 -/* 02EFC4 8002E3C4 E420D0DC */ swc1 $f0, %lo(D_8011D0DC)($at) -/* 02EFC8 8002E3C8 3C018012 */ lui $at, %hi(D_8011D0E0) # $at, 0x8012 -/* 02EFCC 8002E3CC E420D0E0 */ swc1 $f0, %lo(D_8011D0E0)($at) -/* 02EFD0 8002E3D0 3C01BF80 */ li $at, 0xBF800000 # -1.000000 -/* 02EFD4 8002E3D4 44815000 */ mtc1 $at, $f10 -/* 02EFD8 8002E3D8 3C018012 */ lui $at, %hi(D_8011D0DC) # $at, 0x8012 -/* 02EFDC 8002E3DC E44A0000 */ swc1 $f10, ($v0) -/* 02EFE0 8002E3E0 C42CD0DC */ lwc1 $f12, %lo(D_8011D0DC)($at) -/* 02EFE4 8002E3E4 3C018012 */ lui $at, %hi(D_8011D0E0) # $at, 0x8012 -/* 02EFE8 8002E3E8 C42ED0E0 */ lwc1 $f14, %lo(D_8011D0E0)($at) -/* 02EFEC 8002E3EC 10000076 */ b .L8002E5C8 -/* 02EFF0 8002E3F0 3C014310 */ lui $at, 0x4310 -.L8002E3F4: -/* 02EFF4 8002E3F4 3C098012 */ lui $t1, %hi(D_8011D364) # $t1, 0x8012 -/* 02EFF8 8002E3F8 8D29D364 */ lw $t1, %lo(D_8011D364)($t1) -/* 02EFFC 8002E3FC 8EAA0050 */ lw $t2, 0x50($s5) -/* 02F000 8002E400 3C018012 */ lui $at, %hi(D_8011D0C0) # $at, 0x8012 -/* 02F004 8002E404 A5490008 */ sh $t1, 8($t2) -/* 02F008 8002E408 8EAB0050 */ lw $t3, 0x50($s5) -/* 02F00C 8002E40C 3C148012 */ lui $s4, %hi(D_8011D0CE) # $s4, 0x8012 -/* 02F010 8002E410 8D6C0004 */ lw $t4, 4($t3) -/* 02F014 8002E414 2694D0CE */ addiu $s4, %lo(D_8011D0CE) # addiu $s4, $s4, -0x2f32 -/* 02F018 8002E418 AC2CD0C0 */ sw $t4, %lo(D_8011D0C0)($at) -/* 02F01C 8002E41C 8EAD0040 */ lw $t5, 0x40($s5) -/* 02F020 8002E420 3C018012 */ lui $at, %hi(D_8011D0CC) # $at, 0x8012 -/* 02F024 8002E424 85AE0044 */ lh $t6, 0x44($t5) -/* 02F028 8002E428 00000000 */ nop -/* 02F02C 8002E42C 01D07821 */ addu $t7, $t6, $s0 -/* 02F030 8002E430 A68F0000 */ sh $t7, ($s4) -/* 02F034 8002E434 8EB80040 */ lw $t8, 0x40($s5) -/* 02F038 8002E438 00000000 */ nop -/* 02F03C 8002E43C 87190042 */ lh $t9, 0x42($t8) -/* 02F040 8002E440 00000000 */ nop -/* 02F044 8002E444 03304021 */ addu $t0, $t9, $s0 -/* 02F048 8002E448 A428D0CC */ sh $t0, %lo(D_8011D0CC)($at) -/* 02F04C 8002E44C 86A90048 */ lh $t1, 0x48($s5) -/* 02F050 8002E450 00000000 */ nop -/* 02F054 8002E454 12490025 */ beq $s2, $t1, .L8002E4EC -/* 02F058 8002E458 00000000 */ nop -/* 02F05C 8002E45C C6A20030 */ lwc1 $f2, 0x30($s5) -/* 02F060 8002E460 44806800 */ mtc1 $zero, $f13 -/* 02F064 8002E464 44806000 */ mtc1 $zero, $f12 -/* 02F068 8002E468 46001021 */ cvt.d.s $f0, $f2 -/* 02F06C 8002E46C 462C003C */ c.lt.d $f0, $f12 -/* 02F070 8002E470 44802000 */ mtc1 $zero, $f4 -/* 02F074 8002E474 45000003 */ bc1f .L8002E484 -/* 02F078 8002E478 3C014080 */ li $at, 0x40800000 # 4.000000 -/* 02F07C 8002E47C 46001087 */ neg.s $f2, $f2 -/* 02F080 8002E480 46001021 */ cvt.d.s $f0, $f2 -.L8002E484: -/* 02F084 8002E484 44812800 */ mtc1 $at, $f5 -/* 02F088 8002E488 3C014090 */ li $at, 0x40900000 # 4.500000 -/* 02F08C 8002E48C 46240181 */ sub.d $f6, $f0, $f4 -/* 02F090 8002E490 44814800 */ mtc1 $at, $f9 -/* 02F094 8002E494 462030A0 */ cvt.s.d $f2, $f6 -/* 02F098 8002E498 44804000 */ mtc1 $zero, $f8 -/* 02F09C 8002E49C 46001021 */ cvt.d.s $f0, $f2 -/* 02F0A0 8002E4A0 462C003C */ c.lt.d $f0, $f12 -/* 02F0A4 8002E4A4 3C014480 */ li $at, 0x44800000 # 1024.000000 -/* 02F0A8 8002E4A8 45000004 */ bc1f .L8002E4BC -/* 02F0AC 8002E4AC 00000000 */ nop -/* 02F0B0 8002E4B0 44801000 */ mtc1 $zero, $f2 -/* 02F0B4 8002E4B4 00000000 */ nop -/* 02F0B8 8002E4B8 46001021 */ cvt.d.s $f0, $f2 -.L8002E4BC: -/* 02F0BC 8002E4BC 4620403C */ c.lt.d $f8, $f0 -/* 02F0C0 8002E4C0 00000000 */ nop -/* 02F0C4 8002E4C4 45000003 */ bc1f .L8002E4D4 -/* 02F0C8 8002E4C8 00000000 */ nop -/* 02F0CC 8002E4CC 44811000 */ mtc1 $at, $f2 -/* 02F0D0 8002E4D0 00000000 */ nop -.L8002E4D4: -/* 02F0D4 8002E4D4 3C01800E */ lui $at, %hi(D_800E5F50) # $at, 0x800e -/* 02F0D8 8002E4D8 C4245F50 */ lwc1 $f4, %lo(D_800E5F50)($at) -/* 02F0DC 8002E4DC C62A0000 */ lwc1 $f10, ($s1) -/* 02F0E0 8002E4E0 46041182 */ mul.s $f6, $f2, $f4 -/* 02F0E4 8002E4E4 46065200 */ add.s $f8, $f10, $f6 -/* 02F0E8 8002E4E8 E6280000 */ swc1 $f8, ($s1) -.L8002E4EC: -/* 02F0EC 8002E4EC 8EAA0050 */ lw $t2, 0x50($s5) -/* 02F0F0 8002E4F0 3C038012 */ lui $v1, %hi(D_8011D0D8) # $v1, 0x8012 -/* 02F0F4 8002E4F4 C5440000 */ lwc1 $f4, ($t2) -/* 02F0F8 8002E4F8 2463D0D8 */ addiu $v1, %lo(D_8011D0D8) # addiu $v1, $v1, -0x2f28 -/* 02F0FC 8002E4FC 46122282 */ mul.s $f10, $f4, $f18 -/* 02F100 8002E500 3C014120 */ li $at, 0x41200000 # 10.000000 -/* 02F104 8002E504 44813000 */ mtc1 $at, $f6 -/* 02F108 8002E508 3C018012 */ lui $at, %hi(D_8011D0DC) # $at, 0x8012 -/* 02F10C 8002E50C E46A0000 */ swc1 $f10, ($v1) -/* 02F110 8002E510 C4700000 */ lwc1 $f16, ($v1) -/* 02F114 8002E514 3C028012 */ lui $v0, %hi(D_8011D0F0) # $v0, 0x8012 -/* 02F118 8002E518 46068002 */ mul.s $f0, $f16, $f6 -/* 02F11C 8002E51C 2442D0F0 */ addiu $v0, %lo(D_8011D0F0) # addiu $v0, $v0, -0x2f10 -/* 02F120 8002E520 E420D0DC */ swc1 $f0, %lo(D_8011D0DC)($at) -/* 02F124 8002E524 3C018012 */ lui $at, %hi(D_8011D0E0) # $at, 0x8012 -/* 02F128 8002E528 E420D0E0 */ swc1 $f0, %lo(D_8011D0E0)($at) -/* 02F12C 8002E52C 3C018012 */ lui $at, %hi(D_8011D0DC) # $at, 0x8012 -/* 02F130 8002E530 C42CD0DC */ lwc1 $f12, %lo(D_8011D0DC)($at) -/* 02F134 8002E534 3C018012 */ lui $at, %hi(D_8011D0E0) # $at, 0x8012 -/* 02F138 8002E538 C42ED0E0 */ lwc1 $f14, %lo(D_8011D0E0)($at) -/* 02F13C 8002E53C 3C014080 */ li $at, 0x40800000 # 4.000000 -/* 02F140 8002E540 44814000 */ mtc1 $at, $f8 -/* 02F144 8002E544 3C018012 */ lui $at, %hi(D_8011D0E4) # $at, 0x8012 -/* 02F148 8002E548 460C4102 */ mul.s $f4, $f8, $f12 -/* 02F14C 8002E54C 00000000 */ nop -/* 02F150 8002E550 460E2282 */ mul.s $f10, $f4, $f14 -/* 02F154 8002E554 E42AD0E4 */ swc1 $f10, %lo(D_8011D0E4)($at) -/* 02F158 8002E558 8EAB0040 */ lw $t3, 0x40($s5) -/* 02F15C 8002E55C 3C013E00 */ li $at, 0x3E000000 # 0.125000 -/* 02F160 8002E560 856C0042 */ lh $t4, 0x42($t3) -/* 02F164 8002E564 44812000 */ mtc1 $at, $f4 -/* 02F168 8002E568 448C3000 */ mtc1 $t4, $f6 -/* 02F16C 8002E56C 3C0140E0 */ li $at, 0x40E00000 # 7.000000 -/* 02F170 8002E570 46803220 */ cvt.s.w $f8, $f6 -/* 02F174 8002E574 44803000 */ mtc1 $zero, $f6 -/* 02F178 8002E578 46044282 */ mul.s $f10, $f8, $f4 -/* 02F17C 8002E57C 44812000 */ mtc1 $at, $f4 -/* 02F180 8002E580 E44A0000 */ swc1 $f10, ($v0) -/* 02F184 8002E584 C4420000 */ lwc1 $f2, ($v0) -/* 02F188 8002E588 00000000 */ nop -/* 02F18C 8002E58C 4606103C */ c.lt.s $f2, $f6 -/* 02F190 8002E590 00000000 */ nop -/* 02F194 8002E594 45000005 */ bc1f .L8002E5AC -/* 02F198 8002E598 00000000 */ nop -/* 02F19C 8002E59C 46001207 */ neg.s $f8, $f2 -/* 02F1A0 8002E5A0 E4480000 */ swc1 $f8, ($v0) -/* 02F1A4 8002E5A4 C4420000 */ lwc1 $f2, ($v0) -/* 02F1A8 8002E5A8 00000000 */ nop -.L8002E5AC: -/* 02F1AC 8002E5AC 46022282 */ mul.s $f10, $f4, $f2 -/* 02F1B0 8002E5B0 3C018012 */ lui $at, %hi(D_8011D0F4) # $at, 0x8012 -/* 02F1B4 8002E5B4 240D8000 */ li $t5, -32768 -/* 02F1B8 8002E5B8 E42AD0F4 */ swc1 $f10, %lo(D_8011D0F4)($at) -/* 02F1BC 8002E5BC 3C018012 */ lui $at, %hi(D_8011D0D0) # $at, 0x8012 -/* 02F1C0 8002E5C0 A42DD0D0 */ sh $t5, %lo(D_8011D0D0)($at) -/* 02F1C4 8002E5C4 3C014310 */ li $at, 0x43100000 # 144.000000 -.L8002E5C8: -/* 02F1C8 8002E5C8 44813000 */ mtc1 $at, $f6 -/* 02F1CC 8002E5CC 8E620000 */ lw $v0, ($s3) -/* 02F1D0 8002E5D0 46103203 */ div.s $f8, $f6, $f16 -/* 02F1D4 8002E5D4 868C0000 */ lh $t4, ($s4) -/* 02F1D8 8002E5D8 3C068012 */ lui $a2, %hi(D_8011D0CC) # $a2, 0x8012 -/* 02F1DC 8002E5DC 27A40078 */ addiu $a0, $sp, 0x78 -/* 02F1E0 8002E5E0 E4680000 */ swc1 $f8, ($v1) -/* 02F1E4 8002E5E4 C440000C */ lwc1 $f0, 0xc($v0) -/* 02F1E8 8002E5E8 C4420014 */ lwc1 $f2, 0x14($v0) -/* 02F1EC 8002E5EC 460C0101 */ sub.s $f4, $f0, $f12 -/* 02F1F0 8002E5F0 84C6D0CC */ lh $a2, %lo(D_8011D0CC)($a2) -/* 02F1F4 8002E5F4 444EF800 */ cfc1 $t6, $31 -/* 02F1F8 8002E5F8 AFAC0014 */ sw $t4, 0x14($sp) -/* 02F1FC 8002E5FC 35C10003 */ ori $at, $t6, 3 -/* 02F200 8002E600 38210002 */ xori $at, $at, 2 -/* 02F204 8002E604 44C1F800 */ ctc1 $at, $31 -/* 02F208 8002E608 00000000 */ nop -/* 02F20C 8002E60C 460022A4 */ cvt.w.s $f10, $f4 -/* 02F210 8002E610 44CEF800 */ ctc1 $t6, $31 -/* 02F214 8002E614 44055000 */ mfc1 $a1, $f10 -/* 02F218 8002E618 460E1181 */ sub.s $f6, $f2, $f14 -/* 02F21C 8002E61C 00057C00 */ sll $t7, $a1, 0x10 -/* 02F220 8002E620 4459F800 */ cfc1 $t9, $31 -/* 02F224 8002E624 000F2C03 */ sra $a1, $t7, 0x10 -/* 02F228 8002E628 37210003 */ ori $at, $t9, 3 -/* 02F22C 8002E62C 38210002 */ xori $at, $at, 2 -/* 02F230 8002E630 44C1F800 */ ctc1 $at, $31 -/* 02F234 8002E634 00000000 */ nop -/* 02F238 8002E638 46003224 */ cvt.w.s $f8, $f6 -/* 02F23C 8002E63C 44D9F800 */ ctc1 $t9, $31 -/* 02F240 8002E640 44074000 */ mfc1 $a3, $f8 -/* 02F244 8002E644 460C0100 */ add.s $f4, $f0, $f12 -/* 02F248 8002E648 00074400 */ sll $t0, $a3, 0x10 -/* 02F24C 8002E64C 444AF800 */ cfc1 $t2, $31 -/* 02F250 8002E650 00083C03 */ sra $a3, $t0, 0x10 -/* 02F254 8002E654 35410003 */ ori $at, $t2, 3 -/* 02F258 8002E658 38210002 */ xori $at, $at, 2 -/* 02F25C 8002E65C 44C1F800 */ ctc1 $at, $31 -/* 02F260 8002E660 00000000 */ nop -/* 02F264 8002E664 460022A4 */ cvt.w.s $f10, $f4 -/* 02F268 8002E668 44CAF800 */ ctc1 $t2, $31 -/* 02F26C 8002E66C 440B5000 */ mfc1 $t3, $f10 -/* 02F270 8002E670 460E1180 */ add.s $f6, $f2, $f14 -/* 02F274 8002E674 AFAB0010 */ sw $t3, 0x10($sp) -/* 02F278 8002E678 444DF800 */ cfc1 $t5, $31 -/* 02F27C 8002E67C 00000000 */ nop -/* 02F280 8002E680 35A10003 */ ori $at, $t5, 3 -/* 02F284 8002E684 38210002 */ xori $at, $at, 2 -/* 02F288 8002E688 44C1F800 */ ctc1 $at, $31 -/* 02F28C 8002E68C 00000000 */ nop -/* 02F290 8002E690 46003224 */ cvt.w.s $f8, $f6 -/* 02F294 8002E694 440E4000 */ mfc1 $t6, $f8 -/* 02F298 8002E698 44CDF800 */ ctc1 $t5, $31 -/* 02F29C 8002E69C 0C00A84D */ jal get_inside_segment_count_xyz -/* 02F2A0 8002E6A0 AFAE0018 */ sw $t6, 0x18($sp) -/* 02F2A4 8002E6A4 3C018012 */ lui $at, %hi(D_8011C230) # $at, 0x8012 -/* 02F2A8 8002E6A8 AC20C230 */ sw $zero, %lo(D_8011C230)($at) -/* 02F2AC 8002E6AC 3C018012 */ lui $at, %hi(D_8011B118) # $at, 0x8012 -/* 02F2B0 8002E6B0 3C038012 */ lui $v1, %hi(D_8011B320) # $v1, 0x8012 -/* 02F2B4 8002E6B4 3C048012 */ lui $a0, %hi(D_8011B320) # $a0, 0x8012 -/* 02F2B8 8002E6B8 AFA20070 */ sw $v0, 0x70($sp) -/* 02F2BC 8002E6BC AC20B118 */ sw $zero, %lo(D_8011B118)($at) -/* 02F2C0 8002E6C0 2484B330 */ addiu $a0, %lo(D_8011B320) + 0x10 # addiu $a0, $a0, -0x4cd0 -/* 02F2C4 8002E6C4 2463B320 */ addiu $v1, %lo(D_8011B320) # addiu $v1, $v1, -0x4ce0 -.L8002E6C8: -/* 02F2C8 8002E6C8 24630004 */ addiu $v1, $v1, 4 -/* 02F2CC 8002E6CC 0064082B */ sltu $at, $v1, $a0 -/* 02F2D0 8002E6D0 1420FFFD */ bnez $at, .L8002E6C8 -/* 02F2D4 8002E6D4 AC60FFFC */ sw $zero, -4($v1) -/* 02F2D8 8002E6D8 2403FFFF */ li $v1, -1 -/* 02F2DC 8002E6DC 3C018012 */ lui $at, %hi(D_8011D0E8) # $at, 0x8012 -/* 02F2E0 8002E6E0 AC23D0E8 */ sw $v1, %lo(D_8011D0E8)($at) -/* 02F2E4 8002E6E4 3C018012 */ lui $at, %hi(D_8011D0EC) # $at, 0x8012 -/* 02F2E8 8002E6E8 AC23D0EC */ sw $v1, %lo(D_8011D0EC)($at) -/* 02F2EC 8002E6EC 1840005C */ blez $v0, .L8002E860 -/* 02F2F0 8002E6F0 00009025 */ move $s2, $zero -/* 02F2F4 8002E6F4 3C13800E */ lui $s3, %hi(gCurrentLevelModel) # $s3, 0x800e -/* 02F2F8 8002E6F8 2673C918 */ addiu $s3, %lo(gCurrentLevelModel) # addiu $s3, $s3, -0x36e8 -/* 02F2FC 8002E6FC 27B10078 */ addiu $s1, $sp, 0x78 -/* 02F300 8002E700 24140044 */ li $s4, 68 -.L8002E704: -/* 02F304 8002E704 8E300000 */ lw $s0, ($s1) -/* 02F308 8002E708 00000000 */ nop -/* 02F30C 8002E70C 06000051 */ bltz $s0, .L8002E854 -/* 02F310 8002E710 8FAD0070 */ lw $t5, 0x70($sp) -/* 02F314 8002E714 12C00013 */ beqz $s6, .L8002E764 -/* 02F318 8002E718 3C018012 */ lui $at, %hi(D_8011D0DC) # $at, 0x8012 -/* 02F31C 8002E71C 02140019 */ multu $s0, $s4 -/* 02F320 8002E720 8E6F0000 */ lw $t7, ($s3) -/* 02F324 8002E724 3C0A8012 */ lui $t2, %hi(gWaveBlockCount) # $t2, 0x8012 -/* 02F328 8002E728 8DF80004 */ lw $t8, 4($t7) -/* 02F32C 8002E72C 0000C812 */ mflo $t9 -/* 02F330 8002E730 03194021 */ addu $t0, $t8, $t9 -/* 02F334 8002E734 8109002B */ lb $t1, 0x2b($t0) -/* 02F338 8002E738 00000000 */ nop -/* 02F33C 8002E73C 11200009 */ beqz $t1, .L8002E764 -/* 02F340 8002E740 00000000 */ nop -/* 02F344 8002E744 8D4AD384 */ lw $t2, %lo(gWaveBlockCount)($t2) -/* 02F348 8002E748 00000000 */ nop -/* 02F34C 8002E74C 11400005 */ beqz $t2, .L8002E764 -/* 02F350 8002E750 00000000 */ nop -/* 02F354 8002E754 0C00BBBB */ jal func_8002EEEC -/* 02F358 8002E758 02002025 */ move $a0, $s0 -/* 02F35C 8002E75C 1000003D */ b .L8002E854 -/* 02F360 8002E760 8FAD0070 */ lw $t5, 0x70($sp) -.L8002E764: -/* 02F364 8002E764 C6A0000C */ lwc1 $f0, 0xc($s5) -/* 02F368 8002E768 C42CD0DC */ lwc1 $f12, %lo(D_8011D0DC)($at) -/* 02F36C 8002E76C C6A20014 */ lwc1 $f2, 0x14($s5) -/* 02F370 8002E770 460C0101 */ sub.s $f4, $f0, $f12 -/* 02F374 8002E774 8E6C0000 */ lw $t4, ($s3) -/* 02F378 8002E778 444EF800 */ cfc1 $t6, $31 -/* 02F37C 8002E77C 00105880 */ sll $t3, $s0, 2 -/* 02F380 8002E780 35C10003 */ ori $at, $t6, 3 -/* 02F384 8002E784 38210002 */ xori $at, $at, 2 -/* 02F388 8002E788 44C1F800 */ ctc1 $at, $31 -/* 02F38C 8002E78C 3C018012 */ lui $at, %hi(D_8011D0E0) # $at, 0x8012 -/* 02F390 8002E790 460022A4 */ cvt.w.s $f10, $f4 -/* 02F394 8002E794 C42ED0E0 */ lwc1 $f14, %lo(D_8011D0E0)($at) -/* 02F398 8002E798 44CEF800 */ ctc1 $t6, $31 -/* 02F39C 8002E79C 44055000 */ mfc1 $a1, $f10 -/* 02F3A0 8002E7A0 460E1181 */ sub.s $f6, $f2, $f14 -/* 02F3A4 8002E7A4 8D8D0008 */ lw $t5, 8($t4) -/* 02F3A8 8002E7A8 444FF800 */ cfc1 $t7, $31 -/* 02F3AC 8002E7AC 01705823 */ subu $t3, $t3, $s0 -/* 02F3B0 8002E7B0 35E10003 */ ori $at, $t7, 3 -/* 02F3B4 8002E7B4 38210002 */ xori $at, $at, 2 -/* 02F3B8 8002E7B8 44C1F800 */ ctc1 $at, $31 -/* 02F3BC 8002E7BC 000B5880 */ sll $t3, $t3, 2 -/* 02F3C0 8002E7C0 46003224 */ cvt.w.s $f8, $f6 -/* 02F3C4 8002E7C4 016D2021 */ addu $a0, $t3, $t5 -/* 02F3C8 8002E7C8 44CFF800 */ ctc1 $t7, $31 -/* 02F3CC 8002E7CC 44064000 */ mfc1 $a2, $f8 -/* 02F3D0 8002E7D0 460C0100 */ add.s $f4, $f0, $f12 -/* 02F3D4 8002E7D4 4458F800 */ cfc1 $t8, $31 -/* 02F3D8 8002E7D8 00000000 */ nop -/* 02F3DC 8002E7DC 37010003 */ ori $at, $t8, 3 -/* 02F3E0 8002E7E0 38210002 */ xori $at, $at, 2 -/* 02F3E4 8002E7E4 44C1F800 */ ctc1 $at, $31 -/* 02F3E8 8002E7E8 00000000 */ nop -/* 02F3EC 8002E7EC 460022A4 */ cvt.w.s $f10, $f4 -/* 02F3F0 8002E7F0 44D8F800 */ ctc1 $t8, $31 -/* 02F3F4 8002E7F4 44075000 */ mfc1 $a3, $f10 -/* 02F3F8 8002E7F8 460E1180 */ add.s $f6, $f2, $f14 -/* 02F3FC 8002E7FC 4459F800 */ cfc1 $t9, $31 -/* 02F400 8002E800 00000000 */ nop -/* 02F404 8002E804 37210003 */ ori $at, $t9, 3 -/* 02F408 8002E808 38210002 */ xori $at, $at, 2 -/* 02F40C 8002E80C 44C1F800 */ ctc1 $at, $31 -/* 02F410 8002E810 00000000 */ nop -/* 02F414 8002E814 46003224 */ cvt.w.s $f8, $f6 -/* 02F418 8002E818 44084000 */ mfc1 $t0, $f8 -/* 02F41C 8002E81C 44D9F800 */ ctc1 $t9, $31 -/* 02F420 8002E820 0C00C537 */ jal func_800314DC -/* 02F424 8002E824 AFA80010 */ sw $t0, 0x10($sp) -/* 02F428 8002E828 8E290000 */ lw $t1, ($s1) -/* 02F42C 8002E82C 8E6C0000 */ lw $t4, ($s3) -/* 02F430 8002E830 01340019 */ multu $t1, $s4 -/* 02F434 8002E834 8D8B0004 */ lw $t3, 4($t4) -/* 02F438 8002E838 00402825 */ move $a1, $v0 -/* 02F43C 8002E83C 02C03025 */ move $a2, $s6 -/* 02F440 8002E840 00005012 */ mflo $t2 -/* 02F444 8002E844 014B2021 */ addu $a0, $t2, $t3 -/* 02F448 8002E848 0C00BA41 */ jal func_8002E904 -/* 02F44C 8002E84C 00000000 */ nop -/* 02F450 8002E850 8FAD0070 */ lw $t5, 0x70($sp) -.L8002E854: -/* 02F454 8002E854 26520001 */ addiu $s2, $s2, 1 -/* 02F458 8002E858 164DFFAA */ bne $s2, $t5, .L8002E704 -/* 02F45C 8002E85C 26310004 */ addiu $s1, $s1, 4 -.L8002E860: -/* 02F460 8002E860 3C0E8012 */ lui $t6, %hi(D_8011C230) # $t6, 0x8012 -/* 02F464 8002E864 8DCEC230 */ lw $t6, %lo(D_8011C230)($t6) -/* 02F468 8002E868 00000000 */ nop -/* 02F46C 8002E86C 19C00010 */ blez $t6, .L8002E8B0 -/* 02F470 8002E870 00000000 */ nop -/* 02F474 8002E874 8EAF0054 */ lw $t7, 0x54($s5) -/* 02F478 8002E878 00000000 */ nop -/* 02F47C 8002E87C 11E00008 */ beqz $t7, .L8002E8A0 -/* 02F480 8002E880 00000000 */ nop -/* 02F484 8002E884 16C00006 */ bnez $s6, .L8002E8A0 -/* 02F488 8002E888 00000000 */ nop -/* 02F48C 8002E88C 0C00BE99 */ jal func_8002FA64 -/* 02F490 8002E890 00000000 */ nop -/* 02F494 8002E894 8EB80054 */ lw $t8, 0x54($s5) -/* 02F498 8002E898 00000000 */ nop -/* 02F49C 8002E89C E7000000 */ swc1 $f0, ($t8) -.L8002E8A0: -/* 02F4A0 8002E8A0 0C00BCAB */ jal func_8002F2AC -/* 02F4A4 8002E8A4 00000000 */ nop -/* 02F4A8 8002E8A8 0C00BD10 */ jal func_8002F440 -/* 02F4AC 8002E8AC 00000000 */ nop -.L8002E8B0: -/* 02F4B0 8002E8B0 16C00006 */ bnez $s6, .L8002E8CC -/* 02F4B4 8002E8B4 3C098012 */ lui $t1, %hi(D_8011D364) # $t1, 0x8012 -/* 02F4B8 8002E8B8 3C198012 */ lui $t9, %hi(D_8011D364) # $t9, 0x8012 -/* 02F4BC 8002E8BC 8F39D364 */ lw $t9, %lo(D_8011D364)($t9) -/* 02F4C0 8002E8C0 8EA80050 */ lw $t0, 0x50($s5) -/* 02F4C4 8002E8C4 10000005 */ b .L8002E8DC -/* 02F4C8 8002E8C8 A519000A */ sh $t9, 0xa($t0) -.L8002E8CC: -/* 02F4CC 8002E8CC 8D29D364 */ lw $t1, %lo(D_8011D364)($t1) -/* 02F4D0 8002E8D0 8EAC0058 */ lw $t4, 0x58($s5) -/* 02F4D4 8002E8D4 00000000 */ nop -/* 02F4D8 8002E8D8 A589000A */ sh $t1, 0xa($t4) -.L8002E8DC: -/* 02F4DC 8002E8DC 8FBF0044 */ lw $ra, 0x44($sp) -/* 02F4E0 8002E8E0 8FB00028 */ lw $s0, 0x28($sp) -/* 02F4E4 8002E8E4 8FB1002C */ lw $s1, 0x2c($sp) -/* 02F4E8 8002E8E8 8FB20030 */ lw $s2, 0x30($sp) -/* 02F4EC 8002E8EC 8FB30034 */ lw $s3, 0x34($sp) -/* 02F4F0 8002E8F0 8FB40038 */ lw $s4, 0x38($sp) -/* 02F4F4 8002E8F4 8FB5003C */ lw $s5, 0x3c($sp) -/* 02F4F8 8002E8F8 8FB60040 */ lw $s6, 0x40($sp) -/* 02F4FC 8002E8FC 03E00008 */ jr $ra -/* 02F500 8002E900 27BD0100 */ addiu $sp, $sp, 0x100 - diff --git a/include/PR/libultra.h b/include/PR/libultra.h index f0dab415..22b390e1 100644 --- a/include/PR/libultra.h +++ b/include/PR/libultra.h @@ -5,6 +5,10 @@ #define TV_TYPE_PAL 0 #define TV_TYPE_MPAL 2 +#define OS_TV_TYPE_PAL 0 +#define OS_TV_TYPE_NTSC 1 +#define OS_TV_TYPE_MPAL 2 + #define RESET_TYPE_COLD_RESET 0 #define RESET_TYPE_NMI 1 #define RESET_TYPE_BOOT_DISK 2 diff --git a/include/PR/os_pi.h b/include/PR/os_pi.h index 49ba94dd..e4d61996 100644 --- a/include/PR/os_pi.h +++ b/include/PR/os_pi.h @@ -92,8 +92,8 @@ s32 osPiWriteIo(uintptr_t devAddr, u32 data); s32 osPiReadIo(uintptr_t devAddr, u32 *data); s32 osPiRawReadIo(u32 devAddr, u32 *data); -s32 osPiRawStartDma(s32 dir, u32 cart_addr, void *dram_addr, size_t size); -s32 osEPiRawStartDma(OSPiHandle *piHandle, s32 dir, u32 cart_addr, void *dram_addr, size_t size); +s32 __osPiRawStartDma(s32 dir, u32 cart_addr, void *dram_addr, size_t size); +s32 __osEPiRawStartDma(OSPiHandle *piHandle, s32 dir, u32 cart_addr, void *dram_addr, size_t size); s32 osEPiRawWriteIo(OSPiHandle *, u32 , u32); #endif diff --git a/include/common.h b/include/common.h new file mode 100644 index 00000000..a281efb8 --- /dev/null +++ b/include/common.h @@ -0,0 +1,57 @@ +#ifndef COMMON_H +#define COMMON_H + +#define VERSION_77 77 // NA / PAL V1 +#define VERSION_79 79 // Japan +#define VERSION_80 80 // NA / PAL V1.1 + +#define REGION_NA 1 +#define REGION_PAL 2 +#define REGION_JP 3 + +#if defined(VERSION_us_v77) +#define Func80019808Checksum 0x35281 +#define ViewportFuncChecksum 0x585E +#define TractionTableChecksum 0x1C65B +#define ObjLoopGoldenBalloonChecksum 0xA597 +#define VERSION VERSION_77 +#define REGION REGION_NA +#elif defined(VERSION_pal_v77) +#define Func80019808Checksum 0x34E72 +#define ViewportFuncChecksum 0x59E5 +#define TractionTableChecksum 0x1C38F +#define ObjLoopGoldenBalloonChecksum 0xA6FF +#define VERSION VERSION_77 +#define REGION REGION_PAL +#elif defined(VERSION_jpn_v79) +#define Func80019808Checksum 0x34EA6 +#define ViewportFuncChecksum 0x592D +#define TractionTableChecksum 0x1C9EC +#define ObjLoopGoldenBalloonChecksum 0xA7C5 +#define VERSION VERSION_79 +#define REGION REGION_JP +#elif defined(VERSION_us_v80) +#define Func80019808Checksum 0x34B94 +#define ViewportFuncChecksum 0x5881 +#define TractionTableChecksum 0x1CA13 +#define ObjLoopGoldenBalloonChecksum 0xA745 +#define VERSION VERSION_80 +#define REGION REGION_NA +#elif defined(VERSION_pal_v80) +#define Func80019808Checksum 0x3507C +#define ViewportFuncChecksum 0x580A +#define TractionTableChecksum 0x1CE40 +#define ObjLoopGoldenBalloonChecksum 0xA6AF +#define VERSION VERSION_80 +#define REGION REGION_PAL +#else +// Default to NA V1 if somehow we don't have a proper define. +#define Func80019808Checksum 0x35281 +#define ViewportFuncChecksum 0x585E +#define TractionTableChecksum 0x1C65B +#define ObjLoopGoldenBalloonChecksum 0xA597 +#define VERSION VERSION_77 +#define REGION REGION_NA +#endif + +#endif // COMMON_H diff --git a/include/macros.h b/include/macros.h index 896c281b..815befcd 100644 --- a/include/macros.h +++ b/include/macros.h @@ -37,6 +37,13 @@ #define STATIC_ASSERT(cond, msg) typedef char GLUE2(static_assertion_failed, __LINE__)[(cond) ? 1 : -1] #endif + +#ifdef __GNUC__ +#define ALIGNED(x) __attribute__((aligned(x))) +#else +#define ALIGNED(x) +#endif + // Align to 8-byte boundary for DMA requirements #ifdef __GNUC__ #define ALIGNED8 __attribute__((aligned(8))) @@ -68,4 +75,12 @@ // Used to make a u32 colour value look clearer. Transforms 0xFF0000FF to 255, 0, 0, 255 #define COLOUR_RGBA32(r, g, b, a) (((r << 24) | (g << 16) | (b << 8) | a)) +#define ALIGN8(val) (((val) + 7) & ~7) + +#define STACK(stack, size) \ + u64 stack[ALIGN8(size) / sizeof(u64)] + +#define STACK_START(stack) \ + ((u8*)(stack) + sizeof(stack)) + #endif diff --git a/include/structs.h b/include/structs.h index e8d075ac..ba905255 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1368,7 +1368,7 @@ typedef struct Object_Racer { /* 0x1FA */ s8 drifting; /* 0x1FB */ s8 unk1FB; /* 0x1FC */ u8 unk1FC; - /* 0x1FD */ s8 unk1FD; + /* 0x1FD */ s8 cameraIndex; /* 0x1FE */ u8 unk1FE; /* 0x1FF */ u8 unk1FF; /* 0x200 */ s8 transitionTimer; diff --git a/lib/src/mips1/os/osCreatePiManager.c b/lib/src/mips1/os/osCreatePiManager.c index 0175cc2e..c06d46fb 100644 --- a/lib/src/mips1/os/osCreatePiManager.c +++ b/lib/src/mips1/os/osCreatePiManager.c @@ -5,47 +5,73 @@ #include "libultra_internal.h" #include "stacks.h" #include "lib/src/os/piint.h" +#include "macros.h" -extern OSMesgQueue __osPiAccessQueue; -extern u32 __osPiAccessQueueEnabled; -extern OSDevMgr __osPiDevMgr; +static OSThread piThread ALIGNED(0x8); +static STACK(piThreadStack, OS_PIM_STACKSIZE) ALIGNED(0x10); -// bss variables -OSThread piThread; -u64 gPIMgrStack[0x20]; -OSMesgQueue piEventQueue; -OSMesg piEventBuf[2]; +static OSMesgQueue piEventQueue ALIGNED(0x8); +static OSMesg piEventBuf[1]; -void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ, OSMesg *cmdBuf, s32 cmdMsgCnt) { +OSDevMgr __osPiDevMgr = { 0 }; + +#ifndef RAREDIFFS +OSPiHandle* __osPiTable = NULL; +#if BUILD_VERSION >= VERSION_J +OSPiHandle __Dom1SpeedParam ALIGNED(0x8); +OSPiHandle __Dom2SpeedParam ALIGNED(0x8); +OSPiHandle* __osCurrentHandle[2] ALIGNED(0x8) = { &__Dom1SpeedParam, &__Dom2SpeedParam }; +#else +extern OSPiHandle CartRomHandle; +extern OSPiHandle LeoDiskHandle; +OSPiHandle* __osCurrentHandle[2] ALIGNED(0x8) = { &CartRomHandle, &LeoDiskHandle }; +#endif +#endif + +void osCreatePiManager(OSPri pri, OSMesgQueue* cmdQ, OSMesg* cmdBuf, s32 cmdMsgCnt) { u32 savedMask; OSPri oldPri; OSPri myPri; - if (!__osPiDevMgr.active) { - osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); - osCreateMesgQueue(&piEventQueue, (OSMesg*)&piEventBuf, 1); - if (!__osPiAccessQueueEnabled) - __osPiCreateAccessQueue(); - osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222); - oldPri = -1; - myPri = osGetThreadPri(NULL); - if (myPri < pri) { - oldPri = myPri; - osSetThreadPri(NULL, pri); - } - savedMask = __osDisableInt(); - __osPiDevMgr.active = 1; - __osPiDevMgr.thread = &piThread; - __osPiDevMgr.cmdQueue = cmdQ; - __osPiDevMgr.evtQueue = &piEventQueue; - __osPiDevMgr.acsQueue = &__osPiAccessQueue; - __osPiDevMgr.dma = osPiRawStartDma; - __osPiDevMgr.edma = osEPiRawStartDma; - osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, &gPIMgrStack[0x20], pri); - osStartThread(&piThread); - __osRestoreInt(savedMask); - if (oldPri != -1) { - osSetThreadPri(NULL, oldPri); - } +#ifdef _DEBUG + if ((pri < OS_PRIORITY_IDLE) || (pri > OS_PRIORITY_MAX)) { + __osError(ERR_OSCREATEPIMANAGER, 1, pri); + return; + } +#endif + + if (__osPiDevMgr.active) { + return; + } + osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt); + osCreateMesgQueue(&piEventQueue, (OSMesg*)piEventBuf, 1); + + if (!__osPiAccessQueueEnabled) { + __osPiCreateAccessQueue(); + } + + osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222); + oldPri = -1; + myPri = osGetThreadPri(NULL); + + if (myPri < pri) { + oldPri = myPri; + osSetThreadPri(NULL, pri); + } + + savedMask = __osDisableInt(); + __osPiDevMgr.active = 1; + __osPiDevMgr.thread = &piThread; + __osPiDevMgr.cmdQueue = cmdQ; + __osPiDevMgr.evtQueue = &piEventQueue; + __osPiDevMgr.acsQueue = &__osPiAccessQueue; + __osPiDevMgr.dma = __osPiRawStartDma; + __osPiDevMgr.edma = __osEPiRawStartDma; + osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, STACK_START(piThreadStack), pri); + osStartThread(&piThread); + __osRestoreInt(savedMask); + + if (oldPri != -1) { + osSetThreadPri(NULL, oldPri); } } diff --git a/lib/src/os/__osLeoInterrupt.c b/lib/src/os/__osLeoInterrupt.c index 2df540e4..639b9221 100644 --- a/lib/src/os/__osLeoInterrupt.c +++ b/lib/src/os/__osLeoInterrupt.c @@ -3,6 +3,10 @@ #include "types.h" +// Used for __osException, but .bss file order is weird. Need to fix later. +u8 leoDiskStack[16]; // technically should have a OS_LEO_STACKSIZE or something. + // This is something like 4096 in libreultra... + //This has been blanked out for some reason s32 __osLeoInterrupt(void) { return 0; diff --git a/lib/src/os/osEpiRawStartDma.c b/lib/src/os/osEpiRawStartDma.c index 11aac402..067f0170 100644 --- a/lib/src/os/osEpiRawStartDma.c +++ b/lib/src/os/osEpiRawStartDma.c @@ -4,7 +4,7 @@ #include "libultra_internal.h" #include "PR/rcp.h" -s32 osEPiRawStartDma(OSPiHandle *pihandle, s32 dir, u32 cart_addr, void *dram_addr, u32 size) { +s32 __osEPiRawStartDma(OSPiHandle *pihandle, s32 dir, u32 cart_addr, void *dram_addr, u32 size) { register int status; status = IO_READ(PI_STATUS_REG); diff --git a/lib/src/os/osInitialize.c b/lib/src/os/osInitialize.c index f2dbe602..4270e715 100644 --- a/lib/src/os/osInitialize.c +++ b/lib/src/os/osInitialize.c @@ -18,6 +18,7 @@ OSTime osClockRate = OS_CLOCK_RATE; u32 __osShutdown = 0; u32 __OSGlobalIntMask = OS_IM_ALL; s32 gLeoFound = FALSE; +u32 __osFinalrom; s32 __osLeoInterrupt(void); extern s32 osViClock; //This is defined in another file somehow diff --git a/lib/src/os/osPiRawStartDma.c b/lib/src/os/osPiRawStartDma.c index b88d8812..042c2823 100644 --- a/lib/src/os/osPiRawStartDma.c +++ b/lib/src/os/osPiRawStartDma.c @@ -6,7 +6,7 @@ #include "libultra_internal.h" #include "PR/rcp.h" -s32 osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) { +s32 __osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size) { register int status; status = IO_READ(PI_STATUS_REG); while (status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY | PI_STATUS_ERROR)) { diff --git a/lib/src/os/osViMgr.c b/lib/src/os/osViMgr.c index c26ee69a..6b5e7c12 100644 --- a/lib/src/os/osViMgr.c +++ b/lib/src/os/osViMgr.c @@ -12,8 +12,6 @@ extern u32 __osBaseCounter; extern u32 __osViIntrCount; OSDevMgr __osViDevMgr = {0}; -u64 gThread30Stack[0x400]; -u32 __osFinalrom; extern OSThread viThread; extern OSMesgQueue viEventQueue; diff --git a/src/audio.c b/src/audio.c index 02cf7a5d..2c56fd4b 100644 --- a/src/audio.c +++ b/src/audio.c @@ -39,7 +39,7 @@ u8 gBlockVoiceLimitChange = FALSE; /************ .bss ************/ // The audio heap is located at the start of the BSS section. -u8 gBssSectionStart[AUDIO_HEAP_SIZE]; +u8 gAudioHeapStack[AUDIO_HEAP_SIZE]; ALHeap gALHeap; ALSeqFile *gSequenceTable; @@ -50,7 +50,7 @@ u8 gCurrentJingleID; s32 gMusicTempo; u32 *gSeqLengthTable; ALBankFile *gSequenceBank; -ALBankFile *gSoundBank; +ALBankFile *gSoundBank; // Official Name: sfxBankPtr SoundData *gSoundTable; MusicData *gSeqSoundTable; s32 gSoundCount; @@ -89,7 +89,7 @@ void audio_init(OSSched *sc) { audioMgrConfig audConfig; seqLength = 0; - alHeapInit(&gALHeap, gBssSectionStart, sizeof(gBssSectionStart)); + alHeapInit(&gALHeap, gAudioHeapStack, sizeof(gAudioHeapStack)); addrPtr = (s32 *) load_asset_section_from_rom(ASSET_AUDIO_TABLE); gSoundBank = (ALBankFile *) mempool_alloc_safe(addrPtr[ASSET_AUDIO_2] - addrPtr[ASSET_AUDIO_1], COLOUR_TAG_CYAN); @@ -894,6 +894,7 @@ UNUSED void sound_pitch_set(SoundMask *soundMask, u32 pitch) { /** * Return the number of playable sounds in the audio table. + * Official name: amGetSfxCount */ u16 sound_count(void) { return gSoundBank->bankArray[0]->instArray[0]->soundCount; diff --git a/src/audio_assert.c b/src/audio_assert.c index 6d718762..cb3b41a7 100644 --- a/src/audio_assert.c +++ b/src/audio_assert.c @@ -3,9 +3,6 @@ #include "audio_assert.h" -UNUSED void func_800B6F30(UNUSED int arg0, UNUSED int arg1, UNUSED int arg2) { -} - // Only called from two libultra funcs for some reason. // This is likely an assert gone wrong. // Called from alEnvMixerPull, and _pullSubFrame diff --git a/src/audio_spatial.c b/src/audio_spatial.c index b0f19ca9..026c32f4 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -396,7 +396,7 @@ void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z) { f32 outY; f32 outZ; s32 levelSegmentIndex; - f32 *yVals; + f32 yVals[8]; // Not sure of the number needed s32 distBetween; s32 numOfYVals; u8 temp_v0_4; diff --git a/src/audiomgr.c b/src/audiomgr.c index 74a8605e..f890b0fa 100644 --- a/src/audiomgr.c +++ b/src/audiomgr.c @@ -9,6 +9,7 @@ #include "asset_loading.h" #include "objects.h" #include "PR/abi.h" +#include "common.h" /**** type define's for structures unique to audiomgr ****/ typedef union { @@ -80,7 +81,7 @@ s32 gAudioCmdLen; // Set but not used /**** Anti Piracy - Sets random audio frequency ****/ s16 gAntiPiracyCRCStart; s8 gAntiPiracyAudioFreq = FALSE; -s32 gFunc80019808Checksum = 0x35281; +s32 gFunc80019808Checksum = Func80019808Checksum; s32 gFunc80019808Length = 0xFD0; /** Queues and storage for use with audio DMA's ****/ @@ -103,16 +104,6 @@ static void __clearAudioDMA(void); /**** Debug strings ****/ const char D_800E49F0[] = "audio manager: RCP audio interface bug caused DMA from bad address - move audiomgr.c in the makelist!\n"; -const char D_800E4A58[] = "audio: ai out of samples\n"; -const char D_800E4A74[] = "OH DEAR - No audio DMA buffers left\n"; -const char D_800E4A9C[] = "Dma not done\n"; -const char D_800E4AAC[] = ""; -const char D_800E49B0[] = "Bad soundState: voices =%d, states free =%d, states busy =%d, type %d data %x\n"; -const char D_800E4B00[] = "playing a playing sound\n"; -const char D_800E4B1C[] = "Nonsense sndp event\n"; -const char D_800E4B34[] = "Sound state allocate failed - sndId %d\n"; -const char D_800E4B5C[] = "Don't worry - game should cope OK\n"; -const char D_800E4B80[] = "WARNING: Attempt to stop NULL sound aborted\n"; /****************************************************************************** * Audio Manager API @@ -365,7 +356,7 @@ static void __amHandleDoneMsg(UNUSED AudioInfo *info) { samplesLeft = osAiGetLength() >> 2; if (samplesLeft == 0 && !firstTime) { - // stubbed_printf("audio: ai out of samples\n"); + stubbed_printf("audio: ai out of samples\n"); firstTime = 0; } } @@ -402,9 +393,8 @@ static s32 __amDMA(s32 addr, s32 len, UNUSED void *state) { buffEnd = dmaPtr->startAddr + DMA_BUFFER_LENGTH; if (dmaPtr->startAddr > (u32) addr) { /* since buffers are ordered */ break; /* abort if past possible */ - - } else if (addrEnd <= buffEnd) { /* yes, found a buffer with samples */ - dmaPtr->lastFrame = audFrameCt; /* mark it used */ + } else if (addrEnd <= buffEnd) { /* yes, found a buffer with samples */ + dmaPtr->lastFrame = audFrameCt; /* mark it used */ foundBuffer = dmaPtr->ptr + addr - dmaPtr->startAddr; return (int) osVirtualToPhysical(foundBuffer); } @@ -426,6 +416,7 @@ static s32 __amDMA(s32 addr, s32 len, UNUSED void *state) { * pointer, it's better than nothing */ if (!dmaPtr) { + stubbed_printf("OH DEAR - No audio DMA buffers left\n"); return (int) osVirtualToPhysical(lastDmaPtr->ptr) + delta; } @@ -502,8 +493,8 @@ static void __clearAudioDMA(void) { * 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) { /* stubbed_printf("Dma not done\n"); */ + if (osRecvMesg(&audDMAMessageQ, (OSMesg *) &iomsg, OS_MESG_NOBLOCK) == -1) { + stubbed_printf("Dma not done\n"); } // if (logging) // osLogEvent(log, 17, 2, iomsg->devAddr, iomsg->size); diff --git a/src/audiosfx.c b/src/audiosfx.c index e8e8a5f0..8dfabefe 100644 --- a/src/audiosfx.c +++ b/src/audiosfx.c @@ -19,6 +19,14 @@ s32 sfxVolumeSlider = 256; s32 D_800DC6C4 = 0; // Currently unknown, might be a different type. u16 *gSoundChannelVolume; +/**** Debug strings ****/ +const char D_800E4AB0[] = "Bad soundState: voices =%d, states free =%d, states busy =%d, type %d data %x\n"; +const char D_800E4B00[] = "playing a playing sound\n"; +const char D_800E4B1C[] = "Nonsense sndp event\n"; +const char D_800E4B34[] = "Sound state allocate failed - sndId %d\n"; +const char D_800E4B5C[] = "Don't worry - game should cope OK\n"; +const char D_800E4B80[] = "WARNING: Attempt to stop NULL sound aborted\n"; + static void _removeEvents(ALEventQueue *, ALSoundState *, u16); void set_sfx_volume_slider(u32 volume) { diff --git a/src/camera.c b/src/camera.c index 646ec552..a1cf2507 100644 --- a/src/camera.c +++ b/src/camera.c @@ -11,6 +11,7 @@ #include "math_util.h" #include "weather.h" #include "lib/src/os/piint.h" +#include "include/viint.h" /************ .rodata ************/ @@ -100,7 +101,7 @@ f32 gModelMatrixViewZ[5]; u16 perspNorm; Matrix *gModelMatrixF[6]; MatrixS *gModelMatrixS[6]; -Matrix D_80120DA0[5]; +Matrix *D_80120DA0[10][8]; // Not sure why, but gModelMatrixF is populated from here, even though this is never set. Matrix gPerspectiveMatrixF; Matrix gViewMatrixF; Matrix gCameraMatrixF; @@ -112,20 +113,19 @@ Matrix gCurrentModelMatrixS; /******************************/ -#ifdef NON_MATCHING -extern s32 D_B0000578; /** * Official Name: camInit */ +extern s32 D_B0000578; void camera_init(void) { s32 i; s32 j; u32 stat; - // This loop is not cooperating. - for (i = 0; i < 5; i++) { - gModelMatrixF[i] = D_80120DA0 + i + i * 0; - } + // clang-format off + // This section is highly suspicous to be undefined behaviour as we have it defined right now. + for (i = 0; i < 5; i++) { gModelMatrixF[i] = (Matrix *) &D_80120DA0[(i << 1)]; } + // clang-format on for (j = 0; j < 8; j++) { gActiveCameraID = j; @@ -140,7 +140,7 @@ void camera_init(void) { gSpriteAnimOff = FALSE; D_80120D18 = 0; gAdjustViewportHeight = 0; - gAntiPiracyViewport = 0; + gAntiPiracyViewport = FALSE; WAIT_ON_IOBUSY(stat); @@ -154,9 +154,6 @@ void camera_init(void) { f32_matrix_to_s16_matrix(&gPerspectiveMatrixF, &gProjectionMatrixS); gCurCamFOV = CAMERA_DEFAULT_FOV; } -#else -GLOBAL_ASM("asm/non_matchings/camera/camera_init.s") -#endif void func_80066060(s32 cameraID, s32 zoomLevel) { if (cameraID >= 0 && cameraID < 4) { @@ -170,7 +167,7 @@ void func_80066060(s32 cameraID, s32 zoomLevel) { * Otherwise, set it to 0, regardless of TV type. */ void set_viewport_tv_type(s8 setting) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gAdjustViewportHeight = setting; } } @@ -667,14 +664,14 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { x = videoWidth >> 1; sp54_x = x; sp58_y = y; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { sp58_y = 145; } switch (viewports) { case VIEWPORTS_COUNT_1_PLAYER: posY = sp58_y; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { posY -= 18; } gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, videoWidth, videoHeight); @@ -683,7 +680,7 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { case VIEWPORTS_COUNT_2_PLAYERS: if (gActiveCameraID == 0) { posY = videoHeight >> 2; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { posY -= 12; } gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, videoWidth, (y - (videoHeight >> 7))); @@ -739,7 +736,7 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { } posY += sp58_y; posX += sp54_x; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { if (gActiveCameraID <= VIEWPORTS_COUNT_2_PLAYERS) { posY -= 20; } else { @@ -754,7 +751,7 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { break; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { posX -= 4; } viewport_rsp_set(dlist, sp54_x, sp58_y, posX, posY); @@ -1005,7 +1002,7 @@ void viewport_reset(Gfx **dlist) { gActiveCameraID = 0; } -UNUSED const char D_800E6F34[] = "cameraPushSprMtx: model stack overflow!!\n"; +UNUSED const char D_800E6F44[] = "cameraPushSprMtx: model stack overflow!!\n"; /** * Sets the matrix position to the world origin (0, 0, 0) diff --git a/src/fade_transition.c b/src/fade_transition.c index 44acae0a..bf7f704d 100644 --- a/src/fade_transition.c +++ b/src/fade_transition.c @@ -313,7 +313,7 @@ s32 handle_transitions(s32 updateRate) { */ void render_fade_transition(Gfx **dList, MatrixS **mats, Vertex **verts) { if (sTransitionStatus != TRANSITION_NONE) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { set_ortho_matrix_height(1.4f); } else { set_ortho_matrix_height(1.2f); diff --git a/src/font.c b/src/font.c index 92922891..d865e0e7 100644 --- a/src/font.c +++ b/src/font.c @@ -5,6 +5,7 @@ #include "menu.h" #include "textures_sprites.h" #include "camera.h" +#include "common.h" /************ .data ************/ @@ -43,7 +44,7 @@ s32 gDescPowsOf10[9] = { #define OUTWARDS 1 // clang-format off -s8 sDialogueBoxDimensions[48] = { +s8 sDialogueBoxDimensions[] = { /*X Offset*/ 4, INWARDS, /*Y Start*/ 0, INWARDS, /*Y end*/ 1, /*X Offset*/ 2, INWARDS, /*Y Start*/ 1, INWARDS, /*Y end*/ 2, /*X Offset*/ 1, INWARDS, /*Y Start*/ 2, INWARDS, /*Y end*/ 4, @@ -51,18 +52,13 @@ s8 sDialogueBoxDimensions[48] = { /*X Offset*/ 1, OUTWARDS, /*Y Start*/ -4, OUTWARDS, /*Y end*/ -2, /*X Offset*/ 2, OUTWARDS, /*Y Start*/ -2, OUTWARDS, /*Y end*/ -1, /*X Offset*/ 4, OUTWARDS, /*Y Start*/ -1, OUTWARDS, 0, - /*X Offset*/ -1, 0, 0, 0, 0, // End of Data - /*X Offset*/ 0, 0, 0, 0, 0, 0, 0, 0, + /*X Offset*/ -1, // End of Data }; // clang-format on #undef INWARDS #undef OUTWARDS -OSDevMgr __osPiDevMgr = { - 0, NULL, NULL, NULL, NULL, NULL, NULL, -}; - /*******************************/ /************ .bss ************/ @@ -994,13 +990,13 @@ void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogu * character '~' with the number. */ void parse_string_with_number(char *input, char *output, s32 number) { - while (*input != '\0') { - if ('~' == *input) { // ~ is equivalent to a %d. + while (*input) { + if (*input == '~') { // ~ is equivalent to a %d. // output the number as part of the string s32_to_string(&output, number); input++; } else { - *output = (signed char) *input; // It's either this cast, or change the function signature + *output = *input; input++; output++; } diff --git a/src/game.c b/src/game.c index 62b92c46..4402cb5c 100644 --- a/src/game.c +++ b/src/game.c @@ -44,6 +44,7 @@ #include "particles.h" #include "math_util.h" #include "controller.h" +#include "common.h" /************ .data ************/ @@ -53,7 +54,7 @@ u8 gTwoPlayerAdvRace = FALSE; s32 gIsInRace = 0; // Updated automatically from calc_func_checksums.py -s32 gViewportFuncChecksum = 0x585E; +s32 gViewportFuncChecksum = ViewportFuncChecksum; s32 gViewportFuncLength = 0x154; s16 gLevelPropertyStackPos = 0; s16 D_800DD32C = 0; diff --git a/src/game_text.c b/src/game_text.c index b246569f..100bfcb4 100644 --- a/src/game_text.c +++ b/src/game_text.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x800C29F0 */ #include "game_text.h" +#include "common.h" #include "menu.h" #include "objects.h" #include "racer.h" @@ -45,7 +46,7 @@ s16 gDialogueYPos2; // The Lower Right Y Coord of the Dialogue Box. Changes for s16 gShowSubtitles; s16 gSubtitleLineCount; s16 gCurrentTextID; -UNUSED s16 D_8012A7BE; +UNUSED s16 D_8012A7BC; char *gSubtitleProperties[1]; char *gCurrentMessageText[2]; char *gCurrentTextProperties; @@ -66,7 +67,7 @@ void init_dialogue_text(void) { gCurrentTextID = 0; gDialogueXPos1 = 32; gDialogueXPos2 = 288; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gDialogueYPos1 = 224; gDialogueYPos2 = 248; } else { @@ -259,7 +260,7 @@ void reset_delayed_text(void) { * Set the delayed text ID and delay (in seconds) */ void set_delayed_text(s32 textID, f32 delay) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gTextboxDelay = delay * 50.0; } else { gTextboxDelay = delay * 60.0; @@ -469,7 +470,7 @@ s32 func_800C38B4(s32 arg0, TextBox *textbox) { case 1: textbox->left = var_s0[1] & 0xFF; textbox->top = D_8012A7A0[arg0 + 2] & 0xFF; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { temp = textbox->top; textbox->top = (textbox->top * 264) / 240; temp = textbox->top - temp; diff --git a/src/game_ui.c b/src/game_ui.c index 2b5d06c5..a3471791 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x8009ECF0 */ #include "game_ui.h" +#include "common.h" #include "types.h" #include "macros.h" #include "structs.h" @@ -148,7 +149,7 @@ u32 gHudColour = COLOUR_RGBA32(255, 255, 255, 254); UNUSED f32 sRecordVel = 0.0f; // Set to whatever the highest velocity recorded is, but never actually used. // Unused? -s32 D_800E283C[5] = { 0x06FFFFFF, 0x000FFFFF, 0x06000000, 0x0014FFFF, 0x00000000 }; +s32 D_800E283C[] = { 0x06FFFFFF, 0x000FFFFF, 0x06000000, 0x0014FFFF }; /*******************************/ @@ -232,7 +233,7 @@ u8 gMinimapOpacityTarget; s32 gStopwatchErrorX; s32 gStopwatchErrorY; LevelHeader_70 *D_80127194; -s32 D_80127198[6]; +UNUSED s32 D_80127198[6]; // Not sure why this ended up here, and not in rcp.c along with the rest of the task data. u8 gGfxTaskYieldData[OS_YIELD_DATA_SIZE]; @@ -860,7 +861,7 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { gCurrentHud->challengePortrait.x += 68.0f; } else if (gNumActivePlayers == 2) { gCurrentHud->challengePortrait.x = portraitX; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.y += 66.0; gCurrentHud->eggChallengeIcon.y += 66.0; } else { @@ -1011,7 +1012,7 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { if (gNumActivePlayers == 1) { prevCurrHudUnk64C += 68; } else if (gNumActivePlayers == 2) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { offset += 66.0; } else { offset += 55; @@ -1242,7 +1243,7 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { stopwatchTimer += curRacer->lap_times[i]; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { stopwatchTimer = (f32) stopwatchTimer * 1.2; } if (normalise_time(36000) < stopwatchTimer) { @@ -1362,17 +1363,17 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { render_speedometer(playerRacerObj, updateRate); if (get_contpak_error() > 0) { switch (get_contpak_error()) { - case 1: + case CONTPAK_ERROR_UNKNOWN: SWMessage[0] = "CAN'T"; SWMessage[1] = "SAVE"; SWMessage[2] = "GHOST"; break; - case 2: + case CONTPAK_ERROR_FULL: SWMessage[0] = " CONTROLLER"; SWMessage[1] = "PAK"; SWMessage[2] = "FULL"; break; - case 3: + case CONTPAK_ERROR_DAMAGED: SWMessage[0] = " CONTROLLER"; SWMessage[1] = "PAK"; SWMessage[2] = "DAMAGED"; @@ -1647,9 +1648,9 @@ void render_racer_bananas(Object_Racer *racer, s32 updateRate) { } if (var_v1 == 0) { sprite_opaque(TRUE); - set_viewport_tv_type(TV_TYPE_NTSC); + set_viewport_tv_type(OS_TV_TYPE_NTSC); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountIconStatic); - set_viewport_tv_type(TV_TYPE_PAL); + set_viewport_tv_type(OS_TV_TYPE_PAL); sprite_opaque(FALSE); gCurrentHud->bananaCountIconSpin.spriteOffset = var_v1; if (gCurrentHud->bananaCountSparkle.unk1B) { @@ -1663,18 +1664,18 @@ void render_racer_bananas(Object_Racer *racer, s32 updateRate) { gCurrentHud->bananaCountSparkle.spriteOffset++; } } - set_viewport_tv_type(TV_TYPE_NTSC); + set_viewport_tv_type(OS_TV_TYPE_NTSC); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountSparkle); - set_viewport_tv_type(TV_TYPE_PAL); + set_viewport_tv_type(OS_TV_TYPE_PAL); } } else { gCurrentHud->bananaCountIconSpin.spriteOffset = var_v1 + 128; sprite_anim_off(FALSE); sprite_opaque(TRUE); - set_viewport_tv_type(TV_TYPE_NTSC); + set_viewport_tv_type(OS_TV_TYPE_NTSC); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountIconSpin); sprite_opaque(FALSE); - set_viewport_tv_type(TV_TYPE_PAL); + set_viewport_tv_type(OS_TV_TYPE_PAL); sprite_anim_off(TRUE); gCurrentHud->bananaCountIconSpin.spriteOffset -= 128; } @@ -2252,7 +2253,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { } break; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengeFinishPosition1.unk1D -= 4; gCurrentHud->raceTimeNumber.unk1D -= 4; gCurrentHud->lapTimeText.unk1D -= 4; @@ -2275,7 +2276,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { var_f0 = 183.0f; var_f2 = 198.0f; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { var_f0 *= 1.1; var_f2 *= 1.1; var_f12 -= 4.0f; @@ -2308,7 +2309,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { var_f12 = 230.0f; var_f14 = -70.0f; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { var_f0 *= 1.1; var_f2 *= 1.1; var_f12 -= 4.0f; @@ -2546,7 +2547,7 @@ void render_balloon_count(UNUSED Object_Racer *racer) { Settings *settings; settings = get_settings(); - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { balloonTickTimer = 646; } else { balloonTickTimer = 840; @@ -2576,14 +2577,14 @@ void render_balloon_count(UNUSED Object_Racer *racer) { gCurrentHud->balloonCountNumber1.spriteOffset = balloonCount % 10; } func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountNumber1); - set_viewport_tv_type(TV_TYPE_NTSC); - if (osTvType == TV_TYPE_PAL) { + set_viewport_tv_type(OS_TV_TYPE_NTSC); + if (osTvType == OS_TV_TYPE_PAL) { sprite_opaque(TRUE); } // gCurrentHud->balloonCountIcon.scale += 0.001f; func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountIcon); sprite_opaque(FALSE); - set_viewport_tv_type(TV_TYPE_PAL); + set_viewport_tv_type(OS_TV_TYPE_PAL); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountX); } @@ -2627,7 +2628,7 @@ void render_weapon_hud(Object *obj, s32 updateRate) { racer = (Object_Racer *) obj->unk64; if (racer->raceFinished == FALSE) { - set_viewport_tv_type(TV_TYPE_NTSC); + set_viewport_tv_type(OS_TV_TYPE_NTSC); temp_a0 = (racer->balloon_type * 3) + (racer->balloon_level); if (gCurrentHud->weaponDisplay.unk1D != racer->balloon_level) { if (racer->balloon_level == 0) { @@ -2696,7 +2697,7 @@ void render_weapon_hud(Object *obj, s32 updateRate) { } } gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - set_viewport_tv_type(TV_TYPE_PAL); + set_viewport_tv_type(OS_TV_TYPE_PAL); } } @@ -3003,7 +3004,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gCurrentHud->eggChallengeIcon.x = 221.0f; gCurrentHud->eggChallengeIcon.y = 197.0f; gCurrentHud->challengePortrait.y = 165.0f; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.x -= 4.0f; gCurrentHud->eggChallengeIcon.x -= 4.0f; gCurrentHud->challengePortrait.y *= 1.1; @@ -3045,12 +3046,12 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); sprite_anim_off(TRUE); gCurrentHud->challengePortrait.x = 225.0f; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.y = 181.5f; } else { gCurrentHud->challengePortrait.y = 165.0f; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { var_a0_5 = (66.0f - gCurrentHud->bananaCountIconStatic.x) - 4.0f; temp = -114.0f - gCurrentHud->bananaCountIconStatic.y; } else { @@ -3070,7 +3071,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gCurrentHud->bananaCountX.x += var_a0_5; gCurrentHud->bananaCountX.y -= temp; gCurrentHud->challengePortrait.spriteID = curRacerObj->characterId + HUD_SPRITE_PORTRAIT; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.x -= 4.0f; gCurrentHud->eggChallengeIcon.x -= 4.0f; } @@ -3112,7 +3113,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u for (sp144 = 0; sp144 < racerCount; sp144++) { someRacer = (Object_Racer *) racerGroup[sp144]->unk64; render_treasure_hud(someRacer); - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.y += 66.0; gCurrentHud->treasureMetre.y += 66.0; } else { @@ -3140,7 +3141,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gCurrentHud->challengePortrait.y = 165.0f; gCurrentHud->treasureMetre.x = 209.0f; gCurrentHud->treasureMetre.y = 193.0f; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->challengePortrait.x -= 4.0f; gCurrentHud->treasureMetre.x -= 4.0f; gCurrentHud->challengePortrait.y *= 1.1; @@ -3212,13 +3213,13 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gMinimapScreenY = -98; break; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gMinimapScreenY *= 1.2; } sprite_opaque(FALSE); objTrans.x = gMinimapScreenX + gHudOffsetX + gHudBounceX; objTrans.y = gMinimapScreenY; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { objTrans.x -= 4.0f; } objTrans.z_rotation = -someObjSeg->trans.z_rotation; @@ -3315,7 +3316,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gHudMinimapColours[someRacer->characterId].blue, opacity); } if (!(get_current_level_race_type() & RACETYPE_CHALLENGE) || (!someRacer->raceFinished)) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gCurrentHud->minimapMarker.x -= 4.0f; } if (get_current_level_race_type() == RACETYPE_CHALLENGE_BATTLE) { diff --git a/src/memory.c b/src/memory.c index fc125be2..7f57a37e 100644 --- a/src/memory.c +++ b/src/memory.c @@ -712,16 +712,24 @@ UNUSED void mempool_print_slots(void) { for (i = 0; i <= gNumberOfMemoryPools; i++) { stubbed_printf("Region = %d loc = %x size = %x\t", i, gMemoryPools[i].slots, gMemoryPools[i].size); slot = &gMemoryPools[i].slots[0]; - + do { flags = slot->flags; nextIndex = slot->nextIndex; - switch(flags) { - case 0: stubbed_printf("FREE"); break; - case 1: stubbed_printf("ALLOCATED"); break; - case 2: stubbed_printf("ALLOCATED,FIXED"); break; - default: stubbed_printf("\n"); break; + switch (flags) { + case 0: + stubbed_printf("FREE"); + break; + case 1: + stubbed_printf("ALLOCATED"); + break; + case 2: + stubbed_printf("ALLOCATED,FIXED"); + break; + default: + stubbed_printf("\n"); + break; } stubbed_printf("\n"); if (nextIndex == -1) { diff --git a/src/menu.h b/src/menu.h index 92c74b84..01d13061 100644 --- a/src/menu.h +++ b/src/menu.h @@ -469,9 +469,9 @@ void reset_title_logo_scale(void); void menu_init(u32 menuId); s32 menu_loop(Gfx **currDisplayList, MatrixS **currHudMat, Vertex **currHudVerts, TriangleList **currHudTris, s32 updateRate); void menu_timestamp_render(s32 frameCount, s32 xPos, s32 yPos, u8 red, u8 green, u8 blue, u8 fontID); -void postrace_offsets(MenuElement *arg0, f32 arg1, f32 arg2, f32 arg3, s32 arg4, s32 arg5); +void postrace_offsets(MenuElement *elements, f32 in, f32 mid, f32 out, s32 textOffset, s32 timestampOffset); void trackmenu_set_records(void); -void menu_missing_controller(Gfx **dl, s32 updateRate); +void menu_missing_controller(Gfx **dList, s32 updateRate); void menu_logos_screen_init(void); s32 menu_logo_screen_loop(s32 updateRate); void init_title_screen_variables(void); @@ -483,10 +483,11 @@ void optionscreen_free(void); void menu_audio_options_init(void); void soundoptions_free(void); void menu_save_options_init(void); -SIDeviceStatus savemenu_check_space(s32 controllerIndex, s32 *arg1, SaveFileData *arg2, s32 *arg3, s32 fileSize, s32 arg5); -void savemenu_blank_save_destination(SaveFileData *arg0, s32 *arg1); -s32 savemenu_input_source(s32 buttonsPressed, s32 arg1); -s32 savemenu_input_dest(s32 buttonsPressed, s32 arg1); +SIDeviceStatus savemenu_check_space(s32 controllerIndex, s32 *pakState, SaveFileData *file, s32 *index, s32 fileSize, + s32 arg5); +void savemenu_blank_save_destination(SaveFileData *file, s32 *fileIndex); +s32 savemenu_input_source(s32 buttonsPressed, s32 direction); +s32 savemenu_input_dest(s32 buttonsPressed, s32 direction); s32 savemenu_input_confirm(s32 buttonsPressed, s32 arg1); void savemenu_free(void); void menu_boot_init(void); @@ -495,13 +496,13 @@ void bootscreen_init_cpak(void); void pakmenu_free(void); void cheatmenu_free(void); void menu_magic_codes_list_init(void); -void cheatlist_exclusive(s32 arg0, s32 arg1, s32 arg2); +void cheatlist_exclusive(s32 code, s32 cheatA, s32 cheatB); void cheatlist_free(void); -void charselect_prev(s32 arg0, s32 *arg1); +void charselect_prev(s32 context, s32 *arg1); void titlescreen_controller_assign(s32 controllerIndex); void menu_character_select_init(void); void charselect_render_text(s32 arg0); -void charselect_move(s32 arg0, s8 *arg1, s32 arg2, u16 menuPickSoundId, u16 menuPickFailedSoundId); +void charselect_move(s32 playerID, s8 *direction, s32 bounds, u16 menuPickSoundId, u16 menuPickFailedSoundId); void charselect_free(void); void menu_caution_init(void); void caution_free(void); @@ -525,7 +526,7 @@ void menu_results_init(void); void results_free(void); void filename_decompress(u32 compressedFilename, char *output, s32 length); s32 filename_compress(char *filename, s32 length); -void filename_init(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 *arg4, char *fileName, s32 fileNameLength); +void filename_init(s32 titleY, s32 x, s32 y, s32 font, s32 *targetX, char *fileName, s32 fileNameLength); void menu_unload_bigfont(void); void trophyround_adventure(void); void trophyround_render(UNUSED s32 updateRate); @@ -533,7 +534,7 @@ void trophyround_free(void); void rankings_free(void); s32 get_trophy_race_world_id(void); void ghostmenu_free(void); -void cinematic_start(s8 *arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s8 *arg5); +void cinematic_start(s8 *params, s32 arg1, s32 endFlags, s32 skipFlagsA, s32 skipFlagsB, s8 *portraits); void menu_cinematic_init(void); void cinematic_free(void); void menu_credits_init(void); @@ -558,13 +559,13 @@ s32 get_number_of_active_players(void); s32 get_active_player_count(void); s32 get_multiplayer_racer_count(void); Settings **get_all_save_files_ptr(void); -void menu_assetgroup_free(s16 *arg0); -void menu_asset_free(s32 arg0); +void menu_assetgroup_free(s16 *assetGroup); +void menu_asset_free(s32 assetID); void menu_assetgroup_load(s16 *textureIndex); void menu_imagegroup_load(s16 *imageSet); void menu_image_load(s32 imageID); void menu_imagegroup_free(void); -void dialogue_npc_finish(s32 arg0); +void dialogue_npc_finish(s32 npcID); void dialogue_try_close(void); s32 npc_dialogue_loop(u32 dialogueOption); void set_option_text_colour(s32 condition); @@ -577,7 +578,7 @@ s32 dialogue_race_defeat(void); s32 trophy_race_cabinet_menu_loop(void); void dialogue_open_stub(void); void dialogue_close_stub(void); -f32 dialogue_ortho(DialogueBoxBackground *arg0, Gfx **dlist, MatrixS **mat, Vertex **verts); +f32 dialogue_ortho(DialogueBoxBackground *arg0, Gfx **dList, MatrixS **mat, Vertex **verts); u64 *get_eeprom_settings_pointer(void); s32 set_eeprom_settings_value(u64 valueToSet); s32 unset_eeprom_settings_value(u64 valueToUnset); @@ -629,24 +630,24 @@ void charselect_input(s8 *activePlayers); s32 menu_audio_options_loop(s32 updateRate); void ghostmenu_generate(void); void filename_render(UNUSED s32 updateRate); -void charselect_assign_ai(s32 arg0); +void charselect_assign_ai(s32 charSlot); void menu_number_render(s32 number, s32 x, s32 y, s32 r, s32 g, s32 b, s32 a, UNUSED s32 font, s32 alignment); void menu_element_render(s32 elementID); void menu_input(void); SIDeviceStatus savemenu_load_sources(void); -void menu_asset_load(s32 arg0); +void menu_asset_load(s32 assetID); s32 savemenu_input_message(s32 buttonsPressed, s32 yAxis); -void savemenu_render_element(SaveFileData *arg0, s32 x, s32 y); +void savemenu_render_element(SaveFileData *file, s32 x, s32 y); void trackmenu_render_2D(s32 x, s32 y, char *hubName, char *trackName, s32 rectOpacity, s32 imageId, s32 copyViewPort, DrawTexture *arg7, s32 arg8); void pausemenu_render(UNUSED s32 updateRate); -s32 menu_postrace(Gfx **dlist, MatrixS **matrices, Vertex **vertices, s32 updateRate); +s32 menu_postrace(Gfx **dList, MatrixS **matrices, Vertex **vertices, s32 updateRate); void ghostmenu_render(UNUSED s32 updateRate); -s32 ghostmenu_erase(s32 arg0); +s32 ghostmenu_erase(s32 id); void cheatmenu_render(s32 updateRate); void cheatlist_render(s32 updateRate); void trackmenu_track_view(s32 updateRate); void savemenu_render(UNUSED s32 updateRate); -void draw_menu_elements(s32 flags, MenuElement *elems, f32 scale); +void draw_menu_elements(s32 state, MenuElement *elems, f32 scale); void fileselect_render(UNUSED s32 updateRate); void savemenu_render_error(SIDeviceStatus deviceStatus); SIDeviceStatus savemenu_write(void); @@ -674,10 +675,11 @@ void func_8007FFEC(s32 arg0); SIDeviceStatus func_80087F14(s32 *controllerIndex, s32 arg1); void set_gIntDisFlag(s8 setting); void init_save_data(void); -void func_80080580(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour, TextureHeader *tex); +void func_80080580(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, + s32 colour, TextureHeader *tex); void fileselect_input_copy(s32 updateRate); -s32 func_8008F618(Gfx **dlist, MatrixS **mtx); +s32 func_8008F618(Gfx **dList, MatrixS **mtx); void func_80080BC8(Gfx **); void func_80080E90(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour0, s32 colour1, s32 colour2, s32 colour3); void func_80084854(void); diff --git a/src/object_functions.c b/src/object_functions.c index bf25392e..9e9a599e 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -32,6 +32,7 @@ #include "collision.h" #include "controller.h" #include "printf.h" +#include "common.h" /************ .data ************/ @@ -203,7 +204,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { someObj = obj->properties.fireball.obj; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON_2 && obj->properties.fireball.timer < 0) { @@ -439,7 +440,7 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { delete = FALSE; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } dir.x = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); @@ -723,7 +724,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { egg = (Object_CollectEgg *) obj->unk64; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } switch (egg->status) { @@ -1214,7 +1215,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { tempPosY = obj->segment.trans.y_position; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } tt = (Object_NPC *) obj->unk64; @@ -2228,7 +2229,7 @@ void obj_init_smoke(UNUSED Object *obj, UNUSED LevelObjectEntry_Smoke *entry) { void obj_loop_smoke(Object *obj, s32 updateRate) { f32 updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } obj->segment.trans.x_position += obj->segment.x_velocity * updateRateF; @@ -2259,7 +2260,7 @@ void obj_loop_wardensmoke(Object *obj, s32 updateRate) { f32 updateRateF; updateRateF = (f32) updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } obj->segment.animFrame += updateRate * 4; @@ -2562,7 +2563,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { updateRateF2 = updateRate; updateRateF = updateRateF2; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } taj = (Object_NPC *) obj->unk64; @@ -3397,7 +3398,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { s32 isPirated; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } isPirated = FALSE; @@ -3539,7 +3540,7 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { doorEntry = &doorObj->segment.level_entry->door; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } settings = get_settings(); @@ -3982,7 +3983,7 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { entry = (LevelObjectEntry_Bridge_WhaleRamp *) obj->segment.level_entry; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } @@ -4236,7 +4237,7 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { Object_Racer *racerObj; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } obj->segment.y_velocity -= 0.5 * updateRateF; @@ -4336,7 +4337,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { SoundMask *prevSoundMask; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } banana = (Object_Banana *) obj->unk64; @@ -4862,7 +4863,7 @@ void weapon_projectile(Object *obj, s32 updateRate) { guMtxXFMF(mtxf, 0.0f, 0.0f, weapon->forwardVel, &obj->segment.x_velocity, &obj->segment.y_velocity, &obj->segment.z_velocity); updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } offset.x = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); @@ -5166,7 +5167,7 @@ void weapon_trap(Object *weaponObj, s32 updateRate) { weaponOwner = &weapon->owner->unk64->racer; updateRateF = updateRate; weaponProperties = &weaponObj->properties.weapon; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } if (weaponProperties->status == WEAPON_DROPPED) { @@ -6376,7 +6377,7 @@ void obj_loop_frog(Object *obj, s32 updateRate) { s32 i; s32 hopping; s32 var_v1; - UNUSED s32 pad0[29];// Wtf is this large gap here? + UNUSED s32 pad0[29]; // Wtf is this large gap here? f32 colY[8]; UNUSED s32 pad2[4]; f32 cosine; @@ -6387,7 +6388,7 @@ void obj_loop_frog(Object *obj, s32 updateRate) { Object *racerObj; updateRateF = updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } frog = (Object_Frog *) obj->unk64; @@ -6608,7 +6609,7 @@ void obj_loop_levelname(Object *obj, s32 updateRate) { textWidth = (get_text_width(levelName, 0, 0) + 24) >> 1; x1 = SCREEN_WIDTH_HALF - textWidth; x2 = textWidth + SCREEN_WIDTH_HALF; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { y1 = SCREEN_HEIGHT - 16; y2 = SCREEN_HEIGHT - 16 + 24; } else { diff --git a/src/object_models.c b/src/object_models.c index 22080e30..33f0bcc1 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x8005F850 */ #include "object_models.h" +#include "common.h" #include "macros.h" #include "memory.h" #include "asset_enums.h" @@ -13,7 +14,7 @@ /************ .data ************/ -s32 gTractionTableChecksum = 116315; +s32 gTractionTableChecksum = TractionTableChecksum; s32 gTrackRenderFuncLength = 1980; /*******************************/ diff --git a/src/objects.c b/src/objects.c index bd235151..cb17d6a2 100644 --- a/src/objects.c +++ b/src/objects.c @@ -157,7 +157,7 @@ BossRaceVehicles gBossVehicles[] = { { VEHICLE_PLANE, VEHICLE_ROCKET }, // Wizpig 2 }; -s8 D_800DC820[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; +s8 D_800DC834[10] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; s8 D_800DC840[8] = { 9, 1, 2, 3, 4, 5, 7, 0 }; @@ -461,7 +461,7 @@ void func_8000BADC(s32 updateRate) { } for (i = 0; i < gNumRacers; i++) { updateRateF = (f32) updateRate; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2f; } racer = &(*gRacers)[i]->unk64->racer; @@ -771,7 +771,7 @@ void try_free_object_header(s32 index) { * it consistent with non PAL timers, running 60Hz. */ s32 normalise_time(s32 timer) { - if (osTvType != TV_TYPE_PAL || timer < 0) { + if (osTvType != OS_TV_TYPE_PAL || timer < 0) { return timer; } else { return (timer * 5) / 6; @@ -918,7 +918,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { s32 var_s4; s32 tajFlags; - D_8011AD20 = 0; + D_8011AD20 = FALSE; gEventCountdown = 0; gFirstTimeFinish = 0; gNumRacers = 0; @@ -1148,7 +1148,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { curRacer->vehicleID = vehicle; curRacer->vehicleIDPrev = vehicle; if (sp127 != -1 && sp127 != (s32) vehicle) { - D_8011AD20 = 1; + D_8011AD20 = TRUE; } sp127 = vehicle; if (curRacer->vehicleID == VEHICLE_PLANE || curRacer->vehicleID == VEHICLE_SMOKEY || @@ -1205,7 +1205,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { D_8011AD3C = 0; } if (D_8011AD3C != 0) { - D_8011AD20 = 0; + D_8011AD20 = FALSE; } if (get_game_mode() == GAMEMODE_INGAME) { for (j = 0; j < gObjectCount; j++) { @@ -2614,7 +2614,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { newZPos = obj->segment.trans.z_position + zPos; if (levelModel == NULL) { gNoBoundsCheck = FALSE; - return 0; + return FALSE; } outOfBounds = FALSE; x2 = (levelModel->upperXBounds + 1000.0); @@ -2652,7 +2652,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { gNoBoundsCheck = FALSE; if (outOfBounds) { obj->segment.object.segmentID = -1; - return 1; + return TRUE; } obj->segment.trans.x_position = newXPos; @@ -2665,7 +2665,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { if (box == NULL) { obj->segment.object.segmentID = get_level_segment_index_from_position(intXPos, intYPos, intZPos); - return 0; + return FALSE; } else { outsideBBox = FALSE; if (box->x2 < intXPos || intXPos < box->x1) { @@ -2684,7 +2684,7 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { } } } - return 0; + return FALSE; } /** @@ -4407,7 +4407,7 @@ void race_transition_adventure(s32 updateRate) { set_anti_aliasing(TRUE); disable_racer_input(); if (!(get_current_level_race_type() & RACETYPE_CHALLENGE_BATTLE)) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { cutsceneTimerLimit = 415; } else { cutsceneTimerLimit = 540; @@ -4535,7 +4535,7 @@ void race_finish_time_trial(void) { timetrial_swap_player_ghost(get_current_map_id()); gHasGhostToSave = TRUE; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { bestCourseTime = (bestCourseTime * 6) / 5; } if (bestCourseTime < gTTGhostTimeToBeat) { @@ -4805,7 +4805,7 @@ f32 func_8001B834(Object_Racer *racer1, Object_Racer *racer2) { return var_f2; } -UNUSED f32 func_8001B974(Object_Racer *racer) { +UNUSED f32 func_8001B954(Object_Racer *racer) { f32 distLeft; s32 checkpointID; @@ -5428,7 +5428,7 @@ Object *ainode_get(s32 nodeID) { return NULL; } -UNUSED void func_8001D23C(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2) { +UNUSED void func_8001D248(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2) { } /** @@ -6179,8 +6179,7 @@ void mode_init_taj_race(void) { Settings *settings; Object *racerObj; Object_Racer *racer; - UNUSED s32 pad2[7]; - f32 sp2C; + f32 yOut[8]; gTajRaceInit -= 1; if (gTajRaceInit == 0) { @@ -6219,7 +6218,7 @@ void mode_init_taj_race(void) { lvlSeg = get_level_segment_index_from_position(newRacerEntry.common.x, checkpointNode->y, newRacerEntry.common.z); newRacerEntry.common.y = - func_8002BAB0(lvlSeg, newRacerEntry.common.x, newRacerEntry.common.z, &sp2C) ? sp2C : checkpointNode->y; + func_8002BAB0(lvlSeg, newRacerEntry.common.x, newRacerEntry.common.z, yOut) ? yOut[0] : checkpointNode->y; newRacerEntry.common.size = 16; newRacerEntry.angleY = racer->steerVisualRotation; newRacerEntry.angleX = 0; @@ -6361,7 +6360,84 @@ void mode_end_taj_race(s32 reason) { gIsTajChallenge = FALSE; } -GLOBAL_ASM("asm/non_matchings/objects/func_800230D0.s") +CheckpointNode *func_800230D0(Object *obj, Object_Racer *racer) { + CheckpointNode *lastCheckpointNode; + ObjectSegment *activeCameraSegment; + s32 yOutCount; + f32 yOut[9]; + Object *ptrList; + s32 i; + + if (gNumberOfCheckpoints == 0) { + lastCheckpointNode = NULL; + for (i = 0; i < gObjectCount; i++) { + ptrList = gObjPtrList[i]; + if (!(ptrList->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && (ptrList->behaviorId == BHV_SETUP_POINT)) { + if (ptrList->properties.setupPoint.racerIndex == 0) { + obj->segment.trans.x_position = ptrList->segment.trans.x_position; + obj->segment.trans.y_position = ptrList->segment.trans.y_position; + obj->segment.trans.z_position = ptrList->segment.trans.z_position; + obj->segment.object.segmentID = ptrList->segment.object.segmentID; + i = gObjectCount; + } + } + } + } else { + lastCheckpointNode = &gTrackCheckpoints[gNumberOfCheckpoints - 1]; + obj->segment.trans.x_position = lastCheckpointNode->x - (lastCheckpointNode->rotationZFrac * 35.0f); + obj->segment.trans.y_position = lastCheckpointNode->y; + obj->segment.trans.z_position = lastCheckpointNode->z + (lastCheckpointNode->rotationXFrac * 35.0f); + obj->segment.object.segmentID = get_level_segment_index_from_position( + obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + } + yOutCount = func_8002BAB0(obj->segment.object.segmentID, obj->segment.trans.x_position, + obj->segment.trans.z_position, yOut); + if (yOutCount != 0) { + obj->segment.trans.y_position = yOut[yOutCount - 1]; + } + racer->prev_x_position = obj->segment.trans.x_position; + racer->prev_y_position = obj->segment.trans.y_position; + racer->prev_z_position = obj->segment.trans.z_position; + if (lastCheckpointNode != NULL) { + racer->steerVisualRotation = arctan2_f(lastCheckpointNode->rotationXFrac, lastCheckpointNode->rotationZFrac); + } else { + racer->steerVisualRotation = ptrList->segment.trans.y_rotation; + } + racer->checkpoint = 0; + racer->courseCheckpoint = racer->lap * gNumberOfCheckpoints; + obj->segment.trans.y_rotation = racer->steerVisualRotation; + racer->unkD8.x = obj->segment.trans.x_position; + racer->unkD8.y = obj->segment.trans.y_position + 15.0f; + racer->unkD8.z = obj->segment.trans.z_position; + racer->unkE4.x = obj->segment.trans.x_position; + racer->unkE4.y = obj->segment.trans.y_position + 15.0f; + racer->unkE4.z = obj->segment.trans.z_position; + racer->unkF0.x = obj->segment.trans.x_position; + racer->unkF0.y = obj->segment.trans.y_position + 15.0f; + racer->unkF0.z = obj->segment.trans.z_position; + racer->unkFC.x = obj->segment.trans.x_position; + racer->unkFC.y = obj->segment.trans.y_position + 15.0f; + racer->unkFC.z = obj->segment.trans.z_position; + obj->interactObj->x_position = obj->segment.trans.x_position; + obj->interactObj->y_position = obj->segment.trans.y_position; + obj->interactObj->z_position = obj->segment.trans.z_position; + // fake + if (1) {} + if (1) {} + racer->velocity = 0.0f; + racer->lateral_velocity = 0.0f; + obj->segment.x_velocity = 0.0f; + obj->segment.z_velocity = 0.0f; + racer->vehicleID = racer->vehicleIDPrev; + if (racer->playerIndex != -1) { + set_active_camera(racer->playerIndex); + activeCameraSegment = get_active_camera_segment_no_cutscenes(); + activeCameraSegment->trans.x_position = obj->segment.trans.x_position; + activeCameraSegment->trans.y_position = obj->segment.trans.y_position; + activeCameraSegment->trans.z_position = obj->segment.trans.z_position; + } + return lastCheckpointNode; +} /** * Returns true if a taj challenge is currently active. diff --git a/src/printf.c b/src/printf.c index 6ba8a4f4..0a005c59 100644 --- a/src/printf.c +++ b/src/printf.c @@ -352,7 +352,105 @@ 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 xOffset; + char *nextBuffer; + char red; + char green; + char blue; + char alpha; + + bufferSave = buffer; + nextBuffer = buffer + 1; + while (*buffer != 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; + } + } else { + xOffset = 6; + if (*buffer != 0x20) { + xOffset = debug_text_character(dlist, *buffer); + } + } + } 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; + } + } + var_a1 = gDebugScreenWidth - 16; + if (D_80127CB4 != 0 && *buffer >= 32 && *buffer < 0x80) { + xOffset = 7; + } + gDebugTextX += xOffset; + if (var_a1 < gDebugTextX) { + if (!gDebugTextOn) { + debug_text_background(dlist, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); + } + debug_text_newline(); + D_80127CB0 = gDebugTextX; + D_80127CB2 = gDebugTextY; + } + *buffer = *nextBuffer++; + } + return nextBuffer - bufferSave; +} +#else GLOBAL_ASM("asm/non_matchings/printf/func_800B653C.s") +#endif /** * Render the background for the debug text. @@ -453,3 +551,6 @@ void debug_text_newline(void) { gDebugTextX = gDebugBoundsX1; gDebugTextY += 11; } + +UNUSED void func_800B6F30(UNUSED int arg0, UNUSED int arg1, UNUSED int arg2) { +} diff --git a/src/racer.c b/src/racer.c index bf2ce7f0..321e8ff0 100644 --- a/src/racer.c +++ b/src/racer.c @@ -28,12 +28,10 @@ #include "collision.h" #include "controller.h" #include "particles.h" +#include "common.h" #define MAX_NUMBER_OF_GHOST_NODES 360 -#define TICK_RATE 0.016 -#define TICK_RATE_3X 0.046 - /** * This file features extensive use of CLAMP and WRAP. * CLAMP will keep the value within the two ranges. @@ -107,7 +105,7 @@ s8 D_800DCDB0[16][2] = { }; // Checksum count for obj_loop_goldenballoon -s32 gObjLoopGoldenBalloonChecksum = 0xA597; +s32 gObjLoopGoldenBalloonChecksum = ObjLoopGoldenBalloonChecksum; FadeTransition gDoorFadeTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 50, -1); @@ -694,16 +692,14 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r f32 xVelTemp; f32 zVelTemp; f32 spFC; - UNUSED f32 pad2; + UNUSED s32 pad2; f32 spF4; f32 spF0; f32 temp; f32 racerOx1; f32 racerOz1; - s32 temp3; - UNUSED f32 pad3; f32 var_f0; - Vec3f *waterRotation; + Vec3f water_rotation; f32 var_f2; s32 var_v0; f32 spC8; @@ -714,9 +710,9 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s32 var_t0; Asset20 *asset20; s8 lastWheelSurface; - s8 waveProperties; + s8 wave_properties; s8 wheelsOnStone; - f32 var_f4; + UNUSED s32 pad3; Matrix transformedMtx; s8 playerObjectHasMoved; f32 var_f6; @@ -724,8 +720,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (func_8000E138()) { updateRateF *= 1.15; } - playerObjectHasMoved = 0; - if ((racer->playerIndex >= PLAYER_ONE) && (gNumViewports < 2)) { + playerObjectHasMoved = FALSE; + if (racer->playerIndex >= PLAYER_ONE && gNumViewports < 2) { obj->particleEmitFlags |= OBJ_EMIT_UNK_100; } D_8011D550 = 0; @@ -784,7 +780,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r spF4 *= 1.2; } if ((gCurrentRacerInput & B_BUTTON) && (gCurrentStickY < -40 || racer->velocity < 0.0f)) { - racer->brake += updateRateF * TICK_RATE_3X; + racer->brake += updateRateF * 0.046; if (racer->brake > 1.2) { racer->brake = 1.2f; } @@ -792,7 +788,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r rumble_set(racer->playerIndex, RUMBLE_TYPE_5); } } else { - racer->brake -= updateRateF * TICK_RATE_3X; + racer->brake -= updateRateF * 0.046; if (racer->brake < 0.0f) { racer->brake = 0.0f; } @@ -951,7 +947,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } iTemp = (gCurrentPlayerIndex != PLAYER_COMPUTER && !racer->raceFinished) ? racer->steerAngle : gCurrentStickX; spFC = 0.004; - obj->segment.y_velocity -= (obj->segment.y_velocity * (0.025)) * updateRateF; + obj->segment.y_velocity -= (obj->segment.y_velocity * 0.025) * updateRateF; if (gCurrentRacerInput & B_BUTTON && gCurrentStickY >= -40 && racer->velocity >= -0.5) { spFC *= 16.0f; } @@ -1042,7 +1038,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } var_f2 = sqrtf((obj->segment.z_velocity * obj->segment.z_velocity) + - (obj->segment.x_velocity * obj->segment.x_velocity)); + (obj->segment.x_velocity * obj->segment.x_velocity)); if (var_f2 > 0.25) { racer->unk168 = arctan2_f(obj->segment.x_velocity, obj->segment.z_velocity) + 0x8000; var_v1 = ((0x8000 - racer->unk168) & 0xFFFF) - (racer->cameraYaw & 0xFFFF); @@ -1058,8 +1054,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } sp11C *= 0.125; var_v1 = (sp11C * var_v1) * 0.75; - temp3 = (var_v1 * updateRate) >> 4; - racer->cameraYaw += temp3; + racer->cameraYaw += (var_v1 * updateRate) >> 4; var_v1 = (0x8000 - racer->cameraYaw) - (racer->steerVisualRotation & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; @@ -1071,8 +1066,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f2 = 10.0; } - var_f2 = var_f2 / 10.0; - var_v1 = ((f32) var_v1) * var_f2; + var_f2 /= 10.0; + var_v1 *= var_f2; if (gCurrentRacerInput & A_BUTTON || gCurrentRacerInput & R_TRIG) { var_v1 *= 2; } @@ -1189,7 +1184,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } objectMoved = move_object(obj, (temp * updateRateF) + racerOx1, obj->segment.y_velocity * updateRateF, - (zVelTemp * updateRateF) + racerOz1); + (zVelTemp * updateRateF) + racerOz1); if (objectMoved && gCurrentPlayerIndex != PLAYER_COMPUTER) { playerObjectHasMoved = TRUE; @@ -1211,8 +1206,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r waterHeight = -10000.0f; // clang-format off // the backslash here is relevant for the match - waveProperties = get_wave_properties(obj->segment.trans.y_position, &waterHeight, &waterRotation); \ - if (waveProperties != 0) { + wave_properties = get_wave_properties(obj->segment.trans.y_position, &waterHeight, &water_rotation); \ + if (wave_properties != 0) { // clang-format on velocity = racer->velocity; if (velocity < 0.0f) { @@ -1245,7 +1240,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (gCurrentRacerInput & R_TRIG) { iTemp = gCurrentStickX * 2; } - rotate_racer_in_water(obj, racer, &waterRotation, waveProperties, updateRate, iTemp, 1.0f); + rotate_racer_in_water(obj, racer, &water_rotation, wave_properties, updateRate, iTemp, 1.0f); } if (racer->buoyancy > 0.0) { obj->segment.trans.y_position += racer->buoyancy * racer->unkC4; @@ -1262,6 +1257,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r iTemp = 1; } racer->unk1D2 = iTemp; // restores unk1D2 + var_f2 = 1.0f / updateRateF; temp = ((obj->segment.trans.x_position - (xPos + racerOx1)) - D_8011D548) * var_f2; zVelTemp = ((obj->segment.trans.z_position - (zPos + racerOz1)) - D_8011D54C) * var_f2; @@ -1284,8 +1280,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (gCurrentPlayerIndex >= PLAYER_ONE && racer->buoyancy > 0.0) { if (gNumViewports < 3) { var_f2 = ((obj->segment.x_velocity * obj->segment.x_velocity) + - (obj->segment.y_velocity * obj->segment.y_velocity)) + - (obj->segment.z_velocity * obj->segment.z_velocity); + (obj->segment.y_velocity * obj->segment.y_velocity)) + + (obj->segment.z_velocity * obj->segment.z_velocity); if (var_f2 > 16.0f) { if (var_f2 < 80.0f) { obj->particleEmitFlags |= OBJ_EMIT_PARTICLE_3 | OBJ_EMIT_PARTICLE_4; @@ -1337,8 +1333,8 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gCurrentRacerTransform.y_position = 0.0f; gCurrentRacerTransform.z_position = 0.0f; object_transform_to_matrix_2(transformedMtx, &gCurrentRacerTransform); - guMtxXFMF(transformedMtx, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, &racer->lateral_velocity, - (f32 *) &racer->unk34, &racer->velocity); + guMtxXFMF(transformedMtx, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, + &racer->lateral_velocity, (f32 *) &racer->unk34, &racer->velocity); if (racer->groundedWheels == 0 && racer->waterTimer == 0) { iTemp = (-gCurrentStickY * 0x40) & 0xFFFF; var_v1 = iTemp - (obj->segment.trans.x_rotation & 0xFFFF); @@ -1376,7 +1372,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.y_velocity += 3.5; } var_f2 = ((2.0 * obj->segment.y_velocity) / gCurrentRacerWeightStat); - racer->unk1FB = ((s32) var_f2) + 1; + racer->unk1FB = (s32) (var_f2) + 1; } if (racer->unk1FB > 0) { racer->unk1FB -= updateRate; @@ -2109,7 +2105,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { tempRacer->racePosition = 1; tempRacer->miscAnimCounter = tempRacer->playerIndex * 5; tempRacer->checkpoint_distance = 1.0f; - tempRacer->unk1FD = 0; + tempRacer->cameraIndex = 0; tempRacer->magnetSoundMask = NULL; tempRacer->shieldSoundMask = NULL; tempRacer->bananaSoundMask = NULL; @@ -2232,7 +2228,7 @@ void update_player_racer(Object *obj, s32 updateRate) { tempRacer->unk1F1 = 0; } // PAL moves 20% faster. - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { updateRateF *= 1.2; } tempRacer->unk1F6 -= updateRate; @@ -3119,7 +3115,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR // If on the Taj pad and the horn is honked, summon Taj if (racer->playerIndex == PLAYER_ONE && racer->groundedWheels && surfaceType == SURFACE_TAJ_PAD && gCurrentButtonsPressed & Z_TRIG) { - gTajInteractStatus = 2; + gTajInteractStatus = TAJ_TELEPORT; } // Set grip levels to basically zero when floating on water. if (racer->buoyancy != 0.0) { @@ -3333,7 +3329,7 @@ s32 should_taj_teleport(void) { /** * Sets Taj's interaction status. */ -void set_taj_status(s32 status) { +void set_taj_status(TajInteraction status) { gTajInteractStatus = status; } @@ -4033,7 +4029,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, if (!racer->approachTarget) { xVel = obj->segment.x_velocity; zVel = obj->segment.z_velocity; - if (racer->unk1D2) { + if (racer->unk1D2 != 0) { xVel += racer->unk11C; zVel += racer->unk120; } @@ -4067,7 +4063,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, gCurrentRacerTransform.scale = 1.0f; object_transform_to_matrix_2(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, xVel, 0.0f, zVel, &hVel, &tempVel, &yVel); - if (racer->unk1D2) { + if (racer->unk1D2 != 0) { racer->unk1D2 -= updateRate; if (racer->unk1D2 < 0) { racer->unk1D2 = 0; @@ -5818,7 +5814,7 @@ s32 set_ghost_position_and_rotation(Object *obj) { } commonUnk0f32 = (f32) obj->properties.common.unk0 / 30.0f; - if (osTvType == TV_TYPE_PAL && ghostDataIndex == 2) { + if (osTvType == OS_TV_TYPE_PAL && ghostDataIndex == 2) { commonUnk0f32 = ((f32) obj->properties.common.unk0 * 1.2) / 30.0f; } commonUnk0s32 = commonUnk0f32; // Truncate the float to an integer? diff --git a/src/racer.h b/src/racer.h index 9b6e52d4..5162cbdc 100644 --- a/src/racer.h +++ b/src/racer.h @@ -169,7 +169,7 @@ void racer_attack_handler_plane(Object *obj, Object_Racer *racer); void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer); void set_racer_tail_lights(Object_Racer *racer); s32 should_taj_teleport(void); -void set_taj_status(s32 status); +void set_taj_status(TajInteraction status); void slowly_reset_head_angle(Object_Racer *racer); void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 duration, s32 arg5, s32 flags, s32 arg7); void handle_car_steering(Object_Racer *racer); @@ -231,6 +231,7 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number); void update_player_racer(Object *obj, s32 updateRate); void func_80045128(Object **racerObjs); void timetrial_ghost_write(Object *obj, s32 updateRate); +void func_80046524(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); //Non Matching s32 set_ghost_position_and_rotation(Object *obj); @@ -240,7 +241,6 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32, f32); s32 func_80017248(void*, s32, s32*, Vec3f*, f32*, f32*, s8* surface); void func_80059208(Object* obj, Object_Racer* racer, s32 updateRate); /* extern */ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */ -void func_80046524(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */ void func_80049794(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */ void func_8004CC20(s32 updateRate, f32 updateRateF, Object* obj, Object_Racer* racer); /* extern */ void func_8004447C(Object *obj, Object_Racer *racer, s32 updateRate); diff --git a/src/rcp.h b/src/rcp.h index 9e91261b..5046bf48 100644 --- a/src/rcp.h +++ b/src/rcp.h @@ -70,7 +70,7 @@ void bgdraw_fillcolour(s32 red, s32 green, s32 blue); void rdp_init(Gfx **dList); void rsp_init(Gfx **dList); void gfxtask_init(OSSched *sc); -void bgdraw_texture_init(TextureHeader *arg0, TextureHeader *arg1, u32 arg2); +void bgdraw_texture_init(TextureHeader *tex1, TextureHeader *tex2, u32 shiftX); s32 gfxtask_run_xbus(Gfx* dlBegin, Gfx* dlEnd, s32 recvMesg); void gfxtask_run_fifo(Gfx* dlBegin, Gfx* dlEnd, s32 recvMesg); void texrect_draw(Gfx **dList, DrawTexture *element, s32 xPos, s32 yPos, u8 red, u8 green, u8 blue, diff --git a/src/save_data.c b/src/save_data.c index 7105b12d..e47ce637 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -2,6 +2,7 @@ /* RAM_POS: 0x80072250 */ #include "save_data.h" +#include "common.h" #include "memory.h" #include "PR/pfs.h" #include "PR/os_cont.h" @@ -198,7 +199,7 @@ void rumble_update(s32 updateRate) { u8 controllerToCheck; u8 pfsBitPattern; - if (gRumbleIdle != 0 || gRumbleKillTimer != 0) { + if ((gRumbleIdle != 0 || gRumbleKillTimer != 0)) { gRumbleDetectionTimer += updateRate; if (gRumbleDetectionTimer > 120) { gRumbleDetectionTimer = 0; @@ -1635,7 +1636,7 @@ SIDeviceStatus repair_controller_pak(s32 controllerIndex) { s32 status = get_si_device_status(controllerIndex); if (status == CONTROLLER_PAK_GOOD || status == CONTROLLER_PAK_INCONSISTENT) { status = osPfsChecker(&pfs[controllerIndex]); - if (status == CONTROLLER_PAK_GOOD) { + if (status == 0) { ret = CONTROLLER_PAK_GOOD; } else if (status == PFS_ERR_NEW_PACK) { ret = CONTROLLER_PAK_CHANGED; @@ -1695,7 +1696,7 @@ s32 get_controller_pak_file_list(s32 controllerIndex, s32 maxNumOfFilesToGet, ch if (get_language() == LANGUAGE_JAPANESE) { gameCode = JPN_GAME_CODE; - } else if (osTvType == TV_TYPE_PAL) { + } else if (osTvType == OS_TV_TYPE_PAL) { gameCode = PAL_GAME_CODE; } else { gameCode = NTSC_GAME_CODE; @@ -1714,7 +1715,6 @@ s32 get_controller_pak_file_list(s32 controllerIndex, s32 maxNumOfFilesToGet, ch bzero(gPakFileList, files_used); list = gPakFileList; - // TODO: There's probably an unidentified struct here for (i = 0; i < maxNumOfFilesOnCpak; i++) { fileNames[i] = (char *) list; list += 0x12; @@ -1894,7 +1894,7 @@ SIDeviceStatus get_file_number(s32 controllerIndex, char *fileName, char *fileEx if (get_language() == LANGUAGE_JAPANESE) { gameCode = JPN_GAME_CODE; - } else if (osTvType == TV_TYPE_PAL) { + } else if (osTvType == OS_TV_TYPE_PAL) { gameCode = PAL_GAME_CODE; } else { gameCode = NTSC_GAME_CODE; @@ -1974,7 +1974,7 @@ SIDeviceStatus write_controller_pak_file(s32 controllerIndex, s32 fileNumber, ch if (get_language() == LANGUAGE_JAPANESE) { game_code = JPN_GAME_CODE; - } else if (osTvType == TV_TYPE_PAL) { + } else if (osTvType == OS_TV_TYPE_PAL) { game_code = PAL_GAME_CODE; } else { game_code = NTSC_GAME_CODE; @@ -2083,8 +2083,7 @@ char *string_to_font_codes(char *inString, char *outString, s32 stringLength) { for (i = 0; i < 65; i++) { currentChar = *inString; if (currentChar == gN64FontCodes[i]) { - *outString = i; - outString++; + *outString++ = i; break; } } diff --git a/src/save_data.h b/src/save_data.h index 19d7d726..d9e697c0 100644 --- a/src/save_data.h +++ b/src/save_data.h @@ -166,7 +166,7 @@ s32 func_80072C54(s32 arg0); void populate_settings_from_save_data(Settings *settings, u8 *saveData); s32 read_save_file(s32 saveFileNum, Settings *settings); void erase_save_file(s32 saveFileNum, Settings *settings); -SIDeviceStatus func_800756D4(s32 controllerIndex, u8 *arg1, u8 *arg2, u8 *arg3, s16 *arg4); +SIDeviceStatus func_800756D4(s32 controllerIndex, u8 *levelIDs, u8 *vehicleIDs, u8 *characterIDs, s16 *checksumIDs); SIDeviceStatus get_file_extension(s32 controllerIndex, s32 fileType, char *fileExt); void func_80073588(Settings *settings, u8 *saveData, u8 arg2); void func_800732E8(Settings *settings, u8 *saveData); diff --git a/src/stacks.h b/src/stacks.h index b24d7964..06aeb1c4 100644 --- a/src/stacks.h +++ b/src/stacks.h @@ -3,7 +3,7 @@ #include "types.h" -#define OS_PIM_STACKSIZE 4096 +#define OS_PIM_STACKSIZE 256 extern u8 D_8012A9B0[0x100]; extern u16 D_80129BB0[512]; diff --git a/src/textures_sprites.c b/src/textures_sprites.c index bdd7869d..c3a4fda6 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -829,49 +829,41 @@ void sprite_opaque(s32 setting) { gForceFlags = TRUE; } -#ifdef NON_EQUIVALENT -// Reasonably certain the macros are correct, but definitely need to figure out the gDkrDmaDisplayList Gfx arguments -void func_8007BF34(Gfx **dlist, s32 arg1) { - s32 temp_a1; - s32 temp_t8; - s32 temp_v0_3; - - if ((arg1 != gCurrentRenderFlags) || (gForceFlags != 0)) { +void func_8007BF34(Gfx **dlist, s32 flags) { + if ((flags != gCurrentRenderFlags) || gForceFlags) { gDPPipeSync((*dlist)++); - if (((gCurrentRenderFlags * 16) < 0) || (gForceFlags != 0)) { + if ((gCurrentRenderFlags & RENDER_VTX_ALPHA) || gForceFlags) { gSPSetGeometryMode((*dlist)++, G_FOG); } - temp_a1 = arg1 & 0xF7FFFFFF & ~gBlockedRenderFlags; - temp_v0_3 = temp_a1 & 2; - if (((gCurrentRenderFlags & 2) != temp_v0_3) || (gForceFlags != 0)) { - if (temp_v0_3 != 0) { + flags &= ~RENDER_VTX_ALPHA; + flags &= ~gBlockedRenderFlags; + if (((flags & RENDER_Z_COMPARE) != (gCurrentRenderFlags & RENDER_Z_COMPARE)) || gForceFlags) { + if (flags & RENDER_Z_COMPARE) { gSPSetGeometryMode((*dlist)++, G_ZBUFFER); } else { gSPClearGeometryMode((*dlist)++, G_ZBUFFER); } } - gForceFlags = 0; - gCurrentRenderFlags = temp_a1; - temp_t8 = temp_a1 & ~0x800; - if (gSpriteOpaque == 0) { - if ((gCurrentRenderFlags & 0x200) != 0) { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteCld[((temp_t8 >> 1) & 1) * 16]), + gForceFlags = FALSE; + gCurrentRenderFlags = flags; + flags &= ~RENDER_DECAL; + if (gSpriteOpaque == FALSE) { + if ((gCurrentRenderFlags & RENDER_PRESERVE_COVERAGE)) { + gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteCld[(flags >> 1) & 1]), numberOfGfxCommands(dRenderSettingsSpriteCld[0])); } else { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteXlu[(temp_t8 - 16) * 16]), + // fake ^ 0 required for some reason + gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteXlu[(flags - 16) ^ 0]), numberOfGfxCommands(dRenderSettingsSpriteXlu[0])); } } else { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[temp_t8 * 16]), + gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[flags]), numberOfGfxCommands(dRenderSettingsCommon[0])); } gCurrentTextureHeader = NULL; - gUsingTexture = 1; + gUsingTexture = TRUE; } } -#else -GLOBAL_ASM("asm/non_matchings/textures_sprites/func_8007BF34.s") -#endif /** * Official Name: texLoadSprite diff --git a/src/textures_sprites.h b/src/textures_sprites.h index ce1b348e..b2536ff5 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -140,7 +140,7 @@ void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentCo void func_8007CA68(s32 spriteID, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4); // Non Matching MemoryPoolSlot *func_8007C12C(s32 spriteID, s32 arg1); // Non Matching void tex_init_textures(void); // Non Matching -void func_8007BF34(Gfx **dlist, s32 arg1); // Non Matching +void func_8007BF34(Gfx **dlist, s32 flags); // Non Matching void load_blinking_lights_texture(Gfx **dlist, TextureHeader *texture_list, u32 flags, s32 texture_index); // Non Matching void build_tex_display_list(TextureHeader *tex, Gfx *dlist); // Non Matching diff --git a/src/thread0_epc.c b/src/thread0_epc.c index 5cd7914e..58cc7f8e 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -58,7 +58,7 @@ void thread0_Main(UNUSED void *unused) { 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); - osCreatePiManager(150, &D_801297E8, D_801297C8, 8); + osCreatePiManager(150, &D_801297E8, D_801297C8, ARRAY_COUNT(D_801297C8)); while (1) { osRecvMesg(&D_80129790, (OSMesg) &sp34, OS_MESG_BLOCK); diff --git a/src/thread30_track_loading.c b/src/thread30_track_loading.c index 0f457d3f..fe93c772 100644 --- a/src/thread30_track_loading.c +++ b/src/thread30_track_loading.c @@ -3,9 +3,8 @@ #include "thread30_track_loading.h" #include "macros.h" -#include "libultra_internal.h" +#include #include "game.h" -#include "stacks.h" /************ .data ************/ @@ -18,16 +17,10 @@ s32 gThread30LoadDelay = 0; /************ .bss ************/ -// Used for __osException, but .bss file order is weird. Need to fix later. -u8 leoDiskStack[16]; // technically should have a OS_LEO_STACKSIZE or something. - // This is something like 4096 in libreultra... OSThread gThread30; OSMesgQueue gThread30MesgQueue; OSMesg gThread30Message[2]; - -// Currently defined in osViMgr.c -// There are a few stacks defined next to each other. Maybe they are in their own separate file? -extern u64 gThread30Stack[0x400]; +u64 gThread30Stack[0x400]; /*****************************/ diff --git a/src/thread3_main.c b/src/thread3_main.c index 8eded573..f186c0e2 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -55,7 +55,7 @@ const char D_800E7134[] = "BBB\n"; // Functionally unused. /************ .data ************/ -UNUSED char gBuildString[40] = "Version 7.7 29/09/97 15.00 L.Schuneman"; +UNUSED char gBuildString[] = "Version 7.7 29/09/97 15.00 L.Schuneman"; s8 sAntiPiracyTriggered = 0; UNUSED s32 D_800DD378 = 1; @@ -182,11 +182,11 @@ void init_game(void) { gIsLoading = FALSE; gLevelDefaultVehicleID = VEHICLE_CAR; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { viMode = OS_VI_PAL_LPN1; - } else if (osTvType == TV_TYPE_NTSC) { + } else if (osTvType == OS_TV_TYPE_NTSC) { viMode = OS_VI_NTSC_LPN1; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { viMode = OS_VI_MPAL_LPN1; } @@ -334,7 +334,7 @@ void main_game_loop(void) { } if (gDrawFrameTimer == 2) { framebufferSize = SCREEN_WIDTH * SCREEN_HEIGHT * 2; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { framebufferSize = (s32) ((SCREEN_WIDTH * SCREEN_HEIGHT * 2) * 1.1f); } dmacopy_doubleword(gVideoLastFramebuffer, gVideoCurrFramebuffer, (s32) gVideoCurrFramebuffer + framebufferSize); diff --git a/src/thread3_main.h b/src/thread3_main.h index c23ea82d..99a62017 100644 --- a/src/thread3_main.h +++ b/src/thread3_main.h @@ -121,7 +121,7 @@ void load_next_ingame_level(s32 numPlayers, s32 trackID, Vehicle vehicle); void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId); void unload_level_game(void); void set_drumstick_unlock_transition(void); -void race_postrace_type(s32 arg0); +void race_postrace_type(s32 finishState); void func_8006D8F0(s32 arg0); void func_8006D968(s8 *arg0); GameMode get_game_mode(void); diff --git a/src/tracks.c b/src/tracks.c index 1989bbdc..56ec319d 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -23,6 +23,7 @@ #include "math_util.h" #include "printf.h" #include "collision.h" +#include "common.h" // Maximum size for a level model is 522.5 KiB #define LEVEL_MODEL_MAX_SIZE 0x82A00 @@ -63,7 +64,7 @@ s8 D_800DC92C[24] = { Gfx *gSceneCurrDisplayList; MatrixS *gSceneCurrMatrix; Vertex *gSceneCurrVertexList; -TriangleList *gSceneCurrTriList; +Triangle *gSceneCurrTriList; ObjectSegment *gSceneActiveCamera; @@ -143,9 +144,9 @@ UNUSED s32 D_8011D34C; DrawTexture *gShadowHeapTextures[4]; DrawTexture *gCurrentShadowTexture; s32 D_8011D364; -s32 D_8011D368; // xOffset? -s32 D_8011D36C; // yOffset? -s32 *D_8011D370; +s32 D_8011D368; // xOffset? +s32 D_8011D36C; // yOffset? +u16 **D_8011D370; // Allocated 0x7D0 s32 *D_8011D374; s32 D_8011D378; s32 gScenePlayerViewports; @@ -160,7 +161,7 @@ Vertex *D_8011D480[2]; Vertex *D_8011D488; s32 D_8011D48C; TriangleList *D_8011D490[2]; -Vertex *D_8011D498; +Triangle *D_8011D498; s16 D_8011D49C; s16 D_8011D49E; f32 D_8011D4A0; @@ -169,7 +170,15 @@ f32 D_8011D4A8; f32 D_8011D4AC; f32 D_8011D4B0; s8 D_8011D4B4; -s16 D_8011D4B6; +typedef struct Unk8011D4B6 { + union { + struct { + u8 one, two; + }; + s16 whole; + }; +} Unk8011D4B6; +Unk8011D4B6 D_8011D4B6; s16 D_8011D4B8; s16 D_8011D4BA; s16 D_8011D4BC; @@ -417,7 +426,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, TriangleList **tris, lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, get_active_camera_segment()); set_text_font(FONT_COLOURFUL); - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { posX = SCREEN_WIDTH_HALF + 6; posY = SCREEN_HEIGHT_HALF_PAL + 6; } else { @@ -575,7 +584,7 @@ void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex) { var_s4 = D_8011D478->unk0; D_8011D488 = gSceneCurrVertexList; D_8011D498 = gSceneCurrTriList; - D_8011D4B6 = 0; + D_8011D4B6.whole = 0; D_8011D4B8 = 0; spAC = temp_t6; spA8 = temp_t7; @@ -611,9 +620,10 @@ void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex) { } } } - if (D_8011D4B6 != 0) { - gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D488), D_8011D4B6, 0); - gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D498), (D_8011D4B6 >> 1), TRIN_DISABLE_TEXTURE); + if (D_8011D4B6.whole != 0) { + gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D488), D_8011D4B6.whole, 0); + gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D498), (D_8011D4B6.whole >> 1), + TRIN_DISABLE_TEXTURE); } gSceneCurrVertexList = spAC; gSceneCurrTriList = spA8; @@ -660,9 +670,310 @@ void func_80026C14(s16 arg0, s16 arg1, s32 arg2) { } GLOBAL_ASM("asm/non_matchings/tracks/func_80026E54.s") + +#ifdef NON_EQUIVALENT +s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { + Vertex *verts; + Triangle *tris; + s32 two; + s32 test; + s32 vertZ1; + s32 vertX2; + s32 vertZ2; + s32 vertX1; + ColourRGBA colour; + + if (D_8011D4B8 >= D_8011D4BC) { + return 0; + } else { + if (D_8011D4B6.whole == 24) { + gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D488), D_8011D4B6.whole, 0); + if (two) {} + gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(D_8011D498), (D_8011D4B6.whole >> 1), + TRIN_DISABLE_TEXTURE); + D_8011D4B6.whole = 0; + D_8011D488 = gSceneCurrVertexList; + D_8011D498 = gSceneCurrTriList; + } + verts = gSceneCurrVertexList; + 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); + vertX2 = ((arg3 * D_8011D4A0) + D_8011D4AC); + vertZ2 = ((arg3 * D_8011D4A4) + D_8011D4B0); + two = D_8011D4B6.two; + verts[0].x = vertX1; + verts[0].y = (arg0[0] + 2.0f); + verts[0].z = vertZ1; + if (1) { + verts[0].r = colour.r; + verts[0].g = colour.g; + verts[0].b = colour.b; + verts[0].a = colour.a; + verts[1].x = vertX2; + verts[1].y = (arg0[1] + 2.0f); + verts[1].z = vertZ2; + verts[1].r = colour.r; + verts[1].g = colour.g; + verts[1].b = colour.b; + verts[1].a = colour.a; + verts[2].x = vertX1; + verts[2].y = (arg1[0] - 2.0f); + verts[2].z = vertZ1; + verts[2].r = colour.r; + } + verts[2].g = colour.g; + verts[2].b = colour.b; + verts[2].a = colour.a; + verts[3].x = vertX2; + verts[3].y = (arg1[1] - 2.0f); + verts[3].z = vertZ2; + verts[3].r = colour.r; + verts[3].g = colour.g; + verts[3].b = colour.b; + verts[3].a = colour.a; + verts += 4; + gSceneCurrVertexList = verts; + tris = gSceneCurrTriList; + tris[0].flags = 0x40; + tris[0].vi0 = two + 2; + tris[0].vi1 = two + 1; + tris[0].vi2 = two; + tris[0].uv0.u = 0x3E0; + tris[0].uv0.v = 0x3E0; + tris[0].uv1.u = 0x3E0; + tris[0].uv1.v = 0; + tris[0].uv2.u = 1; + tris[0].uv2.v = 0; + tris[1].flags = 0x40; + tris[1].vi0 = two + 3; + tris[1].vi1 = two + 1; + tris[1].vi2 = two + 2; + tris[1].uv0.u = 1; + tris[1].uv0.v = 0x3E0; + tris[1].uv1.u = 0x3E0; + tris[1].uv1.v = 0x3E0; + tris[1].uv2.u = 1; + tris[1].uv2.v = 0; + tris += 2; + gSceneCurrTriList = tris; + D_8011D4B6.whole += 4; + D_8011D4B8 += 1; + } + + return 0; +} +#else GLOBAL_ASM("asm/non_matchings/tracks/func_80027184.s") +#endif + +#ifdef NON_EQUIVALENT +typedef struct Unk80027568_2 { + s32 unk0; + u16 unk4; +} Unk80027568_2; + +typedef struct Unk80027568_1 { + u8 unk0[0x18]; + Vec4f *unk18; +} Unk80027568_1; + +s32 func_80027568(void) { + f32 camXPos; + f32 camYPos; + f32 camZPos; + f32 projectedRacerPos; + f32 projectedCamPos; + f32 racerXPos; + f32 racerYPos; + f32 racerZPos; + f32 temp_f18_2; + f32 var_f16; + f32 scalingFactor; + s32 curViewport; + s32 isNegative; + s32 var_a1; + s32 ret; + s32 var_t4; + s32 i; + s32 var_v0_1; + u16 var_v0; + Vec4f *vector; + Object **racerGroup; + s32 numRacers; + Unk80027568_1 *var_ra; + Object *currentObjRacer; + + racerGroup = get_racer_objects(&numRacers); + if (numRacers == 0) { + return FALSE; + } + if ((check_if_showing_cutscene_camera() != 0) || (gSceneActiveCamera->object.unk36 >= 5) || + (gSceneActiveCamera->object.unk36 == 3)) { + return FALSE; + } + curViewport = get_current_viewport(); + currentObjRacer = NULL; + for (i = 0; i < numRacers; i++) { + if (curViewport == racerGroup[i]->unk64->racer.playerIndex) { + currentObjRacer = racerGroup[i]; + i = numRacers; // Come on! Just use break! + } + } + if (currentObjRacer == NULL) { + return FALSE; + } + func_80031130(1, ¤tObjRacer->segment.trans.x_position, &gSceneActiveCamera->trans.x_position, -1); + ret = FALSE; + // bug? var_ra can be undefined? + for (var_t4 = 0; var_t4 < D_8011D378 && ret == FALSE; var_t4++) { + var_v0_1 = D_8011D370[var_t4]; + if (var_v0_1 > 0) { + var_ra = (void *) PHYS_TO_K0(var_v0_1); + } else { + ret = TRUE; + vector = &var_ra->unk18[var_v0_1]; + camXPos = gSceneActiveCamera->trans.x_position; + camYPos = gSceneActiveCamera->trans.y_position; + camZPos = gSceneActiveCamera->trans.z_position; + projectedCamPos = + (((vector->x * camXPos) + (vector->y * camYPos) + (vector->z * camZPos) + vector->w) - 14.0); + if (projectedCamPos < -0.1) { + racerXPos = currentObjRacer->segment.trans.x_position; + racerYPos = currentObjRacer->segment.trans.y_position; + racerZPos = currentObjRacer->segment.trans.z_position; + projectedRacerPos = + (vector->x * racerXPos) + (vector->y * racerYPos) + (vector->z * racerZPos) + vector->w; + if (projectedRacerPos >= -0.1) { + if (projectedRacerPos != projectedCamPos) { + scalingFactor = projectedRacerPos / (projectedRacerPos - projectedCamPos); + } else { + scalingFactor = 0.0f; + } + for (var_a1 = 1; var_a1 < 3 && ret == TRUE; var_a1++) { + var_v0 = D_8011D370[var_t4][var_a1 + 1]; + isNegative = FALSE; + if (var_v0 & 0x8000) { + var_v0 &= 0x7FFF; + isNegative = TRUE; + } + vector = &var_ra->unk18[var_v0]; + temp_f18_2 = (vector->x * (racerXPos + ((camXPos - racerXPos) * scalingFactor))) + + (vector->y * (racerYPos + ((camYPos - racerYPos) * scalingFactor))) + + (vector->z * (racerZPos + ((camZPos - racerZPos) * scalingFactor))) + vector->w; + var_f16 = temp_f18_2; + if (isNegative) { + var_f16 = -temp_f18_2; + } + if (var_f16 > 4.0f) { + ret = FALSE; + } + } + } + } + } + } + return ret; +} +#else GLOBAL_ASM("asm/non_matchings/tracks/func_80027568.s") -GLOBAL_ASM("asm/non_matchings/tracks/func_800278E8.s") +#endif + +void func_800278E8(s32 updateRate) { + s16 angleDiff; + f32 xDelta; + f32 yDelta; + f32 zDelta; + f32 xzSqr; + ObjectSegment *segment; + Object *thisObject; + Object **racerGroup; + Object *lastObject; + Object *objectFirstPlace; + Object_Racer *currentRacer; + Object_Racer *lastRacer; + Object_Racer *racerFirstPlace; + s32 numRacers; + s32 i; + s32 cameraId; + Object *camera; + + racerGroup = get_racer_objects(&numRacers); + lastRacer = NULL; + for (i = 0; i < numRacers; i++) { + if (1) {} // fake + if (racerGroup[i] != NULL) { + currentRacer = &racerGroup[i]->unk64->racer; + cameraId = currentRacer->cameraIndex; + spectate_nearest(racerGroup[i], &cameraId); + currentRacer->cameraIndex = cameraId; + if (currentRacer->raceFinished) { + if (currentRacer->finishPosition == 1) { + racerFirstPlace = currentRacer; + objectFirstPlace = racerGroup[i]; + } + } else if (lastRacer == NULL) { + lastRacer = currentRacer; + lastObject = racerGroup[i]; + } else if (currentRacer->racePosition < lastRacer->racePosition) { + lastRacer = currentRacer; + lastObject = racerGroup[i]; + } + } + } + if (lastRacer != NULL) { + currentRacer = lastRacer; + thisObject = lastObject; + } else { + currentRacer = racerFirstPlace; + thisObject = objectFirstPlace; + } + camera = spectate_object(currentRacer->cameraIndex); + if (D_8011B104 != currentRacer->cameraIndex) { + D_8011B108 = 0; + } else if (D_8011B100 != currentRacer->playerIndex) { + D_8011B108 = 180; + D_8011B100 = currentRacer->playerIndex; + } + if (camera != NULL) { + segment = get_active_camera_segment_no_cutscenes(); + segment->trans.x_position = camera->segment.trans.x_position; + segment->trans.y_position = camera->segment.trans.y_position; + segment->trans.z_position = camera->segment.trans.z_position; + xDelta = segment->trans.x_position - thisObject->segment.trans.x_position; + yDelta = segment->trans.y_position - thisObject->segment.trans.y_position; + zDelta = segment->trans.z_position - thisObject->segment.trans.z_position; + xzSqr = sqrtf((xDelta * xDelta) + (zDelta * zDelta)); + if (D_8011B108 != 0) { + angleDiff = ((s32) (-atan2s(xDelta, zDelta) - segment->trans.y_rotation) + 0x8000); + //!@bug Never true, since angleDiff is signed. Should be >=. + if (angleDiff > 0x8000) { + angleDiff = -(0xFFFF - angleDiff); + } + segment->trans.y_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; + angleDiff = atan2s(yDelta, xzSqr) - segment->trans.x_rotation; + //!@bug Never true, since angleDiff is signed. Should be >=. + if (angleDiff > 0x8000) { + angleDiff = -(0xFFFF - angleDiff); + } + segment->trans.x_rotation += ((s32) (angleDiff / (16.0f * (D_8011B108 / 180.0f)))) & 0xFFFF; + D_8011B108 -= updateRate; + if (D_8011B108 < 0) { + D_8011B108 = 0; + } + } else { + segment->trans.y_rotation = 0x8000 - atan2s(xDelta, zDelta); + segment->trans.x_rotation = atan2s(yDelta, xzSqr); + } + segment->trans.z_rotation = 0; + segment->object.cameraSegmentID = get_level_segment_index_from_position( + segment->trans.x_position, currentRacer->oy1, segment->trans.z_position); + D_8011B104 = currentRacer->cameraIndex; + } +} /** * Handle the flipbook effect for level geometry textures. @@ -772,7 +1083,7 @@ void draw_gradient_background(void) { gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), 4, 0); gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(tris), 2, 0); set_twenty = 20; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { y0 = -180; y1 = 180; } else { @@ -2395,20 +2706,18 @@ void func_8002DE30(Object *obj) { } // Generate shadow -#ifdef NON_EQUIVALENT void func_8002E234(Object *obj, s32 bool) { - s32 *inSegs; + f32 var_f2; + s32 yPos; f32 xPos; f32 zPos; s32 *new_var; - f32 character_scale; - f32 var_f2; - s32 yPos; s32 cheats; + s32 inSegs[28]; s32 i; - s32 test; - f32 temp; s32 segs; + f32 character_scale; + s32 test; yPos = obj->segment.trans.y_position; character_scale = 1.0f; @@ -2423,7 +2732,6 @@ void func_8002E234(Object *obj, s32 bool) { D_8011D0C4 = obj; D_8011D0C8 = 2.0f; - if (D_8011D0C4) {} // fakematch if (bool) { D_8011D0B8 = 0; @@ -2466,17 +2774,11 @@ void func_8002E234(Object *obj, s32 bool) { D_8011D0F0 = -D_8011D0F0; } D_8011D0F4 = (7.0f * D_8011D0F0); - if (1) {} - if (1) {} - if (1) {} - if (1) {} - if (1) {} - if (1) {} D_8011D0D0 = -0x8000; } D_8011D0D8 = 144.0f / D_8011D0D8; - xPos = obj->segment.trans.x_position; - zPos = obj->segment.trans.z_position; + xPos = D_8011D0C4->segment.trans.x_position; + zPos = D_8011D0C4->segment.trans.z_position; segs = get_inside_segment_count_xyz(inSegs, (xPos - D_8011D0DC), D_8011D0CC, (zPos - D_8011D0E0), (xPos + D_8011D0DC), D_8011D0CE, (zPos + D_8011D0E0)); D_8011C230 = 0; @@ -2484,21 +2786,20 @@ void func_8002E234(Object *obj, s32 bool) { for (i = 0; i < ARRAY_COUNT(D_8011B320); i++) { D_8011B320[i] = 0; } - new_var = inSegs; // fake? D_8011D0E8 = -1; D_8011D0EC = -1; for (i = 0; i < segs; i++) { - if (new_var[i] >= 0) { + if (inSegs[i] >= 0) { if (bool && (gCurrentLevelModel->segments[inSegs[i]].hasWaves != 0) && (gWaveBlockCount != 0)) { - func_8002EEEC(); + func_8002EEEC(inSegs[i]); } else { - test = func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[new_var[i]], + test = func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[inSegs[i]], (obj->segment.trans.x_position - D_8011D0DC), // x1 (obj->segment.trans.z_position - D_8011D0E0), // z1 (obj->segment.trans.x_position + D_8011D0DC), // x2 (obj->segment.trans.z_position + D_8011D0E0) // z2 ); - func_8002E904(&gCurrentLevelModel->segments[new_var[i]], test, bool); + func_8002E904(&gCurrentLevelModel->segments[inSegs[i]], test, bool); } } } @@ -2515,39 +2816,30 @@ void func_8002E234(Object *obj, s32 bool) { obj->waterEffect->meshEnd = D_8011D364; } } -#else -GLOBAL_ASM("asm/non_matchings/tracks/func_8002E234.s") -#endif GLOBAL_ASM("asm/non_matchings/tracks/func_8002E904.s") GLOBAL_ASM("asm/non_matchings/tracks/func_8002EEEC.s") #ifdef NON_EQUIVALENT void func_8002F2AC(void) { - f32 temp_f10; f32 temp_f12; f32 temp_f16; - f32 temp_f8; unk8011B120_unkC *var_v0; s32 i, j; for (i = 0; i < D_8011B118; i++) { var_v0 = D_8011B120[i].unkC; temp_f16 = D_8011B120[i].x * var_v0->unk0; - temp_f10 = var_v0->unkC; - temp_f8 = var_v0->unk4; temp_f12 = D_8011B120[i].z * var_v0->unk8; - D_8011B120[i].y = (f32) (-(temp_f16 + temp_f12 + temp_f10) / temp_f8); + D_8011B120[i].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC) / var_v0->unk4); } - for (i = 0; D_8011B320[i] > 0; i++) { + for (i = 0; i < ARRAY_COUNT(D_8011B320); i++) { for (j = 0; j < D_8011B320[i]; j++) { - var_v0 = D_8011B330[i].unkC; - temp_f16 = D_8011B330[i].x * var_v0->unk0; - temp_f10 = var_v0->unkC; - temp_f8 = var_v0->unk4; - temp_f12 = D_8011B330[i].z * var_v0->unk8; - D_8011B330[i].z = (f32) (-(temp_f16 + temp_f12 + temp_f10) / temp_f8); + var_v0 = D_8011B330[j + i].unkC; + temp_f16 = D_8011B330[j + i].x * var_v0->unk0; + temp_f12 = D_8011B330[j + i].z * var_v0->unk8; + D_8011B330[j + i].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC) / var_v0->unk4); } } } diff --git a/src/tracks.h b/src/tracks.h index 0bc877af..4cc07452 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -201,7 +201,7 @@ void func_800BA8E4(Gfx**, MatrixS**, s32); void func_8002DE30(Object*); void func_8002E234(Object*, s32); void func_8002E904(LevelModelSegment *, s32, s32 bool); -void func_8002EEEC(void); +void func_8002EEEC(s32 arg0); void func_8002F2AC(void); void func_8002F440(void); f32 func_8002FA64(void); diff --git a/src/video.c b/src/video.c index 0060a985..1e1df1f2 100644 --- a/src/video.c +++ b/src/video.c @@ -31,7 +31,6 @@ VideoModeResolution gVideoModeResolutions[] = { s32 gVideoRefreshRate; // Official Name: viFramesPerSecond f32 gVideoAspectRatio; f32 gVideoHeightRatio; -UNUSED s32 D_8012617C; OSMesg gVideoMesgBuf[8]; OSMesgQueue gVideoMesgQueue[8]; OSViMode gTvViMode; @@ -49,7 +48,6 @@ u8 D_801262E4; UNUSED OSMesg D_801262E8[8]; u8 gVideoDeltaCounter; u8 gVideoDeltaTime; -UNUSED s32 D_8012630C; OSScClient gVideoSched; /******************************/ @@ -60,11 +58,11 @@ OSScClient gVideoSched; * Official Name: viInit */ void video_init(s32 videoModeIndex, OSSched *sc) { - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { gVideoRefreshRate = REFRESH_50HZ; gVideoAspectRatio = ASPECT_RATIO_PAL; gVideoHeightRatio = HEIGHT_RATIO_PAL; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { gVideoRefreshRate = REFRESH_60HZ; gVideoAspectRatio = ASPECT_RATIO_MPAL; gVideoHeightRatio = HEIGHT_RATIO_MPAL; @@ -74,7 +72,7 @@ void video_init(s32 videoModeIndex, OSSched *sc) { gVideoHeightRatio = HEIGHT_RATIO_NTSC; } - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { s32 i; for (i = 0; i < 8; i++) { gVideoModeResolutions[i].height += PAL_HEIGHT_DIFFERENCE; @@ -141,9 +139,9 @@ void fb_init_vi(void) { OSViMode *tvViMode; viModeTableIndex = OS_VI_NTSC_LPN1; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { viModeTableIndex = OS_VI_PAL_LPN1; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { viModeTableIndex = OS_VI_MPAL_LPN1; } @@ -159,13 +157,13 @@ void fb_init_vi(void) { // So maybe it was swapped out late in development? stubbed_printf("320 by 240 Anti-aliased, Non interlaced.\n"); tvViMode = &osViModeNtscLpn1; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { tvViMode = &osViModePalLpn1; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { tvViMode = &osViModeMpalLpn1; } fb_memcpy((u8 *) tvViMode, (u8 *) &gTvViMode, sizeof(OSViMode)); - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { // A simple osViExtendVStart to add an additional 24 scanlines? gTvViMode.fldRegs[0].vStart -= (PAL_HEIGHT_DIFFERENCE << 16); gTvViMode.fldRegs[1].vStart -= (PAL_HEIGHT_DIFFERENCE << 16); @@ -177,9 +175,9 @@ void fb_init_vi(void) { case VIDEO_MODE_MEDRES_LPN: stubbed_printf("640 by 240 Point sampled, Non interlaced.\n"); tvViMode = &osViModeNtscLpn1; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { tvViMode = &osViModePalLpn1; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { tvViMode = &osViModeMpalLpn1; } @@ -193,9 +191,9 @@ void fb_init_vi(void) { case VIDEO_MODE_MEDRES_LAN: stubbed_printf("640 by 240 Anti-aliased, Non interlaced.\n"); tvViMode = &osViModeNtscLan1; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { tvViMode = &osViModePalLan1; - } else if (osTvType == TV_TYPE_MPAL) { + } else if (osTvType == OS_TV_TYPE_MPAL) { tvViMode = &osViModeMpalLan1; } fb_memcpy((u8 *) tvViMode, (u8 *) &gTvViMode, sizeof(OSViMode)); diff --git a/src/waves.c b/src/waves.c index 57e6bb8e..31db7dfb 100644 --- a/src/waves.c +++ b/src/waves.c @@ -4,7 +4,7 @@ #include "waves.h" #include "types.h" #include "macros.h" -#include "libultra_internal.h" +#include #include "memory.h" #include "textures_sprites.h" #include "objects.h" @@ -278,13 +278,13 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { set_rng_seed(0x57415646); if (D_80129FC8.unk4 > 0) { - for (i = 0; i < D_80129FC8.unk4; i++) { - for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { - D_800E3044[(var_s0 * 2)] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); - D_800E3044[(var_s0 * 2) + 1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + for (i = 0; i < D_80129FC8.unk4; i++) { + for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { + D_800E3044[(var_s0 * 2)] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + D_800E3044[(var_s0 * 2) + 1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + } } } - } load_rng_seed(); if (arg2 != 2) { var_s3 = 2; @@ -312,7 +312,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { } } } - + var_s5 = 0; for (var_s7 = 0; var_s7 < D_80129FC8.unk0; var_s7++) { for (var_s0 = 0; var_s0 < D_80129FC8.unk0; var_s0++) { @@ -609,7 +609,7 @@ f32 func_800BEFC4(s32 arg0, s32 arg1, s32 arg2) { temp_f12 = (temp_f20 * temp_f20) + (temp_f22 * temp_f22); if (temp_f12 < temp_s1->unk14) { temp_f0 = sqrtf(temp_f12); - var_s0 = (u16)temp_s1->unk1A; + var_s0 = (u16) temp_s1->unk1A; if (temp_s1->unk31 != 0) { if (temp_f20 < temp_f26) { var_s0 -= (s32) (temp_f20 * temp_s1->unk20); @@ -747,7 +747,7 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, result->unk18 = i; result->unk14 = arg3 * arg3; result->unk1A = arg4; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { result->unk1C = arg5 * 20971.52; //(f64) (0x80000 / 25.0); } else { result->unk1C = arg5 * 17476.27; //(f64) ((0x80000 / 1.2) / 25.0); @@ -844,7 +844,7 @@ UNUSED void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, arg0->unk0 = (arg0->unkC - arg0->unk10); arg0->unk4 = (arg0->unkC + arg0->unk10); arg0->unk28 += arg2; - if (osTvType == TV_TYPE_PAL) { + if (osTvType == OS_TV_TYPE_PAL) { arg0->unk1C = arg0->unk28 * 20971.52; //(f64) (0x80000 / 25.0); } else { arg0->unk1C = arg0->unk28 * 17476.27; //(f64) ((0x80000 / 1.2) / 25.0); diff --git a/src/weather.c b/src/weather.c index f419d261..8c8fc3a2 100644 --- a/src/weather.c +++ b/src/weather.c @@ -6,13 +6,13 @@ #include "macros.h" #include "structs.h" #include "f3ddkr.h" -#include "PR/libultra.h" #include "camera.h" #include "tracks.h" #include "audio_spatial.h" #include "textures_sprites.h" #include "math_util.h" #include "objects.h" +#include "common.h" #define WEATHER_OVERRIDE_COUNT 16 @@ -843,7 +843,7 @@ void free_rain_memory(void) { * The game will slowly ease into the intended values. */ void rain_set(s32 lightningFrequency, s32 opacity, f32 time) { - gRainHiddenTimer = osTvType == TV_TYPE_PAL ? 50.0 * time : 60.0 * time; + gRainHiddenTimer = osTvType == OS_TV_TYPE_PAL ? 50.0 * time : 60.0 * time; gLightningFrequencyTarget = lightningFrequency; gLightningFrequencyStep = (gLightningFrequencyTarget - gLightningFrequency) / gRainHiddenTimer; gRainOpacityTarget = opacity; diff --git a/src/weather.h b/src/weather.h index 83e7a8da..2760630f 100644 --- a/src/weather.h +++ b/src/weather.h @@ -100,11 +100,11 @@ typedef struct WeatherData { s32 shiftTime; } WeatherData; -void weather_clip_planes(s16 arg0, s16 arg1); +void weather_clip_planes(s16 near, s16 far); void lensflare_remove(Object *obj); void lensflare_override_add(Object *obj); void free_rain_memory(void); -void rain_set(s32 arg0, s32 arg1, f32 arg2); +void rain_set(s32 lightningFrequency, s32 opacity, f32 time); void rain_fog(void); void rain_update(s32 updateRate); void rain_sound(s32 updateRate); @@ -114,15 +114,15 @@ void render_rain_overlay(RainGfxData*, s32); void weather_update(Gfx **currDisplayList, MatrixS **currHudMat, Vertex **currHudVerts, TriangleList **currHudTris, s32 updateRate); void snow_render(void); void weather_free(void); -void weather_set(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); +void weather_set(s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity, s32 time); void lensflare_override(ObjectSegment *cameraSegment); void snow_update(s32 updateRate); void snow_init(void); -void rain_init(s32 arg0, s32 arg1); +void rain_init(s32 intensity, s32 opacity); void weather_init(void); void snow_vertices(void); void lensflare_init(Object *); void lensflare_render(Gfx**, MatrixS**, Vertex**, ObjectSegment*); -void weather_reset(s32 weatherType, s32 weatherEnable, s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity); +void weather_reset(s32 weatherType, s32 density, s32 velX, s32 velY, s32 velZ, s32 intensity, s32 opacity); #endif diff --git a/tools/python/first_diff.py b/tools/python/first_diff.py index fa68016a..1c6a2b70 100644 --- a/tools/python/first_diff.py +++ b/tools/python/first_diff.py @@ -1,255 +1,54 @@ #!/usr/bin/env python3 -import os.path +# SPDX-FileCopyrightText: © 2022 AngheloAlf +# SPDX-License-Identifier: MIT + +from __future__ import annotations + import argparse -from subprocess import check_call - -parser = argparse.ArgumentParser( - description="Find the first difference(s) between the built ROM and the base ROM." -) -parser.add_argument( - "-c", - "--count", - type=int, - default=5, - help="find up to this many instruction difference(s)", -) -parser.add_argument( - "-d", - "--diff", - dest="diff_args", - nargs="?", - action="store", - default=False, - const="prompt", - help="run diff.py on the result with the provided arguments" -) -parser.add_argument( - "-m", "--make", help="run ninja before finding difference(s)", action="store_true" -) -args = parser.parse_args() - -diff_count = args.count - -if args.make: - check_call(["ninja", "baseroms/dkr.z64"]) - -baseimg = f"baseroms/dkr.z64" -basemap = f"expected/build/us_1.0/dkr.map" - -myimg = f"build/us_1.0/dkr.z64" -mymap = f"build/us_1.0/dkr.map" - -if not os.path.isfile(baseimg): - print(f"{baseimg} must exist.") - exit(1) -if not os.path.isfile(myimg) or not os.path.isfile(mymap): - print(f"{myimg} and {mymap} must exist.") - exit(1) - -mybin = open(myimg, "rb").read() -basebin = open(baseimg, "rb").read() - -if len(mybin) != len(basebin): - print("Modified ROM has different size...") - exit(1) - -if mybin == basebin: - print("No differences!") - exit(0) +import mapfile_parser +from pathlib import Path +import rabbitizer -def search_rom_address(target_addr): - ram_offset = None - prev_ram = 0 - prev_rom = 0 - prev_sym = "" - cur_file = "" - prev_file = cur_file - prev_line = "" - with open(mymap) as f: - for line in f: - if "load address" in line: - # Ignore .bss sections since we're looking for a ROM address - if ".bss" in line or ".bss" in prev_line: - ram_offset = None - continue - ram = int(line[16 : 16 + 18], 0) - rom = int(line[59 : 59 + 18], 0) - ram_offset = ram - rom - continue +def decodeInstruction(bytesDiff: bytes, mapFile: mapfile_parser.MapFile) -> str: + word = (bytesDiff[0] << 24) | (bytesDiff[1] << 16) | (bytesDiff[2] << 8) | (bytesDiff[3] << 0) + instr = rabbitizer.Instruction(word) + immOverride = None - prev_line = line + if instr.isJumpWithAddress(): + # Instruction is a function call (jal) - if ( - ram_offset is None - or "=" in line - or "*fill*" in line - or " 0x" not in line - ): - continue + # Get the embedded address of the function call + symAddress = instr.getInstrIndexAsVram() - ram = int(line[16 : 16 + 18], 0) - rom = ram - ram_offset - sym = line.split()[-1] + # Search for the address in the mapfile + symInfo = mapFile.findSymbolByVramOrVrom(symAddress) + if symInfo is not None: + # Use the symbol from the mapfile instead of a raw value + immOverride = symInfo.symbol.name - if "0x" in sym: - ram_offset = None - continue - if "/" in sym: - cur_file = sym - continue + return instr.disassemble(immOverride=immOverride, extraLJust=-20) - if rom > target_addr: - return f"{prev_sym} (RAM 0x{prev_ram:X}, ROM 0x{prev_rom:X}, {prev_file})" +def firstDiffMain(): + parser = argparse.ArgumentParser(description="Find the first difference(s) between the built ROM and the base ROM.") - prev_ram = ram - prev_rom = rom - prev_sym = sym - prev_file = cur_file + parser.add_argument("-c", "--count", type=int, default=5, help="find up to this many instruction difference(s)") + parser.add_argument("-r", "--region", help="Which region should be processed", default="us") + parser.add_argument("-v", "--version", help="Which version should be processed", default="v77") + parser.add_argument("-a", "--add-colons", action='store_true', help="Add colon between bytes" ) - return "at end of rom?" + args = parser.parse_args() + buildFolder = Path("build") / Path("us_1.0") -def parse_map(map_fname): - ram_offset = None - cur_file = "" - syms = {} - prev_sym = None - prev_line = "" - with open(map_fname) as f: - for line in f: - if "load address" in line: - ram = int(line[16 : 16 + 18], 0) - rom = int(line[59 : 59 + 18], 0) - ram_offset = ram - rom - continue + BUILTROM = buildFolder / f"dkr.z64" + BUILTMAP = buildFolder / f"dkr.map" - prev_line = line + EXPECTEDROM = "expected" / BUILTROM + EXPECTEDMAP = "expected" / BUILTMAP - if ( - ram_offset is None - or "=" in line - or "*fill*" in line - or " 0x" not in line - ): - continue + mapfile_parser.frontends.first_diff.doFirstDiff(BUILTMAP, EXPECTEDMAP, BUILTROM, EXPECTEDROM, args.count, mismatchSize=True, addColons=args.add_colons, bytesConverterCallback=decodeInstruction) - ram = int(line[16 : 16 + 18], 0) - rom = ram - ram_offset - sym = line.split()[-1] - - if "0x" in sym: - ram_offset = None - continue - elif "/" in sym: - cur_file = sym - continue - - syms[sym] = (rom, cur_file, prev_sym, ram) - prev_sym = sym - - return syms - - -def map_diff(): - map1 = parse_map(mymap) - map2 = parse_map(basemap) - min_ram = None - found = None - for sym, addr in map1.items(): - if sym not in map2: - continue - if addr[0] != map2[sym][0]: - if min_ram is None or addr[0] < min_ram: - min_ram = addr[0] - found = (sym, addr[1], addr[2]) - if min_ram is None: - return False - else: - print( - f"Map appears to have shifted just before {found[0]} ({found[1]}) -- in {found[2]}?" - ) - if found[2] is not None and found[2] not in map2: - print( - f"(Base map file {basemap} out of date due to new or renamed symbols, so result may be imprecise.)" - ) - return True - - -def hexbytes(bs): - return ":".join("{:02X}".format(c) for c in bs) - - -found_instr_diff = [] -map_search_diff = [] -diffs = 0 -shift_cap = 1000 -for i in range(24, len(mybin), 4): - # (mybin[i:i+4] != basebin[i:i+4], but that's slightly slower in CPython...) - if diffs <= shift_cap and ( - mybin[i] != basebin[i] - or mybin[i + 1] != basebin[i + 1] - or mybin[i + 2] != basebin[i + 2] - or mybin[i + 3] != basebin[i + 3] - ): - if diffs == 0: - print(f"First difference at ROM addr 0x{i:X}, {search_rom_address(i)}") - print( - f"Bytes: {hexbytes(mybin[i : i + 4])} vs {hexbytes(basebin[i : i + 4])}" - ) - diffs += 1 - if ( - len(found_instr_diff) < diff_count - and mybin[i] >> 2 != basebin[i] >> 2 - and not search_rom_address(i) in map_search_diff - ): - found_instr_diff.append(i) - map_search_diff.append(search_rom_address(i)) - -if diffs == 0: - print("No differences but ROMs differ?") - exit() - -if len(found_instr_diff) > 0: - for i in found_instr_diff: - print(f"Instruction difference at ROM addr 0x{i:X}, {search_rom_address(i)}") - print( - f"Bytes: {hexbytes(mybin[i : i + 4])} vs {hexbytes(basebin[i : i + 4])}" - ) -print() - -definite_shift = diffs > shift_cap -if definite_shift: - print(f"Over {shift_cap} differing words, must be a shifted ROM.") -else: - print(f"{diffs} differing word(s).") - -if diffs > 100: - if not os.path.isfile(basemap): - print( - f"To find ROM shifts, copy a clean .map file to {basemap} and rerun this script." - ) - elif not map_diff(): - print(f"No ROM shift{' (!?)' if definite_shift else ''}") - -if args.diff_args: - if len(found_instr_diff) < 1: - print(f"No instruction difference to run diff.py on") - exit() - - diff_sym = search_rom_address(found_instr_diff[0]).split()[0] - if args.diff_args == "prompt": - diff_args = input("Call diff.py with which arguments? ") or "--" - else: - diff_args = args.diff_args - if diff_args[0] != "-": - diff_args = "-" + diff_args - check_call( - [ - "python3", - "diff.py", - diff_args, - diff_sym, - ] - ) +if __name__ == "__main__": + firstDiffMain() \ No newline at end of file diff --git a/tools/python/score.py b/tools/python/score.py index d7f49b64..1332532d 100644 --- a/tools/python/score.py +++ b/tools/python/score.py @@ -67,10 +67,10 @@ class DkrMapFile: functions = [] lines = mapFile.read().split('\n') for line in lines: - if line.startswith(' 0x00000000'): + if line.startswith(' 0x8'): if '=' in line: line = line[0:line.find('=')-1] - address = int(line[26:26+8], 16) + address = int(line[18:18+8], 16) if address >= CODE_START and address < CODE_END: symbol = line[line.rfind(' ')+1:] functions.append((symbol, address))