Difference between revisions of "Rand16 (Events)"
Jump to navigation
Jump to search
(Created page with "<font face='Courier New'> 0014a48c: 3c048017 lui r4,0x8017 0014a490: 8c843c7c lw r4,0x3c7c(r4) 0014a494: 00000000 nop 0014a498: 00041840 sll r3,r4,0x01 0014a49c: 006418...") |
m (FFHGuest moved page 0014a48c - 0014a4d4 to Rand16 (Events): Confirmed that this is an rng function and the nature of the function) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<font face='Courier New'> | <font face='Courier New'> | ||
− | + | # 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 | 0014a48c: 3c048017 lui r4,0x8017 | ||
− | 0014a490: 8c843c7c lw r4,0x3c7c(r4) | + | 0014a490: 8c843c7c lw r4,0x3c7c(r4) 2 words after next event(?). Previous RNG value, might be specific to events. |
0014a494: 00000000 nop | 0014a494: 00000000 nop | ||
− | 0014a498: 00041840 sll r3,r4,0x01 | + | 0014a498: 00041840 sll r3,r4,0x01 r4 * 2 |
− | 0014a49c: 00641821 addu r3,r3,r4 | + | 0014a49c: 00641821 addu r3,r3,r4 r4 * 3 |
− | 0014a4a0: 00031100 sll r2,r3,0x04 | + | 0014a4a0: 00031100 sll r2,r3,0x04 r4 * 30 |
− | 0014a4a4: 00621821 addu r3,r3,r2 | + | 0014a4a4: 00621821 addu r3,r3,r2 r4 * 33 |
− | 0014a4a8: 00031880 sll r3,r3,0x02 | + | 0014a4a8: 00031880 sll r3,r3,0x02 r4 * 204 |
− | 0014a4ac: 00641823 subu r3,r3,r4 | + | 0014a4ac: 00641823 subu r3,r3,r4 r4 * 203 |
− | 0014a4b0: 00031140 sll r2,r3,0x05 | + | 0014a4b0: 00031140 sll r2,r3,0x05 r4 * 6496 |
− | 0014a4b4: 00431023 subu r2,r2,r3 | + | 0014a4b4: 00431023 subu r2,r2,r3 r4 * 6293 |
− | 0014a4b8: 00021080 sll r2,r2,0x02 | + | 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 | + | 0014a4bc: 00441021 addu r2,r2,r4 r4 * 25173 # Perhaps to intentionally waste cycles to slow this down? |
− | 0014a4c0: 24423619 addiu r2,r2,0x3619 | + | 0014a4c0: 24423619 addiu r2,r2,0x3619 r4 * 0x6254 + 0x3619 |
− | 0014a4c4: 3042ffff andi r2,r2,0xffff | + | 0014a4c4: 3042ffff andi r2,r2,0xffff efficient modulo via bitmask |
0014a4c8: 3c018017 lui r1,0x8017 | 0014a4c8: 3c018017 lui r1,0x8017 | ||
− | 0014a4cc: ac223c7c sw r2,0x3c7c(r1) | + | 0014a4cc: ac223c7c sw r2,0x3c7c(r1) update the RNG seed |
0014a4d0: 03e00008 jr r31 | 0014a4d0: 03e00008 jr r31 | ||
0014a4d4: 00000000 nop | 0014a4d4: 00000000 nop | ||
</font> | </font> |
Latest revision as of 20:04, 27 February 2024
# 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