Prosty generator pseudolosowy
From Atariki
(Różnice między wersjami)
Wersja z dnia 09:31, 11 kwi 2009 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 21:08, 4 kwi 2010 KMK (Dyskusja | wkład) (pierwsza osoba) Next diff → |
||
Linia 10: | Linia 10: | ||
== Programowy == | == 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. Nie jest ona mojego autorstwa. Znalazłem to gdzieś na sieci, niestety źródłowego adresu w tej chwili nie znajdę. | + | 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 zapisujemu wartości początkowe generatora. | + | 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 36: | Linia 36: | ||
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]] | [[Kategoria:Niezbędnik kodera]] |
Wersja z dnia 21:08, 4 kwi 2010
Sprzętowy
Korzystamy z rejestru RANDOM układu Pokey:
lda $d20a ldx $d20a ldy $d20a
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.