TerusTheBird

CrazyBus RNG (better)

Dec 3rd, 2021 (edited)
402
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; RNG state location
  2. RND = 0xFF000A
  3.  
  4. ; int RandomSeed( u64 seed )
  5. ;  input: D0+D1, seed
  6. ; output: D0, garbage
  7. RandomSeed:
  8.     ADD.L    D0,     D1      ; user seed in d0 (d1 too)
  9.     MOVEM.L  D0/D1,  RND
  10.     ; fall through
  11.  
  12. ; int LongRnd()
  13. ;  input: none
  14. ; output: D0, random number
  15. LongRnd:
  16.     MOVEM.L  D2-D3,  -(SP)
  17.     MOVEM.L  RND,    D0/D1   ; D0=LSB's, D1=MSB's of random number
  18.     ANDI.B   #$0E,   D0      ; ensure upper 59 bits are an...
  19.     ORI.B    #$20,   D0      ; ...odd binary number
  20.     MOVE.L   D0,     D2
  21.     MOVE.L   D1,     D3
  22.     ADD.L    D2,     D2      ; accounts for 1 of 17 left shifts
  23.     ADDX.L   D3,     D3      ; [D2/D3] = RND*2
  24.     ADD.L    D2,     D0
  25.     ADDX.L   D3,     D1      ; [D0/D1] = RND*3
  26.     SWAP     D3              ; shift [D2/D3] additional 16 times
  27.     SWAP     D2
  28.     MOVE.W   D2,     D3
  29.     CLR.W    D2
  30.     ADD.L    D2,     D0      ; add to [D0/D1]
  31.     ADDX.L   D3,     D1
  32.     MOVEM.L  D0/D1,  RND     ; save for next time through
  33.     MOVE.L   D1,     D0      ; most random part to D0
  34.     MOVEM.L  (SP)+,  D2-D3
  35.     RTS
  36.  
  37. ; int Random( u16 max )
  38. ;  input: D0, max (exclusive)
  39. ; output: D0, random number
  40. Random:
  41.     MOVE.W   D2,     -(SP)
  42.     MOVE.W   D0,     D2      ; save upper limit
  43.     BEQ.S    _end            ; range of 0 returns 0 always
  44.     BSR.S    LongRnd         ; get a longword random number
  45.     CLR.W    D0              ; use upper word (it's most random)
  46.     SWAP     D0
  47.     DIVU.W   D2,     D0      ; divide by range...
  48.     CLR.W    D0              ; ...and use remainder for the value
  49.     SWAP     D0              ; result in D0.W
  50. _end:
  51.     MOVE.W   (SP)+,  D2
  52.     RTS
  53.  
RAW Paste Data Copied