White flame ha pubblicato un articolo riguardo alla generazione di numeri pseudo causuali periodici. Molto interessante mi sono detto, proviamo ad utilizzare questo algoritmo.
;Pseudo random number generator test
;PRNG by White Flame/ONS <http://www.white-flame.com/prng.txt>
;iAN CooG/HF 26/04/05
seed = $02
eorseed = $fb
eoridx = $fc
tisecs = $a2
*= $0801
word eop
word 7102
byte $9e
byte "2059"
eop
byte 0
ldx #0
faderloop
jsr randseed
fader
jsr rand
clrchr
lda #$20
jsr storescreen
inx
bne fader
lda clrchr+1
eor #$80
sta clrchr+1
bmi faderloop
fillerloop
lda tisecs
sta color+1
jsr randseed
filler
jsr rand
color
lda #00
jsr storecol
inx
bne filler
beq fillerloop
;rts
;-------------------------
rand; White Flame PRNG
lda seed;seed
beq doEor
asl
beq noEor
bcc noEor
doEor
eor eorseed
noEor
sta seed
tay
rts
;-------------------------
storescreen
sta $0400,y
sta $0500,y
sta $0600,y
sta $06e8,y
delay
ldy #$70
delayloop
;lda $d012
;bmi *-3
lda $d012
bpl *-3
dey
bne delayloop
rts
;-------------------------
storecol
sta $d800,y
sta $d900,y
sta $da00,y
sta $dae8,y
bvc delay
;-------------------------
randseed
stx restx+1
lda eoridx
and #$0f
tax
lda rndtab,x
sta eorseed
inc eoridx
restx
ldx #0
rts
;-------------------------
rndtab
byte $1d ; 0
byte $2b ; 1
byte $2d ; 2
byte $4d ; 3
byte $5f ; 4
byte $63 ; 5
byte $65 ; 6
byte $69 ; 7
byte $71 ; 8
byte $87 ; 9
byte $8d ; a
byte $a9 ; b
byte $c3 ; c
byte $cf ; d
byte $e7 ; e
byte $f5 ; f
endrndtab
Notare che il pattern di riempimento cambia ad ogni ciclo ma ogni "buco" viene sempre riempito, perche' l'algoritmo genera SEMPRE e SOLO una volta ognuno dei 256 valori possibili fino a ritornare al valore iniziale.