Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Rand_addr = 0x02235798 --B2/JP
- function LCG_64(U32,L32)
- --64bit multiplication
- local l16, u16, Carry16
- local l24, u24, Carry24
- local Carry
- local x, y, z = {}, {}, {}
- x[0] = bit.band(L32, 255)
- x[1] = bit.band(bit.rshift(L32, 8), 255)
- x[2] = bit.band(bit.rshift(L32, 16), 255)
- x[3] = bit.band(bit.rshift(L32, 24), 255)
- y[0] = bit.band(x[0] * 1812433253, 4294967295)
- y[1] = bit.band(bit.lshift(x[1] * 1812433253, 8), 4294967295)
- y[2] = bit.band(bit.lshift(x[2] * 1812433253, 16), 4294967295)
- y[3] = bit.band(bit.lshift(x[3] * 1812433253, 24), 4294967295)
- l16 = bit.band(y[0], 0xFFFF) + bit.band(y[1], 0xFFFF) + bit.band(y[2], 0xFFFF) + bit.band(y[3], 0xFFFF)
- Carry16 = bit.rshift(l16, 16)
- u16 = bit.rshift(y[0], 16) + bit.rshift(y[1], 16) + bit.rshift(y[2], 16) + bit.rshift(y[3], 16) + Carry16
- z[0] = bit.rshift(u16, 16)
- z[1] = math.floor((x[0] * 1812433253) / 0x100000000)
- z[2] = math.floor((x[1] * 1812433253) / 0x1000000)
- z[3] = math.floor((x[2] * 1812433253) / 0x10000)
- z[4] = math.floor((x[3] * 1812433253) / 0x100)
- l32 = bit.band((y[0] + y[1] + y[2] + y[3]), 4294967295)
- u32 = z[0] + z[1] + z[2] + z[3] + z[4]
- u32 = bit.band(LCG_32(L32, 1566083941, u32), 4294967295)
- u32 = bit.band(LCG_32(U32, 1812433253, u32), 4294967295)
- l24 = bit.band(y[0], 0xFFFFFF) + bit.band(y[1], 0xFFFFFF) + bit.band(y[2], 0xFFFFFF) + bit.band(y[3], 0xFFFFFF) + 2531011
- Carry24 = bit.rshift(l24, 24)
- u24 = bit.rshift(y[0], 24) + bit.rshift(y[1], 24) + bit.rshift(y[2], 24) + bit.rshift(y[3], 24) + Carry24
- Carry = bit.rshift(u24, 24)
- l32 = bit.band((l32 + 2531011), 4294967295)
- u32 = u32 + Carry
- return l32, u32
- end
- function LCG_32(rand, a, b)
- --32bit multiplication
- local x, y = {}, {}
- x[0] = bit.band(rand, 255)
- x[1] = bit.band(bit.rshift(rand, 8), 255)
- x[2] = bit.band(bit.rshift(rand, 16), 255)
- x[3] = bit.band(bit.rshift(rand, 24), 255)
- y[0] = bit.band(x[0] * a, 4294967295)
- y[1] = bit.band(bit.lshift(x[1] * a, 8), 4294967295)
- y[2] = bit.band(bit.lshift(x[2] * a, 16), 4294967295)
- y[3] = bit.band(bit.lshift(x[3] * a, 24), 4294967295)
- return bit.band((y[0] + y[1] + y[2] + y[3] + b), 4294967295)
- end
- function Fn()
- L32 = memory.readdword(Rand_addr)
- U32 = memory.readdword(Rand_addr + 4)
- for i = 0, 16 do
- gui.text(0,10 * i, string.format("%08X%08X", U32, L32))
- L32, U32 = LCG_64(U32,L32)
- end
- end
- gui.register(Fn)
Advertisement
Add Comment
Please, Sign In to add comment