From 514c44e12ae63acc8fc264bd5fb259b8e6156f67 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 7 Oct 2021 22:35:15 +1000 Subject: [PATCH] Disassemble rng2 functions --- ld/gamefiles.ntsc-beta.inc | 2 +- ld/gamefiles.ntsc-final.inc | 2 +- ld/gamefiles.pal-final.inc | 2 +- src/game/chr/chr.c | 14 +++++----- src/game/game_1291b0.c | 40 ---------------------------- src/game/propobj.c | 20 +++++++------- src/game/rng2.s | 48 ++++++++++++++++++++++++++++++++++ src/include/game/game_1291b0.h | 4 +-- 8 files changed, 70 insertions(+), 62 deletions(-) delete mode 100644 src/game/game_1291b0.c create mode 100644 src/game/rng2.s diff --git a/ld/gamefiles.ntsc-beta.inc b/ld/gamefiles.ntsc-beta.inc index c2b9d1301..09b397de2 100644 --- a/ld/gamefiles.ntsc-beta.inc +++ b/ld/gamefiles.ntsc-beta.inc @@ -144,7 +144,7 @@ build/ROMID/game/game_11f000.o (section); \ build/ROMID/game/game_127910.o (section); \ build/ROMID/game/crc.o (section); \ - build/ROMID/game/game_1291b0.o (section); \ + build/ROMID/game/rng2.o (section); \ build/ROMID/game/game_129210.o (section); \ build/ROMID/game/explosions/explosions.o (section); \ build/ROMID/game/smoke/smoke.o (section); \ diff --git a/ld/gamefiles.ntsc-final.inc b/ld/gamefiles.ntsc-final.inc index c98fad1af..5595cfdde 100644 --- a/ld/gamefiles.ntsc-final.inc +++ b/ld/gamefiles.ntsc-final.inc @@ -143,7 +143,7 @@ build/ROMID/game/game_11f000.o (section); \ build/ROMID/game/game_127910.o (section); \ build/ROMID/game/crc.o (section); \ - build/ROMID/game/game_1291b0.o (section); \ + build/ROMID/game/rng2.o (section); \ build/ROMID/game/game_129210.o (section); \ build/ROMID/game/explosions/explosions.o (section); \ build/ROMID/game/smoke/smoke.o (section); \ diff --git a/ld/gamefiles.pal-final.inc b/ld/gamefiles.pal-final.inc index c98fad1af..5595cfdde 100644 --- a/ld/gamefiles.pal-final.inc +++ b/ld/gamefiles.pal-final.inc @@ -143,7 +143,7 @@ build/ROMID/game/game_11f000.o (section); \ build/ROMID/game/game_127910.o (section); \ build/ROMID/game/crc.o (section); \ - build/ROMID/game/game_1291b0.o (section); \ + build/ROMID/game/rng2.o (section); \ build/ROMID/game/game_129210.o (section); \ build/ROMID/game/explosions/explosions.o (section); \ build/ROMID/game/smoke/smoke.o (section); \ diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index 5d0da8a20..a2d3445c5 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -13909,12 +13909,12 @@ glabel func0f0270f4 /* f0275a4: 00000000 */ nop .L0f0275a8: /* f0275a8: 44c9f800 */ ctc1 $t1,$31 -/* f0275ac: 0fc4a47e */ jal func0f1291f8 +/* f0275ac: 0fc4a47e */ jal rng2SetSeed /* f0275b0: 016c2021 */ addu $a0,$t3,$t4 /* f0275b4: 86020000 */ lh $v0,0x0($s0) /* f0275b8: 1840000e */ blez $v0,.L0f0275f4 /* f0275bc: 00000000 */ nop -/* f0275c0: 0fc4a46c */ jal func0f1291b0 +/* f0275c0: 0fc4a46c */ jal random2 /* f0275c4: 00000000 */ nop /* f0275c8: 0052001b */ divu $zero,$v0,$s2 /* f0275cc: 860d0000 */ lh $t5,0x0($s0) @@ -13931,7 +13931,7 @@ glabel func0f0270f4 .L0f0275f4: /* f0275f4: 0443000e */ bgezl $v0,.L0f027630 /* f0275f8: 86020002 */ lh $v0,0x2($s0) -/* f0275fc: 0fc4a46c */ jal func0f1291b0 +/* f0275fc: 0fc4a46c */ jal random2 /* f027600: 00000000 */ nop /* f027604: 0052001b */ divu $zero,$v0,$s2 /* f027608: 860a0000 */ lh $t2,0x0($s0) @@ -13948,7 +13948,7 @@ glabel func0f0270f4 .L0f027630: /* f027630: 1840000e */ blez $v0,.L0f02766c /* f027634: 00000000 */ nop -/* f027638: 0fc4a46c */ jal func0f1291b0 +/* f027638: 0fc4a46c */ jal random2 /* f02763c: 00000000 */ nop /* f027640: 0052001b */ divu $zero,$v0,$s2 /* f027644: 860e0002 */ lh $t6,0x2($s0) @@ -13965,7 +13965,7 @@ glabel func0f0270f4 .L0f02766c: /* f02766c: 0443000e */ bgezl $v0,.L0f0276a8 /* f027670: 86020004 */ lh $v0,0x4($s0) -/* f027674: 0fc4a46c */ jal func0f1291b0 +/* f027674: 0fc4a46c */ jal random2 /* f027678: 00000000 */ nop /* f02767c: 0052001b */ divu $zero,$v0,$s2 /* f027680: 860b0002 */ lh $t3,0x2($s0) @@ -13982,7 +13982,7 @@ glabel func0f0270f4 .L0f0276a8: /* f0276a8: 1840000e */ blez $v0,.L0f0276e4 /* f0276ac: 00000000 */ nop -/* f0276b0: 0fc4a46c */ jal func0f1291b0 +/* f0276b0: 0fc4a46c */ jal random2 /* f0276b4: 00000000 */ nop /* f0276b8: 0052001b */ divu $zero,$v0,$s2 /* f0276bc: 86190004 */ lh $t9,0x4($s0) @@ -13999,7 +13999,7 @@ glabel func0f0270f4 .L0f0276e4: /* f0276e4: 0443000e */ bgezl $v0,.L0f027720 /* f0276e8: 26310001 */ addiu $s1,$s1,0x1 -/* f0276ec: 0fc4a46c */ jal func0f1291b0 +/* f0276ec: 0fc4a46c */ jal random2 /* f0276f0: 00000000 */ nop /* f0276f4: 0052001b */ divu $zero,$v0,$s2 /* f0276f8: 860c0002 */ lh $t4,0x2($s0) diff --git a/src/game/game_1291b0.c b/src/game/game_1291b0.c deleted file mode 100644 index ac8631672..000000000 --- a/src/game/game_1291b0.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include "constants.h" -#include "bss.h" -#include "lib/rng.h" -#include "data.h" -#include "types.h" - -u32 var8007e3c0 = 0xab8d9f77; -u32 var8007e3c4 = 0x81280783; - -GLOBAL_ASM( -glabel func0f1291b0 -/* f1291b0: 3c048008 */ lui $a0,%hi(var8007e3c0) -/* f1291b4: dc84e3c0 */ ld $a0,%lo(var8007e3c0)($a0) -/* f1291b8: 3c018008 */ lui $at,%hi(var8007e3c0) -/* f1291bc: 000437fc */ dsll32 $a2,$a0,0x1f -/* f1291c0: 00042ff8 */ dsll $a1,$a0,0x1f -/* f1291c4: 000637fa */ dsrl $a2,$a2,0x1f -/* f1291c8: 0005283e */ dsrl32 $a1,$a1,0x0 -/* f1291cc: 0004233c */ dsll32 $a0,$a0,0xc -/* f1291d0: 00c53025 */ or $a2,$a2,$a1 -/* f1291d4: 0004203e */ dsrl32 $a0,$a0,0x0 -/* f1291d8: 00c43026 */ xor $a2,$a2,$a0 -/* f1291dc: 0006253a */ dsrl $a0,$a2,0x14 -/* f1291e0: 30840fff */ andi $a0,$a0,0xfff -/* f1291e4: 00862026 */ xor $a0,$a0,$a2 -/* f1291e8: 0004103c */ dsll32 $v0,$a0,0x0 -/* f1291ec: fc24e3c0 */ sd $a0,%lo(var8007e3c0)($at) -/* f1291f0: 03e00008 */ jr $ra -/* f1291f4: 0002103f */ dsra32 $v0,$v0,0x0 -); - -GLOBAL_ASM( -glabel func0f1291f8 -/* f1291f8: 64840001 */ daddiu $a0,$a0,0x1 -/* f1291fc: 3c018008 */ lui $at,%hi(var8007e3c0) -/* f129200: fc24e3c0 */ sd $a0,%lo(var8007e3c0)($at) -/* f129204: 03e00008 */ jr $ra -/* f129208: 24040000 */ addiu $a0,$zero,0x0 -); diff --git a/src/game/propobj.c b/src/game/propobj.c index 84ce2b15f..04fa52aca 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -50929,7 +50929,7 @@ glabel var7f1aa838 /* f082308: 844e0002 */ lh $t6,0x2($v0) /* f08230c: 01edc021 */ addu $t8,$t7,$t5 /* f082310: 030ec821 */ addu $t9,$t8,$t6 -/* f082314: 0fc4a47e */ jal func0f1291f8 +/* f082314: 0fc4a47e */ jal rng2SetSeed /* f082318: 03282021 */ addu $a0,$t9,$t0 /* f08231c: 8faa0084 */ lw $t2,0x84($sp) /* f082320: 00125880 */ sll $t3,$s2,0x2 @@ -50964,7 +50964,7 @@ glabel var7f1aa838 /* f08238c: 10000001 */ b .L0f082394 /* f082390: 24100014 */ addiu $s0,$zero,0x14 .L0f082394: -/* f082394: 0fc4a46c */ jal func0f1291b0 +/* f082394: 0fc4a46c */ jal random2 /* f082398: 00000000 */ nop /* f08239c: 24010064 */ addiu $at,$zero,0x64 /* f0823a0: 0041001b */ divu $zero,$v0,$at @@ -50976,7 +50976,7 @@ glabel var7f1aa838 /* f0823b8: 01716021 */ addu $t4,$t3,$s1 /* f0823bc: a1800007 */ sb $zero,0x7($t4) .L0f0823c0: -/* f0823c0: 0fc4a46c */ jal func0f1291b0 +/* f0823c0: 0fc4a46c */ jal random2 /* f0823c4: 00000000 */ nop /* f0823c8: 24010014 */ addiu $at,$zero,0x14 /* f0823cc: 0041001b */ divu $zero,$v0,$at @@ -50993,7 +50993,7 @@ glabel var7f1aa838 /* f0823f8: 44192000 */ mfc1 $t9,$f4 /* f0823fc: 00000000 */ nop /* f082400: 01195021 */ addu $t2,$t0,$t9 -/* f082404: 0fc4a46c */ jal func0f1291b0 +/* f082404: 0fc4a46c */ jal random2 /* f082408: a60a0000 */ sh $t2,0x0($s0) /* f08240c: 24010014 */ addiu $at,$zero,0x14 /* f082410: 0041001b */ divu $zero,$v0,$at @@ -51010,7 +51010,7 @@ glabel var7f1aa838 /* f08243c: 440d2000 */ mfc1 $t5,$f4 /* f082440: 00000000 */ nop /* f082444: 030d7021 */ addu $t6,$t8,$t5 -/* f082448: 0fc4a46c */ jal func0f1291b0 +/* f082448: 0fc4a46c */ jal random2 /* f08244c: a60e0002 */ sh $t6,0x2($s0) /* f082450: 24010014 */ addiu $at,$zero,0x14 /* f082454: 0041001b */ divu $zero,$v0,$at @@ -51625,7 +51625,7 @@ glabel var7f1aa838 /* f080d40: 844c0002 */ lh $t4,0x2($v0) /* f080d44: 01495821 */ addu $t3,$t2,$t1 /* f080d48: 016c7821 */ addu $t7,$t3,$t4 -/* f080d4c: 0fc48f8e */ jal func0f1291f8 +/* f080d4c: 0fc48f8e */ jal rng2SetSeed /* f080d50: 01ed2021 */ addu $a0,$t7,$t5 /* f080d54: 13c00031 */ beqz $s8,.NB0f080e1c /* f080d58: 00000000 */ sll $zero,$zero,0x0 @@ -51669,7 +51669,7 @@ glabel var7f1aa838 /* f080de8: 10000001 */ beqz $zero,.NB0f080df0 /* f080dec: 24100014 */ addiu $s0,$zero,0x14 .NB0f080df0: -/* f080df0: 0fc48f7c */ jal func0f1291b0 +/* f080df0: 0fc48f7c */ jal random2 /* f080df4: 00000000 */ sll $zero,$zero,0x0 /* f080df8: 24010064 */ addiu $at,$zero,0x64 /* f080dfc: 0041001b */ divu $zero,$v0,$at @@ -51681,7 +51681,7 @@ glabel var7f1aa838 /* f080e14: 01716021 */ addu $t4,$t3,$s1 /* f080e18: a1800007 */ sb $zero,0x7($t4) .NB0f080e1c: -/* f080e1c: 0fc48f7c */ jal func0f1291b0 +/* f080e1c: 0fc48f7c */ jal random2 /* f080e20: 00000000 */ sll $zero,$zero,0x0 /* f080e24: 0057001b */ divu $zero,$v0,$s7 /* f080e28: 00006810 */ mfhi $t5 @@ -51701,7 +51701,7 @@ glabel var7f1aa838 /* f080e5c: 44192000 */ mfc1 $t9,$f4 /* f080e60: 00000000 */ sll $zero,$zero,0x0 /* f080e64: 01195021 */ addu $t2,$t0,$t9 -/* f080e68: 0fc48f7c */ jal func0f1291b0 +/* f080e68: 0fc48f7c */ jal random2 /* f080e6c: a60a0000 */ sh $t2,0x0($s0) /* f080e70: 0057001b */ divu $zero,$v0,$s7 /* f080e74: 00005810 */ mfhi $t3 @@ -51721,7 +51721,7 @@ glabel var7f1aa838 /* f080ea8: 440d2000 */ mfc1 $t5,$f4 /* f080eac: 00000000 */ sll $zero,$zero,0x0 /* f080eb0: 030d7021 */ addu $t6,$t8,$t5 -/* f080eb4: 0fc48f7c */ jal func0f1291b0 +/* f080eb4: 0fc48f7c */ jal random2 /* f080eb8: a60e0002 */ sh $t6,0x2($s0) /* f080ebc: 0057001b */ divu $zero,$v0,$s7 /* f080ec0: 0000c810 */ mfhi $t9 diff --git a/src/game/rng2.s b/src/game/rng2.s new file mode 100644 index 000000000..7eb419b65 --- /dev/null +++ b/src/game/rng2.s @@ -0,0 +1,48 @@ +#include "macros.inc" +.set noat +.set noreorder +.set gp=64 + +.data + +glabel g_Rng2Seed +.dword 0xab8d9f7781280783 + +.text + +/** + * u32 random(void) + * + * Generate a random number between 0 and 4294967295. + */ +glabel random2 + lui $a0, %hi(g_Rng2Seed) + ld $a0, %lo(g_Rng2Seed)($a0) + lui $at, %hi(g_Rng2Seed) + dsll32 $a2, $a0, 31 + dsll $a1, $a0, 31 + dsrl $a2, $a2, 31 + dsrl32 $a1, $a1, 0 + dsll32 $a0, $a0, 12 + or $a2, $a2, $a1 + dsrl32 $a0, $a0, 0 + xor $a2, $a2, $a0 + dsrl $a0, $a2, 20 + andi $a0, $a0, 0xfff + xor $a0, $a0, $a2 + dsll32 $v0, $a0, 0 + sd $a0, %lo(g_Rng2Seed)($at) + jr $ra + dsra32 $v0, $v0, 0 + +/** + * void rngSetSeed(u32 seed) + * + * Set the given seed as the RNG seed. Add 1 to make sure it isn't 0. + */ +glabel rng2SetSeed + daddiu $a0, $a0, 1 + lui $at, %hi(g_Rng2Seed) + sd $a0, %lo(g_Rng2Seed)($at) + jr $ra + li $a0, 0 diff --git a/src/include/game/game_1291b0.h b/src/include/game/game_1291b0.h index 1a5787aa9..d2e9c7b8c 100644 --- a/src/include/game/game_1291b0.h +++ b/src/include/game/game_1291b0.h @@ -4,7 +4,7 @@ #include "data.h" #include "types.h" -u32 func0f1291b0(void); -u32 func0f1291f8(void); +u32 random2(void); +u32 rng2SetSeed(void); #endif