Prosty generator pseudolosowy: Różnice pomiędzy wersjami
mNie podano opisu zmian |
|||
| (Nie pokazano 5 wersji utworzonych przez 2 użytkowników) | |||
| Linia 1: | Linia 1: | ||
== Sprzętowy == | |||
Na początku inicjujemy generator. Do rejestrów A, X i Y | Korzystamy z rejestru [[Rejestry_POKEY-a#RANDOM|RANDOM]] układu [[Pokey]]: | ||
<pre> | |||
lda $d20a | |||
ldx $d20a | |||
ldy $d20a | |||
</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ą 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> | <pre> | ||
init sta byte_a | init sta byte_a | ||
| Linia 25: | Linia 38: | ||
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 | |||
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 z 2 mar 2016, 01:51
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.