perfect_dark/src/game/rng2.s

49 lines
896 B
ArmAsm

#include "macros.inc"
.set noat
.set noreorder
.set gp=64
.data
glabel g_Rng2Seed
.dword 0xab8d9f7781280783
.text
/**
* u32 random2(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 rng2SetSeed(u64 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