This is a maximally equidustributed combined LFSR random number generator. The seed value is set after the init files are loaded in an attempt to give some randomness to the inital values.
| ram_variable %z1
| ram_variable %z2
| ram_variable %z3
| ram_variable %z4
| : _random_init
xclock+ @ 1 LSHIFT 2 MAX %z1 !
HERE 8 MAX %z2 !
#$buffer get_buffer buffer $10 MAX %z3 ! kill_buffer
xclock+ @ 7 LSHIFT $80 MAX %z4 !
;
CODE random
\ b = (((z1 << 6 ) ^ z1) >> 13 ) ;
%z1 AB D0 MOV
D0 D5 MOV
6 # D5 LSL
D0 D5 EOR
#13 # D6 MOV
D6 D5 LSR
\ z1 = ((( z1 & 4294967294 << 18 ) ^ b ) ;
#4294967294 # D0 AND
#18 # D6 MOV
D6 D0 LSL
D5 D0 EOR
D0 %z1 AB MOV
\ b = (((z2<<2)^z2)>>27);
%z2 AB D1 MOV
D1 D5 MOV
2 # D5 LSL
D1 D5 EOR
#27 # D6 MOV
D6 D5 LSR
\ z2 = (((z2 & 4294967288) << 2) ^b) ;
#4294967288 # D1 AND
2 # D1 LSL
D5 D1 EOR
D1 %z2 AB MOV
\ b = (((z3<<13)^z3)>>21);
%z3 AB D2 MOV
D2 D5 MOV
13 # D6 MOV
D6 D5 LSL
D2 D5 EOR
#21 # D6 MOV
D6 D5 LSR
\ z3 = (((z3 & 4294967280) << 7) ^b) ;
#4294967280 # D2 AND
7 # D2 LSL
D5 D2 EOR
D2 %z3 AB MOV
\ b = (((z4<<3)^z4)>>12);
%z4 AB D3 MOV
D3 D5 MOV
3 # D5 LSL
D3 D5 EOR
#12 # D6 MOV
D6 D5 LSR
\ z4 = (((z4 & 4294967168) << 13) ^b) ;
#4294967168 # D3 AND
#13 # D6 MOV
D6 D3 LSL
D5 D3 EOR
D3 %z4 AB MOV
D1 D0 EOR
D2 D0 EOR
D3 D0 EOR
D0 S -) MOV
NEXT