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
120 ;; ( n count -- n<<count )
141 $FORTH_END_CODE_WORD SHL
145 ;; ( n count -- n>>count )
163 $FORTH_END_CODE_WORD SHR
167 ;; ( n count -- n>>count )
194 $FORTH_END_CODE_WORD SAR
197 $FORTH_CODE_WORD ISGN
199 ;; ( 16 -- -1 or 0 or 1 )
205 jp z,i_pushhl ;; zero
212 $FORTH_END_CODE_WORD ISGN
215 $FORTH_CODE_WORD USQRT
225 $FORTH_END_CODE_WORD USQRT
227 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
228 ;; fast 16-bit integer square root
229 ;; 92 bytes, 344-379 cycles (average 362)
230 ;; v2 - 3 t-state optimization spotted by Russ McNulty
231 ;; http://www.retroprogramming.com/2017/07/a-fast-z80-integer-square-root.html
232 ;; k8: NOT TESTED YET!
321 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
322 ;; generate random number
323 ;; period of 2^32-1, and passes most of the diehard tests
324 ;; this is the preferred PRNG, it is fast, small and good
327 ;; rndSeed: 4 bytes of shit
333 ;; be careful to not have all zeroes in rndSeed!
335 ;; taken from http://www.worldofspectrum.org/forums/showthread.php?t=23070
336 ;; original code by Patrik Rak (2012, based on Einar Saukas version)
338 ld hl,#a280 ; yw -> zt
340 ld de,#c0de ; xz -> yw
342 ld (rndSeed1),hl ; x = y, z = w
343 ld a,l ; w = w^(w<<3)
349 ld a,d ; t = x^(x<<1)
362 $FORTH_CODE_WORD D-RANDSEED@
363 ;; k8 -- set 16-bit random seed
368 $FORTH_END_CODE_WORD D-RANDSEED@
370 $FORTH_CODE_WORD RANDSEED!
371 ;; k8 -- set 16-bit random seed
378 $FORTH_END_CODE_WORD RANDSEED!
380 $FORTH_CODE_WORD D-RANDSEED!
381 ;; k8 -- set 16-bit random seed
389 jr nz,fword_drandseed_ok
395 $FORTH_END_CODE_WORD D-RANDSEED!
398 $FORTH_CODE_WORD URANDOM
399 ;; k8 -- generate 16-bit random number
401 call random_marsaglia
403 $FORTH_END_CODE_WORD URANDOM
405 $FORTH_CODE_WORD RANDOM
406 ;; k8 -- generate 15-bit random number
408 call random_marsaglia
411 $FORTH_END_CODE_WORD RANDOM
414 $FORTH_CODE_WORD URANDOM8
415 ;; k8 -- generate 8-bit random number
417 call random_marsaglia
420 $FORTH_END_CODE_WORD URANDOM8
422 $FORTH_CODE_WORD URANDOM88
423 ;; k8 -- generate two 8-bit random numbers
425 call random_marsaglia
430 $FORTH_END_CODE_WORD URANDOM88