From 24a293620f9b5c077147fae19129f4ff6dc8ee33 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 7 Oct 2021 22:30:35 +1000 Subject: [PATCH] Disassemble rng functions --- src/lib/rng.c | 69 ----------------------------------------------- src/lib/rng.s | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 69 deletions(-) delete mode 100644 src/lib/rng.c create mode 100644 src/lib/rng.s diff --git a/src/lib/rng.c b/src/lib/rng.c deleted file mode 100644 index ddd9e66c7..000000000 --- a/src/lib/rng.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include "constants.h" -#include "bss.h" -#include "lib/rng.h" -#include "lib/lib_2fa00.h" -#include "data.h" -#include "types.h" - -u64 g_RngSeed = 0xab8d9f7781280783; - -GLOBAL_ASM( -glabel random -/* 12dc0: 3c048006 */ lui $a0,%hi(g_RngSeed) -/* 12dc4: dc84ee00 */ ld $a0,%lo(g_RngSeed)($a0) -/* 12dc8: 3c018006 */ lui $at,%hi(g_RngSeed) -/* 12dcc: 000437fc */ dsll32 $a2,$a0,0x1f -/* 12dd0: 00042ff8 */ dsll $a1,$a0,0x1f -/* 12dd4: 000637fa */ dsrl $a2,$a2,0x1f -/* 12dd8: 0005283e */ dsrl32 $a1,$a1,0x0 -/* 12ddc: 0004233c */ dsll32 $a0,$a0,0xc -/* 12de0: 00c53025 */ or $a2,$a2,$a1 -/* 12de4: 0004203e */ dsrl32 $a0,$a0,0x0 -/* 12de8: 00c43026 */ xor $a2,$a2,$a0 -/* 12dec: 0006253a */ dsrl $a0,$a2,0x14 -/* 12df0: 30840fff */ andi $a0,$a0,0xfff -/* 12df4: 00862026 */ xor $a0,$a0,$a2 -/* 12df8: 0004103c */ dsll32 $v0,$a0,0x0 -/* 12dfc: fc24ee00 */ sd $a0,%lo(g_RngSeed)($at) -/* 12e00: 03e00008 */ jr $ra -/* 12e04: 0002103f */ dsra32 $v0,$v0,0x0 -); - -// Commented because ld isn't happy with bitshifting a u64. -//u32 random(void) -//{ -// g_RngSeed = ((g_RngSeed << 63) >> 31 | (g_RngSeed << 31) >> 32) ^ (g_RngSeed << 44) >> 32; -// g_RngSeed = g_RngSeed >> 20 & 0xfff ^ g_RngSeed; -// -// return g_RngSeed; -//} - -GLOBAL_ASM( -glabel rngSetSeed -/* 12e08: 64840001 */ daddiu $a0,$a0,0x1 -/* 12e0c: 3c018006 */ lui $at,%hi(g_RngSeed) -/* 12e10: fc24ee00 */ sd $a0,%lo(g_RngSeed)($at) -/* 12e14: 03e00008 */ jr $ra -/* 12e18: 24040000 */ addiu $a0,$zero,0x0 -); - -GLOBAL_ASM( -glabel rngRotateSeed -/* 12e1c: dc870000 */ ld $a3,0x0($a0) -/* 12e20: 000737fc */ dsll32 $a2,$a3,0x1f -/* 12e24: 00072ff8 */ dsll $a1,$a3,0x1f -/* 12e28: 000637fa */ dsrl $a2,$a2,0x1f -/* 12e2c: 0005283e */ dsrl32 $a1,$a1,0x0 -/* 12e30: 00073b3c */ dsll32 $a3,$a3,0xc -/* 12e34: 00c53025 */ or $a2,$a2,$a1 -/* 12e38: 0007383e */ dsrl32 $a3,$a3,0x0 -/* 12e3c: 00c73026 */ xor $a2,$a2,$a3 -/* 12e40: 00063d3a */ dsrl $a3,$a2,0x14 -/* 12e44: 30e70fff */ andi $a3,$a3,0xfff -/* 12e48: 00e63826 */ xor $a3,$a3,$a2 -/* 12e4c: 0007103c */ dsll32 $v0,$a3,0x0 -/* 12e50: fc870000 */ sd $a3,0x0($a0) -/* 12e54: 03e00008 */ jr $ra -/* 12e58: 0002103f */ dsra32 $v0,$v0,0x0 -); diff --git a/src/lib/rng.s b/src/lib/rng.s new file mode 100644 index 000000000..c94a82a22 --- /dev/null +++ b/src/lib/rng.s @@ -0,0 +1,74 @@ +#include "macros.inc" +.set noat +.set noreorder +.set gp=64 + +.data + +glabel g_RngSeed +.dword 0xab8d9f7781280783 + +.text + +/** + * u32 random(void) + * + * Generate a random number between 0 and 4294967295. + */ +glabel random + lui $a0, %hi(g_RngSeed) + ld $a0, %lo(g_RngSeed)($a0) + lui $at, %hi(g_RngSeed) + 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_RngSeed)($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 rngSetSeed + daddiu $a0, $a0, 1 + lui $at, %hi(g_RngSeed) + sd $a0, %lo(g_RngSeed)($at) + jr $ra + li $a0, 0 + +/** + * u32 rngRotateSeed(u64 *value); + * + * Rotate the given seed using the same algorithm as random(). + * + * Store the new 64-bit seed at the pointed address and return the same seed + * cast as a u32. + */ +glabel rngRotateSeed + ld $a3, 0($a0) + dsll32 $a2, $a3, 31 + dsll $a1, $a3, 31 + dsrl $a2, $a2, 31 + dsrl32 $a1, $a1, 0 + dsll32 $a3, $a3, 12 + or $a2, $a2, $a1 + dsrl32 $a3, $a3, 0 + xor $a2, $a2, $a3 + dsrl $a3, $a2, 20 + andi $a3, $a3, 0xfff + xor $a3, $a3, $a2 + dsll32 $v0, $a3, 0 + sd $a3, 0($a0) + jr $ra + dsra32 $v0, $v0, 0