http://t3x.org/t3xforth/double.html   (light|dark)

T3XFORTH Logo

T3XFORTH

 
\ T3XFORTH Double Words
\ Nils M Holm, 2021
\ Public domain / CC0 License

: 2ROT ( d1 d2 d3 -- d2 d3 d1 ) >R >R 2SWAP R> R> 2SWAP ;

: D0= ( d -- f ) OR 0= ;

: D0< ( d -- f ) NIP 0< ;

: D- ( d d -- d ) DNEGATE D+ ;

: DU< ( ud ud -- f ) ROT SWAP U< IF 2DROP -1 EXIT THEN U< ;

: D= ( d d -- f ) ROT = -ROT = AND ;

: D> ( d d -- f ) 2SWAP D< ;

: DABS ( d -- ud ) 2DUP 0 0 D< IF DNEGATE THEN ;

: DMAX ( d1 d2 -- d ) 2OVER 2OVER D< IF 2SWAP THEN 2DROP ;
: DMIN ( d1 d2 -- d ) 2OVER 2OVER D> IF 2SWAP THEN 2DROP ;

VARIABLE TMP 0 ,

: DU* ( ul1 uh1 ul2 uh2 -- ud ) >R >R  ( i'=uh2 i=ul2 )
  OVER I' UM* DROP 0 SWAP TMP 2!       (   ul1 * uh2 * 2^16)
  I UM* DROP 0 SWAP TMP 2@ D+ TMP 2!   ( + uh1 * ul2 * 2^16)
  R> UM* TMP 2@ D+                     ( + ul1 * ul2 )
  R> DROP ;

: UDM/MOD ( ul uh u -- um ul uh )
  2DUP 0 SWAP UM/MOD  ( ul uh u mod uh/u )
  >R >R NIP R> SWAP   ( ul mod u ; uh/u )
  UM/MOD R> ;

: <# ( ud -- ud ) PAD HLD ! ;

: # ( ud -- ud ) BASE @ UDM/MOD  ROT DIGIT HOLD ;

: #S ( ud -- 0d ) BEGIN # 2DUP D0= 0= WHILE REPEAT ;

: SIGN ( n ud -- ud ) ROT 0< IF [CHAR] - HOLD THEN ;

: #> ( ud -- a u ) 2DROP HLD @ PAD OVER - ;

: D.  ( d -- )      DUP -ROT DABS <# #S SIGN #> TYPE SPACE ;
: D.R ( d n -- ) >R DUP -ROT DABS <# #S SIGN #> R> (PAD) TYPE ;

: 2VARIABLE ( -- ) VARIABLE 0 , ;

: 2CONSTANT ( d -- ) <BUILDS , , DOES> 2@ ;

: CONVERT ( ud a -- ud a ) 1+  0 DBL !  BEGIN
    DUP C@ ?DIGIT IF ( d a digit )
      2SWAP BASE @ 0 DU* 0 -ROT D+ ROT 1+ ELSE
    DUP C@ [CHAR] , = IF 1+  -1 DBL !     ELSE
      EXIT THEN THEN  AGAIN ;

: ?NUMBER ( a -- d T | F )
  DUP 1+ C@ [CHAR] - = DUP >R IF 1+ THEN
  0 0 ROT CONVERT
  C@ BL <> IF 2DROP R> DROP 0 EXIT THEN
  R> IF DNEGATE THEN  -1 ;

: NUMBER ( a -- n | d ) DUP ?NUMBER IF ROT DROP
    DBL @ 0= IF DROP THEN EXIT THEN  ?WHAT ;

' NUMBER 'NUMBER !

: (FENCE) ;
' (FENCE) >NFA FENCE !
 

contact | privacy