diff --git a/ld/pd.ld b/ld/pd.ld index 76b20a147..67c8ae4d0 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -9,6 +9,9 @@ SECTIONS _gamedataSegmentRomStart = 0x39850; _inflateSegmentRomStart = 0x4e850; _ziplistSegmentRomStart = 0x4fc40; + _rspMicrocodeStart = 0x80059fe0; + _rspMicrocodeStartPlusOne = 0x80059fe1; + _rspMicrocodeEnd = 0x8005afe0; _antipiracyUncloakWriteAddress = 0x7002a324; diff --git a/src/game/game_01e250.c b/src/game/game_01e250.c index 15b8f4f87..8128f26fd 100644 --- a/src/game/game_01e250.c +++ b/src/game/game_01e250.c @@ -6435,7 +6435,7 @@ glabel func0f023098 .L0f024034: /* f024034: afa30124 */ sw $v1,0x124($sp) /* f024038: afa60110 */ sw $a2,0x110($sp) -/* f02403c: 0fc47b9c */ jal func0f11ee70 +/* f02403c: 0fc47b9c */ jal debugGetSlowMotion /* f024040: e7b00114 */ swc1 $f16,0x114($sp) /* f024044: 8fa30124 */ lw $v1,0x124($sp) /* f024048: 8fa60110 */ lw $a2,0x110($sp) diff --git a/src/game/game_097ba0.c b/src/game/game_097ba0.c index 67d71973c..1c024fecc 100644 --- a/src/game/game_097ba0.c +++ b/src/game/game_097ba0.c @@ -22646,7 +22646,7 @@ glabel func0f0abad0 /* f0abafc: 8c680464 */ lw $t0,0x464($v1) /* f0abb00: 5500001b */ bnezl $t0,.L0f0abb70 /* f0abb04: 8fbf0024 */ lw $ra,0x24($sp) -/* f0abb08: 0fc5ae15 */ jal func0f16b854 +/* f0abb08: 0fc5ae15 */ jal getEffectiveSlowMotion /* f0abb0c: 00000000 */ sll $zero,$zero,0x0 /* f0abb10: 10400003 */ beqz $v0,.L0f0abb20 /* f0abb14: 3c048009 */ lui $a0,0x8009 @@ -22700,7 +22700,7 @@ GLOBAL_ASM( glabel func0f0abba8 /* f0abba8: 27bdffe8 */ addiu $sp,$sp,-24 /* f0abbac: afbf0014 */ sw $ra,0x14($sp) -/* f0abbb0: 0fc5ae15 */ jal func0f16b854 +/* f0abbb0: 0fc5ae15 */ jal getEffectiveSlowMotion /* f0abbb4: 00000000 */ sll $zero,$zero,0x0 /* f0abbb8: 10400005 */ beqz $v0,.L0f0abbd0 /* f0abbbc: 00000000 */ sll $zero,$zero,0x0 @@ -22722,7 +22722,7 @@ GLOBAL_ASM( glabel func0f0abbe8 /* f0abbe8: 27bdffe8 */ addiu $sp,$sp,-24 /* f0abbec: afbf0014 */ sw $ra,0x14($sp) -/* f0abbf0: 0fc5ae15 */ jal func0f16b854 +/* f0abbf0: 0fc5ae15 */ jal getEffectiveSlowMotion /* f0abbf4: 00000000 */ sll $zero,$zero,0x0 /* f0abbf8: 10400005 */ beqz $v0,.L0f0abc10 /* f0abbfc: 00000000 */ sll $zero,$zero,0x0 diff --git a/src/game/game_11ecf0.c b/src/game/game_11ecf0.c index 4a7348183..a64542501 100644 --- a/src/game/game_11ecf0.c +++ b/src/game/game_11ecf0.c @@ -313,10 +313,13 @@ glabel func0f11ee40 /* f11ee6c: 00001025 */ or $v0,$zero,$zero ); +u32 debugGetSlowMotion(void) +{ + return SLOWMOTION_OFF; +} + GLOBAL_ASM( -glabel func0f11ee70 -/* f11ee70: 03e00008 */ jr $ra -/* f11ee74: 00001025 */ or $v0,$zero,$zero +glabel func0f11ee78 /* f11ee78: 03e00008 */ jr $ra /* f11ee7c: 00001025 */ or $v0,$zero,$zero /* f11ee80: 03e00008 */ jr $ra diff --git a/src/game/game_167ae0.c b/src/game/game_167ae0.c index b29ce5a30..c0cb8f57a 100644 --- a/src/game/game_167ae0.c +++ b/src/game/game_167ae0.c @@ -261,7 +261,7 @@ glabel func0f167c88 /* f167cd4: 0005782b */ sltu $t7,$zero,$a1 /* f167cd8: 11e0000a */ beqz $t7,.L0f167d04 /* f167cdc: 01e02825 */ or $a1,$t7,$zero -/* f167ce0: 0fc5ae15 */ jal func0f16b854 +/* f167ce0: 0fc5ae15 */ jal getEffectiveSlowMotion /* f167ce4: 00000000 */ sll $zero,$zero,0x0 /* f167ce8: 2c450001 */ sltiu $a1,$v0,0x1 /* f167cec: 10a00005 */ beqz $a1,.L0f167d04 @@ -3308,7 +3308,7 @@ glabel func0f169374 /* f16a900: 8e790464 */ lw $t9,0x464($s3) /* f16a904: 57200015 */ bnezl $t9,.L0f16a95c /* f16a908: 2861000f */ slti $at,$v1,0xf -/* f16a90c: 0fc5ae15 */ jal func0f16b854 +/* f16a90c: 0fc5ae15 */ jal getEffectiveSlowMotion /* f16a910: 00000000 */ sll $zero,$zero,0x0 /* f16a914: 10400003 */ beqz $v0,.L0f16a924 /* f16a918: 3c048009 */ lui $a0,0x8009 @@ -4361,7 +4361,7 @@ glabel func0f16b810 ); GLOBAL_ASM( -glabel func0f16b854 +glabel getEffectiveSlowMotion /* f16b854: 27bdffd0 */ addiu $sp,$sp,-48 /* f16b858: afbf0014 */ sw $ra,0x14($sp) /* f16b85c: 3c04b000 */ lui $a0,0xb000 @@ -4418,7 +4418,7 @@ glabel func0f16b854 /* f16b918: 10000010 */ beqz $zero,.L0f16b95c /* f16b91c: 24020001 */ addiu $v0,$zero,0x1 .L0f16b920: -/* f16b920: 0fc47b9c */ jal func0f11ee70 +/* f16b920: 0fc47b9c */ jal debugGetSlowMotion /* f16b924: 00000000 */ sll $zero,$zero,0x0 /* f16b928: 24010001 */ addiu $at,$zero,0x1 /* f16b92c: 14410003 */ bne $v0,$at,.L0f16b93c @@ -4426,7 +4426,7 @@ glabel func0f16b854 /* f16b934: 10000009 */ beqz $zero,.L0f16b95c /* f16b938: 24020001 */ addiu $v0,$zero,0x1 .L0f16b93c: -/* f16b93c: 0fc47b9c */ jal func0f11ee70 +/* f16b93c: 0fc47b9c */ jal debugGetSlowMotion /* f16b940: 00000000 */ sll $zero,$zero,0x0 /* f16b944: 24010002 */ addiu $at,$zero,0x2 /* f16b948: 54410004 */ bnel $v0,$at,.L0f16b95c @@ -4441,6 +4441,52 @@ glabel func0f16b854 /* f16b968: 00000000 */ sll $zero,$zero,0x0 ); +// Can't match the antipiracy part +//u32 getEffectiveSlowMotion(void) +//{ +//#if PIRACYCHECKS +// u32 salt = func0f16b800(0xb000de8d); +// u32 actual; +// u32 expected = func0f16b800(0x1741d42a); +// func0004e650(salt, &actual); +// +// if (actual != expected) { +// extern u32 _rspMicrocodeStart; +// extern u32 _rspMicrocodeStartPlusOne; +// u32 *ptr = &_rspMicrocodeStart; +// u32 *end = &ptr[1024]; +// +// if (!(end < &_rspMicrocodeStartPlusOne)) { +// do { +// *ptr += 8; +// ptr++; +// } while (ptr < end); +// } +// } +//#endif +// +// if (g_Vars.normmplayerisrunning) { +// if (g_MpSetup.options & MPOPTION_SLOWMOTION_ON) { +// return SLOWMOTION_ON; +// } +// if (g_MpSetup.options & MPOPTION_SLOWMOTION_SMART) { +// return SLOWMOTION_SMART; +// } +// } else { +// if (cheatIsActive(CHEAT_SLOMO)) { +// return SLOWMOTION_ON; +// } +// if (debugGetSlowMotion() == SLOWMOTION_ON) { +// return SLOWMOTION_ON; +// } +// if (debugGetSlowMotion() == SLOWMOTION_SMART) { +// return SLOWMOTION_SMART; +// } +// } +// +// return SLOWMOTION_OFF; +//} + GLOBAL_ASM( glabel func0f16b96c /* f16b96c: 27bdfd70 */ addiu $sp,$sp,-656 @@ -4664,7 +4710,7 @@ glabel func0f16b96c /* f16bc68: 100000d4 */ beqz $zero,.L0f16bfbc /* f16bc6c: 8e830034 */ lw $v1,0x34($s4) .L0f16bc70: -/* f16bc70: 0fc5ae15 */ jal func0f16b854 +/* f16bc70: 0fc5ae15 */ jal getEffectiveSlowMotion /* f16bc74: 00000000 */ sll $zero,$zero,0x0 /* f16bc78: 8e8f0040 */ lw $t7,0x40($s4) /* f16bc7c: 24010002 */ addiu $at,$zero,0x2 diff --git a/src/include/constants.h b/src/include/constants.h index 6a091795e..fe80cd736 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -1139,6 +1139,9 @@ #define MPOPTION_NOAUTOAIM 0x00000008 #define MPOPTION_NOPLAYERHIGHLIGHT 0x00000010 #define MPOPTION_NOPICKUPHIGHLIGHT 0x00000020 +#define MPOPTION_SLOWMOTION_ON 0x00000040 +#define MPOPTION_SLOWMOTION_SMART 0x00000080 +#define MPOPTION_NOPICKUPHIGHLIGHT 0x00000020 #define MPOPTION_FASTMOVEMENT 0x00000100 #define MPOPTION_KILLSSCORE 0x00000400 #define MPOPTION_HIGHLIGHTBRIEFCASE 0x00000800 @@ -1656,6 +1659,10 @@ #define SKJUMPSTATE_TAKEOFF 0 #define SKJUMPSTATE_AIRBORNE 1 +#define SLOWMOTION_OFF 0 +#define SLOWMOTION_ON 1 +#define SLOWMOTION_SMART 2 + #define SMOKETYPE_0 0 #define SMOKETYPE_1 1 #define SMOKETYPE_2 2 diff --git a/src/include/game/game_11ecf0.h b/src/include/game/game_11ecf0.h index 4219322da..8f03e9826 100644 --- a/src/include/game/game_11ecf0.h +++ b/src/include/game/game_11ecf0.h @@ -15,7 +15,7 @@ u32 func0f11ee08(void); bool func0f11ee20(void); u32 func0f11ee28(void); u32 func0f11ee40(void); -u32 func0f11ee70(void); +u32 debugGetSlowMotion(void); bool func0f11ee88(void); u32 func0f11ee90(void); bool func0f11eea8(void); diff --git a/src/include/game/game_167ae0.h b/src/include/game/game_167ae0.h index 82d32e27c..3dd506b6c 100644 --- a/src/include/game/game_167ae0.h +++ b/src/include/game/game_167ae0.h @@ -18,9 +18,9 @@ u32 func0f168f24(void); u32 func0f1691c0(void); u32 func0f169374(void); u32 func0f16b0c8(void); -u32 func0f16b800(void); +u32 func0f16b800(u32 arg0); u32 func0f16b810(void); -u32 func0f16b854(void); +u32 getEffectiveSlowMotion(void); u32 func0f16b96c(void); u32 func0f16cb04(void); void func0f16cce4(void); diff --git a/src/include/lib/lib_4e530.h b/src/include/lib/lib_4e530.h index cf3bac9fa..712c23308 100644 --- a/src/include/lib/lib_4e530.h +++ b/src/include/lib/lib_4e530.h @@ -5,6 +5,6 @@ u32 func0004e530(void); u32 func0004e640(void); -u32 func0004e650(void); +void func0004e650(u32 salt, u32 *actual); #endif