Prosty generator pseudolosowy

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 21:18, 6 lis 2008
Bob er (Dyskusja | wkład)
(wersja pierwsza)
← Previous diff
Aktualna wersja
KMK (Dyskusja | wkład)
(Sprzętowy)
Linia 1: Linia 1:
-Czasami jest potrzeba generowania liczb pseudolosowych w powtarzalny sposób (np. w grach). W takim przypadku [[POKEY|POKEY]] ze swoim rejestrem [[Rejestry_POKEY-a|RANDOM]] nie będzie zbyt pomocny. Można wtedy użyć poniższej metody. Nie jest ona mojego autorstwa. Znalazłem to gdzieś na sieci, niestety źródłowego adresu w tej chwili nie znajdę. +== Sprzętowy ==
 + 
 +Korzystamy z rejestru [[Rejestry_POKEY-a#RANDOM|RANDOM]] układu [[Pokey]]:
-Na początku inicjujemy generator. Do rejestrów A, X i Y zapisujemu wartości początkowe generatora. 
<pre> <pre>
-init equ *+ lda $d20a
- sta byte_a+ ldx $d20a
- stx byte_b+ ldy $d20a
- sty byte_c+</pre>
- rts+ 
 +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ą w sposób widoczny 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|POKEY]] ze swoim rejestrem [[Rejestry_POKEY-a|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.
 +<pre>
 +init sta byte_a
 + stx byte_b
 + sty byte_c
 + rts
</pre> </pre>
Linia 13: Linia 25:
<pre> <pre>
-random equ *+random lda byte_a
- lda byte_a+ eor byte_b
- eor byte_b+ asl
- asl @+ sta byte_a
- sta byte_a+ clc
- clc+ lda byte_b
- lda byte_b+ adc byte_c
- adc byte_c+ sta byte_b
- sta byte_b+ lda byte_c
- lda byte_c+ eor byte_b
- eor byte_b+ sta byte_c
- sta byte_c+ rts
- rts+
</pre> </pre>
-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.+ 
 +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.
 + 
 +[[Kategoria:Niezbędnik kodera]]

Aktualna wersja

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ą w sposób widoczny 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