;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Random Number Generator # 01 Tylisha C. Andersen ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; General-purpose random number generator. ; Uses a 'Linear feedback shift register'. ; Note: won't work if the seed is zero. ; Assumes ds = cs ; Returns eax = result Proc rand push cx mov eax, [seed] mov cx, 33 rloop: add eax, eax jnc $+4 xor al, 197 loop rloop mov [seed], eax pop cx ret seed dd 1 EndP rand ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Random Number Generator # 02 Mikko Hyvarinen ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! random proc imul eax,[seed],1107030247 add eax,97177 mov [seed],eax shr eax,15 ret seed dd 0 random endp ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; Random Number Generator # 03 Tylisha C. Andersen ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ; True random number generator. Not a pseudo-random RNG! ; Uses the system clock countdown timer. Very slow. ; Returns eax = result Proc true_rand push cx ; save registers push edx mov cx, 100 ; 100 iterations cli ; no interrupts allowed p1_loop: mov al, 06h ; set timer command out 43h, al call p1_null in al, 40h ; read low byte of timer xor dl, al ; xor into edx call p1_null in al, 40h ; read high byte of timer xor dl, al ; xor into edx rol edx, 7 ; rotate left by 7 loop p1_loop ; loop back sti ; enable interrupts xchg eax, edx ; result in eax pop edx ; restore registers pop cx p1_null: ret ; return EndP true_rand