Prosty generator pseudolosowy
From Atariki
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.