Disassemble rng functions
This commit is contained in:
parent
8ee7501915
commit
24a293620f
|
|
@ -1,69 +0,0 @@
|
|||
#include <ultra64.h>
|
||||
#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
|
||||
);
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue