From b68891331f33b5869b84abb7ecdb0706e6914acb Mon Sep 17 00:00:00 2001 From: Ethan Roseman Date: Mon, 5 Oct 2020 16:04:33 -0400 Subject: [PATCH] Float funcs fixed --- Makefile | 2 +- .../code_7bb60_len_41b0/integrate_gravity.s | 42 ------------------ .../code_7bb60_len_41b0/start_bounce_a.s | 26 ----------- .../code_7bb60_len_41b0/start_falling.s | 29 ------------ .../update_locomotion_state.s | 31 ------------- include/common_structs.h | 6 ++- include/si.h | 4 -- src/code_7bb60_len_41b0.c | 44 ++++++++++++------- 8 files changed, 33 insertions(+), 151 deletions(-) delete mode 100644 asm/nonmatchings/code_7bb60_len_41b0/integrate_gravity.s delete mode 100644 asm/nonmatchings/code_7bb60_len_41b0/start_bounce_a.s delete mode 100644 asm/nonmatchings/code_7bb60_len_41b0/start_falling.s delete mode 100644 asm/nonmatchings/code_7bb60_len_41b0/update_locomotion_state.s diff --git a/Makefile b/Makefile index 5f76096794..50100618b6 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ TARGET = papermario CPPFLAGS = -Iinclude -D _LANGUAGE_C -ffreestanding -DF3DEX_GBI_2 ASFLAGS = -EB -Iinclude -march=vr4300 -mtune=vr4300 -OLDASFLAGS = -EB -Iinclude +OLDASFLAGS = -EB -Iinclude -G 0 CFLAGS = -O2 -quiet -G 0 -mcpu=vr4300 -mfix4300 -mips3 -mgp32 -mfp32 LDFLAGS = -T undefined_syms.txt -T $(LD_SCRIPT) -Map $(BUILD_DIR)/papermario.map --no-check-sections diff --git a/asm/nonmatchings/code_7bb60_len_41b0/integrate_gravity.s b/asm/nonmatchings/code_7bb60_len_41b0/integrate_gravity.s deleted file mode 100644 index 8ee933f2c9..0000000000 --- a/asm/nonmatchings/code_7bb60_len_41b0/integrate_gravity.s +++ /dev/null @@ -1,42 +0,0 @@ -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches - -glabel integrate_gravity -/* 7C8F8 800E3448 3C048011 */ lui $a0, %hi(gPlayerStatus) -/* 7C8FC 800E344C 2484EFC8 */ addiu $a0, $a0, %lo(gPlayerStatus) -/* 7C900 800E3450 8C820000 */ lw $v0, ($a0) -/* 7C904 800E3454 3C030004 */ lui $v1, 4 -/* 7C908 800E3458 00431024 */ and $v0, $v0, $v1 -/* 7C90C 800E345C 10400012 */ beqz $v0, .L800E34A8 -/* 7C910 800E3460 00000000 */ nop -/* 7C914 800E3464 C480007C */ lwc1 $f0, 0x7c($a0) -/* 7C918 800E3468 3C013FD9 */ lui $at, 0x3fd9 -/* 7C91C 800E346C 3421999A */ ori $at, $at, 0x999a -/* 7C920 800E3470 44812000 */ mtc1 $at, $f4 -/* 7C924 800E3474 C4860078 */ lwc1 $f6, 0x78($a0) -/* 7C928 800E3478 46040003 */ div.s $f0, $f0, $f4 -/* 7C92C 800E347C 46003180 */ add.s $f6, $f6, $f0 -/* 7C930 800E3480 C4820074 */ lwc1 $f2, 0x74($a0) -/* 7C934 800E3484 46043003 */ div.s $f0, $f6, $f4 -/* 7C938 800E3488 46001080 */ add.s $f2, $f2, $f0 -/* 7C93C 800E348C C4800070 */ lwc1 $f0, 0x70($a0) -/* 7C940 800E3490 46041103 */ div.s $f4, $f2, $f4 -/* 7C944 800E3494 46040000 */ add.s $f0, $f0, $f4 -/* 7C948 800E3498 E4860078 */ swc1 $f6, 0x78($a0) -/* 7C94C 800E349C E4820074 */ swc1 $f2, 0x74($a0) -/* 7C950 800E34A0 08038D34 */ j .L800E34D0 -/* 7C954 800E34A4 E4800070 */ swc1 $f0, 0x70($a0) -.L800E34A8: -/* 7C958 800E34A8 C4840078 */ lwc1 $f4, 0x78($a0) -/* 7C95C 800E34AC C480007C */ lwc1 $f0, 0x7c($a0) -/* 7C960 800E34B0 46002100 */ add.s $f4, $f4, $f0 -/* 7C964 800E34B4 C4800074 */ lwc1 $f0, 0x74($a0) -/* 7C968 800E34B8 46040000 */ add.s $f0, $f0, $f4 -/* 7C96C 800E34BC C4820070 */ lwc1 $f2, 0x70($a0) -/* 7C970 800E34C0 46001080 */ add.s $f2, $f2, $f0 -/* 7C974 800E34C4 E4840078 */ swc1 $f4, 0x78($a0) -/* 7C978 800E34C8 E4800074 */ swc1 $f0, 0x74($a0) -/* 7C97C 800E34CC E4820070 */ swc1 $f2, 0x70($a0) -.L800E34D0: -/* 7C980 800E34D0 03E00008 */ jr $ra -/* 7C984 800E34D4 C4800070 */ lwc1 $f0, 0x70($a0) diff --git a/asm/nonmatchings/code_7bb60_len_41b0/start_bounce_a.s b/asm/nonmatchings/code_7bb60_len_41b0/start_bounce_a.s deleted file mode 100644 index e5309869c7..0000000000 --- a/asm/nonmatchings/code_7bb60_len_41b0/start_bounce_a.s +++ /dev/null @@ -1,26 +0,0 @@ -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches - -glabel start_bounce_a -/* 7F4E4 800E6034 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 7F4E8 800E6038 AFBF0010 */ sw $ra, 0x10($sp) -/* 7F4EC 800E603C 0C039769 */ jal set_action_state -/* 7F4F0 800E6040 24040004 */ addiu $a0, $zero, 4 -/* 7F4F4 800E6044 3C014120 */ lui $at, 0x4120 -/* 7F4F8 800E6048 44810000 */ mtc1 $at, $f0 -/* 7F4FC 800E604C 3C01C000 */ lui $at, 0xc000 -/* 7F500 800E6050 44811000 */ mtc1 $at, $f2 -/* 7F504 800E6054 3C013F4C */ lui $at, 0x3f4c -/* 7F508 800E6058 3421CCCD */ ori $at, $at, 0xcccd -/* 7F50C 800E605C 44812000 */ mtc1 $at, $f4 -/* 7F510 800E6060 3C01BF40 */ lui $at, 0xbf40 -/* 7F514 800E6064 44813000 */ mtc1 $at, $f6 -/* 7F518 800E6068 3C028011 */ lui $v0, %hi(gPlayerStatus) -/* 7F51C 800E606C 2442EFC8 */ addiu $v0, $v0, %lo(gPlayerStatus) -/* 7F520 800E6070 E4400070 */ swc1 $f0, 0x70($v0) -/* 7F524 800E6074 E4420074 */ swc1 $f2, 0x74($v0) -/* 7F528 800E6078 E4440078 */ swc1 $f4, 0x78($v0) -/* 7F52C 800E607C E446007C */ swc1 $f6, 0x7c($v0) -/* 7F530 800E6080 8FBF0010 */ lw $ra, 0x10($sp) -/* 7F534 800E6084 03E00008 */ jr $ra -/* 7F538 800E6088 27BD0018 */ addiu $sp, $sp, 0x18 diff --git a/asm/nonmatchings/code_7bb60_len_41b0/start_falling.s b/asm/nonmatchings/code_7bb60_len_41b0/start_falling.s deleted file mode 100644 index 81cd6b58eb..0000000000 --- a/asm/nonmatchings/code_7bb60_len_41b0/start_falling.s +++ /dev/null @@ -1,29 +0,0 @@ -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches - -glabel start_falling -/* 7F480 800E5FD0 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 7F484 800E5FD4 AFBF0010 */ sw $ra, 0x10($sp) -/* 7F488 800E5FD8 0C039769 */ jal set_action_state -/* 7F48C 800E5FDC 24040008 */ addiu $a0, $zero, 8 -/* 7F490 800E5FE0 3C013DEA */ lui $at, 0x3dea -/* 7F494 800E5FE4 3421161E */ ori $at, $at, 0x161e -/* 7F498 800E5FE8 44810000 */ mtc1 $at, $f0 -/* 7F49C 800E5FEC 3C01BE92 */ lui $at, 0xbe92 -/* 7F4A0 800E5FF0 3421FEC5 */ ori $at, $at, 0xfec5 -/* 7F4A4 800E5FF4 44811000 */ mtc1 $at, $f2 -/* 7F4A8 800E5FF8 3C01BE3A */ lui $at, 0xbe3a -/* 7F4AC 800E5FFC 3421ACDA */ ori $at, $at, 0xacda -/* 7F4B0 800E6000 44812000 */ mtc1 $at, $f4 -/* 7F4B4 800E6004 3C013C3C */ lui $at, 0x3c3c -/* 7F4B8 800E6008 3421BE62 */ ori $at, $at, 0xbe62 -/* 7F4BC 800E600C 44813000 */ mtc1 $at, $f6 -/* 7F4C0 800E6010 3C028011 */ lui $v0, %hi(gPlayerStatus) -/* 7F4C4 800E6014 2442EFC8 */ addiu $v0, $v0, %lo(gPlayerStatus) -/* 7F4C8 800E6018 E4400070 */ swc1 $f0, 0x70($v0) -/* 7F4CC 800E601C E4420074 */ swc1 $f2, 0x74($v0) -/* 7F4D0 800E6020 E4440078 */ swc1 $f4, 0x78($v0) -/* 7F4D4 800E6024 E446007C */ swc1 $f6, 0x7c($v0) -/* 7F4D8 800E6028 8FBF0010 */ lw $ra, 0x10($sp) -/* 7F4DC 800E602C 03E00008 */ jr $ra -/* 7F4E0 800E6030 27BD0018 */ addiu $sp, $sp, 0x18 diff --git a/asm/nonmatchings/code_7bb60_len_41b0/update_locomotion_state.s b/asm/nonmatchings/code_7bb60_len_41b0/update_locomotion_state.s deleted file mode 100644 index 10cf6835a2..0000000000 --- a/asm/nonmatchings/code_7bb60_len_41b0/update_locomotion_state.s +++ /dev/null @@ -1,31 +0,0 @@ -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches - -glabel update_locomotion_state -/* 7F418 800E5F68 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 7F41C 800E5F6C AFB00010 */ sw $s0, 0x10($sp) -/* 7F420 800E5F70 3C108011 */ lui $s0, %hi(gPlayerStatus) -/* 7F424 800E5F74 2610EFC8 */ addiu $s0, $s0, %lo(gPlayerStatus) -/* 7F428 800E5F78 AFBF0014 */ sw $ra, 0x14($sp) -/* 7F42C 800E5F7C 0C03A752 */ jal is_ability_active -/* 7F430 800E5F80 2404000B */ addiu $a0, $zero, 0xb -/* 7F434 800E5F84 1440000C */ bnez $v0, .L800E5FB8 -/* 7F438 800E5F88 24040001 */ addiu $a0, $zero, 1 -/* 7F43C 800E5F8C 8E0200E8 */ lw $v0, 0xe8($s0) -/* 7F440 800E5F90 00420018 */ mult $v0, $v0 -/* 7F444 800E5F94 00001812 */ mflo $v1 -/* 7F448 800E5F98 8E0200EC */ lw $v0, 0xec($s0) -/* 7F44C 800E5F9C 00000000 */ nop -/* 7F450 800E5FA0 00420018 */ mult $v0, $v0 -/* 7F454 800E5FA4 00003012 */ mflo $a2 -/* 7F458 800E5FA8 00661021 */ addu $v0, $v1, $a2 -/* 7F45C 800E5FAC 28420BD2 */ slti $v0, $v0, 0xbd2 -/* 7F460 800E5FB0 50400001 */ beql $v0, $zero, .L800E5FB8 -/* 7F464 800E5FB4 24040002 */ addiu $a0, $zero, 2 -.L800E5FB8: -/* 7F468 800E5FB8 0C039769 */ jal set_action_state -/* 7F46C 800E5FBC 00000000 */ nop -/* 7F470 800E5FC0 8FBF0014 */ lw $ra, 0x14($sp) -/* 7F474 800E5FC4 8FB00010 */ lw $s0, 0x10($sp) -/* 7F478 800E5FC8 03E00008 */ jr $ra -/* 7F47C 800E5FCC 27BD0018 */ addiu $sp, $sp, 0x18 diff --git a/include/common_structs.h b/include/common_structs.h index a9a6dc2af4..0250d3952e 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -243,6 +243,10 @@ typedef union { s32 flags; } ScriptFlags; +struct ScriptInstance; + +typedef ApiStatus(*ApiFunc)(struct ScriptInstance*, s32); + typedef struct ScriptInstance { /* 0x000 */ ScriptFlags flags; /* 0x004 */ u8 groupFlags; @@ -1407,7 +1411,7 @@ typedef struct PlayerStatus { /* 0x0DC */ s32 currentButtons; /* 0x0E0 */ s32 pressedButtons; /* 0x0E4 */ s32 heldButtons; - /* 0x0E8 */ f32 stickAxis[2]; + /* 0x0E8 */ s32 stickAxis[2]; /* 0x0F0 */ s32 currentButtonsBuffer[10]; /* 0x118 */ s32 pressedButtonsBuffer[10]; /* 0x140 */ s32 heldButtonsBuffer[10]; diff --git a/include/si.h b/include/si.h index 6be24fcebe..6c6f650af2 100644 --- a/include/si.h +++ b/include/si.h @@ -21,8 +21,4 @@ typedef s32 ApiStatus; #define ApiStatus_REPEAT 3 /* Call again immediately */ #define ApiStatus_FINISH 255 /* Corresponds to SI_FINISH */ -struct ScriptInstance; - -typedef ApiStatus(*ApiFunc)(struct ScriptInstance* script, s32 isInitialCall); - #endif diff --git a/src/code_7bb60_len_41b0.c b/src/code_7bb60_len_41b0.c index f0c2e10003..81ee216fc5 100644 --- a/src/code_7bb60_len_41b0.c +++ b/src/code_7bb60_len_41b0.c @@ -18,7 +18,7 @@ void move_player(s16 duration, f32 heading, f32 speed) { playerStatus->moveFrames = duration; playerStatus->currentSpeed = speed; - if (!(playerStatus->animFlags & 0x00400000)) { + if (!(playerStatus->animFlags & 0x400000)) { set_action_state(speed > playerStatus->walkSpeed ? ActionState_RUN : ActionState_WALK); } } @@ -41,7 +41,20 @@ INCLUDE_ASM(s32, "code_7bb60_len_41b0", func_800E315C); INCLUDE_ASM(s32, "code_7bb60_len_41b0", phys_player_land); -INCLUDE_ASM(f32, "code_7bb60_len_41b0", integrate_gravity); +f32 integrate_gravity(void) { + PlayerStatus* playerStatus = &gPlayerStatus; + + if (playerStatus->flags & 0x40000) { + playerStatus->gravityIntegrator[2] += playerStatus->gravityIntegrator[3] / 1.7f; + playerStatus->gravityIntegrator[1] += playerStatus->gravityIntegrator[2] / 1.7f; + playerStatus->gravityIntegrator[0] += playerStatus->gravityIntegrator[1] / 1.7f; + } else { + playerStatus->gravityIntegrator[2] += playerStatus->gravityIntegrator[3]; + playerStatus->gravityIntegrator[1] += playerStatus->gravityIntegrator[2]; + playerStatus->gravityIntegrator[0] += playerStatus->gravityIntegrator[1]; + } + return playerStatus->gravityIntegrator[0]; +} f32 func_800E34D8(void) { f32 ret = integrate_gravity(); @@ -189,36 +202,33 @@ void set_action_state(s32 actionState) { } } -INCLUDE_ASM(s32, "code_7bb60_len_41b0", update_locomotion_state); +void update_locomotion_state(void) { + PlayerStatus* playerStatus = (&gPlayerStatus); + do { } while (0); // required to match + + set_action_state((!is_ability_active(Ability_SLOW_GO) + && (SQ(playerStatus->stickAxis[0]) + SQ(playerStatus->stickAxis[1]) >= 0xBD2)) ? ActionState_RUN : ActionState_WALK); +} -// todo these floats don't work -#ifdef NON_MATCHING void start_falling(void) { PlayerStatus* playerStatus = &gPlayerStatus; set_action_state(ActionState_FALLING); - playerStatus->gravityIntegrator[1] = 0.1143f; - playerStatus->gravityIntegrator[2] = -0.2871f; - playerStatus->gravityIntegrator[3] = -0.1823f; - playerStatus->gravityIntegrator[4] = 0.01152f; + playerStatus->gravityIntegrator[0] = 0.1143f; + playerStatus->gravityIntegrator[1] = -0.2871f; + playerStatus->gravityIntegrator[2] = -0.1823f; + playerStatus->gravityIntegrator[3] = 0.01152f; } -#else -INCLUDE_ASM(void, "code_7bb60_len_41b0", start_falling); -#endif -#ifdef NON_MATCHING void start_bounce_a(void) { PlayerStatus* playerStatus = &gPlayerStatus; set_action_state(ActionState_BOUNCE); playerStatus->gravityIntegrator[0] = 10.0f; playerStatus->gravityIntegrator[1] = -2.0f; - playerStatus->gravityIntegrator[2] = 0.5f; // todo is 0.8f but this doesn't work atm + playerStatus->gravityIntegrator[2] = 0.8f; playerStatus->gravityIntegrator[3] = -0.75f; } -#else -INCLUDE_ASM(void, "code_7bb60_len_41b0", start_bounce_a); -#endif void start_bounce_b(void) { PlayerStatus* playerStatus = &gPlayerStatus;