Autore Topic: Numeri Pseudo Casuali  (Letto 2060 volte)

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Numeri Pseudo Casuali
« il: 29 Aprile 2005, 00:48:05 »
 White flame ha pubblicato un articolo riguardo alla generazione di numeri pseudo causuali periodici. Molto interessante mi sono detto, proviamo ad utilizzare questo algoritmo.

Codice: [Seleziona]
;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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -