1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 $FORTH_END_CODE_WORD 1+
18 $FORTH_END_CODE_WORD 2+
28 $FORTH_END_CODE_WORD 4+
35 $FORTH_END_CODE_WORD 1-
43 $FORTH_END_CODE_WORD 2-
53 $FORTH_END_CODE_WORD 4-
55 $FORTH_CODE_WORD 256U*
62 $FORTH_END_CODE_WORD 256U*
64 $FORTH_CODE_WORD 256U/
71 $FORTH_END_CODE_WORD 256U/
81 $FORTH_END_CODE_WORD 2U/
91 $FORTH_END_CODE_WORD 2U*
93 $FORTH_CODE_WORD 2UMOD
102 $FORTH_END_CODE_WORD 2UMOD
104 $FORTH_CODE_WORD 256UMOD
110 $FORTH_END_CODE_WORD 256UMOD
112 $FORTH_CODE_WORD USQRT
122 $FORTH_END_CODE_WORD USQRT
124 $FORTH_CODE_WORD ISGN
126 ;; ( 16 -- -1 or 0 or 1 )
132 jp z,i_pushhl ;; zero
139 $FORTH_END_CODE_WORD ISGN
142 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
143 ;; fast 16-bit integer square root
144 ;; 92 bytes, 344-379 cycles (average 362)
145 ;; v2 - 3 t-state optimization spotted by Russ McNulty
146 ;; http://www.retroprogramming.com/2017/07/a-fast-z80-integer-square-root.html
147 ;; k8: NOT TESTED YET!
236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
237 ;; generate random number
238 ;; period of 2^32-1, and passes most of the diehard tests
239 ;; this is the preferred PRNG, it is fast, small and good
242 ;; rndSeed: 4 bytes of shit
248 ;; be careful to not have all zeroes in rndSeed!
250 ;; taken from http://www.worldofspectrum.org/forums/showthread.php?t=23070
251 ;; original code by Patrik Rak (2012, based on Einar Saukas version)
253 ld hl,#a280 ; yw -> zt
255 ld de,#c0de ; xz -> yw
257 ld (rndSeed1),hl ; x = y, z = w
258 ld a,l ; w = w^(w<<3)
264 ld a,d ; t = x^(x<<1)
277 $FORTH_CODE_WORD RANDSEED!
278 ;; k8 -- set 16-bit random seed
285 $FORTH_END_CODE_WORD RANDSEED!
287 $FORTH_CODE_WORD D-RANDSEED!
288 ;; k8 -- set 16-bit random seed
296 jr nz,fword_drandseed_ok
302 $FORTH_END_CODE_WORD D-RANDSEED!
305 $FORTH_CODE_WORD RANDOMU16
306 ;; k8 -- generate 16-bit random number
308 call random_marsaglia
310 $FORTH_END_CODE_WORD RANDOMU16
312 $FORTH_CODE_WORD RANDOMU8
313 ;; k8 -- generate 8-bit random number
315 call random_marsaglia
318 $FORTH_END_CODE_WORD RANDOMU8
320 $FORTH_CODE_WORD RANDOM
321 ;; k8 -- generate 15-bit random number
323 call random_marsaglia
326 $FORTH_END_CODE_WORD RANDOM