From 3d2697d2e4c79dec2493ee46004506fff43646bd Mon Sep 17 00:00:00 2001 From: ketmar Date: Thu, 23 Jul 2020 06:15:31 +0000 Subject: [PATCH] dsforth: added words to generate random numbers FossilOrigin-Name: 5357081f5271a0b055c5416de62f83298f73f92262c5a1ae4027bf8e592772bd --- dsforth/math_misc.zas | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/dsforth/math_misc.zas b/dsforth/math_misc.zas index 780e152..f688603 100644 --- a/dsforth/math_misc.zas +++ b/dsforth/math_misc.zas @@ -231,3 +231,96 @@ sqrt16_hl: rra cpl ret + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; generate random number +;; period of 2^32-1, and passes most of the diehard tests +;; this is the preferred PRNG, it is fast, small and good +;; +;; IN: +;; rndSeed: 4 bytes of shit +;; OUT: +;; HL: 16-bit random +;; DE: dead +;; AF: dead +;; WARNING: +;; be careful to not have all zeroes in rndSeed! +;; +;; taken from http://www.worldofspectrum.org/forums/showthread.php?t=23070 +;; original code by Patrik Rak (2012, based on Einar Saukas version) +random_marsaglia: + ld hl,#a280 ; yw -> zt +rndSeed0 equ $-2 + ld de,#c0de ; xz -> yw +rndSeed1 equ $-2 + ld (rndSeed1),hl ; x = y, z = w + ld a,l ; w = w^(w<<3) + add a,a + add a,a + add a,a + xor l + ld l,a + ld a,d ; t = x^(x<<1) + add a,a + xor d + ld h,a + rra ; t = t^(t>>1)^w + xor h + xor l + ld h,e ; y = z + ld l,a ; w = t + ld (rndSeed0),hl + ret + + +$FORTH_CODE_WORD RANDSEED! +;; k8 -- set 16-bit random seed +;; ( n -- ) + pop hl + ld (rndSeed0),hl + ld hl,#c0de + ld (rndSeed1),hl + jp i_next +$FORTH_END_CODE_WORD RANDSEED! + +$FORTH_CODE_WORD D-RANDSEED! +;; k8 -- set 16-bit random seed +;; ( lo hi -- ) + pop hl + pop de + ld a,l + or h + or d + or e + jr nz,fword_drandseed_ok + inc l +fword_drandseed_ok: + ld (rndSeed0),hl + ld (rndSeed1),de + jp i_next +$FORTH_END_CODE_WORD D-RANDSEED! + + +$FORTH_CODE_WORD RANDOMU16 +;; k8 -- generate 16-bit random number +;; ( -- n ) + call random_marsaglia + jp i_pushhl +$FORTH_END_CODE_WORD RANDOMU16 + +$FORTH_CODE_WORD RANDOMU8 +;; k8 -- generate 8-bit random number +;; ( -- n ) + call random_marsaglia + ld h,0 + jp i_pushhl +$FORTH_END_CODE_WORD RANDOMU8 + +$FORTH_CODE_WORD RANDOM +;; k8 -- generate 15-bit random number +;; ( -- n ) + call random_marsaglia + res 7,h + jp i_pushhl +$FORTH_END_CODE_WORD RANDOM -- 2.11.4.GIT