theballaam96

DK64 RNG

Feb 5th, 2019
452
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. MIPS > MATHS/LUA CONVERSION
  2.  
  3. RNGSomething()
  4. var_C = -0xC
  5. var_8 = -8
  6. var_4 = -4
  7.  
  8. [lui $t6, 0x8074] $t6 = 0x80740000
  9. [lw $a1, RNG] $a1 = RNG Value
  10. [addiu $sp, -0x20] $sp = $sp - 0x20
  11. [sw $ra 0x20+var_C($sp)] mainmemory.write_u32_be($sp + 0x20 + var_C, $ra)
  12. [li $a0,0] $a0 = 0x0
  13. [lui $a3, 0x1DF] $a3 = 0x01DF0000
  14. [sw $a0, 0x20+var_8($sp)] mainmemory.write_u32_be($sp + 0x20 + var_8, $a0)
  15. [li $a3, 0x1DF5E0D] $a3 = 0x01DF5E0D
  16. [li $a2, 0] $a2 = 0x0
  17. [jal CycleRNG] CycleRNG()
  18. [sw $a1, 0x20+var_4($sp)] mainmemory.write_u32_be($sp + 0x20 + var_4, $a1)
  19. [lw $ra, 0x20+var_C($sp)] $ra = mainmemory.read_u32_be($sp + 0x20 + var_C)
  20. [lui $a0, 0x8074] $a0 = 0x80740000
  21. [addiu $t1, $v1, 1] $t1 = $v1 + 1
  22. [li $at, 0xFFFFFFFF] $at = 0xFFFFFFFF
  23. [la $a0, RNG] $a0 = RNG
  24. [and $v0, $t1, $at] $v0 = $t1 and $at
  25. [sw $v0, (RNG-RNG)($a0)] mainmemory.write_u32_be($a0 + (RNG - RNG), $v0)
  26. [jr $ra] jr $ra
  27. [addiu $sp, 0x20] $sp = $sp + 0x20
  28. end
  29.  
  30. CycleRNG()
  31. arg_0 = 0
  32. arg_8 = 8
  33. [sw $a0, arg_0($sp)] mainmemory.write_u32_be($sp + arg_0, $a0)
  34. [sw $a1, arg_0+4($sp)] mainmemory.write_u32_be($sp + arg_0 + 4, $a1)
  35. [sw $a2, arg_8($sp)] mainmemory.write_u32_be($sp + arg_8, $a2)
  36. [sw $a3, arg_8+4($sp)] mainmemory.write_u32_be($sp + arg_8 + 4, $a3)
  37.  
  38. [ld $t7, arg_8($sp)] $t7 = mainmemory.read_u64_be($sp + arg_8)
  39. [ld $t6, arg_0($sp)] $t6 = mainmemory.read_u64_be($sp + arg_0)
  40.  
  41. [dmultu $t6, $t7] LO = [$t6 x $t7](0 > 63) -- Lower 64 bits get placed into LO
  42. [dmultu $t6, $t7] HI = [$t6 x $t7](64 > 127) -- Upper 64 bits get placed into HI
  43.  
  44. [mflo $v0] $v0 = LO
  45.  
  46. [dsll32 $v1, $v0, 0] $v1 = $v0 * 2^(32 + 0) -- Bitshift left 32 bits
  47. [dsra32 $v1, 0] $v1 = $v1 / 2^(32 + 0) -- Bitshift right 32 bits
  48.  
  49. [jr $ra] jr $ra
  50.  
  51. [dsra32 $v0, 0] $v0 = $v0 / 2^(32 + 0) -- Bitshift right 32 bits
  52. end
  53.  
  54. SIMPLIFIED
  55. a0 = 0
  56. a1 = rng_value
  57. a2 = 0
  58. a3 = 0x01DF5E0D
  59. sp = sp - 32
  60. t6 = (a0 * (256 ^ 4)) + a1
  61. t7 = (a2 * (256 ^ 4)) + a3
  62. hi = math.floor(t6 * t7 / (256 ^ 8))
  63. lo = (t6 * t7) - (256 ^ 8)(hi)
  64. v0 = lo
  65. v1 = v0
  66. a0 = 0x80740000
  67. t1 = v1 + 1
  68. at = 0xFFFFFFFF
  69. a0 = rng_address
  70. v0 = t1
  71. rng_value = v0
  72. sp = sp + 32
  73.  
  74. sp = sp - 32
  75. t6 = rng_value
  76. t7 = 0x01DF5E0D
  77. hi = math.floor(t6 * t7 / (256 ^ 4))
  78. lo = (t6 * t7) % (256 ^ 8)
  79. v1 = lo
  80. t1 = v1 + 1
  81. v0 = t1 % (16 ^ 8)
  82. rng_value = v0
  83. sp = sp + 32
  84.  
  85. rng_value = (((rng_value * 0x01DF5E0D) % (256 ^ 8)) + 1) % (256 ^ 4)
Advertisement
Add Comment
Please, Sign In to add comment