diff --git a/startup.4th b/startup.4th index e2d8d4a..dee0402 100644 --- a/startup.4th +++ b/startup.4th @@ -190,22 +190,42 @@ DEFER THROW-UNWIND ( k*x n -- i*x ) : DABS ( d -- +d ) DUP 0< IF DNEGATE THEN ; +80 CONSTANT PNO-BUFFER-BYTES +CREATE PNO-BUFFER PNO-BUFFER-BYTES ALLOT +PNO-BUFFER PNO-BUFFER-BYTES + CONSTANT PNO-BUFFER-END +CREATE PNO-POINTER PNO-BUFFER-END , + +: <# ( -- ) PNO-BUFFER-END PNO-POINTER ! ; +: HOLD ( char -- ) PNO-POINTER 1 OVER -! @ C! ; +: #> ( xd -- c-addr u ) 2DROP PNO-BUFFER-END PNO-POINTER @ TUCK - ; + +' PNO-BUFFER (HIDE) +' PNO-BUFFER-END (HIDE) +' PNO-POINTER (HIDE) + +: SIGN ( n -- ) 0< IF [CHAR] - HOLD THEN ; + +: #B ( ud1 u -- ud2 ) + UM/MOD ROT DUP 10 >= IF + 10 - [CHAR] A + + ELSE + [CHAR] 0 + + THEN HOLD ; + +: # ( ud1 -- ud2 ) 10 #B ; + +: #SB ( ud u -- ) + >R BEGIN R@ #B 2DUP D0= UNTIL RDROP ; + +: #S ( ud -- ) 10 #SB ; + \ Display the unsigned number at the top of the stack -: U. ( u -- "" ) - \ Start with the highest place-value on the left - 1000000000 - \ Skip place-values that would be larger than the input - BEGIN 2DUP U< OVER 1 U> AND WHILE 10 U/ REPEAT - \ Emit the remaining digits down to the units' place - BEGIN - TUCK U/MOD [CHAR] 0 + EMIT SWAP - DUP 1 U<= IF 2DROP EXIT THEN - 10 U/ - AGAIN ; +: DU. ( ud -- "" ) <# #S #> TYPE ; +: U. ( u -- "" ) 0 DU. ; \ Display the signed number at the top of the stack -: . ( n -- "" ) - DUP 0< IF [CHAR] - EMIT NEGATE THEN U. ; +: D. ( d -- "" ) DUP -ROT DABS <# #S ROT SIGN #> TYPE ; +: . ( n -- "" ) S>D D. ; \ Display the content of the data stack : .DS ( -- "" )