Heute so gecodet...

  • Neu

    Auch schon n paar Wochen her, aber durch einen anderen Thread darauf gekommen, dass das vielleicht mal jemand brauchen könnte:

    Ein xorshift-32 PRNG für den C64:

    Quellcode

    1. .export rnd_init
    2. .export rnd
    3. .zeropage
    4. rnd_state: .res 4
    5. rnd_buf: .res 4
    6. .code
    7. rnd_init:
    8. lda #$0
    9. ldx #$3
    10. rndi_clrloop: sta rnd_state,x
    11. dex
    12. bne rndi_clrloop
    13. lda $d012
    14. bne rndi_ok
    15. lda #$7f
    16. rndi_ok: sta rnd_state
    17. rts
    18. rnd:
    19. ldx #$3
    20. r_copyloop: lda rnd_state,x
    21. sta rnd_buf,x
    22. dex
    23. bpl r_copyloop
    24. ldx #$3
    25. r_shiftloop: asl rnd_buf
    26. rol rnd_buf+1
    27. rol rnd_buf+2
    28. rol rnd_buf+3
    29. dex
    30. bpl r_shiftloop
    31. ldx #$3
    32. r_xorloop: lda rnd_state,x
    33. eor rnd_buf,x
    34. sta rnd_state,x
    35. dex
    36. bpl r_xorloop
    37. lda rnd_state+3
    38. lsr a
    39. eor rnd_state
    40. sta rnd_state
    41. eor rnd_state+3
    42. sta rnd_state+3
    43. rts
    Alles anzeigen
    Die Version liefert einen 8bit Ausschnitt im Akku zurück, also Zufallszahlen von 0 bis 255. Wenn man eine höhere Auflösung braucht kann man noch zusätzlich rnd_state+2 in einem der Index-Register (X bietet sich an, weil es eh clobbered wird) zurückliefern. Mehr als 16bit Resultat sind bei einem 32bit xorshift nicht zu empfehlen.

    rnd_init seedet das Ganze, und verwendet dazu die aktuelle Rasterzeile. Falls man den also aus irgendeinem Grund bereits synchronisiert mit dem Raster aufruft, sollte das angepasst werden auf eine andere "Zufallsquelle".