Prosty generator pseudolosowy

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 15:32, 1 sie 2015
Tdc (Dyskusja | wkład)
(int.)
← Previous diff
Wersja z dnia 23:51, 1 mar 2016
KMK (Dyskusja | wkład)
(Sprzętowy)
Next diff →
Linia 8: Linia 8:
ldy $d20a ldy $d20a
</pre> </pre>
 +
 +Uwaga: dobrze jest zadbać, żeby pomiędzy kolejnymi odczytami rejestru upływało co najmniej 8 cykli zegara 1,77 MHz - w przeciwnym razie kolejne odczytywane liczby mogą być ze sobą skorelowane. To zjawisko może szczególnie silnie występować na akceleratorach.
== Programowy == == Programowy ==

Wersja z dnia 23:51, 1 mar 2016

Sprzętowy

Korzystamy z rejestru RANDOM układu Pokey:

       lda $d20a
       ldx $d20a
       ldy $d20a

Uwaga: dobrze jest zadbać, żeby pomiędzy kolejnymi odczytami rejestru upływało co najmniej 8 cykli zegara 1,77 MHz - w przeciwnym razie kolejne odczytywane liczby mogą być ze sobą skorelowane. To zjawisko może szczególnie silnie występować na akceleratorach.

Programowy

Czasami jest potrzeba generowania liczb pseudolosowych w powtarzalny sposób (np. w grach). W takim przypadku POKEY ze swoim rejestrem RANDOM nie będzie zbyt pomocny. Można wtedy użyć poniższej metody (jest ona bliżej nierozpoznanego autorstwa).

Na początku inicjujemy generator. Do rejestrów A, X i Y zapisujemy wartości początkowe generatora.

init   sta byte_a
       stx byte_b
       sty byte_c
       rts

Następnie możemy wołać poniższą funkcję. Wartość zwracana jest w akumulatorze (cały bajt).

random lda byte_a
       eor byte_b
       asl
       sta byte_a
       clc
       lda byte_b
       adc byte_c
       sta byte_b
       lda byte_c
       eor byte_b
       sta byte_c
       rts

Jak widać metoda jest dosyć szybka, zajmuje stałą ilość cykli, nie potrzebuje żadnych tablic. Wystarczą 3 bajty gdzieś w pamięci i nie muszą być one obok siebie.

Personal tools