Rand16 (Events)
Jump to navigation
Jump to search
# ROUTINE: rand16 # SUMMARY: 16-bit linear congruential pseudorandom number generator, using well-known constants made (in)famous by Peter Grogono in 1978. # # nextRNG = (prevRNG * 25173 + 13849) mod 2^16 # 0014a48c: 3c048017 lui r4,0x8017 0014a490: 8c843c7c lw r4,0x3c7c(r4) 2 words after next event(?). Previous RNG value, might be specific to events. 0014a494: 00000000 nop 0014a498: 00041840 sll r3,r4,0x01 r4 * 2 0014a49c: 00641821 addu r3,r3,r4 r4 * 3 0014a4a0: 00031100 sll r2,r3,0x04 r4 * 30 0014a4a4: 00621821 addu r3,r3,r2 r4 * 33 0014a4a8: 00031880 sll r3,r3,0x02 r4 * 204 0014a4ac: 00641823 subu r3,r3,r4 r4 * 203 0014a4b0: 00031140 sll r2,r3,0x05 r4 * 6496 0014a4b4: 00431023 subu r2,r2,r3 r4 * 6293 0014a4b8: 00021080 sll r2,r2,0x02 r4 * 25172 # No idea what the purpose of building this constant this way is. 0014a4bc: 00441021 addu r2,r2,r4 r4 * 25173 # Perhaps to intentionally waste cycles to slow this down? 0014a4c0: 24423619 addiu r2,r2,0x3619 r4 * 0x6254 + 0x3619 0014a4c4: 3042ffff andi r2,r2,0xffff efficient modulo via bitmask 0014a4c8: 3c018017 lui r1,0x8017 0014a4cc: ac223c7c sw r2,0x3c7c(r1) update the RNG seed 0014a4d0: 03e00008 jr r31 0014a4d4: 00000000 nop