2 \ some sections were removed
, because i either not implemented them
, or they are implemented differently
3 \ also
, the test was modified
to use
1 as true value
4 \ some other changes were made
to accomodate UrForth specifics
9 false constant noisy
-tests
15 \
(C
) 1993 JOHNS HOPKINS UNIVERSITY
/ APPLIED PHYSICS LABORATORY
16 \ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS
.
20 \ SET THE FOLLOWING FLAG
TO TRUE
FOR MORE VERBOSE OUTPUT
; THIS MAY
21 \ ALLOW YOU
TO TELL WHICH TEST CAUSED YOUR SYSTEM
TO HANG
.
25 : EMPTY
-STACK \
( ... -- ) EMPTY STACK
.
26 DEPTH ?DUP
IF 0 DO DROP LOOP
THEN ;
28 : TEST
-ERROR \
( C
-ADDR U
-- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
29 \ THE LINE THAT HAD THE ERROR
.
30 \ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING
TO ERROR
31 \ EMPTY
-STACK \ THROW AWAY EVERY THING
ELSE
33 type
." at line " TIB
-CURR
-LINE
. cr
35 \ tib @
>in @
1- + c@
&d10
= if -1 >in
+! endif
37 \ tib @
>in @
1- + c@
&d32
<=
51 ." -----------------------" cr
61 VARIABLE ACTUAL
-DEPTH \ STACK RECORD
62 CREATE ACTUAL-RESULTS 20 CELLS ALLOT
64 : { \
( -- ) SYNTACTIC SUGAR
.
67 : -> \
( ... -- ) RECORD DEPTH AND CONTENT OF STACK
.
68 DEPTH DUP ACTUAL
-DEPTH
! \ RECORD DEPTH
69 ?DUP
IF \
IF THERE IS SOMETHING ON STACK
70 0 DO ACTUAL
-RESULTS I CELLS
+ ! LOOP \ SAVE THEM
73 : } \
( ... -- ) COMPARE STACK
(EXPECTED
) CONTENTS WITH SAVED
75 DEPTH ACTUAL
-DEPTH @
= IF \
IF DEPTHS MATCH
76 DEPTH ?DUP
IF \
IF THERE IS SOMETHING ON THE STACK
77 0 DO \
FOR EACH STACK ITEM
78 ACTUAL
-RESULTS I CELLS
+ @ \ COMPARE ACTUAL WITH EXPECTED
79 <> IF S
" INCORRECT RESULT: " TEST
-ERROR LEAVE
THEN
83 \ S
" WRONG NUMBER OF RESULTS: " TEST
-ERROR
84 ." expected " depth
. ." results, but got " ACTUAL
-DEPTH @
. cr
85 S
" WRONG NUMBER OF RESULTS: " TEST
-ERROR
88 : TESTING \
( -- ) TALKING COMMENT
.
90 \
IF DUP
>R TYPE CR R
> >IN
!
111 \
>From
: john@netnews
.jhuapl
.edu
(John Hayes
)
112 \ Subject
: Testing CORE Words
(coretest
.fr
)
114 \
(C
) 1993 JOHNS HOPKINS UNIVERSITY
/ APPLIED PHYSICS LABORATORY
115 \ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS
.
117 \ THIS
PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM
.
118 \ THE
PROGRAM ASSUMES A TWO
'S COMPLEMENT IMPLEMENTATION WHERE
119 \ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
120 \ THE RANGE OF UNSIGNED NUMBER IS 0 ... 2^(N)-1.
121 \ I HAVEN'T FIGURED OUT HOW
TO TEST KEY
, QUIT
, ABORT
, OR ABORT
"...
122 \ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
127 \ ------------------------------------------------------------------------
128 TESTING BOOLEANS: INVERT AND OR XOR
135 { 0 INVERT 1 AND -> 1 }
136 { 1 INVERT 1 AND -> 0 }
159 \ ------------------------------------------------------------------------
160 TESTING 2* 2/ LSHIFT RSHIFT
163 1 BEGIN DUP 2* WHILE 2* REPEAT ;
164 FIND-MSB CONSTANT MSB
169 { 0 INVERT 2* 1 XOR -> 0 INVERT }
175 { 0 INVERT 2/ -> 0 INVERT } \ MSB PROPOGATED
176 { 0 INVERT 1 XOR 2/ -> 0 INVERT }
177 { MSB 2/ MSB AND -> MSB }
182 { 1 F LSHIFT -> 8000 } \ BIGGEST GUARANTEED SHIFT
183 { 0 INVERT 1 LSHIFT 1 XOR -> 0 INVERT }
184 { MSB 1 LSHIFT -> 0 }
190 { 8000 F RSHIFT -> 1 } \ BIGGEST
191 { MSB 1 RSHIFT MSB AND -> 0 } \ RSHIFT ZERO FILLS MSBS
192 { MSB 1 RSHIFT 2* -> MSB }
194 \ ------------------------------------------------------------------------
195 TESTING COMPARISONS: 0= = 0< < > U< MIN MAX D<
196 0 INVERT CONSTANT MAX-UINT
197 0 INVERT 1 RSHIFT CONSTANT MAX-INT
198 0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
199 0 INVERT 1 RSHIFT CONSTANT MID-UINT
200 0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
203 \ 1S CONSTANT <TRUE> \ k8: nope
206 { -> } \ START WITH CLEAN SLATE
211 { MAX-UINT 0= -> <FALSE> }
212 { MIN-INT 0= -> <FALSE> }
213 { MAX-INT 0= -> <FALSE> }
217 { -1 -1 = -> <TRUE> }
219 { -1 0 = -> <FALSE> }
221 { 0 -1 = -> <FALSE> }
225 { MIN-INT 0< -> <TRUE> }
227 { MAX-INT 0< -> <FALSE> }
233 { MIN-INT 0 < -> <TRUE> }
234 { MIN-INT MAX-INT < -> <TRUE> }
235 { 0 MAX-INT < -> <TRUE> }
240 { 0 -1 < -> <FALSE> }
241 { 1 -1 < -> <FALSE> }
242 { 0 MIN-INT < -> <FALSE> }
243 { MAX-INT MIN-INT < -> <FALSE> }
244 { MAX-INT 0 < -> <FALSE> }
248 { -1 0 > -> <FALSE> }
249 { -1 1 > -> <FALSE> }
250 { MIN-INT 0 > -> <FALSE> }
251 { MIN-INT MAX-INT > -> <FALSE> }
252 { 0 MAX-INT > -> <FALSE> }
259 { 0 MIN-INT > -> <TRUE> }
260 { MAX-INT MIN-INT > -> <TRUE> }
261 { MAX-INT 0 > -> <TRUE> }
265 { 0 MID-UINT U< -> <TRUE> }
266 { 0 MAX-UINT U< -> <TRUE> }
267 { MID-UINT MAX-UINT U< -> <TRUE> }
268 { 0 0 U< -> <FALSE> }
269 { 1 1 U< -> <FALSE> }
270 { 1 0 U< -> <FALSE> }
271 { 2 1 U< -> <FALSE> }
272 { MID-UINT 0 U< -> <FALSE> }
273 { MAX-UINT 0 U< -> <FALSE> }
274 { MAX-UINT MID-UINT U< -> <FALSE> }
280 { MIN-INT 0 MIN -> MIN-INT }
281 { MIN-INT MAX-INT MIN -> MIN-INT }
282 { 0 MAX-INT MIN -> 0 }
289 { 0 MIN-INT MIN -> MIN-INT }
290 { MAX-INT MIN-INT MIN -> MIN-INT }
291 { MAX-INT 0 MIN -> 0 }
297 { MIN-INT 0 MAX -> 0 }
298 { MIN-INT MAX-INT MAX -> MAX-INT }
299 { 0 MAX-INT MAX -> MAX-INT }
306 { 0 MIN-INT MAX -> 0 }
307 { MAX-INT MIN-INT MAX -> MAX-INT }
308 { MAX-INT 0 MAX -> MAX-INT }
310 \ .( MIN-INT: ) MIN-INT . cr
311 \ .( MAX-INT: ) MAX-INT . cr
313 { 1 S>D 1 S>D D< -> 0 }
314 { -1 S>D -1 S>D D< -> 0 }
315 { -1 S>D 0 S>D D< -> true }
316 { 0 S>D -1 S>D D< -> 0 }
317 { MIN-INT 1 SWAP 2 S>D D< -> true }
318 { 2 S>D MIN-INT 1 SWAP D< -> 0 }
320 { 1 S>D 1 S>D D> -> false }
321 { -1 S>D -1 S>D D> -> false }
322 { -1 S>D 0 S>D D> -> false }
323 { 0 S>D -1 S>D D> -> true }
324 { MIN-INT 1 SWAP 2 S>D D> -> false }
325 { 2 S>D MIN-INT 1 SWAP D> -> true }
328 \ ------------------------------------------------------------------------
329 TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP PICK
331 { 1 2 3 0 PICK -> 1 2 3 3 }
333 { 1 2 2DUP -> 1 2 1 2 }
334 { 1 2 3 4 2OVER -> 1 2 3 4 1 2 }
335 { 1 2 3 4 2SWAP -> 3 4 1 2 }
341 { 0 1 DEPTH -> 0 1 2 }
345 { 1 2 OVER -> 1 2 1 }
346 { 1 2 3 ROT -> 2 3 1 }
349 \ ------------------------------------------------------------------------
353 { : GR2 >R R@ R> DROP ; -> }
356 { 1S GR1 -> 1S } ( RETURN STACK HOLDS CELLS )
358 \ ------------------------------------------------------------------------
359 TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
370 { MID-UINT 1 + -> MID-UINT+1 }
381 { MID-UINT+1 1 - -> MID-UINT }
386 { MID-UINT 1+ -> MID-UINT+1 }
391 { MID-UINT+1 1- -> MID-UINT }
402 { MIN-INT ABS -> MID-UINT+1 }
404 \ ------------------------------------------------------------------------
405 TESTING MULTIPLY: S>D * M* UM*
412 { MIN-INT S>D -> MIN-INT -1 }
413 { MAX-INT S>D -> MAX-INT 0 }
421 { -3 3 M* -> -9 S>D }
422 { 3 -3 M* -> -9 S>D }
423 { -3 -3 M* -> 9 S>D }
424 { 0 MIN-INT M* -> 0 S>D }
425 { 1 MIN-INT M* -> MIN-INT S>D }
426 { 2 MIN-INT M* -> 0 1S }
427 { 0 MAX-INT M* -> 0 S>D }
428 { 1 MAX-INT M* -> MAX-INT S>D }
429 { 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }
430 { MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }
431 { MAX-INT MIN-INT M* -> MSB MSB 2/ }
432 { MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }
434 { 0 0 * -> 0 } \ TEST IDENTITIES
444 { MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }
445 { MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }
446 { MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }
455 { MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }
456 { MID-UINT+1 2 UM* -> 0 1 }
457 { MID-UINT+1 4 UM* -> 0 2 }
458 { 1S 2 UM* -> 1S 1 LSHIFT 1 }
459 { MAX-UINT MAX-UINT UM* -> 1 1 INVERT }
461 \ ------------------------------------------------------------------------
462 TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
464 { 0 S>D 1 FM/MOD -> 0 0 }
465 { 1 S>D 1 FM/MOD -> 0 1 }
466 { 2 S>D 1 FM/MOD -> 0 2 }
467 { -1 S>D 1 FM/MOD -> 0 -1 }
468 { -2 S>D 1 FM/MOD -> 0 -2 }
469 { 0 S>D -1 FM/MOD -> 0 0 }
470 { 1 S>D -1 FM/MOD -> 0 -1 }
471 { 2 S>D -1 FM/MOD -> 0 -2 }
472 { -1 S>D -1 FM/MOD -> 0 1 }
473 { -2 S>D -1 FM/MOD -> 0 2 }
474 { 2 S>D 2 FM/MOD -> 0 1 }
475 { -1 S>D -1 FM/MOD -> 0 1 }
476 { -2 S>D -2 FM/MOD -> 0 1 }
477 { 7 S>D 3 FM/MOD -> 1 2 }
478 { 7 S>D -3 FM/MOD -> -2 -3 }
479 { -7 S>D 3 FM/MOD -> 2 -3 }
480 { -7 S>D -3 FM/MOD -> -1 2 }
481 { MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }
482 { MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }
483 { MAX-INT S>D MAX-INT FM/MOD -> 0 1 }
484 { MIN-INT S>D MIN-INT FM/MOD -> 0 1 }
485 { 1S 1 4 FM/MOD -> 3 MAX-INT }
486 { 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }
487 { 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }
488 { 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }
489 { 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }
490 { 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }
491 { 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }
492 { 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }
493 { 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }
494 { MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }
495 { MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }
496 { MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }
497 { MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }
499 { 0 S>D 1 SM/REM -> 0 0 }
500 { 1 S>D 1 SM/REM -> 0 1 }
501 { 2 S>D 1 SM/REM -> 0 2 }
502 { -1 S>D 1 SM/REM -> 0 -1 }
503 { -2 S>D 1 SM/REM -> 0 -2 }
504 { 0 S>D -1 SM/REM -> 0 0 }
505 { 1 S>D -1 SM/REM -> 0 -1 }
506 { 2 S>D -1 SM/REM -> 0 -2 }
507 { -1 S>D -1 SM/REM -> 0 1 }
508 { -2 S>D -1 SM/REM -> 0 2 }
509 { 2 S>D 2 SM/REM -> 0 1 }
510 { -1 S>D -1 SM/REM -> 0 1 }
511 { -2 S>D -2 SM/REM -> 0 1 }
512 { 7 S>D 3 SM/REM -> 1 2 }
513 { 7 S>D -3 SM/REM -> 1 -2 }
514 { -7 S>D 3 SM/REM -> -1 -2 }
515 { -7 S>D -3 SM/REM -> -1 2 }
516 { MAX-INT S>D 1 SM/REM -> 0 MAX-INT }
517 { MIN-INT S>D 1 SM/REM -> 0 MIN-INT }
518 { MAX-INT S>D MAX-INT SM/REM -> 0 1 }
519 { MIN-INT S>D MIN-INT SM/REM -> 0 1 }
520 { 1S 1 4 SM/REM -> 3 MAX-INT }
521 { 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }
522 { 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }
523 { 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }
524 { 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }
525 { MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }
526 { MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }
527 { MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }
528 { MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }
530 { 0 0 1 UM/MOD -> 0 0 }
531 { 1 0 1 UM/MOD -> 0 1 }
532 { 1 0 2 UM/MOD -> 1 0 }
533 { 3 0 2 UM/MOD -> 1 1 }
534 { MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }
535 { MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }
536 { MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }
539 [ -3 2 / -2 = ( INVERT ) not ] LITERAL IF POSTPONE \ THEN ;
541 [ -3 2 / -1 = ( INVERT ) not ] LITERAL IF POSTPONE \ THEN ;
543 \ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
544 \ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
545 IFFLOORED : T/MOD >R S>D R> FM/MOD ;
546 IFFLOORED : T/ T/MOD SWAP DROP ;
547 IFFLOORED : TMOD T/MOD DROP ;
548 IFFLOORED : T*/MOD >R M* R> FM/MOD ;
549 IFFLOORED : T*/ T*/MOD SWAP DROP ;
550 IFSYM : T/MOD >R S>D R> SM/REM ;
551 IFSYM : T/ T/MOD SWAP DROP ;
552 IFSYM : TMOD T/MOD DROP ;
553 IFSYM : T*/MOD >R M* R> SM/REM ;
554 IFSYM : T*/ T*/MOD SWAP DROP ;
556 { 0 1 /MOD -> 0 1 T/MOD }
557 { 1 1 /MOD -> 1 1 T/MOD }
558 { 2 1 /MOD -> 2 1 T/MOD }
559 { -1 1 /MOD -> -1 1 T/MOD }
560 { -2 1 /MOD -> -2 1 T/MOD }
561 { 0 -1 /MOD -> 0 -1 T/MOD }
562 { 1 -1 /MOD -> 1 -1 T/MOD }
563 { 2 -1 /MOD -> 2 -1 T/MOD }
564 { -1 -1 /MOD -> -1 -1 T/MOD }
565 { -2 -1 /MOD -> -2 -1 T/MOD }
566 { 2 2 /MOD -> 2 2 T/MOD }
567 { -1 -1 /MOD -> -1 -1 T/MOD }
568 { -2 -2 /MOD -> -2 -2 T/MOD }
569 { 7 3 /MOD -> 7 3 T/MOD }
570 { 7 -3 /MOD -> 7 -3 T/MOD }
571 { -7 3 /MOD -> -7 3 T/MOD }
572 { -7 -3 /MOD -> -7 -3 T/MOD }
573 { MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }
574 { MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }
575 { MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }
576 { MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }
581 { -1 1 / -> -1 1 T/ }
582 { -2 1 / -> -2 1 T/ }
583 { 0 -1 / -> 0 -1 T/ }
584 { 1 -1 / -> 1 -1 T/ }
585 { 2 -1 / -> 2 -1 T/ }
586 { -1 -1 / -> -1 -1 T/ }
587 { -2 -1 / -> -2 -1 T/ }
589 { -1 -1 / -> -1 -1 T/ }
590 { -2 -2 / -> -2 -2 T/ }
592 { 7 -3 / -> 7 -3 T/ }
593 { -7 3 / -> -7 3 T/ }
594 { -7 -3 / -> -7 -3 T/ }
595 { MAX-INT 1 / -> MAX-INT 1 T/ }
596 { MIN-INT 1 / -> MIN-INT 1 T/ }
597 { MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }
598 { MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }
600 { 0 1 MOD -> 0 1 TMOD }
601 { 1 1 MOD -> 1 1 TMOD }
602 { 2 1 MOD -> 2 1 TMOD }
603 { -1 1 MOD -> -1 1 TMOD }
604 { -2 1 MOD -> -2 1 TMOD }
605 { 0 -1 MOD -> 0 -1 TMOD }
606 { 1 -1 MOD -> 1 -1 TMOD }
607 { 2 -1 MOD -> 2 -1 TMOD }
608 { -1 -1 MOD -> -1 -1 TMOD }
609 { -2 -1 MOD -> -2 -1 TMOD }
610 { 2 2 MOD -> 2 2 TMOD }
611 { -1 -1 MOD -> -1 -1 TMOD }
612 { -2 -2 MOD -> -2 -2 TMOD }
613 { 7 3 MOD -> 7 3 TMOD }
614 { 7 -3 MOD -> 7 -3 TMOD }
615 { -7 3 MOD -> -7 3 TMOD }
616 { -7 -3 MOD -> -7 -3 TMOD }
617 { MAX-INT 1 MOD -> MAX-INT 1 TMOD }
618 { MIN-INT 1 MOD -> MIN-INT 1 TMOD }
619 { MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }
620 { MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }
622 { 0 2 1 */ -> 0 2 1 T*/ }
623 { 1 2 1 */ -> 1 2 1 T*/ }
624 { 2 2 1 */ -> 2 2 1 T*/ }
625 { -1 2 1 */ -> -1 2 1 T*/ }
626 { -2 2 1 */ -> -2 2 1 T*/ }
627 { 0 2 -1 */ -> 0 2 -1 T*/ }
628 { 1 2 -1 */ -> 1 2 -1 T*/ }
629 { 2 2 -1 */ -> 2 2 -1 T*/ }
630 { -1 2 -1 */ -> -1 2 -1 T*/ }
631 { -2 2 -1 */ -> -2 2 -1 T*/ }
632 { 2 2 2 */ -> 2 2 2 T*/ }
633 { -1 2 -1 */ -> -1 2 -1 T*/ }
634 { -2 2 -2 */ -> -2 2 -2 T*/ }
635 { 7 2 3 */ -> 7 2 3 T*/ }
636 { 7 2 -3 */ -> 7 2 -3 T*/ }
637 { -7 2 3 */ -> -7 2 3 T*/ }
638 { -7 2 -3 */ -> -7 2 -3 T*/ }
640 ( á.þ. üÔÏ ÐÒÏÓÔÏ ÏÛÉÂËÁ ÒÁÚÒÁÂÏÔÞÉËÁ ÔÅÓÔÁ, ÐÏ ANS ÚÄÅÓØ overflow
641 { MAX-INT 2 1 */ -> MAX-INT 2 1 T*/ }
642 { MIN-INT 2 1 */ -> MIN-INT 2 1 T*/ }
644 { MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }
645 { MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }
647 { 0 2 1 */MOD -> 0 2 1 T*/MOD }
648 { 1 2 1 */MOD -> 1 2 1 T*/MOD }
649 { 2 2 1 */MOD -> 2 2 1 T*/MOD }
650 { -1 2 1 */MOD -> -1 2 1 T*/MOD }
651 { -2 2 1 */MOD -> -2 2 1 T*/MOD }
652 { 0 2 -1 */MOD -> 0 2 -1 T*/MOD }
653 { 1 2 -1 */MOD -> 1 2 -1 T*/MOD }
654 { 2 2 -1 */MOD -> 2 2 -1 T*/MOD }
655 { -1 2 -1 */MOD -> -1 2 -1 T*/MOD }
656 { -2 2 -1 */MOD -> -2 2 -1 T*/MOD }
657 { 2 2 2 */MOD -> 2 2 2 T*/MOD }
658 { -1 2 -1 */MOD -> -1 2 -1 T*/MOD }
659 { -2 2 -2 */MOD -> -2 2 -2 T*/MOD }
660 { 7 2 3 */MOD -> 7 2 3 T*/MOD }
661 { 7 2 -3 */MOD -> 7 2 -3 T*/MOD }
662 { -7 2 3 */MOD -> -7 2 3 T*/MOD }
663 { -7 2 -3 */MOD -> -7 2 -3 T*/MOD }
665 ( á.þ. ÔÏÖÅ ÏÛÉÂËÁ, ÄÏÌÖÎÏ ÂÙÔØ overflow
666 { MAX-INT 2 1 */MOD -> MAX-INT 2 1 T*/MOD }
667 { MIN-INT 2 1 */MOD -> MIN-INT 2 1 T*/MOD }
669 { MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }
670 { MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }
672 \ -----------------------------------------------------------------------------
673 TESTING <> U> (contributed by James Bowman)
675 T{ 0 0 <> -> FALSE }T
676 T{ 1 1 <> -> FALSE }T
677 T{ -1 -1 <> -> FALSE }T
679 T{ -1 0 <> -> TRUE }T
681 T{ 0 -1 <> -> TRUE }T
683 T{ 0 1 U> -> FALSE }T
684 T{ 1 2 U> -> FALSE }T
685 T{ 0 MID-UINT U> -> FALSE }T
686 T{ 0 MAX-UINT U> -> FALSE }T
687 T{ MID-UINT MAX-UINT U> -> FALSE }T
688 T{ 0 0 U> -> FALSE }T
689 T{ 1 1 U> -> FALSE }T
692 T{ MID-UINT 0 U> -> TRUE }T
693 T{ MAX-UINT 0 U> -> TRUE }T
694 T{ MAX-UINT MID-UINT U> -> TRUE }T
696 \ -----------------------------------------------------------------------------
697 TESTING 0<> 0> (contributed by James Bowman)
703 T{ MAX-UINT 0<> -> TRUE }T
704 T{ MIN-INT 0<> -> TRUE }T
705 T{ MAX-INT 0<> -> TRUE }T
709 T{ MIN-INT 0> -> FALSE }T
711 T{ MAX-INT 0> -> TRUE }T
713 \ -----------------------------------------------------------------------------
714 TESTING NIP TUCK ROLL PICK (contributed by James Bowman)
717 T{ 1 2 3 NIP -> 1 3 }T
719 T{ 1 2 TUCK -> 2 1 2 }T
720 T{ 1 2 3 TUCK -> 1 3 2 3 }T
722 T{ : RO5 100 200 300 400 500 ; -> }T
723 T{ RO5 3 ROLL -> 100 300 400 500 200 }T
724 T{ RO5 2 ROLL -> RO5 ROT }T
725 T{ RO5 1 ROLL -> RO5 SWAP }T
726 T{ RO5 0 ROLL -> RO5 }T
728 T{ RO5 2 PICK -> 100 200 300 400 500 300 }T
729 T{ RO5 1 PICK -> RO5 OVER }T
730 T{ RO5 0 PICK -> RO5 DUP }T
732 \ -----------------------------------------------------------------------------
733 TESTING 2>R 2R@ 2R> (contributed by James Bowman)
735 T{ : RR0 2>R 100 R> R> ; -> }T
736 T{ 300 400 RR0 -> 100 400 300 }T
737 T{ 200 300 400 RR0 -> 200 100 400 300 }T
739 T{ : RR1 2>R 100 2R@ R> R> ; -> }T
740 T{ 300 400 RR1 -> 100 300 400 400 300 }T
741 T{ 200 300 400 RR1 -> 200 100 300 400 400 300 }T
743 T{ : RR2 2>R 100 2R> ; -> }T
744 T{ 300 400 RR2 -> 100 300 400 }T
745 T{ 200 300 400 RR2 -> 200 100 300 400 }T
747 \ -----------------------------------------------------------------------------
748 TESTING HEX (contributed by James Bowman)
750 T{ BASE @ HEX BASE @ DECIMAL BASE @ - SWAP BASE ! -> 6 }T
752 \ -----------------------------------------------------------------------------
753 TESTING WITHIN (contributed by James Bowman)
755 T{ 0 0 0 WITHIN -> FALSE }T
756 T{ 0 0 MID-UINT WITHIN -> TRUE }T
757 T{ 0 0 MID-UINT+1 WITHIN -> TRUE }T
758 T{ 0 0 MAX-UINT WITHIN -> TRUE }T
759 T{ 0 MID-UINT 0 WITHIN -> FALSE }T
760 T{ 0 MID-UINT MID-UINT WITHIN -> FALSE }T
761 T{ 0 MID-UINT MID-UINT+1 WITHIN -> FALSE }T
762 T{ 0 MID-UINT MAX-UINT WITHIN -> FALSE }T
763 T{ 0 MID-UINT+1 0 WITHIN -> FALSE }T
764 T{ 0 MID-UINT+1 MID-UINT WITHIN -> TRUE }T
765 T{ 0 MID-UINT+1 MID-UINT+1 WITHIN -> FALSE }T
766 T{ 0 MID-UINT+1 MAX-UINT WITHIN -> FALSE }T
767 T{ 0 MAX-UINT 0 WITHIN -> FALSE }T
768 T{ 0 MAX-UINT MID-UINT WITHIN -> TRUE }T
769 T{ 0 MAX-UINT MID-UINT+1 WITHIN -> TRUE }T
770 T{ 0 MAX-UINT MAX-UINT WITHIN -> FALSE }T
771 T{ MID-UINT 0 0 WITHIN -> FALSE }T
772 T{ MID-UINT 0 MID-UINT WITHIN -> FALSE }T
773 T{ MID-UINT 0 MID-UINT+1 WITHIN -> TRUE }T
774 T{ MID-UINT 0 MAX-UINT WITHIN -> TRUE }T
775 T{ MID-UINT MID-UINT 0 WITHIN -> TRUE }T
776 T{ MID-UINT MID-UINT MID-UINT WITHIN -> FALSE }T
777 T{ MID-UINT MID-UINT MID-UINT+1 WITHIN -> TRUE }T
778 T{ MID-UINT MID-UINT MAX-UINT WITHIN -> TRUE }T
779 T{ MID-UINT MID-UINT+1 0 WITHIN -> FALSE }T
780 T{ MID-UINT MID-UINT+1 MID-UINT WITHIN -> FALSE }T
781 T{ MID-UINT MID-UINT+1 MID-UINT+1 WITHIN -> FALSE }T
782 T{ MID-UINT MID-UINT+1 MAX-UINT WITHIN -> FALSE }T
783 T{ MID-UINT MAX-UINT 0 WITHIN -> FALSE }T
784 T{ MID-UINT MAX-UINT MID-UINT WITHIN -> FALSE }T
785 T{ MID-UINT MAX-UINT MID-UINT+1 WITHIN -> TRUE }T
786 T{ MID-UINT MAX-UINT MAX-UINT WITHIN -> FALSE }T
787 T{ MID-UINT+1 0 0 WITHIN -> FALSE }T
788 T{ MID-UINT+1 0 MID-UINT WITHIN -> FALSE }T
789 T{ MID-UINT+1 0 MID-UINT+1 WITHIN -> FALSE }T
790 T{ MID-UINT+1 0 MAX-UINT WITHIN -> TRUE }T
791 T{ MID-UINT+1 MID-UINT 0 WITHIN -> TRUE }T
792 T{ MID-UINT+1 MID-UINT MID-UINT WITHIN -> FALSE }T
793 T{ MID-UINT+1 MID-UINT MID-UINT+1 WITHIN -> FALSE }T
794 T{ MID-UINT+1 MID-UINT MAX-UINT WITHIN -> TRUE }T
795 T{ MID-UINT+1 MID-UINT+1 0 WITHIN -> TRUE }T
796 T{ MID-UINT+1 MID-UINT+1 MID-UINT WITHIN -> TRUE }T
797 T{ MID-UINT+1 MID-UINT+1 MID-UINT+1 WITHIN -> FALSE }T
798 T{ MID-UINT+1 MID-UINT+1 MAX-UINT WITHIN -> TRUE }T
799 T{ MID-UINT+1 MAX-UINT 0 WITHIN -> FALSE }T
800 T{ MID-UINT+1 MAX-UINT MID-UINT WITHIN -> FALSE }T
801 T{ MID-UINT+1 MAX-UINT MID-UINT+1 WITHIN -> FALSE }T
802 T{ MID-UINT+1 MAX-UINT MAX-UINT WITHIN -> FALSE }T
803 T{ MAX-UINT 0 0 WITHIN -> FALSE }T
804 T{ MAX-UINT 0 MID-UINT WITHIN -> FALSE }T
805 T{ MAX-UINT 0 MID-UINT+1 WITHIN -> FALSE }T
806 T{ MAX-UINT 0 MAX-UINT WITHIN -> FALSE }T
807 T{ MAX-UINT MID-UINT 0 WITHIN -> TRUE }T
808 T{ MAX-UINT MID-UINT MID-UINT WITHIN -> FALSE }T
809 T{ MAX-UINT MID-UINT MID-UINT+1 WITHIN -> FALSE }T
810 T{ MAX-UINT MID-UINT MAX-UINT WITHIN -> FALSE }T
811 T{ MAX-UINT MID-UINT+1 0 WITHIN -> TRUE }T
812 T{ MAX-UINT MID-UINT+1 MID-UINT WITHIN -> TRUE }T
813 T{ MAX-UINT MID-UINT+1 MID-UINT+1 WITHIN -> FALSE }T
814 T{ MAX-UINT MID-UINT+1 MAX-UINT WITHIN -> FALSE }T
815 T{ MAX-UINT MAX-UINT 0 WITHIN -> TRUE }T
816 T{ MAX-UINT MAX-UINT MID-UINT WITHIN -> TRUE }T
817 T{ MAX-UINT MAX-UINT MID-UINT+1 WITHIN -> TRUE }T
818 T{ MAX-UINT MAX-UINT MAX-UINT WITHIN -> FALSE }T
820 T{ MIN-INT MIN-INT MIN-INT WITHIN -> FALSE }T
821 T{ MIN-INT MIN-INT 0 WITHIN -> TRUE }T
822 T{ MIN-INT MIN-INT 1 WITHIN -> TRUE }T
823 T{ MIN-INT MIN-INT MAX-INT WITHIN -> TRUE }T
824 T{ MIN-INT 0 MIN-INT WITHIN -> FALSE }T
825 T{ MIN-INT 0 0 WITHIN -> FALSE }T
826 T{ MIN-INT 0 1 WITHIN -> FALSE }T
827 T{ MIN-INT 0 MAX-INT WITHIN -> FALSE }T
828 T{ MIN-INT 1 MIN-INT WITHIN -> FALSE }T
829 T{ MIN-INT 1 0 WITHIN -> TRUE }T
830 T{ MIN-INT 1 1 WITHIN -> FALSE }T
831 T{ MIN-INT 1 MAX-INT WITHIN -> FALSE }T
832 T{ MIN-INT MAX-INT MIN-INT WITHIN -> FALSE }T
833 T{ MIN-INT MAX-INT 0 WITHIN -> TRUE }T
834 T{ MIN-INT MAX-INT 1 WITHIN -> TRUE }T
835 T{ MIN-INT MAX-INT MAX-INT WITHIN -> FALSE }T
836 T{ 0 MIN-INT MIN-INT WITHIN -> FALSE }T
837 T{ 0 MIN-INT 0 WITHIN -> FALSE }T
838 T{ 0 MIN-INT 1 WITHIN -> TRUE }T
839 T{ 0 MIN-INT MAX-INT WITHIN -> TRUE }T
840 T{ 0 0 MIN-INT WITHIN -> TRUE }T
841 T{ 0 0 0 WITHIN -> FALSE }T
842 T{ 0 0 1 WITHIN -> TRUE }T
843 T{ 0 0 MAX-INT WITHIN -> TRUE }T
844 T{ 0 1 MIN-INT WITHIN -> FALSE }T
845 T{ 0 1 0 WITHIN -> FALSE }T
846 T{ 0 1 1 WITHIN -> FALSE }T
847 T{ 0 1 MAX-INT WITHIN -> FALSE }T
848 T{ 0 MAX-INT MIN-INT WITHIN -> FALSE }T
849 T{ 0 MAX-INT 0 WITHIN -> FALSE }T
850 T{ 0 MAX-INT 1 WITHIN -> TRUE }T
851 T{ 0 MAX-INT MAX-INT WITHIN -> FALSE }T
852 T{ 1 MIN-INT MIN-INT WITHIN -> FALSE }T
853 T{ 1 MIN-INT 0 WITHIN -> FALSE }T
854 T{ 1 MIN-INT 1 WITHIN -> FALSE }T
855 T{ 1 MIN-INT MAX-INT WITHIN -> TRUE }T
856 T{ 1 0 MIN-INT WITHIN -> TRUE }T
857 T{ 1 0 0 WITHIN -> FALSE }T
858 T{ 1 0 1 WITHIN -> FALSE }T
859 T{ 1 0 MAX-INT WITHIN -> TRUE }T
860 T{ 1 1 MIN-INT WITHIN -> TRUE }T
861 T{ 1 1 0 WITHIN -> TRUE }T
862 T{ 1 1 1 WITHIN -> FALSE }T
863 T{ 1 1 MAX-INT WITHIN -> TRUE }T
864 T{ 1 MAX-INT MIN-INT WITHIN -> FALSE }T
865 T{ 1 MAX-INT 0 WITHIN -> FALSE }T
866 T{ 1 MAX-INT 1 WITHIN -> FALSE }T
867 T{ 1 MAX-INT MAX-INT WITHIN -> FALSE }T
868 T{ MAX-INT MIN-INT MIN-INT WITHIN -> FALSE }T
869 T{ MAX-INT MIN-INT 0 WITHIN -> FALSE }T
870 T{ MAX-INT MIN-INT 1 WITHIN -> FALSE }T
871 T{ MAX-INT MIN-INT MAX-INT WITHIN -> FALSE }T
872 T{ MAX-INT 0 MIN-INT WITHIN -> TRUE }T
873 T{ MAX-INT 0 0 WITHIN -> FALSE }T
874 T{ MAX-INT 0 1 WITHIN -> FALSE }T
875 T{ MAX-INT 0 MAX-INT WITHIN -> FALSE }T
876 T{ MAX-INT 1 MIN-INT WITHIN -> TRUE }T
877 T{ MAX-INT 1 0 WITHIN -> TRUE }T
878 T{ MAX-INT 1 1 WITHIN -> FALSE }T
879 T{ MAX-INT 1 MAX-INT WITHIN -> FALSE }T
880 T{ MAX-INT MAX-INT MIN-INT WITHIN -> TRUE }T
881 T{ MAX-INT MAX-INT 0 WITHIN -> TRUE }T
882 T{ MAX-INT MAX-INT 1 WITHIN -> TRUE }T
883 T{ MAX-INT MAX-INT MAX-INT WITHIN -> FALSE }T
885 \ ------------------------------------------------------------------------
886 TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
892 { 1STA 2NDA U< -> <TRUE> } \ HERE MUST GROW WITH ALLOT
893 { 1STA 1+ -> 2NDA } \ ... BY ONE ADDRESS UNIT
894 ( MISSING TEST: NEGATIVE ALLOT )
900 { 1ST 2ND U< -> <TRUE> } \ HERE MUST GROW WITH ALLOT
901 { 1ST CELL+ -> 2ND } \ ... BY ONE CELL
902 { 1ST 1 CELLS + -> 2ND }
903 { 1ST @ 2ND @ -> 1 2 }
905 { 1ST @ 2ND @ -> 5 2 }
907 { 1ST @ 2ND @ -> 5 6 }
911 { 1S 1ST ! 1ST @ -> 1S } \ CAN STORE CELL-WIDE VALUE
917 { 1STC 2NDC U< -> <TRUE> } \ HERE MUST GROW WITH ALLOT
918 { 1STC CHAR+ -> 2NDC } \ ... BY ONE CHAR
919 { 1STC 1 CHARS + -> 2NDC }
920 { 1STC C@ 2NDC C@ -> 1 2 }
922 { 1STC C@ 2NDC C@ -> 3 2 }
924 { 1STC C@ 2NDC C@ -> 3 4 }
926 HERE 1 ALLOT ALIGN 123 , CONSTANT X
927 { X 1+ ALIGNED @ -> 123 }
928 ( MISSING TEST: CHARS AT ALIGNED ADDRESS )
930 { 1 CELLS 1 CHARS MOD -> 0 } \ SIZE OF CELL MULTIPLE OF SIZE OF CHAR
932 ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
933 CONSTANT A-ADDR CONSTANT UA-ADDR
934 { UA-ADDR ALIGNED -> A-ADDR }
935 { 1 A-ADDR C! A-ADDR C@ -> 1 }
936 { 1234 A-ADDR ! A-ADDR @ -> 1234 }
937 { 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }
938 { 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }
939 { 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }
940 { 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }
941 { 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }
944 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
945 ( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
946 { 1 CHARS 1 < -> <FALSE> }
947 { 1 CHARS 1 CELLS > -> <FALSE> }
948 ( TBD: HOW TO FIND NUMBER OF BITS? )
950 ( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
951 { 1 CELLS 1 < -> <FALSE> }
952 { 1 CELLS 1 CHARS MOD -> 0 }
953 { 1S BITS 10 < -> <FALSE> }
958 { -1 1ST +! 1ST @ -> 0 }
960 \ ------------------------------------------------------------------------
961 TESTING CHAR [CHAR] [ ] BL S"
962 alias
[CHAR
] CHAR \ k8
: ans morons
967 { CHAR H -> 48 } \ k8: ans morons { CHAR HELLO -> 48 }
968 { : GC1 [CHAR] X ; -> }
969 { : GC2 [CHAR] H ; -> } \ k8: ans morons { : GC2 [CHAR] HELLO ; -> }
972 { : GC3 [ GC1 ] LITERAL ; -> }
974 { : GC4 S" XY
" ; -> }
975 { GC4 SWAP DROP -> 2 }
976 { GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }
978 \ ------------------------------------------------------------------------
979 TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
982 { ' GT1 EXECUTE -> 123 }
983 { : GT2 ['] GT1 ; IMMEDIATE -> }
984 { GT2 EXECUTE -> 123 }
986 HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
987 HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
988 { GT1STRING bcount WFIND -> ' GT1 -1 }
989 { GT2STRING bcount WFIND -> ' GT2 1 }
991 ( HOW TO SEARCH FOR NON-EXISTENT WORD? )
992 { : GT3 GT2 LITERAL ; -> }
994 { GT1STRING BCOUNT -> GT1STRING CHAR+ 3 }
996 { : GT4 POSTPONE GT1 ; IMMEDIATE -> }
999 { : GT6 345 ; IMMEDIATE -> }
1000 { : GT7 POSTPONE GT6 ; -> }
1003 { : GT8 STATE @ ; IMMEDIATE -> }
1005 { : GT9 GT8 LITERAL ; -> }
1006 { GT9 0= -> <FALSE> }
1008 \ ------------------------------------------------------------------------
1009 TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
1011 { : GI1 IF 123 THEN ; -> }
1012 { : GI2 IF 123 ELSE 234 THEN ; -> }
1020 { : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }
1021 { 0 GI3 -> 0 1 2 3 4 5 }
1026 { : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }
1027 { 3 GI4 -> 3 4 5 6 }
1031 ( á.þ. - ÉÓÐÒÁ×ÉÔØ )
1032 \ k8: what the fuck is this?!
1033 ;; { : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }
1034 ;; { 1 GI5 -> 1 345 }
1035 ;; { 2 GI5 -> 2 345 }
1036 ;; { 3 GI5 -> 3 4 5 123 }
1037 ;; { 4 GI5 -> 4 5 123 }
1038 ;; { 5 GI5 -> 5 123 }
1040 { : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> ENDIF ; -> }
1044 { 3 GI6 -> 0 1 2 3 }
1045 { 4 GI6 -> 0 1 2 3 4 }
1047 \ ------------------------------------------------------------------------
1048 (* moved to the bottom
1052 : cs1 CASE 1 OF 111 ENDOF
1065 -1 OF CASE R@ 1 OF 100 ENDOF
1070 -2 OF CASE R@ 1 OF -99 ENDOF
1079 { -1 3 cs2 -> -300 }
1081 { -2 2 cs2 -> -199 }
1086 \ ------------------------------------------------------------------------
1087 TESTING DO ?DO LOOP +LOOP I J UNLOOP LEAVE EXIT FOR
1089 { : GD1 DO I LOOP ; -> }
1090 { 4 1 GD1 -> 1 2 3 }
1091 { 2 -1 GD1 -> -1 0 1 }
1092 { MID-UINT+1 MID-UINT GD1 -> MID-UINT }
1094 { : GD2 DO I -1 +LOOP ; -> }
1095 { 1 4 GD2 -> 4 3 2 1 }
1096 \ { 1 4 GD2 -> 4 } \ k8: FIG
1097 { -1 2 GD2 -> 2 1 0 -1 }
1098 \ { -1 2 GD2 -> 2 1 0 } \ k8: FIG
1099 { MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }
1100 \ { MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 } \ k8: FIG
1102 { : GD3 DO 1 0 DO J LOOP LOOP ; -> }
1103 { 4 1 GD3 -> 1 2 3 }
1104 { 2 -1 GD3 -> -1 0 1 }
1105 { MID-UINT+1 MID-UINT GD3 -> MID-UINT }
1107 { : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }
1108 { 1 4 GD4 -> 4 3 2 1 }
1109 \ { 1 4 GD4 -> 4 } \ k8: FIG
1110 { -1 2 GD4 -> 2 1 0 -1 }
1111 \ { -1 2 GD4 -> 2 1 0 } \ k8: FIG
1112 { MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }
1113 \ { MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 } \ k8: FIG
1115 { : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }
1120 { : GD6 ( PAT: {0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} )
1122 I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
1132 { -9876 -9876 qd -> }
1133 { 5 0 qd -> 0 1 2 3 4 }
1135 : qd1 ?DO I 10 +LOOP ;
1136 { 50 1 qd1 -> 1 11 21 31 41 }
1137 { 50 0 qd1 -> 0 10 20 30 40 }
1139 : qd2 ?DO I 3 > IF LEAVE ELSE I THEN LOOP ;
1140 { 5 -1 qd2 -> -1 0 1 2 3 }
1142 : qd3 ?DO I 1 +LOOP ;
1144 { 4 1 qd3 -> 1 2 3 }
1145 { 2 -1 qd3 -> -1 0 1 }
1147 : qd4 ?DO I -1 +LOOP ;
1149 { 1 4 qd4 -> 4 3 2 1 }
1150 \ { 1 4 qd4 -> 4 } \ k8: FIG
1151 { -1 2 qd4 -> 2 1 0 -1 }
1152 \ { -1 2 qd4 -> 2 1 0 } \ k8: FIG
1154 : qff0 for i endfor ;
1160 : QD5 ?DO I -10 +LOOP ;
1161 T{ 1 50 QD5 -> 50 40 30 20 10 }T
1162 T{ 0 50 QD5 -> 50 40 30 20 10 0 }T
1163 T{ -25 10 QD5 -> 10 0 -10 -20 }T
1168 : QD6 ( limit start increment -- )
1174 ITERS @ 6 = IF LEAVE THEN
1179 T{ 4 4 -1 QD6 -> 0 }T
1180 T{ 1 4 -1 QD6 -> 4 3 2 1 4 }T
1181 T{ 4 1 -1 QD6 -> 1 0 -1 -2 -3 -4 6 }T
1182 T{ 4 1 0 QD6 -> 1 1 1 1 1 1 6 }T
1183 T{ 0 0 0 QD6 -> 0 }T
1184 T{ 1 4 0 QD6 -> 4 4 4 4 4 4 6 }T
1185 T{ 1 4 1 QD6 -> 4 5 6 7 8 9 6 }T
1186 T{ 4 1 1 QD6 -> 1 2 3 3 }T
1187 T{ 4 4 1 QD6 -> 0 }T
1188 T{ 2 -1 -1 QD6 -> -1 -2 -3 -4 -5 -6 6 }T
1189 T{ -1 2 -1 QD6 -> 2 1 0 -1 4 }T
1190 T{ 2 -1 0 QD6 -> -1 -1 -1 -1 -1 -1 6 }T
1191 T{ -1 2 0 QD6 -> 2 2 2 2 2 2 6 }T
1192 T{ -1 2 1 QD6 -> 2 3 4 5 6 7 6 }T
1193 T{ 2 -1 1 QD6 -> -1 0 1 3 }T
1196 \ ------------------------------------------------------------------------
1197 TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
1199 { 123 CONSTANT X123 -> }
1201 { : EQU CONSTANT ; -> }
1202 { X123 EQU Y123 -> }
1209 { : NOP : POSTPONE ; ; -> }
1210 { NOP NOP1 NOP NOP2 -> }
1214 { : DOES1 DOES> @ 1 + ; -> }
1215 { : DOES2 DOES> @ 2 + ; -> }
1218 { ' CR1 >BODY -> HERE }
1226 \ modified by Ketmar
1228 { : WEIRD: CREATE ddd , DOES> @ 1 + DOES> @ 2 + ; -> }
1231 \ k8: nope, it doesn't work this way, morons { ' W1 >BODY -> HERE }
1232 \ { W1 -> HERE 1 + }
1233 \ { W1 -> HERE 2 + }
1239 \ ------------------------------------------------------------------------
1242 : GE1 S" 123" ; IMMEDIATE
1243 : GE2 S" 123 1+" ; IMMEDIATE
1244 : GE3 S" : GE4
345 ;" ;
1245 : GE5 EVALUATE ; IMMEDIATE
1247 { GE1 EVALUATE -> 123 } ( TEST EVALUATE IN INTERP. STATE )
1248 { GE2 EVALUATE -> 124 }
1252 { : GE6 GE1 GE5 ; -> } ( TEST EVALUATE IN COMPILE STATE )
1254 { : GE7 GE2 GE5 ; -> }
1257 \ ------------------------------------------------------------------------
1259 TESTING SOURCE >IN WORD
1261 : GS1 S" SOURCE
" 2DUP EVALUATE
1262 >R SWAP >R = R> R> = ;
1263 { GS1 -> <TRUE> <TRUE> }
1266 : RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
1272 : GS2 5 SCANS ! S" 123 RESCAN?
" EVALUATE ;
1273 { GS2 -> 123 123 123 123 123 }
1275 : GS3 BL WORD COUNT SWAP C@ ;
1276 { GS3 HELLO -> 5 CHAR H }
1278 : GS4 SOURCE >IN ! DROP ;
1285 \ ------------------------------------------------------------------------
1286 TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
1288 (* k8: we already have it
1289 : S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
1290 >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
1291 R> ?DUP IF \ IF NON-EMPTY STRINGS
1293 OVER C@ OVER C@ - IF 2DROP <FALSE> UNLOOP EXIT THEN
1294 SWAP CHAR+ SWAP CHAR+
1297 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
1299 R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
1303 : GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA
" S= ;
1306 : GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
1309 : GP3 <# 1 0 # # #> S" 01" S= ;
1312 : GP4 <# 1 0 #S #> S" 1" S= ;
1315 24 CONSTANT MAX-BASE \ BASE 2 .. 36
1317 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
1318 COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
1322 MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
1323 I BASE ! \ TBD: ASSUMES BASE WORKS
1324 I 0 <# #S #> S" 10" S= AND
1331 MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
1332 R> BASE ! \ S: C-ADDR U
1334 0 DO \ S: C-ADDR FLAG
1335 OVER C@ [CHAR] 1 = AND \ ALL ONES
1341 BASE @ >R MAX-BASE BASE !
1345 1 = SWAP C@ I 30 + = AND AND
1349 1 = SWAP C@ 41 I A - + = AND AND
1357 : GN-STRING GN-BUF 1 ;
1358 : GN-CONSUMED GN-BUF CHAR+ 0 ;
1359 \ : GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
1360 : GN' [CHAR] ' WORD cell+ c@ GN-BUF C! GN-STRING ;
1362 { 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }
1363 { 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }
1364 { 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }
1365 { 0 0 GN' -' >NUMBER -> 0 0 GN-STRING } \ SHOULD FAIL TO CONVERT THESE
1366 { 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }
1367 { 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }
1370 BASE @ >R BASE ! >NUMBER R> BASE ! ;
1372 { 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }
1373 { 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }
1374 { 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }
1375 { 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }
1376 { 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }
1377 { 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }
1379 : GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
1382 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
1384 { 0 0 2 GN1 -> 0 0 0 }
1385 { MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }
1386 { MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }
1387 { 0 0 MAX-BASE GN1 -> 0 0 0 }
1388 { MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }
1389 { MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }
1391 : GN2 \ ( -- 16 10 )
1392 BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
1396 \ ------------------------------------------------------------------------
1397 TESTING FILL MOVE CMOVE
1399 CREATE FBUF 00 C, 00 C, 00 C, create;
1400 CREATE SBUF 12 C, 34 C, 56 C, create;
1401 : SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
1403 { FBUF 0 20 FILL -> }
1404 { SEEBUF -> 00 00 00 }
1406 { FBUF 1 20 FILL -> }
1407 { SEEBUF -> 20 00 00 }
1409 { FBUF 3 20 FILL -> }
1410 { SEEBUF -> 20 20 20 }
1412 { FBUF FBUF 3 CHARS MOVE -> } \ BIZARRE SPECIAL CASE
1413 { SEEBUF -> 20 20 20 }
1415 { SBUF FBUF 0 CHARS MOVE -> }
1416 { SEEBUF -> 20 20 20 }
1418 { SBUF FBUF 1 CHARS MOVE -> }
1419 { SEEBUF -> 12 20 20 }
1421 { SBUF FBUF 3 CHARS MOVE -> }
1422 { SEEBUF -> 12 34 56 }
1424 { FBUF FBUF CHAR+ 2 CHARS MOVE -> }
1425 { SEEBUF -> 12 12 34 }
1427 { FBUF CHAR+ FBUF 2 CHARS MOVE -> }
1428 { SEEBUF -> 12 34 34 }
1430 \ CMOVE ÏÂÑÚÁÔÅÌØÎÏ ÂÁÊÔÏ×ÏÅ! Dmitry Yakimov
1431 { FBUF FBUF CHAR+ 2 CHARS CMOVE -> }
1432 { SEEBUF -> 12 12 12 }
1434 \ k8: test various CMOVE offsets
1435 CREATE TXBUF 18 ALLOT create;
1436 CREATE ZXBUF 18 ALLOT create;
1437 CREATE SXBUF 1 C, 2 C, 3 C, 4 C, 5 C, 6 C, 7 C, 8 C, 9 C, 0x0a C, 0x0b C, 0x0c C, 0x0d C, 0x0e C, 0x0f C, 0x10 C, 0x11 C, 0x12 C, create;
1439 : CMOVE-SLOW ( saddr daddr count -- )
1440 for over c@ over c! 1+ swap 1+ swap endfor 2drop
1443 : XBUFN ( ofs len -- okflag )
1446 2dup over SXBUF 1+ + rot TXBUF 1+ + rot cmove
1447 over SXBUF 1+ + rot ZXBUF 1+ + rot cmove-slow
1448 TXBUF 18 ZXBUF 18 compare 0=
1455 i j XBUFN ifnot ." FAILED WITH I
=" i . ." J
=" j . cr 1 n-bye endif
1462 \ ------------------------------------------------------------------------
1463 TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U
.
1466 ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
1467 9 1+ 0 DO I
. LOOP CR
1468 ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
1469 [CHAR
] 9 1+ [CHAR
] 0 DO I
0 SPACES EMIT LOOP CR
1470 ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
1471 [CHAR
] G
1+ [CHAR
] A
DO I EMIT SPACE LOOP CR
1472 ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
1473 5 1+ 0 DO I
[CHAR
] 0 + EMIT
2 SPACES LOOP CR
1474 ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
1475 S
" LINE 1" TYPE CR S
" LINE 2" TYPE CR
1476 ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
1477 ." SIGNED: " MIN
-INT
. MAX
-INT
. CR
1478 ." UNSIGNED: " 0 U
. MAX
-UINT U
. CR
1481 ;; " (for syntax highlighter)
1485 \ ------------------------------------------------------------------------
1487 TESTING INPUT: ACCEPT
1489 CREATE ABUF 80 CHARS ALLOT
1492 CR ." PLEASE TYPE UP
TO 80 CHARACTERS
:" CR
1494 CR ." RECEIVED
: " [CHAR] " EMIT
1495 ABUF SWAP TYPE
[CHAR
] " EMIT CR
1502 \ ------------------------------------------------------------------------
1503 TESTING DICTIONARY SEARCH RULES
1505 { : GDX 123 ; : GDX GDX 234 ; -> }
1510 \ ------------------------------------------------------------------------
1511 TESTING /STRING COMPARE SEARCH COMPARE-CI
1514 { : s1 S" abcdefghijklmnopqrstuvwxyz
" ; -> }
1515 { : s2 S" abc
" ; -> }
1516 { : s3 S" jklmn
" ; -> }
1518 { : s5 S" mnoq
" ; -> }
1519 { : s6 S" 12345" ; -> }
1521 { : s8 S" abc
" ; -> }
1523 { : s10 S" a
" ; -> }
1524 { : s13 S" aaaaa a
" ; } \ Six spaces
1525 { : s14 [ s1 ] SLITERAL ; -> }
1527 { s1 5 /STRING -> s1 SWAP 5 + SWAP 5 - }
1528 { s1 10 /STRING -4 /STRING -> s1 6 /STRING }
1529 { s1 0 /STRING -> s1 }
1531 { s1 -TRAILING -> s1 } \ "abcdefghijklmnopqrstuvwxyz
"
1532 { s8 -TRAILING -> s8 2 - } \ "abc
"
1533 { s7 -TRAILING -> s7 } \ " "
1534 { s9 -TRAILING -> s9 DROP 0 } \ " "
1535 { s10 -TRAILING -> s10 1- } \ " a
"
1537 { s1 s1 COMPARE -> 0 }
1538 { s1 PAD SWAP CMOVE -> } \ Copy s1 to PAD
1539 { s1 PAD OVER COMPARE -> 0 }
1540 { s1 PAD 6 COMPARE -> 1 }
1541 { PAD 10 s1 COMPARE -> -1 }
1542 { s1 PAD 0 COMPARE -> 1 }
1543 { PAD 0 s1 COMPARE -> -1 }
1544 { s1 s6 COMPARE -> 1 }
1545 { s6 s1 COMPARE -> -1 }
1547 : "abdde
" S" abdde
" ; ;; "
1548 : "abbde" S
" abbde" ; ;; "
1549 : "abcdf
" S" abcdf
" ; ;; "
1550 : "abcdee" S
" abcdee" ; ;; "
1552 { s1 "abdde
" COMPARE -> -1 } ;; "
1553 { s1
"abbde" COMPARE
-> 1 } ;; "
1554 { s1 "abcdf
" COMPARE -> -1 } ;; "
1555 { s1
"abcdee" COMPARE
-> 1 } ;; "
1560 { s11 s12 COMPARE -> 1 }
1561 { s12 s11 COMPARE -> -1 }
1563 { s11 s12 COMPARE-CI -> 0 }
1564 { s12 s11 COMPARE-CI -> 0 }
1569 { sX11 sX12 COMPARE-CI -> -1 }
1570 { sX12 sX11 COMPARE-CI -> 1 }
1572 { s1 s2 SEARCH -> s1 TRUE }
1573 { s1 s3 SEARCH -> s1 9 /STRING TRUE }
1574 { s1 s4 SEARCH -> s1 25 /STRING TRUE }
1575 { s1 s5 SEARCH -> s1 FALSE }
1576 { s1 s6 SEARCH -> s1 FALSE }
1577 { s1 s7 SEARCH -> s1 TRUE }
1579 \ ------------------------------------------------------------------------
1583 : COMPARE ( a0 c0 a1 c1 -- flag )
1584 rot ;; ( a0 a1 c0 c1 )
1590 2swap over c@ over c@ - ?dup
1592 >r 2drop 2drop r> sgn exit
1595 2swap 1- swap 1- swap
1604 { PARSE-NAME abcd S" abcd
" COMPARE -> 0 }
1605 { PARSE-NAME abcde S" abcde
" COMPARE -> 0 }
1606 \ test empty parse area
1607 (* k8: nope; for some reason this test thinks that EOL is a delimiter
1614 { : parse-name-test ( "name1
" "name2
" -- n )
1615 PARSE-NAME PARSE-NAME COMPARE ; -> }
1616 { parse-name-test abcd abcd -> 0 }
1617 { parse-name-test abcd abcd -> 0 }
1618 { parse-name-test abcde abcdf -> -1 }
1619 { parse-name-test abcdf abcde -> 1 }
1620 { parse-name-test abcde abcde
1622 { parse-name-test abcde abcde
1625 \ ------------------------------------------------------------------------
1629 : c1 1 2 3 ['] t1 CATCH ;
1630 { c1 -> 1 2 3 9 0 } \ No THROW executed
1633 : c2 1 2 ['] t2 CATCH ;
1634 { c2 -> 1 2 8 0 } \ 0 THROW does nothing
1636 : t3 7 8 9 99 THROW ;
1637 : c3 1 2 ['] t3 CATCH ;
1638 { c3 -> 1 2 99 } \ Restores stack to CATCH depth
1640 : t4 1- DUP 0> IF RECURSE ELSE 999 THROW -222 THEN ;
1641 : c4 3 4 5 10 ['] t4 CATCH -111 ;
1642 { c4 -> 3 4 5 0 999 -111 } \ Test return stack unwinding
1644 : t5 2DROP 2DROP 9999 THROW ;
1645 : c5 1 2 3 4 ['] t5 CATCH \ Test depth restored correctly
1646 DEPTH >R DROP 2DROP 2DROP R> ; \ after stack has been emptied
1649 \ ------------------------------------------------------------------------
1650 TESTING [IF] [ELSE] [ENDIF]
1652 { TRUE [IF] 111 [ELSE] 222 [THEN] -> 111 }
1653 { FALSE [IF] 111 [ELSE] 222 [THEN] -> 222 }
1655 \ Check words are immediate
1656 : tfind parse-name wfind dup 0= 666 ?error ;
1657 { tfind [IF] NIP -> 1 }
1658 { tfind [ELSE] NIP -> 1 }
1659 { tfind [THEN] NIP -> 1 }
1661 { : pt2 [ 0 ] [IF] 1111 [ELSE] 2222 [THEN] ; pt2 -> 2222 }
1662 { : pt3 [ -1 ] [IF] 3333 [ELSE] 4444 [THEN] ; pt3 -> 3333 }
1664 \ Code spread over more than 1 line
1680 { <T> [IF] 1 <T> [IF] 2 [ELSE] 3 [THEN] [ELSE] 4 [THEN] -> 1 2 }
1681 { <F> [IF] 1 <T> [IF] 2 [ELSE] 3 [THEN] [ELSE] 4 [THEN] -> 4 }
1682 { <T> [IF] 1 <F> [IF] 2 [ELSE] 3 [THEN] [ELSE] 4 [ENDIF] -> 1 3 }
1683 { <F> [IF] 1 <F> [IF] 2 [ELSE] 3 [THEN] [ELSE] 4 [THEN] -> 4 }
1686 \ some tests cannot work with DPL, so no DPL
1688 \ ------------------------------------------------------------------------
1689 TESTING interpreter and compiler reading double numbers, with/without prefixes
1691 0 INVERT CONSTANT 1SD
1692 1SD 1 RSHIFT CONSTANT MAX-INTD \ 01...1
1693 MAX-INTD INVERT CONSTANT MIN-INTD \ 10...0
1694 MAX-INTD 2/ CONSTANT HI-INT \ 001...1
1695 MIN-INTD 2/ CONSTANT LO-INT \ 110...1
1699 T{ : RDL1 3. ; RDL1 -> 3 0 }T
1700 T{ : RDL2 -4. ; RDL2 -> -4 -1 }T
1702 \ k8: this doesn't work with DPL
1704 DECIMAL BASE @ OLD-DBASE !
1705 T{ #12346789. -> 12346789. }T
1706 T{ #-12346789. -> -12346789. }T
1707 T{ $12aBcDeF. -> 313249263. }T
1708 T{ $-12AbCdEf. -> -313249263. }T
1709 T{ %10010110. -> 150. }T
1710 T{ %-10010110. -> -150. }T
1711 \ Check BASE is unchanged
1712 T{ BASE @ OLD-DBASE @ = -> <TRUE> }T
1714 \ Repeat in Hex mode
1715 16 OLD-DBASE ! 16 BASE !
1716 T{ #12346789. -> BC65A5. }T
1717 T{ #-12346789. -> -BC65A5. }T
1718 T{ $12aBcDeF. -> 12AbCdeF. }T
1719 T{ $-12AbCdEf. -> -12ABCDef. }T
1720 T{ %10010110. -> 96. }T
1721 T{ %-10010110. -> -96. }T
1722 \ Check BASE is unchanged
1723 T{ BASE @ OLD-DBASE @ = -> <TRUE> }T \ 2
1726 \ Check number prefixes in compile mode
1727 T{ : dnmp #8327. $-2cbe. %011010111. ; dnmp -> 8327. -11454. 215. }T
1729 \ ------------------------------------------------------------------------------
1732 T{ 1 2 2CONSTANT 2C1 -> }T
1734 T{ : CD1 2C1 ; -> }T
1736 T{ : CD2 2CONSTANT ; -> }T
1737 T{ -1 -2 CD2 2C2 -> }T
1739 T{ 4 5 2CONSTANT 2C3 IMMEDIATE 2C3 -> 4 5 }T
1740 T{ : CD6 2C3 2LITERAL ; CD6 -> 4 5 }T
1742 \ ------------------------------------------------------------------------------
1743 \ Some 2CONSTANTs for the following tests
1745 1SD MAX-INTD 2CONSTANT MAX-2INT \ 01...1
1746 0 MIN-INTD 2CONSTANT MIN-2INT \ 10...0
1747 MAX-2INT 2/ 2CONSTANT HI-2INT \ 001...1
1748 MIN-2INT 2/ 2CONSTANT LO-2INT \ 110...0
1750 \ ------------------------------------------------------------------------------
1753 T{ 0. DNEGATE -> 0. }T
1754 T{ 1. DNEGATE -> -1. }T
1755 T{ -1. DNEGATE -> 1. }T
1756 T{ MAX-2INT DNEGATE -> MIN-2INT SWAP 1+ SWAP }T
1757 T{ MIN-2INT SWAP 1+ SWAP DNEGATE -> MAX-2INT }T
1759 \ ------------------------------------------------------------------------------
1760 TESTING D+ with small integers
1762 T{ 0. 5. D+ -> 5. }T
1763 T{ -5. 0. D+ -> -5. }T
1764 T{ 1. 2. D+ -> 3. }T
1765 T{ 1. -2. D+ -> -1. }T
1766 T{ -1. 2. D+ -> 1. }T
1767 T{ -1. -2. D+ -> -3. }T
1768 T{ -1. 1. D+ -> 0. }T
1770 TESTING D+ with mid range integers
1772 T{ 0 0 0 5 D+ -> 0 5 }T
1773 T{ -1 5 0 0 D+ -> -1 5 }T
1774 T{ 0 0 0 -5 D+ -> 0 -5 }T
1775 T{ 0 -5 -1 0 D+ -> -1 -5 }T
1776 T{ 0 1 0 2 D+ -> 0 3 }T
1777 T{ -1 1 0 -2 D+ -> -1 -1 }T
1778 T{ 0 -1 0 2 D+ -> 0 1 }T
1779 T{ 0 -1 -1 -2 D+ -> -1 -3 }T
1780 T{ -1 -1 0 1 D+ -> -1 0 }T
1781 T{ MIN-INTD 0 2DUP D+ -> 0 1 }T
1782 T{ MIN-INTD S>D MIN-INTD 0 D+ -> 0 0 }T
1784 TESTING D+ with large double integers
1786 T{ HI-2INT 1. D+ -> 0 HI-INT 1+ }T
1787 T{ HI-2INT 2DUP D+ -> 1SD 1- MAX-INTD }T
1788 T{ MAX-2INT MIN-2INT D+ -> -1. }T
1789 T{ MAX-2INT LO-2INT D+ -> HI-2INT }T
1790 T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T
1791 T{ LO-2INT 2DUP D+ -> MIN-2INT }T
1793 \ ------------------------------------------------------------------------------
1794 TESTING D- with small integers
1796 T{ 0. 5. D- -> -5. }T
1797 T{ 5. 0. D- -> 5. }T
1798 T{ 0. -5. D- -> 5. }T
1799 T{ 1. 2. D- -> -1. }T
1800 T{ 1. -2. D- -> 3. }T
1801 T{ -1. 2. D- -> -3. }T
1802 T{ -1. -2. D- -> 1. }T
1803 T{ -1. -1. D- -> 0. }T
1805 TESTING D- with mid-range integers
1807 T{ 0 0 0 5 D- -> 0 -5 }T
1808 T{ -1 5 0 0 D- -> -1 5 }T
1809 T{ 0 0 -1 -5 D- -> 1 4 }T
1810 T{ 0 -5 0 0 D- -> 0 -5 }T
1811 T{ -1 1 0 2 D- -> -1 -1 }T
1812 T{ 0 1 -1 -2 D- -> 1 2 }T
1813 T{ 0 -1 0 2 D- -> 0 -3 }T
1814 T{ 0 -1 0 -2 D- -> 0 1 }T
1815 T{ 0 0 0 1 D- -> 0 -1 }T
1816 T{ MIN-INTD 0 2DUP D- -> 0. }T
1817 T{ MIN-INTD S>D MAX-INTD 0 D- -> 1 1SD }T
1819 TESTING D- with large integers
1821 T{ MAX-2INT MAX-2INT D- -> 0. }T
1822 T{ MIN-2INT MIN-2INT D- -> 0. }T
1823 T{ MAX-2INT HI-2INT D- -> LO-2INT DNEGATE }T
1824 T{ HI-2INT LO-2INT D- -> MAX-2INT }T
1825 T{ LO-2INT HI-2INT D- -> MIN-2INT 1. D+ }T
1826 T{ MIN-2INT MIN-2INT D- -> 0. }T
1827 T{ MIN-2INT LO-2INT D- -> LO-2INT }T
1829 \ ------------------------------------------------------------------------------
1832 T{ 0. D0< -> FALSE }T
1833 T{ 1. D0< -> FALSE }T
1834 T{ MIN-INTD 0 D0< -> FALSE }T
1835 T{ 0 MAX-INTD D0< -> FALSE }T
1836 T{ MAX-2INT D0< -> FALSE }T
1837 T{ -1. D0< -> TRUE }T
1838 T{ MIN-2INT D0< -> TRUE }T
1840 T{ 1. D0= -> FALSE }T
1841 T{ MIN-INTD 0 D0= -> FALSE }T
1842 T{ MAX-2INT D0= -> FALSE }T
1843 T{ -1 MAX-INTD D0= -> FALSE }T
1844 T{ 0. D0= -> TRUE }T
1845 T{ -1. D0= -> FALSE }T
1846 T{ 0 MIN-INTD D0= -> FALSE }T
1848 \ ------------------------------------------------------------------------------
1851 T{ 0. D2* -> 0. D2* }T
1852 T{ MIN-INTD 0 D2* -> 0 1 }T
1853 T{ HI-2INT D2* -> MAX-2INT 1. D- }T
1854 T{ LO-2INT D2* -> MIN-2INT }T
1858 T{ 0 1 D2/ -> MIN-INTD 0 }T
1859 T{ MAX-2INT D2/ -> HI-2INT }T
1860 T{ -1. D2/ -> -1. }T
1861 T{ MIN-2INT D2/ -> LO-2INT }T
1863 \ ------------------------------------------------------------------------------
1866 T{ 0. 1. D< -> TRUE }T
1867 T{ 0. 0. D< -> FALSE }T
1868 T{ 1. 0. D< -> FALSE }T
1869 T{ -1. 1. D< -> TRUE }T
1870 T{ -1. 0. D< -> TRUE }T
1871 T{ -2. -1. D< -> TRUE }T
1872 T{ -1. -2. D< -> FALSE }T
1873 T{ 0 1 1. D< -> FALSE }T \ Suggested by Helmut Eller
1874 T{ 1. 0 1 D< -> TRUE }T
1875 T{ 0 -1 1 -2 D< -> FALSE }T
1876 T{ 1 -2 0 -1 D< -> TRUE }T
1877 T{ -1. MAX-2INT D< -> TRUE }T
1878 T{ MIN-2INT MAX-2INT D< -> TRUE }T
1879 T{ MAX-2INT -1. D< -> FALSE }T
1880 T{ MAX-2INT MIN-2INT D< -> FALSE }T
1881 T{ MAX-2INT 2DUP -1. D+ D< -> FALSE }T
1882 T{ MIN-2INT 2DUP 1. D+ D< -> TRUE }T
1883 T{ MAX-INTD S>D 2DUP 1. D+ D< -> TRUE }T \ Ensure D< acts on MS cells
1885 T{ -1. -1. D= -> TRUE }T
1886 T{ -1. 0. D= -> FALSE }T
1887 T{ -1. 1. D= -> FALSE }T
1888 T{ 0. -1. D= -> FALSE }T
1889 T{ 0. 0. D= -> TRUE }T
1890 T{ 0. 1. D= -> FALSE }T
1891 T{ 1. -1. D= -> FALSE }T
1892 T{ 1. 0. D= -> FALSE }T
1893 T{ 1. 1. D= -> TRUE }T
1895 T{ 0 -1 0 -1 D= -> TRUE }T
1896 T{ 0 -1 0 0 D= -> FALSE }T
1897 T{ 0 -1 0 1 D= -> FALSE }T
1898 T{ 0 0 0 -1 D= -> FALSE }T
1899 T{ 0 0 0 0 D= -> TRUE }T
1900 T{ 0 0 0 1 D= -> FALSE }T
1901 T{ 0 1 0 -1 D= -> FALSE }T
1902 T{ 0 1 0 0 D= -> FALSE }T
1903 T{ 0 1 0 1 D= -> TRUE }T
1905 T{ MAX-2INT MIN-2INT D= -> FALSE }T
1906 T{ MAX-2INT 0. D= -> FALSE }T
1907 T{ MAX-2INT MAX-2INT D= -> TRUE }T
1908 T{ MAX-2INT HI-2INT D= -> FALSE }T
1909 T{ MAX-2INT MIN-2INT D= -> FALSE }T
1910 T{ MIN-2INT MIN-2INT D= -> TRUE }T
1911 T{ MIN-2INT LO-2INT D= -> FALSE }T
1912 T{ MIN-2INT MAX-2INT D= -> FALSE }T
1914 \ ------------------------------------------------------------------------------
1915 TESTING 2LITERAL 2VARIABLE
1917 T{ : CD3 [ MAX-2INT ] 2LITERAL ; -> }T
1918 T{ CD3 -> MAX-2INT }T
1919 T{ 2VARIABLE 2V1 -> }T
1922 T{ -1 -2 2V1 2! -> }T
1923 T{ 2V1 2@ -> -1 -2 }T
1924 T{ : CD4 2VARIABLE ; -> }T
1926 T{ : CD5 2V2 2! ; -> }T
1928 T{ 2V2 2@ -> -2 -1 }T
1929 T{ 2VARIABLE 2V3 IMMEDIATE 5 6 2V3 2! -> }T
1931 T{ : CD7 2V3 [ 2@ ] 2LITERAL ; CD7 -> 5 6 }T
1932 T{ : CD8 [ 6 7 ] 2V3 [ 2! ] ; 2V3 2@ -> 6 7 }T
1934 \ ------------------------------------------------------------------------------
1937 T{ 1. 2. DMAX -> 2. }T
1938 T{ 1. 0. DMAX -> 1. }T
1939 T{ 1. -1. DMAX -> 1. }T
1940 T{ 1. 1. DMAX -> 1. }T
1941 T{ 0. 1. DMAX -> 1. }T
1942 T{ 0. -1. DMAX -> 0. }T
1943 T{ -1. 1. DMAX -> 1. }T
1944 T{ -1. -2. DMAX -> -1. }T
1946 T{ MAX-2INT HI-2INT DMAX -> MAX-2INT }T
1947 T{ MAX-2INT MIN-2INT DMAX -> MAX-2INT }T
1948 T{ MIN-2INT MAX-2INT DMAX -> MAX-2INT }T
1949 T{ MIN-2INT LO-2INT DMAX -> LO-2INT }T
1951 T{ MAX-2INT 1. DMAX -> MAX-2INT }T
1952 T{ MAX-2INT -1. DMAX -> MAX-2INT }T
1953 T{ MIN-2INT 1. DMAX -> 1. }T
1954 T{ MIN-2INT -1. DMAX -> -1. }T
1957 T{ 1. 2. DMIN -> 1. }T
1958 T{ 1. 0. DMIN -> 0. }T
1959 T{ 1. -1. DMIN -> -1. }T
1960 T{ 1. 1. DMIN -> 1. }T
1961 T{ 0. 1. DMIN -> 0. }T
1962 T{ 0. -1. DMIN -> -1. }T
1963 T{ -1. 1. DMIN -> -1. }T
1964 T{ -1. -2. DMIN -> -2. }T
1966 T{ MAX-2INT HI-2INT DMIN -> HI-2INT }T
1967 T{ MAX-2INT MIN-2INT DMIN -> MIN-2INT }T
1968 T{ MIN-2INT MAX-2INT DMIN -> MIN-2INT }T
1969 T{ MIN-2INT LO-2INT DMIN -> MIN-2INT }T
1971 T{ MAX-2INT 1. DMIN -> 1. }T
1972 T{ MAX-2INT -1. DMIN -> -1. }T
1973 T{ MIN-2INT 1. DMIN -> MIN-2INT }T
1974 T{ MIN-2INT -1. DMIN -> MIN-2INT }T
1976 \ ------------------------------------------------------------------------------
1979 T{ 1234 0 D>S -> 1234 }T
1980 T{ -1234 -1 D>S -> -1234 }T
1981 T{ MAX-INTD 0 D>S -> MAX-INTD }T
1982 T{ MIN-INTD -1 D>S -> MIN-INTD }T
1985 T{ -1. DABS -> 1. }T
1986 T{ MAX-2INT DABS -> MAX-2INT }T
1987 T{ MIN-2INT 1. D+ DABS -> MAX-2INT }T
1989 \ ------------------------------------------------------------------------------
1992 T{ HI-2INT 1 M+ -> HI-2INT 1. D+ }T
1993 T{ MAX-2INT -1 M+ -> MAX-2INT -1. D+ }T
1994 T{ MIN-2INT 1 M+ -> MIN-2INT 1. D+ }T
1995 T{ LO-2INT -1 M+ -> LO-2INT -1. D+ }T
1997 \ To correct the result if the division is floored, only used when
1998 \ necessary i.e. negative quotient and remainder <> 0
2000 : ?FLOORED [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ;
2002 T{ 5. 7 11 M*/ -> 3. }T
2003 T{ 5. -7 11 M*/ -> -3. ?FLOORED }T \ FLOORED -4.
2004 T{ -5. 7 11 M*/ -> -3. ?FLOORED }T \ FLOORED -4.
2005 T{ -5. -7 11 M*/ -> 3. }T
2006 T{ MAX-2INT 8 16 M*/ -> HI-2INT }T
2007 T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?FLOORED }T \ FLOORED SUBTRACT 1
2008 T{ MIN-2INT 8 16 M*/ -> LO-2INT }T
2009 T{ MIN-2INT -8 16 M*/ -> LO-2INT DNEGATE }T
2010 T{ MAX-2INT MAX-INTD MAX-INTD M*/ -> MAX-2INT }T
2011 T{ MAX-2INT MAX-INTD 2/ MAX-INTD M*/ -> MAX-INTD 1- HI-2INT NIP }T
2012 T{ MIN-2INT LO-2INT NIP 1+ DUP 1- NEGATE M*/ -> 0 MAX-INTD 1- }T
2013 T{ MIN-2INT LO-2INT NIP 1- MAX-INTD M*/ -> MIN-INTD 3 + HI-2INT NIP 2 + }T
2014 T{ MAX-2INT LO-2INT NIP DUP NEGATE M*/ -> MAX-2INT DNEGATE }T
2015 T{ MIN-2INT MAX-INTD DUP M*/ -> MIN-2INT }T
2017 \ ------------------------------------------------------------------------------
2021 \ Create some large double numbers
2022 MAX-2INT 71 73 M*/ 2CONSTANT DBL1
2023 MIN-2INT 73 79 M*/ 2CONSTANT DBL2
2025 : D>ASCII ( D -- CADDR U )
2026 DUP >R <# DABS #S R> SIGN #> ( -- CADDR1 U )
2027 HERE SWAP 2DUP 2>R CHARS DUP ALLOT MOVE 2R>
2030 DBL1 D>ASCII 2CONSTANT "DBL1
"
2031 DBL2 D>ASCII 2CONSTANT "DBL2
"
2034 CR ." You should see lines duplicated
:" CR
2035 5 SPACES "DBL1
" TYPE CR
2037 8 SPACES "DBL1
" DUP >R TYPE CR
2038 5 SPACES DBL1 R> 3 + D.R CR
2039 5 SPACES "DBL2
" TYPE CR
2041 10 SPACES "DBL2
" DUP >R TYPE CR
2042 5 SPACES DBL2 R> 5 + D.R CR
2045 T{ DOUBLEOUTPUT -> }T
2048 \ ------------------------------------------------------------------------------
2049 TESTING 2ROT DU< (Double Number extension words)
2051 T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T
2052 T{ MAX-2INT MIN-2INT 1. 2ROT -> MIN-2INT 1. MAX-2INT }T
2054 T{ 1. 1. DU< -> FALSE }T
2055 T{ 1. -1. DU< -> TRUE }T
2056 T{ -1. 1. DU< -> FALSE }T
2057 T{ -1. -2. DU< -> FALSE }T
2058 T{ 0 1 1. DU< -> FALSE }T
2059 T{ 1. 0 1 DU< -> TRUE }T
2060 T{ 0 -1 1 -2 DU< -> FALSE }T
2061 T{ 1 -2 0 -1 DU< -> TRUE }T
2063 T{ MAX-2INT HI-2INT DU< -> FALSE }T
2064 T{ HI-2INT MAX-2INT DU< -> TRUE }T
2065 T{ MAX-2INT MIN-2INT DU< -> TRUE }T
2066 T{ MIN-2INT MAX-2INT DU< -> FALSE }T
2067 T{ MIN-2INT LO-2INT DU< -> TRUE }T
2070 \ -----------------------------------------------------------------------------
2071 TESTING Facility words
2074 \ -----------------------------------------------------------------------------
2075 TESTING BEGIN-STRUCTURE END-STRUCTURE +FIELD
2077 T{ BEGIN-STRUCTURE STRCT1
2081 T{ BEGIN-STRUCTURE STRCT2
2088 T{ STRCT2 -> 3 chars 1 cells + }T \ +FIELD doesn't align
2095 T{ CREATE S21 STRCT2 ALLOT -> }T
2096 T{ 11 S21 F21 C! -> }T
2097 T{ 22 S21 F22 C! -> }T
2098 T{ 33 S21 F23 C! -> }T
2099 T{ S21 F23 C@ -> 33 }T
2100 T{ 44 S21 F24 C! -> }T
2101 T{ S21 F21 C@ -> 11 }T
2102 T{ S21 F22 C@ -> 22 }T
2103 T{ S21 F23 C@ -> 44 }T
2104 T{ S21 F24 C@ -> 44 }T
2106 T{ CREATE S22 STRCT2 ALLOT -> }T
2107 T{ 55 S22 F21 C! -> }T
2108 T{ 66 S22 F22 C! -> }T
2109 T{ S21 F21 C@ -> 11 }T
2110 T{ S21 F22 C@ -> 22 }T
2111 T{ S22 F21 C@ -> 55 }T
2112 T{ S22 F22 C@ -> 66 }T
2114 TESTING FIELD: CFIELD:
2116 T{ BEGIN-STRUCTURE STRCT3
2125 T{ 0 F31 CELL+ -> 0 F32 }T
2126 T{ 0 CF31 CHAR+ -> 0 CF32 }T
2127 T{ 0 CF32 CHAR+ -> 0 CF33 }T
2128 T{ 0 CF33 CHAR+ ALIGN-FIELD -> 0 F33 }T
2129 T{ 0 F33 ALIGN-FIELD -> 0 F33 }T
2132 T{ CREATE S31 STRCT3 ALLOT -> }T
2133 T{ 1 S31 F31 ! -> }T
2134 T{ 2 S31 F32 ! -> }T
2135 T{ 3 S31 CF31 C! -> }T
2136 T{ 4 S31 CF32 C! -> }T
2137 T{ 5 S31 F33 ! -> }T
2138 T{ S31 F31 @ -> 1 }T
2139 T{ S31 F32 @ -> 2 }T
2140 T{ S31 CF31 C@ -> 3 }T
2141 T{ S31 CF32 C@ -> 4 }T
2142 T{ S31 F33 @ -> 5 }T
2144 TESTING Nested structures
2146 T{ BEGIN-STRUCTURE STRCT4
2148 ALIGN-FIELD STRCT3 +FIELD F42
2152 T{ STRCT4 -> STRCT2 ALIGN-FIELD STRCT3 + 3 + STRCT2 + }T
2154 T{ CREATE S41 STRCT4 ALLOT -> }T
2155 T{ 21 S41 F41 F21 C! -> }T
2156 T{ 22 S41 F41 F22 C! -> }T
2157 T{ 23 S41 F41 F23 C! -> }T
2158 T{ 24 S41 F42 F31 ! -> }T
2159 T{ 25 S41 F42 F32 ! -> }T
2160 T{ 26 S41 F42 CF31 C! -> }T
2161 T{ 27 S41 F42 CF32 C! -> }T
2162 T{ 28 S41 F42 CF33 C! -> }T
2163 T{ 29 S41 F42 F33 ! -> }T
2164 T{ 30 S41 F44 F21 C! -> }T
2165 T{ 31 S41 F44 F22 C! -> }T
2166 T{ 32 S41 F44 F23 C! -> }T
2168 T{ S41 F41 F21 C@ -> 21 }T
2169 T{ S41 F41 F22 C@ -> 22 }T
2170 T{ S41 F41 F23 C@ -> 23 }T
2171 T{ S41 F42 F31 @ -> 24 }T
2172 T{ S41 F42 F32 @ -> 25 }T
2173 T{ S41 F42 CF31 C@ -> 26 }T
2174 T{ S41 F42 CF32 C@ -> 27 }T
2175 T{ S41 F42 CF33 C@ -> 28 }T
2176 T{ S41 F42 F33 @ -> 29 }T
2177 T{ S41 F44 F21 C@ -> 30 }T
2178 T{ S41 F44 F22 C@ -> 31 }T
2179 T{ S41 F44 F23 C@ -> 32 }T
2182 \ -----------------------------------------------------------------------------
2185 T{ 8 BUFFER: BUF:TEST -> }T
2186 T{ BUF:TEST DUP ALIGNED = -> TRUE }T
2187 T{ 111 BUF:TEST ! 222 BUF:TEST CELL+ ! -> }T
2188 T{ BUF:TEST @ BUF:TEST CELL+ @ -> 111 222 }T
2190 \ -----------------------------------------------------------------------------
2193 T{ 111 VALUE VAL1 -999 VALUE VAL2 -> }T
2196 T{ 222 TO VAL1 -> }T
2198 T{ : VD1 VAL1 ; -> }T
2200 T{ : VD2 TO VAL2 ; -> }T
2205 T{ 123 VALUE VAL3 IMMEDIATE VAL3 -> 123 }T
2206 T{ : VD3 VAL3 LITERAL ; VD3 -> 123 }T
2208 \ -----------------------------------------------------------------------------
2209 TESTING CASE OF ENDOF ENDCASE
2211 : CS1 CASE 1 OF 111 ENDOF
2225 : CS2 >R CASE -1 OF CASE R@ 1 OF 100 ENDOF
2230 -2 OF CASE R@ 1 OF -99 ENDOF
2238 T{ -1 1 CS2 -> 100 }T
2239 T{ -1 2 CS2 -> 200 }T
2240 T{ -1 3 CS2 -> -300 }T
2241 T{ -2 1 CS2 -> -99 }T
2242 T{ -2 2 CS2 -> -199 }T
2243 T{ 0 2 CS2 -> 299 }T
2245 \ Boolean short circuiting using CASE
2248 CASE 1- FALSE OF 11 ENDOF
2249 1- FALSE OF 22 ENDOF
2250 1- FALSE OF 33 ENDOF
2260 \ Empty CASE statements with/without default
2262 T{ : CS4 CASE ENDCASE ; 1 CS4 -> }T
2263 T{ : CS5 CASE 2 SWAP ENDCASE ; 1 CS5 -> 2 }T
2264 T{ : CS6 CASE 1 OF ENDOF 2 ENDCASE ; 1 CS6 -> }T
2265 T{ : CS7 CASE 3 OF ENDOF 2 ENDCASE ; 1 CS7 -> 1 }T
2268 \ -----------------------------------------------------------------------------
2269 TESTING :NONAME RECURSE
2273 :NONAME 1234 ; NN1 !
2274 :NONAME 9876 ; NN2 !
2275 T{ NN1 @ EXECUTE -> 1234 }T
2276 T{ NN2 @ EXECUTE -> 9876 }T
2278 T{ :NONAME ( n -- 0,1,..n ) DUP IF DUP >R 1- RECURSE R> THEN ;
2280 T{ 0 RN1 EXECUTE -> 0 }T
2281 T{ 4 RN1 EXECUTE -> 0 1 2 3 4 }T
2283 :NONAME ( n -- n1 ) \ Multiple RECURSEs in one definition
2285 CASE 0 OF EXIT ENDOF
2286 1 OF 11 SWAP RECURSE ENDOF
2287 2 OF 22 SWAP RECURSE ENDOF
2288 3 OF 33 SWAP RECURSE ENDOF
2289 DROP ABS RECURSE EXIT
2293 T{ 1 RN2 EXECUTE -> 0 }T
2294 T{ 2 RN2 EXECUTE -> 11 0 }T
2295 T{ 4 RN2 EXECUTE -> 33 22 11 0 }T
2296 T{ 25 RN2 EXECUTE -> 33 22 11 0 }T
2298 \ -----------------------------------------------------------------------------
2302 T{ : CQ1 C" 123" ; -> }T
2303 T{ CQ1 BCOUNT EVALUATE -> 123 }T
2304 T{ : CQ2 C" " ; -> }T
2305 T{ CQ2 BCOUNT EVALUATE -> }T
2306 ;; k8: missing space bug; but the parser should accept it
2307 T{ : CQ3 C" 2345"BCOUNT EVALUATE ; CQ3 -> 2345 }T
2309 \ -----------------------------------------------------------------------------
2312 :NONAME DUP + ; CONSTANT DUP+
2313 T{ : Q DUP+ COMPILE, ; -> }T
2314 T{ : AS1 [ Q ] ; -> }T
2315 T{ 123 AS1 -> 246 }T
2318 \ -----------------------------------------------------------------------------
2319 \ Cannot automatically test SAVE-INPUT and RESTORE-INPUT from a console source
2321 TESTING SAVE-INPUT and RESTORE-INPUT with a string source
2323 VARIABLE SI_INC 0 SI_INC !
2330 : S$ S" SAVE
-INPUT SI1 RESTORE
-INPUT
12345" ;
2332 \ k8: how the fuck it expects to have zero here?
2333 \ T{ S$ EVALUATE SI_INC @ -> 0 2345 15 }T
2334 T{ S$ EVALUATE SI_INC @ -> 2345 15 }T
2337 \ -----------------------------------------------------------------------------
2339 TESTING .R and U.R - has to handle different cell sizes
2341 \ Create some large integers just below/above MAX and Min INTs
2342 MAX-INT 73 79 */ CONSTANT LI1
2343 MIN-INT 71 73 */ CONSTANT LI2
2345 LI1 0 <# #S #> NIP CONSTANT LENLI1
2347 : (.R&U.R) ( u1 u2 -- ) \ u1 <= string length, u2 is required indentation
2349 LI1 OVER SPACES . CR R@ LI1 SWAP .R CR
2350 LI2 OVER SPACES . CR R@ 1+ LI2 SWAP .R CR
2351 LI1 OVER SPACES U. CR R@ LI1 SWAP U.R CR
2352 LI2 SWAP SPACES U. CR R> LI2 SWAP U.R CR
2356 CR ." You should see lines duplicated
:" CR
2357 ." indented by
0 spaces
" CR 0 0 (.R&U.R) CR
2358 ." indented by
0 spaces
" CR LENLI1 0 (.R&U.R) CR \ Just fits required width
2359 ." indented by
5 spaces
" CR LENLI1 5 (.R&U.R) CR
2362 CR CR .( Output from .R and U.R)
2367 \ -----------------------------------------------------------------------------
2369 \ Must handle different size characters i.e. 1 CHARS >= 1
2371 84 CONSTANT CHARS/PAD \ Minimum size of PAD in chars
2372 CHARS/PAD CHARS CONSTANT AUS/PAD
2373 : CHECKPAD ( caddr u ch -- f ) \ f = TRUE if u chars = ch
2376 OVER I CHARS + C@ OVER <>
2377 IF 2DROP UNLOOP FALSE EXIT THEN
2383 T{ 0 INVERT PAD C! -> }T
2384 T{ PAD C@ CONSTANT MAXCHAR -> }T
2385 T{ PAD CHARS/PAD 2DUP MAXCHAR FILL MAXCHAR CHECKPAD -> TRUE }T
2386 T{ PAD CHARS/PAD 2DUP CHARS ERASE 0 CHECKPAD -> TRUE }T
2387 T{ PAD CHARS/PAD 2DUP MAXCHAR FILL PAD 0 ERASE MAXCHAR CHECKPAD -> TRUE }T
2388 T{ PAD 43 CHARS + 9 CHARS ERASE -> }T
2389 T{ PAD 43 MAXCHAR CHECKPAD -> TRUE }T
2390 T{ PAD 43 CHARS + 9 0 CHECKPAD -> TRUE }T
2391 T{ PAD 52 CHARS + CHARS/PAD 52 - MAXCHAR CHECKPAD -> TRUE }T
2393 \ Check that use of WORD and pictured numeric output do not corrupt PAD
2394 \ Minimum size of buffers for these are 33 chars and (2*n)+2 chars respectively
2395 \ where n is number of bits per cell
2399 MAX-UINT MAX-UINT <# #S CHAR 1 DUP HOLD HOLD #> 2DROP
2401 BL WORD 12345678123456781234567812345678 DROP
2402 T{ PAD CHARS/PAD 0 CHECKPAD -> TRUE }T
2405 \ -----------------------------------------------------------------------------
2406 TESTING DEFER DEFER@ DEFER! IS ACTION-OF (Forth 2012)
2407 \ Adapted from the Forth 200X RfD tests
2409 T{ DEFER DEFER1 -> }T
2410 T{ : MY-DEFER DEFER ; -> }T
2411 T{ : IS-DEFER1 IS DEFER1 ; -> }T
2412 T{ : ACTION-DEFER1 ACTION-OF DEFER1 ; -> }T
2413 T{ : DEF! DEFER! ; -> }T
2414 T{ : DEF@ DEFER@ ; -> }T
2416 T{ ' * ' DEFER1 DEFER! -> }T
2417 T{ 2 3 DEFER1 -> 6 }T
2418 T{ ' DEFER1 DEFER@ -> ' * }T
2419 T{ ' DEFER1 DEF@ -> ' * }T
2420 T{ ACTION-OF DEFER1 -> ' * }T
2421 T{ ACTION-DEFER1 -> ' * }T
2422 T{ ' + IS DEFER1 -> }T
2423 T{ 1 2 DEFER1 -> 3 }T
2424 T{ ' DEFER1 DEFER@ -> ' + }T
2425 T{ ' DEFER1 DEF@ -> ' + }T
2426 T{ ACTION-OF DEFER1 -> ' + }T
2427 T{ ACTION-DEFER1 -> ' + }T
2428 T{ ' - IS-DEFER1 -> }T
2429 T{ 1 2 DEFER1 -> -1 }T
2430 T{ ' DEFER1 DEFER@ -> ' - }T
2431 T{ ' DEFER1 DEF@ -> ' - }T
2432 T{ ACTION-OF DEFER1 -> ' - }T
2433 T{ ACTION-DEFER1 -> ' - }T
2435 T{ MY-DEFER DEFER2 -> }T
2436 T{ ' DUP IS DEFER2 -> }T
2437 T{ 1 DEFER2 -> 1 1 }T
2440 \ -----------------------------------------------------------------------------
2441 TESTING HOLDS (Forth 2012)
2443 : HTEST S" Testing HOLDS
" ;
2444 : HTEST2 S" works
" ;
2445 : HTEST3 S" Testing HOLDS works
123" ;
2446 T{ 0 0 <# HTEST HOLDS #> HTEST S= -> TRUE }T
2447 T{ 123 0 <# #S BL HOLD HTEST2 HOLDS BL HOLD HTEST HOLDS #>
2448 HTEST3 S= -> TRUE }T
2449 T{ : HLD HOLDS ; -> }T
2450 T{ 0 0 <# HTEST HLD #> HTEST S= -> TRUE }T
2451 T{ <# 123 0 #S S" Number
: " HOLDS #> S" Number
: 123" COMPARE -> 0 }T
2454 \ ------------------------------------------------------------------------
2455 TESTING DLSHIFT DRSHIFT DARSHIFT
2457 T{ 0 1 1 drshift -> 0x80000000 0x00000000 }T
2458 T{ 0 2 0 drshift -> 0x00000000 0x00000002 }T
2459 T{ 0 2 1 drshift -> 0x00000000 0x00000001 }T
2460 T{ 0 2 2 drshift -> 0x80000000 0x00000000 }T
2461 T{ 0 2 3 drshift -> 0x40000000 0x00000000 }T
2462 T{ 0 2 31 drshift -> 0x00000004 0x00000000 }T
2463 T{ 0 2 32 drshift -> 0x00000002 0x00000000 }T
2464 T{ 0 2 33 drshift -> 0x00000001 0x00000000 }T
2465 T{ 0 2 34 drshift -> 0x00000000 0x00000000 }T
2466 T{ 0 2 63 drshift -> 0x00000000 0x00000000 }T
2467 T{ 0 2 64 drshift -> 0x00000000 0x00000000 }T
2468 T{ 0 2 65 drshift -> 0x00000000 0x00000000 }T
2470 T{ 1 0 32 dlshift -> 0x00000000 0x00000001 }T
2471 T{ 1 0 63 dlshift -> 0x00000000 0x80000000 }T
2472 T{ 1 0 64 dlshift -> 0x00000000 0x00000000 }T
2473 T{ 1 0 31 dlshift -> 0x80000000 0x00000000 }T
2475 T{ 1 0 31 dlshift -> 0x80000000 0x00000000 }T
2476 T{ 1 0 32 dlshift -> 0x00000000 0x00000001 }T
2477 T{ 1 0 33 dlshift -> 0x00000000 0x00000002 }T
2478 T{ 1 0 63 dlshift -> 0x00000000 0x80000000 }T
2479 T{ 1 0 64 dlshift -> 0x00000000 0x00000000 }T
2480 T{ 1 0 65 dlshift -> 0x00000000 0x00000000 }T
2482 T{ 0 1 1 darshift -> 0x80000000 0x00000000 }T
2483 T{ 0 2 0 darshift -> 0x00000000 0x00000002 }T
2484 T{ 0 2 1 darshift -> 0x00000000 0x00000001 }T
2485 T{ 0 2 2 darshift -> 0x80000000 0x00000000 }T
2486 T{ 0 2 3 darshift -> 0x40000000 0x00000000 }T
2487 T{ 0 2 31 darshift -> 0x00000004 0x00000000 }T
2488 T{ 0 2 32 darshift -> 0x00000002 0x00000000 }T
2489 T{ 0 2 33 darshift -> 0x00000001 0x00000000 }T
2490 T{ 0 2 34 darshift -> 0x00000000 0x00000000 }T
2491 T{ 0 2 63 darshift -> 0x00000000 0x00000000 }T
2492 T{ 0 2 64 darshift -> 0x00000000 0x00000000 }T
2493 T{ 0 2 65 darshift -> 0x00000000 0x00000000 }T
2495 T{ 0 -4 0 darshift -> 0x00000000 0xFFFFFFFC }T
2496 T{ 0 -4 1 darshift -> 0x00000000 0xFFFFFFFE }T
2497 T{ 0 -4 2 darshift -> 0x00000000 0xFFFFFFFF }T
2498 T{ 0 -4 3 darshift -> 0x80000000 0xFFFFFFFF }T
2499 T{ 0 -4 4 darshift -> 0xC0000000 0xFFFFFFFF }T
2500 T{ 0 -4 16 darshift -> 0xFFFC0000 0xFFFFFFFF }T
2501 T{ 0 -4 31 darshift -> 0xFFFFFFF8 0xFFFFFFFF }T
2502 T{ 0 -4 32 darshift -> 0xFFFFFFFC 0xFFFFFFFF }T
2503 T{ 0 -4 33 darshift -> 0xFFFFFFFE 0xFFFFFFFF }T
2504 T{ 0 -4 34 darshift -> 0xFFFFFFFF 0xFFFFFFFF }T
2505 T{ 0 -4 35 darshift -> 0xFFFFFFFF 0xFFFFFFFF }T
2506 T{ 0 -4 63 darshift -> 0xFFFFFFFF 0xFFFFFFFF }T
2507 T{ 0 -4 64 darshift -> 0xFFFFFFFF 0xFFFFFFFF }T
2508 T{ 0 -4 65 darshift -> 0xFFFFFFFF 0xFFFFFFFF }T
2510 \ ------------------------------------------------------------------------
2511 TESTING ALLOCATE FREE RESIZE
2517 T{ 100 ALLOCATE SWAP ADDR1 ! -> 0 }T
2518 T{ ADDR1 @ ALIGNED -> ADDR1 @ }T \ Test address is aligned
2519 T{ HERE -> DATSP @ }T \ Check data space pointer is unchanged
2520 T{ ADDR1 @ FREE -> 0 }T
2522 T{ 99 ALLOCATE SWAP ADDR1 ! -> 0 }T
2523 T{ ADDR1 @ ALIGNED -> ADDR1 @ }T
2524 T{ ADDR1 @ FREE -> 0 }T
2526 T{ 50 CHARS ALLOCATE SWAP ADDR1 ! -> 0 }T
2528 : WRITEMEM 0 DO I 1+ OVER C! CHAR+ LOOP DROP ; ( ad n -- )
2530 \ CHECKMEM is defined this way to maintain compatibility with both
2531 \ tester.fr and ttester.fs which differ in their definitions of T{
2533 : CHECKMEM ( ad n --- )
2536 T{ R@ C@ -> R> I 1+ SWAP >R }T
2542 ADDR1 @ 50 WRITEMEM ADDR1 @ 50 CHECKMEM
2544 T{ ADDR1 @ 28 CHARS RESIZE SWAP ADDR1 ! -> 0 }T
2547 T{ ADDR1 @ 200 CHARS RESIZE SWAP ADDR1 ! -> 0 }T
2550 \ ------------------------------------------------------------------------------
2551 TESTING failure of RESIZE and ALLOCATE (unlikely to be enough memory)
2553 \ This test relies on the previous test having passed
2556 T{ ADDR1 @ -1 CHARS RESIZE 0= DUP RESIZE-OK ! -> ADDR1 @ FALSE }T
2558 \ Check unRESIZEd allocation is unchanged following RESIZE failure
2559 : MEM? RESIZE-OK @ 0= IF ADDR1 @ 28 CHECKMEM THEN ; \ Avoid using [IF]
2562 T{ ADDR1 @ FREE -> 0 }T \ Tidy up
2564 T{ -1 ALLOCATE SWAP DROP 0= -> FALSE }T \ Memory allocate failed
2566 \ ------------------------------------------------------------------------------
2567 TESTING @ and ! work in ALLOCATEd memory (provided by Peter Knaggs)
2569 : WRITE-CELL-MEM ( ADDR N -- )
2570 1+ 1 DO I OVER ! CELL+ LOOP DROP
2573 : CHECK-CELL-MEM ( ADDR N -- )
2576 T{ R> ( I ) -> R@ ( ADDR ) @ }T
2581 \ Cell based access to the heap
2583 T{ 50 CELLS ALLOCATE SWAP ADDR1 ! -> 0 }T
2584 ADDR1 @ 50 WRITE-CELL-MEM
2585 ADDR1 @ 50 CHECK-CELL-MEM