Gibt es eine brauchbare Routine, mit der man eine nicht wiederholende 8-Bit-Zahl in Assembler, auf dem VC-20 ermitteln kann?
Hallo Besucher, der Thread wurde 1,2k mal aufgerufen und enthält 7 Antworten
letzter Beitrag von Zirias/Excess am
Zufallszahl in Assembler für VC-20
- gamersince1984
- Erledigt
-
-
Der VC-20 sollte in der Hinsicht keinen großen Unterschied machen ... für simpelste Anforderungen geht das hier:
https://codebase64.org/doku.ph…ase:small_fast_8-bit_prng
Hat allerdings auch nur eine Periode von 256, also wirklich "zufällig" ist anders.
Ich kann nachher mal noch eine etwas komplexere Routine mit größerem LFSR raussuchen, falls die Periode länger sein muss
-
Danke. Muß ich mal testen. Ich will Objekte bewegen, die an bestimmten Wegpunkten, zufällig die Richtung ändern sollen.
-
„Echten“ Zufall kriegt man rein, wenn man z.B. in der Zeit zwischen User-Inputs die Basis für den LFSR laufend hochzählt. Dann gibt es keine wirkliche Periode mehr.
-
Wenn du nur z.b. 4 Richtungen unterscheidest, also 2 bits brauchst, ist eine Periode von 256 wahrscheinlich gut genug. Andernfalls kann man wie gesagt größere LFSRs bauen, kann gerne ein Beispiel raussuchen sobald ich aus meinem Meeting hier raus bin
-
Ja, das wäre super. Bei der Routine die ich bisher benutze, endet der Laufweg der Objekte irgendwann in einer Schleife.
-
bei meinem aktuellen Projekt nutze ich diese Routine:
CodeDie hatte ich mir aus diesem Artikel (Seite 98 ff.) zusammengesucht.
Aber falls Du etwas effektiveres findest wäre ich auf jeden Fall daran interessiert.
aitsch
-
Hier mal ein simpler 32bit LFSR:
Code- .zeropage
- rnd_state: .res 4
- .code
- ; seed
- lda $d012
- sta rnd_state
- lda $dc04
- sta rnd_state+1
- lda #$ff
- sta rnd_state+2
- sta rnd_state+3
- ; ...
- ; next "random" number
- asl rnd_state
- rol rnd_state+1
- rol rnd_state+2
- rol rnd_state+3
- bcc done
- ; feedback
- lda rnd_state
- eor #$b7
- sta rnd_state
- lda rnd_state+1
- eor #$1d
- sta rnd_state+1
- lda rnd_state+2
- eor #$c1
- sta rnd_state+2
- lda rnd_state+3
- eor #$04
- sta rnd_state+3
- ; use any two bytes (always the same) for actual "random" values
- done: lda rnd_state+2
- ldx rnd_state+3
Den habe ich in https://csdb.dk/release/?id=187145 für das kräuseln vom Wasser und die Positionen der Sterne benutzt.
Auf dem VIC-20 musst du natürlich irgendwie anders seeden (hier wird die VIC-II Rasterzeile und der Wert vom CIA Timer im C64 benutzt).
Claus hat natürlich auch recht, das Ergebnis lässt sich weiter verbessern, indem man z.B. regelmäßig weiterzählt (so dass der hoffentliche zufällige Zeitpunkt, zu dem man einen Wert braucht, eine Rolle spielt) -- oder indem man bei "zufälligen" Ereignissen wie User-Input weiterzählt.