| ... | ... |
@@ -1,7 +1,6 @@ |
| 1 |
-( pseudo-random number generator ) |
|
| 2 |
- |
|
| 3 |
-( based on 16-bit xorshift algorithm discussed on |
|
| 4 |
- http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html ) |
|
| 1 |
+( pseudo-random number generator, |
|
| 2 |
+ based on two 16-bit xorshift algorithms by George Marsaglia |
|
| 3 |
+ http://www.jstatsoft.org/v08/i14/paper ) |
|
| 5 | 4 |
|
| 6 | 5 |
( devices ) |
| 7 | 6 |
|
| ... | ... |
@@ -18,17 +17,22 @@ |
| 18 | 17 |
|0100 ( -> ) |
| 19 | 18 |
( init ) |
| 20 | 19 |
;on-frame .Screen/vector DEO2 |
| 20 |
+ |
|
| 21 | 21 |
( seed prng (must be nonzero) ) |
| 22 |
- .DateTime/month DEI .DateTime/day DEI |
|
| 23 |
- #00 .DateTime/second #a0 SFT2 EOR2 |
|
| 24 |
- #00 .DateTime/minute #40 SFT2 EOR2 |
|
| 25 |
- .DateTime/hour EOR |
|
| 22 |
+ #00 .DateTime/second DEI |
|
| 23 |
+ #00 .DateTime/minute DEI #60 SFT2 EOR2 |
|
| 24 |
+ #00 .DateTime/hour DEI #c0 SFT2 EOR2 ;prng2/x STA2 |
|
| 25 |
+ #00 .DateTime/hour DEI #04 SFT2 |
|
| 26 |
+ #00 .DateTime/day DEI #10 SFT2 EOR2 |
|
| 27 |
+ #00 .DateTime/month DEI #60 SFT2 EOR2 |
|
| 28 |
+ #00 .DateTime/year DEI #a0 SFT2 EOR2 ;prng2/y STA2 |
|
| 29 |
+ ;prng2/x LDA2 ;prng2/y LDA2 EOR2 |
|
| 26 | 30 |
ORAk ,&non-zero JCN INC2 &non-zero |
| 27 | 31 |
;prng/seed STA2 |
| 28 | 32 |
|
| 29 | 33 |
( theme ) |
| 30 |
- #0fe5 .System/r DEO2 |
|
| 31 |
- #0fc5 .System/g DEO2 |
|
| 34 |
+ #0fe5 .System/r DEO2 |
|
| 35 |
+ #0fc5 .System/g DEO2 |
|
| 32 | 36 |
#0f25 .System/b DEO2 |
| 33 | 37 |
BRK |
| 34 | 38 |
|
| ... | ... |
@@ -42,16 +46,17 @@ |
| 42 | 46 |
BRK |
| 43 | 47 |
|
| 44 | 48 |
@draw-pixel |
| 45 |
- ,prng JSR |
|
| 49 |
+ ,prng2 JSR |
|
| 46 | 50 |
#00 SWP .Screen/x DEO2 |
| 47 | 51 |
#00 SWP .Screen/y DEO2 |
| 48 | 52 |
#01 .Screen/pixel DEO |
| 49 | 53 |
JMP2r |
| 50 | 54 |
|
| 51 | 55 |
@prng ( -- number* ) |
| 52 |
- ( returns the next number in the 65,535-long sequence, |
|
| 56 |
+ ( returns the next number in a 65,535-long sequence, |
|
| 53 | 57 |
which is never zero but every other 16-bit number |
| 54 | 58 |
appears once before the sequence repeats ) |
| 59 |
+ ( http://www.retroprogramming.com/2017/07/ xorshift-pseudorandom-numbers-in-z80.html ) |
|
| 55 | 60 |
,&seed LDR2 |
| 56 | 61 |
DUP2 #70 SFT2 EOR2 |
| 57 | 62 |
DUP2 #09 SFT2 EOR2 |
| ... | ... |
@@ -61,3 +66,17 @@ |
| 61 | 66 |
|
| 62 | 67 |
&seed $2 |
| 63 | 68 |
|
| 69 |
+@prng2 ( -- number* ) |
|
| 70 |
+ ( returns the next number in a (2^32-1)-long sequence ) |
|
| 71 |
+ ( http://b2d-f9r.blogspot.com/2010/08/ 16-bit-xorshift-rng-now-with-more.html ) |
|
| 72 |
+ ,&x LDR2 |
|
| 73 |
+ DUP2 #50 SFT2 EOR2 |
|
| 74 |
+ DUP2 #03 SFT2 EOR2 |
|
| 75 |
+ ,&y LDR2 DUP2 ,&x STR2 |
|
| 76 |
+ DUP2 #01 SFT2 EOR2 EOR2 |
|
| 77 |
+ ,&y STR2k POP |
|
| 78 |
+ JMP2r |
|
| 79 |
+ |
|
| 80 |
+ &x $2 |
|
| 81 |
+ &y $2 |
|
| 82 |
+ |