X-Git-Url: http://git.subgeniuskitty.com/pforth/.git/blobdiff_plain/bb6b2dcdd9acffabfd373c4c3f6b64a9cc43f335..40c6f87ff261cacf78377241c8746da1aaa504c5:/fth/t_corex.fth diff --git a/fth/t_corex.fth b/fth/t_corex.fth index d747941..405b5c1 100644 --- a/fth/t_corex.fth +++ b/fth/t_corex.fth @@ -1,226 +1,319 @@ -\ @(#) t_corex.fth 98/03/16 1.2 -\ Test ANS Forth Core Extensions -\ -\ Copyright 1994 3DO, Phil Burk - -INCLUDE? }T{ t_tools.fth - -ANEW TASK-T_COREX.FTH - -DECIMAL - -\ STUB because missing definition in pForth - FIXME -: SAVE-INPUT ; -: RESTORE-INPUT -1 ; - -TEST{ - -\ ========================================================== -T{ 1 2 3 }T{ 1 2 3 }T - -\ ----------------------------------------------------- .( -T{ 27 .( IF YOU SEE THIS THEN .( WORKED!) }T{ 27 }T - -CR .( 1234 - SHOULD LINE UP WITH NEXT LINE.) CR 1234 8 .R CR - -T{ .( ) 987 .( TEST NULL STRING IN .( ) CR }T{ 987 }T - -\ ----------------------------------------------------- 0<> -T{ 5 0<> }T{ TRUE }T -T{ 0 0<> }T{ 0 }T -T{ -1000 0<> }T{ TRUE }T - -\ ----------------------------------------------------- 2>R 2R> 2R@ -: T2>R ( -- .... ) - 17 - 20 5 2>R - 19 - 2R@ - 37 - 2R> -\ 2>R should be the equivalent of SWAP >R >R so this next construct -\ should reduce to a SWAP. - 88 77 2>R R> R> -; -T{ T2>R }T{ 17 19 20 5 37 20 5 77 88 }T - -\ ----------------------------------------------------- :NONAME -T{ :NONAME 100 50 + ; EXECUTE }T{ 150 }T - -\ ----------------------------------------------------- <> -T{ 12345 12305 <> }T{ TRUE }T -T{ HEX 98765432 98765432 DECIMAL <> }T{ 0 }T - -\ ----------------------------------------------------- ?DO -: T?DO ( n -- sum_n ) 0 SWAP 1+ 0 ?DO i + LOOP ; -T{ 0 T?DO }T{ 0 }T -T{ 4 T?DO }T{ 10 }T - -\ ----------------------------------------------------- AGAIN -: T.AGAIN ( n -- ) - BEGIN - DUP . - DUP 6 < IF EXIT THEN - 1- - AGAIN -; -T{ 10 T.AGAIN CR }T{ 5 }T - -\ ----------------------------------------------------- C" -: T.C" ( -- $STRING ) - C" x5&" -; -T{ T.C" C@ }T{ 3 }T -T{ T.C" COUNT DROP C@ }T{ CHAR x }T -T{ T.C" COUNT DROP CHAR+ C@ }T{ CHAR 5 }T -T{ T.C" COUNT DROP 2 CHARS + C@ }T{ CHAR & }T - -\ ----------------------------------------------------- CASE -: T.CASE ( N -- ) - CASE - 1 OF 101 ENDOF - 27 OF 892 ENDOF - 941 SWAP \ default - ENDCASE -; -T{ 1 T.CASE }T{ 101 }T -T{ 27 T.CASE }T{ 892 }T -T{ 49 T.CASE }T{ 941 }T - -\ ----------------------------------------------------- COMPILE, -: COMPILE.SWAP ['] SWAP COMPILE, ; IMMEDIATE -: T.COMPILE, - 19 20 27 COMPILE.SWAP 39 -; -T{ T.COMPILE, }T{ 19 27 20 39 }T - -\ ----------------------------------------------------- CONVERT -: T.CONVERT - 0 S>D S" 1234xyz" DROP CONVERT - >R - D>S - R> C@ -; -T{ T.CONVERT }T{ 1234 CHAR x }T - -\ ----------------------------------------------------- ERASE -: T.COMMA.SEQ ( n -- , lay down N sequential bytes ) - 0 ?DO I C, LOOP -; -CREATE T-ERASE-DATA 64 T.COMMA.SEQ -T{ T-ERASE-DATA 8 + C@ }T{ 8 }T -T{ T-ERASE-DATA 7 + 3 ERASE -T{ T-ERASE-DATA 6 + C@ }T{ 6 }T -T{ T-ERASE-DATA 7 + C@ }T{ 0 }T -T{ T-ERASE-DATA 8 + C@ }T{ 0 }T -T{ T-ERASE-DATA 9 + C@ }T{ 0 }T -T{ T-ERASE-DATA 10 + C@ }T{ 10 }T - -\ ----------------------------------------------------- FALSE -T{ FALSE }T{ 0 }T - -\ ----------------------------------------------------- HEX -T{ HEX 10 DECIMAL }T{ 16 }T - -\ ----------------------------------------------------- MARKER -: INDIC? ( -- ifInDic , is the following word defined? ) - bl word find - swap drop 0= 0= -; -create FOOBAR -MARKER MYMARK \ create word that forgets itself -create GOOFBALL -MYMARK -T{ indic? foobar indic? mymark indic? goofball }T{ true false false }T - -\ ----------------------------------------------------- NIP -T{ 33 44 55 NIP }T{ 33 55 }T - -\ ----------------------------------------------------- PARSE -: T.PARSE ( char char -- addr num ) - PARSE - >R \ save length - PAD R@ CMOVE \ move string to pad - PAD R> -; -T{ CHAR % T.PARSE wxyz% SWAP C@ }T{ 4 CHAR w }T - -\ ----------------------------------------------------- PICK -T{ 13 12 11 10 2 PICK }T{ 13 12 11 10 12 }T - -\ ----------------------------------------------------- QUERY -T{ ' QUERY 0<> }T{ TRUE }T - -\ ----------------------------------------------------- REFILL -T{ ' REFILL 0<> }T{ TRUE }T - -\ ----------------------------------------------------- RESTORE-INPUT -T{ : T.SAVE-INPUT SAVE-INPUT RESTORE-INPUT ; T.SAVE-INPUT }T{ 0 }T \ EXPECTED FAILURE - -\ ----------------------------------------------------- ROLL -T{ 15 14 13 12 11 10 0 ROLL }T{ 15 14 13 12 11 10 }T -T{ 15 14 13 12 11 10 1 ROLL }T{ 15 14 13 12 10 11 }T -T{ 15 14 13 12 11 10 2 ROLL }T{ 15 14 13 11 10 12 }T -T{ 15 14 13 12 11 10 3 ROLL }T{ 15 14 12 11 10 13 }T -T{ 15 14 13 12 11 10 4 ROLL }T{ 15 13 12 11 10 14 }T - -\ ----------------------------------------------------- SOURCE-ID -T{ SOURCE-ID 0<> }T{ TRUE }T -T{ : T.SOURCE-ID S" SOURCE-ID" EVALUATE ; T.SOURCE-ID }T{ -1 }T - -\ ----------------------------------------------------- SPAN -T{ ' SPAN 0<> }T{ TRUE }T - -\ ----------------------------------------------------- TO VALUE -333 VALUE MY-VALUE -T{ MY-VALUE }T{ 333 }T -T{ 1000 TO MY-VALUE MY-VALUE }T{ 1000 }T -: TEST.VALUE ( -- 19 100 ) - 100 TO MY-VALUE - 19 - MY-VALUE -; -T{ TEST.VALUE }T{ 19 100 }T - -\ ----------------------------------------------------- TRUE -T{ TRUE }T{ 0 0= }T - -\ ----------------------------------------------------- TUCK -T{ 44 55 66 TUCK }T{ 44 66 55 66 }T - -\ ----------------------------------------------------- U.R -HEX CR .( ABCD4321 - SHOULD LINE UP WITH NEXT LINE.) CR -ABCD4321 C U.R CR DECIMAL - -\ ----------------------------------------------------- U> -T{ -5 3 U> }T{ TRUE }T -T{ 10 8 U> }T{ TRUE }T - -\ ----------------------------------------------------- UNUSED -T{ UNUSED 0> }T{ TRUE }T - -\ ----------------------------------------------------- WITHIN -T{ 4 5 10 WITHIN }T{ 0 }T -T{ 5 5 10 WITHIN }T{ TRUE }T -T{ 9 5 10 WITHIN }T{ TRUE }T -T{ 10 5 10 WITHIN }T{ 0 }T - -T{ 4 10 5 WITHIN }T{ TRUE }T -T{ 5 10 5 WITHIN }T{ 0 }T -T{ 9 10 5 WITHIN }T{ 0 }T -T{ 10 10 5 WITHIN }T{ TRUE }T - -T{ -6 -5 10 WITHIN }T{ 0 }T -T{ -5 -5 10 WITHIN }T{ TRUE }T -T{ 9 -5 10 WITHIN }T{ TRUE }T -T{ 10 -5 10 WITHIN }T{ 0 }T - - -\ ----------------------------------------------------- [COMPILE] -: T.[COMPILE].IF [COMPILE] IF ; IMMEDIATE -: T.[COMPILE] 40 0> T.[COMPILE].IF 97 ELSE 53 THEN 97 = ; -T{ T.[COMPILE] }T{ TRUE }T - -\ ----------------------------------------------------- \ -}TEST - +\ @(#) t_corex.fth 98/03/16 1.2 +\ Test ANS Forth Core Extensions +\ +\ Copyright 1994 3DO, Phil Burk + +INCLUDE? }T{ t_tools.fth + +ANEW TASK-T_COREX.FTH + +DECIMAL + +\ STUB because missing definition in pForth - FIXME +: SAVE-INPUT ; +: RESTORE-INPUT -1 ; + +TEST{ + +\ ========================================================== +T{ 1 2 3 }T{ 1 2 3 }T + +\ ----------------------------------------------------- .( +T{ 27 .( IF YOU SEE THIS THEN .( WORKED!) }T{ 27 }T + +CR .( 1234 - SHOULD LINE UP WITH NEXT LINE.) CR 1234 8 .R CR + +T{ .( ) 987 .( TEST NULL STRING IN .( ) CR }T{ 987 }T + +\ ----------------------------------------------------- 0<> +T{ 5 0<> }T{ TRUE }T +T{ 0 0<> }T{ 0 }T +T{ -1000 0<> }T{ TRUE }T + +\ ----------------------------------------------------- 2>R 2R> 2R@ +: T2>R ( -- .... ) + 17 + 20 5 2>R + 19 + 2R@ + 37 + 2R> +\ 2>R should be the equivalent of SWAP >R >R so this next construct +\ should reduce to a SWAP. + 88 77 2>R R> R> +; +T{ T2>R }T{ 17 19 20 5 37 20 5 77 88 }T + +\ ----------------------------------------------------- :NONAME +T{ :NONAME 100 50 + ; EXECUTE }T{ 150 }T + +\ ----------------------------------------------------- <> +T{ 12345 12305 <> }T{ TRUE }T +T{ HEX 98765432 98765432 DECIMAL <> }T{ 0 }T + +\ ----------------------------------------------------- ?DO +: T?DO ( n -- sum_n ) 0 SWAP 1+ 0 ?DO i + LOOP ; +T{ 0 T?DO }T{ 0 }T +T{ 4 T?DO }T{ 10 }T + +\ ----------------------------------------------------- AGAIN +: T.AGAIN ( n -- ) + BEGIN + DUP . + DUP 6 < IF EXIT THEN + 1- + AGAIN +; +T{ 10 T.AGAIN CR }T{ 5 }T + +\ ----------------------------------------------------- C" +: T.C" ( -- $STRING ) + C" x5&" +; +T{ T.C" C@ }T{ 3 }T +T{ T.C" COUNT DROP C@ }T{ CHAR x }T +T{ T.C" COUNT DROP CHAR+ C@ }T{ CHAR 5 }T +T{ T.C" COUNT DROP 2 CHARS + C@ }T{ CHAR & }T + +\ ----------------------------------------------------- CASE +: T.CASE ( N -- ) + CASE + 1 OF 101 ENDOF + 27 OF 892 ENDOF + 941 SWAP \ default + ENDCASE +; +T{ 1 T.CASE }T{ 101 }T +T{ 27 T.CASE }T{ 892 }T +T{ 49 T.CASE }T{ 941 }T + +\ ----------------------------------------------------- COMPILE, +: COMPILE.SWAP ['] SWAP COMPILE, ; IMMEDIATE +: T.COMPILE, + 19 20 27 COMPILE.SWAP 39 +; +T{ T.COMPILE, }T{ 19 27 20 39 }T + +\ ----------------------------------------------------- CONVERT +: T.CONVERT + 0 S>D S" 1234xyz" DROP CONVERT + >R + D>S + R> C@ +; +T{ T.CONVERT }T{ 1234 CHAR x }T + +\ ----------------------------------------------------- ERASE +: T.COMMA.SEQ ( n -- , lay down N sequential bytes ) + 0 ?DO I C, LOOP +; +CREATE T-ERASE-DATA 64 T.COMMA.SEQ +T{ T-ERASE-DATA 8 + C@ }T{ 8 }T +T{ T-ERASE-DATA 7 + 3 ERASE +T{ T-ERASE-DATA 6 + C@ }T{ 6 }T +T{ T-ERASE-DATA 7 + C@ }T{ 0 }T +T{ T-ERASE-DATA 8 + C@ }T{ 0 }T +T{ T-ERASE-DATA 9 + C@ }T{ 0 }T +T{ T-ERASE-DATA 10 + C@ }T{ 10 }T + +\ ----------------------------------------------------- FALSE +T{ FALSE }T{ 0 }T + +\ ----------------------------------------------------- HEX +T{ HEX 10 DECIMAL }T{ 16 }T + +\ ----------------------------------------------------- MARKER +: INDIC? ( -- ifInDic , is the following word defined? ) + bl word find + swap drop 0= 0= +; +create FOOBAR +MARKER MYMARK \ create word that forgets itself +create GOOFBALL +MYMARK +T{ indic? foobar indic? mymark indic? goofball }T{ true false false }T + +\ ----------------------------------------------------- NIP +T{ 33 44 55 NIP }T{ 33 55 }T + +\ ----------------------------------------------------- PARSE +: T.PARSE ( char char -- addr num ) + PARSE + >R \ save length + PAD R@ CMOVE \ move string to pad + PAD R> +; +T{ CHAR % T.PARSE wxyz% SWAP C@ }T{ 4 CHAR w }T + +\ ----------------------------------------------------- PICK +T{ 13 12 11 10 2 PICK }T{ 13 12 11 10 12 }T + +\ ----------------------------------------------------- QUERY +T{ ' QUERY 0<> }T{ TRUE }T + +\ ----------------------------------------------------- REFILL +T{ ' REFILL 0<> }T{ TRUE }T + +\ ----------------------------------------------------- RESTORE-INPUT +T{ : T.SAVE-INPUT SAVE-INPUT RESTORE-INPUT ; T.SAVE-INPUT }T{ 0 }T \ EXPECTED FAILURE + +\ ----------------------------------------------------- ROLL +T{ 15 14 13 12 11 10 0 ROLL }T{ 15 14 13 12 11 10 }T +T{ 15 14 13 12 11 10 1 ROLL }T{ 15 14 13 12 10 11 }T +T{ 15 14 13 12 11 10 2 ROLL }T{ 15 14 13 11 10 12 }T +T{ 15 14 13 12 11 10 3 ROLL }T{ 15 14 12 11 10 13 }T +T{ 15 14 13 12 11 10 4 ROLL }T{ 15 13 12 11 10 14 }T + +\ ----------------------------------------------------- SOURCE-ID +T{ SOURCE-ID 0<> }T{ TRUE }T +T{ : T.SOURCE-ID S" SOURCE-ID" EVALUATE ; T.SOURCE-ID }T{ -1 }T + +\ ----------------------------------------------------- SPAN +T{ ' SPAN 0<> }T{ TRUE }T + +\ ----------------------------------------------------- TO VALUE +333 VALUE MY-VALUE +T{ MY-VALUE }T{ 333 }T +T{ 1000 TO MY-VALUE MY-VALUE }T{ 1000 }T +: TEST.VALUE ( -- 19 100 ) + 100 TO MY-VALUE + 19 + MY-VALUE +; +T{ TEST.VALUE }T{ 19 100 }T + +\ ----------------------------------------------------- TRUE +T{ TRUE }T{ 0 0= }T + +\ ----------------------------------------------------- TUCK +T{ 44 55 66 TUCK }T{ 44 66 55 66 }T + +\ ----------------------------------------------------- U.R +HEX CR .( ABCD4321 - SHOULD LINE UP WITH NEXT LINE.) CR +ABCD4321 C U.R CR DECIMAL + +\ ----------------------------------------------------- U> +T{ -5 3 U> }T{ TRUE }T +T{ 10 8 U> }T{ TRUE }T + +\ ----------------------------------------------------- UNUSED +T{ UNUSED 0> }T{ TRUE }T + +\ ----------------------------------------------------- WITHIN +T{ 4 5 10 WITHIN }T{ 0 }T +T{ 5 5 10 WITHIN }T{ TRUE }T +T{ 9 5 10 WITHIN }T{ TRUE }T +T{ 10 5 10 WITHIN }T{ 0 }T + +T{ 4 10 5 WITHIN }T{ TRUE }T +T{ 5 10 5 WITHIN }T{ 0 }T +T{ 9 10 5 WITHIN }T{ 0 }T +T{ 10 10 5 WITHIN }T{ TRUE }T + +T{ -6 -5 10 WITHIN }T{ 0 }T +T{ -5 -5 10 WITHIN }T{ TRUE }T +T{ 9 -5 10 WITHIN }T{ TRUE }T +T{ 10 -5 10 WITHIN }T{ 0 }T + + +\ ----------------------------------------------------- [COMPILE] +: T.[COMPILE].IF [COMPILE] IF ; IMMEDIATE +: T.[COMPILE] 40 0> T.[COMPILE].IF 97 ELSE 53 THEN 97 = ; +T{ T.[COMPILE] }T{ TRUE }T + +\ ----------------------------------------------------- \ + +\ .( TESTING DO +LOOP with large and small increments ) + +\ Contributed by Andrew Haley +0 invert CONSTANT MAX-UINT +0 INVERT 1 RSHIFT CONSTANT MAX-INT +0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT +MAX-UINT 8 RSHIFT 1+ CONSTANT USTEP +USTEP NEGATE CONSTANT -USTEP +MAX-INT 7 RSHIFT 1+ CONSTANT STEP +STEP NEGATE CONSTANT -STEP + +VARIABLE BUMP + +T{ : GD8 BUMP ! DO 1+ BUMP @ +LOOP ; }T{ }T + +T{ 0 MAX-UINT 0 USTEP GD8 }T{ 256 }T +T{ 0 0 MAX-UINT -USTEP GD8 }T{ 256 }T + +T{ 0 MAX-INT MIN-INT STEP GD8 }T{ 256 }T +T{ 0 MIN-INT MAX-INT -STEP GD8 }T{ 256 }T + +\ Two's complement arithmetic, wraps around modulo wordsize +\ Only tested if the Forth system does wrap around, use of conditional +\ compilation deliberately avoided + +MAX-INT 1+ MIN-INT = CONSTANT +WRAP? +MIN-INT 1- MAX-INT = CONSTANT -WRAP? +MAX-UINT 1+ 0= CONSTANT +UWRAP? +0 1- MAX-UINT = CONSTANT -UWRAP? + +: GD9 ( n limit start step f result -- ) + >R IF GD8 ELSE 2DROP 2DROP R@ THEN }T{ R> }T +; + +T{ 0 0 0 USTEP +UWRAP? 256 GD9 +T{ 0 0 0 -USTEP -UWRAP? 1 GD9 +T{ 0 MIN-INT MAX-INT STEP +WRAP? 1 GD9 +T{ 0 MAX-INT MIN-INT -STEP -WRAP? 1 GD9 + +\ -------------------------------------------------------------------------- +\ .( TESTING DO +LOOP with maximum and minimum increments ) + +: (-MI) MAX-INT DUP NEGATE + 0= IF MAX-INT NEGATE ELSE -32767 THEN ; +(-MI) CONSTANT -MAX-INT + +T{ 0 1 0 MAX-INT GD8 }T{ 1 }T +T{ 0 -MAX-INT NEGATE -MAX-INT OVER GD8 }T{ 2 }T + +T{ 0 MAX-INT 0 MAX-INT GD8 }T{ 1 }T +T{ 0 MAX-INT 1 MAX-INT GD8 }T{ 1 }T +T{ 0 MAX-INT -1 MAX-INT GD8 }T{ 2 }T +T{ 0 MAX-INT DUP 1- MAX-INT GD8 }T{ 1 }T + +T{ 0 MIN-INT 1+ 0 MIN-INT GD8 }T{ 1 }T +T{ 0 MIN-INT 1+ -1 MIN-INT GD8 }T{ 1 }T +T{ 0 MIN-INT 1+ 1 MIN-INT GD8 }T{ 2 }T +T{ 0 MIN-INT 1+ DUP MIN-INT GD8 }T{ 1 }T + +\ ---------------------------------------------------------------------------- +\ .( TESTING number prefixes # $ % and 'c' character input ) +\ Adapted from the Forth 200X Draft 14.5 document + +VARIABLE OLD-BASE +DECIMAL BASE @ OLD-BASE ! +T{ #1289 }T{ 1289 }T +T{ #-1289 }T{ -1289 }T +T{ $12eF }T{ 4847 }T +T{ $-12eF }T{ -4847 }T +T{ %10010110 }T{ 150 }T +T{ %-10010110 }T{ -150 }T +T{ 'z' }T{ 122 }T +T{ 'Z' }T{ 90 }T +\ Check BASE is unchanged +T{ BASE @ OLD-BASE @ = }T{ TRUE }T + +\ Repeat in Hex mode +16 OLD-BASE ! 16 BASE ! +T{ #1289 }T{ 509 }T +T{ #-1289 }T{ -509 }T +T{ $12eF }T{ 12EF }T +T{ $-12eF }T{ -12EF }T +T{ %10010110 }T{ 96 }T +T{ %-10010110 }T{ -96 }T +T{ 'z' }T{ 7a }T +T{ 'Z' }T{ 5a }T +\ Check BASE is unchanged +T{ BASE @ OLD-BASE @ = }T{ TRUE }T \ 2 + +DECIMAL +\ Check number prefixes in compile mode +T{ : nmp #8327 $-2cbe %011010111 ''' ; nmp }T{ 8327 -11454 215 39 }T + +}TEST +