1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; UrForth level
1: self
-hosting
32-bit Forth compiler
3 ;; Copyright
(C
) 2020 Ketmar Dark
// Invisible Vector
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ;; this is the only thing we need
to print unsigned
double numbers
9 code: UDS/MOD ( ud1 u1 --> ud2 u2 )
26 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27 ;; this is the only thing
(besides the one above
) we need
to print signed
double numbers
28 code: DABS ( d -- |d| )
45 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
46 ;; rest of the
double math
48 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
49 code: DNEGATE ( d -- -d )
62 code: DSGN ( d -- -1/0/1 )
76 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91 ;; with overflow clamping
101 ;; with overflow clamping
105 ;; overflow or negative
108 ;; definitely negative
117 ;; positive
, check
for positive overflow
130 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
131 code: 2AND ( d0lo d0hi d1lo d1hi -- d0lo&d1lo d0hi&d1hi )
139 code: 2OR ( d0lo d0hi d1lo d1hi -- d0lo|d1lo d0hi|d1hi )
147 code: 2XOR ( d0lo d0hi d1lo d1hi -- d0lo^d1lo d0hi^d1hi )
156 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
157 code: DLSHIFT ( u cnt -- )
182 code: DRSHIFT ( u cnt -- )
208 code: DARSHIFT ( u cnt -- )
237 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
238 code: UM* ( u0 u1 -- ud )
247 code: UM/MOD ( ud1 u1 -- umod ures )
256 code: UM/ ( ud1 u1 -- ures )
264 code: UMMOD ( ud1 u1 -- umod )
273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274 code: M* ( n0 n1 -- d )
283 code: M/MOD ( d1 n1 -- nmod nres )
292 code: M/ ( d1 n1 -- nres )
300 code: MMOD ( d1 n1 -- nmod )
309 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
310 code: D2* ( d -- d*2 )
321 code: D2/ ( d -- d/2 )
332 code: D2U/ ( d1 -- d/2 )
344 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 code: D0= ( d -- flag )
358 code: D0!= ( d -- flag )
371 code: D0< ( d -- flag )
383 code: D0> ( d -- flag )
399 code: D0<= ( d -- flag )
417 code: D0>= ( d -- flag )
436 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
437 code: D+ ( d1 d2 -- d )
453 code: D- ( d1 d2 -- d )
470 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
471 code: D= ( d1 d2 -- flag )
490 code: D<> ( d1 d2 -- flag )
509 code: D< ( d1 d2 -- flag )
517 ;; d1
-d2
: d1
<d2
:C
; d1
>d2
:nc
525 code: D> ( d1 d2 -- flag )
541 code: DU< ( ud1 ud2 -- flag )
557 code: DU> ( ud1 ud2 -- flag )
573 code: DU<= ( ud1 ud2 -- flag )
588 code: DU>= ( ud1 ud2 -- flag )
604 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
605 : DMAX
( d1 d2
-- max
[d1
,d2
] ) 2over
2over d
< if 2swap
endif 2drop
;
606 : DMIN
( d1 d2
-- min
[d1
,d2
] ) 2over
2over d
> if 2swap
endif 2drop
;
607 : 2ROT
( x1 x2 x3 x4 x5 x6
-- x3 x4 x5 x6 x1 x2
) 2>r
2swap
2r
> 2swap
;
608 : 2NROT
( x1 x2 x3 x4 x5 x6
-- x5 x6 x1 x2 x3 x4
) 2swap
2>r
2swap
2r
> ;
610 : M
+ ( d1|ud1 n
-- d2|ud2
) s
>d d
+ ;
613 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
614 code: UDS* ( ud1 u --> ud2 )
632 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
633 ;; 32-bit sqrt
(because why not?
)
637 r@
2* 1+ 2dup u
>= if - r
> 1+ >r
else drop
endif r
>
643 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
644 code: UD*UD ( ud0lo ud0hi ud1lo ud1hi -- ud2lo ud2hi )