1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11 $FORTH_END_CODE_WORD 1+
20 $FORTH_END_CODE_WORD 2+
31 $FORTH_END_CODE_WORD 4+
39 $FORTH_END_CODE_WORD 1-
48 $FORTH_END_CODE_WORD 2-
59 $FORTH_END_CODE_WORD 4-
61 $FORTH_CODE_WORD 256U*
68 $FORTH_END_CODE_WORD 256U*
70 $FORTH_CODE_WORD 256U/
77 $FORTH_END_CODE_WORD 256U/
87 $FORTH_END_CODE_WORD 2U/
97 $FORTH_END_CODE_WORD 2U*
99 $FORTH_CODE_WORD 2UMOD
108 $FORTH_END_CODE_WORD 2UMOD
110 $FORTH_CODE_WORD 256UMOD
116 $FORTH_END_CODE_WORD 256UMOD
118 $FORTH_CODE_WORD ISGN
120 ;; ( 16 -- -1 or 0 or 1 )
126 jp z,i_pushhl ;; zero
133 $FORTH_END_CODE_WORD ISGN
136 $FORTH_CODE_WORD USQRT
146 $FORTH_END_CODE_WORD USQRT
148 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149 ;; fast 16-bit integer square root
150 ;; 92 bytes, 344-379 cycles (average 362)
151 ;; v2 - 3 t-state optimization spotted by Russ McNulty
152 ;; http://www.retroprogramming.com/2017/07/a-fast-z80-integer-square-root.html
153 ;; k8: NOT TESTED YET!
242 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
243 ;; generate random number
244 ;; period of 2^32-1, and passes most of the diehard tests
245 ;; this is the preferred PRNG, it is fast, small and good
248 ;; rndSeed: 4 bytes of shit
254 ;; be careful to not have all zeroes in rndSeed!
256 ;; taken from http://www.worldofspectrum.org/forums/showthread.php?t=23070
257 ;; original code by Patrik Rak (2012, based on Einar Saukas version)
259 ld hl,#a280 ; yw -> zt
261 ld de,#c0de ; xz -> yw
263 ld (rndSeed1),hl ; x = y, z = w
264 ld a,l ; w = w^(w<<3)
270 ld a,d ; t = x^(x<<1)
283 $FORTH_CODE_WORD D-RANDSEED@
284 ;; k8 -- set 16-bit random seed
289 $FORTH_END_CODE_WORD D-RANDSEED@
291 $FORTH_CODE_WORD RANDSEED!
292 ;; k8 -- set 16-bit random seed
299 $FORTH_END_CODE_WORD RANDSEED!
301 $FORTH_CODE_WORD D-RANDSEED!
302 ;; k8 -- set 16-bit random seed
310 jr nz,fword_drandseed_ok
316 $FORTH_END_CODE_WORD D-RANDSEED!
319 $FORTH_CODE_WORD URANDOM
320 ;; k8 -- generate 16-bit random number
322 call random_marsaglia
324 $FORTH_END_CODE_WORD URANDOM
326 $FORTH_CODE_WORD RANDOM
327 ;; k8 -- generate 15-bit random number
329 call random_marsaglia
332 $FORTH_END_CODE_WORD RANDOM
335 $FORTH_CODE_WORD URANDOM8
336 ;; k8 -- generate 8-bit random number
338 call random_marsaglia
341 $FORTH_END_CODE_WORD URANDOM8
343 $FORTH_CODE_WORD URANDOM88
344 ;; k8 -- generate two 8-bit random numbers
346 call random_marsaglia
351 $FORTH_END_CODE_WORD URANDOM88