A hivatkozott oldalon található két link WoS-os fórumra. Mindkettő algoritmust Patrik Rak jegyzi.mezei írta:https://chuntey.wordpress.com/2012/06/0 ... enerators/
Ezek azért jóval több processzoridőt elvisznek, de a minőségre áldozni kell
A rövidebb algoritmust kipróbáltam, és abszolut győztes. Ténylegesen felveszi az összes értéket.
A végére betettem két sort, hogy Basic-ből ki lehessen próbálni.
Kód: Egész kijelölése
ORG 45000
rnd
ld hl,0xA280 ; xz -> yw
ld de,0xC0DE ; yw -> zt
ld (rnd+1),de ; x = y, z = w
ld a,e ; w = w ^ ( w << 3 )
add a,a
add a,a
add a,a
xor e
ld e,a
ld a,h ; t = x ^ (x << 1)
add a,a
xor h
ld d,a
rra ; t = t ^ (t >> 1) ^ w
xor d
xor e
ld h,l ; y = z
ld l,a ; w = t
ld (rnd+4),hl
ld b,0 ; basic miatt
ld c,a ; basic miatt
ret
Kód: Egész kijelölése
10 PLOT USR 45000/2, USR 45000/2
20 GO TO 10
Összehasonlításul itt a Basic saját RND függvénye. Bármeddig futtatjuk, nem változik a kép, ilyen függőleges csíkok maradnak.
A Basic RND teszt:
Kód: Egész kijelölése
10 PLOT RND*128,RND*128
20 GO TO 10
Korábban beidéztem a Fast RND algoritmust a z80.info oldalról. Szemmel láthatóan önmagában használhatatlan:
Kiegészítve a CPC Telera oldalon található algoritmussal, sokkal jobb eredményt kapunk, de nem olyan jót, mint Patrik kódjával.
A CPC Telera algoritmus tesztelése:
Kód: Egész kijelölése
org 48000
rnd:
ld hl, 0xABCD
xor a
rr h
rr l
jr nc, end
ld a, h
xor 0xF7
ld h, a
ld a, l
xor 0xFB
ld l, a
end:
ld (rnd+1), hl
rnd2:
ld a,0
ld c,a
xor l
rrca
rrca
rrca
xor 0x1F
add c
sbc 0xFF
ld (rnd2+1),a
ld b,0 ; basic miatt
ld c,a ; basic miatt
ret