changelog shortlog graph tags branches changeset file revisions annotate raw help

Mercurial > demo / fig/tests/core.fr

revision 18: a1137af05c8d
parent 17: e4c9ec452eb6
child 19: fd19fdc77a20
     1.1--- a/fig/tests/core.fr	Sat May 27 21:07:55 2023 -0400
     1.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3@@ -1,1003 +0,0 @@
     1.4-\ From: John Hayes S1I
     1.5-\ Subject: core.fr
     1.6-\ Date: Mon, 27 Nov 95 13:10
     1.7-
     1.8-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
     1.9-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
    1.10-\ VERSION 1.2
    1.11-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
    1.12-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
    1.13-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
    1.14-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
    1.15-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
    1.16-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
    1.17-
    1.18-CR
    1.19-TESTING CORE WORDS
    1.20-HEX
    1.21-
    1.22-\ ------------------------------------------------------------------------
    1.23-TESTING BASIC ASSUMPTIONS
    1.24-
    1.25-T{ -> }T               \ START WITH CLEAN SLATE
    1.26-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
    1.27-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
    1.28-T{  0 BITSSET? -> 0 }T      ( ZERO IS ALL BITS CLEAR )
    1.29-T{  1 BITSSET? -> 0 0 }T      ( OTHER NUMBER HAVE AT LEAST ONE BIT )
    1.30-T{ -1 BITSSET? -> 0 0 }T
    1.31-
    1.32-\ ------------------------------------------------------------------------
    1.33-TESTING BOOLEANS: INVERT AND OR XOR
    1.34-
    1.35-T{ 0 0 AND -> 0 }T
    1.36-T{ 0 1 AND -> 0 }T
    1.37-T{ 1 0 AND -> 0 }T
    1.38-T{ 1 1 AND -> 1 }T
    1.39-
    1.40-T{ 0 INVERT 1 AND -> 1 }T
    1.41-T{ 1 INVERT 1 AND -> 0 }T
    1.42-
    1.43-0    CONSTANT 0S
    1.44-0 INVERT CONSTANT 1S
    1.45-
    1.46-T{ 0S INVERT -> 1S }T
    1.47-T{ 1S INVERT -> 0S }T
    1.48-
    1.49-T{ 0S 0S AND -> 0S }T
    1.50-T{ 0S 1S AND -> 0S }T
    1.51-T{ 1S 0S AND -> 0S }T
    1.52-T{ 1S 1S AND -> 1S }T
    1.53-
    1.54-T{ 0S 0S OR -> 0S }T
    1.55-T{ 0S 1S OR -> 1S }T
    1.56-T{ 1S 0S OR -> 1S }T
    1.57-T{ 1S 1S OR -> 1S }T
    1.58-
    1.59-T{ 0S 0S XOR -> 0S }T
    1.60-T{ 0S 1S XOR -> 1S }T
    1.61-T{ 1S 0S XOR -> 1S }T
    1.62-T{ 1S 1S XOR -> 0S }T
    1.63-
    1.64-\ ------------------------------------------------------------------------
    1.65-TESTING 2* 2/ LSHIFT RSHIFT
    1.66-
    1.67-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
    1.68-1S 1 RSHIFT INVERT CONSTANT MSB
    1.69-T{ MSB BITSSET? -> 0 0 }T
    1.70-
    1.71-T{ 0S 2* -> 0S }T
    1.72-T{ 1 2* -> 2 }T
    1.73-T{ 4000 2* -> 8000 }T
    1.74-T{ 1S 2* 1 XOR -> 1S }T
    1.75-T{ MSB 2* -> 0S }T
    1.76-
    1.77-T{ 0S 2/ -> 0S }T
    1.78-T{ 1 2/ -> 0 }T
    1.79-T{ 4000 2/ -> 2000 }T
    1.80-T{ 1S 2/ -> 1S }T            \ MSB PROPOGATED
    1.81-T{ 1S 1 XOR 2/ -> 1S }T
    1.82-T{ MSB 2/ MSB AND -> MSB }T
    1.83-
    1.84-T{ 1 0 LSHIFT -> 1 }T
    1.85-T{ 1 1 LSHIFT -> 2 }T
    1.86-T{ 1 2 LSHIFT -> 4 }T
    1.87-T{ 1 F LSHIFT -> 8000 }T         \ BIGGEST GUARANTEED SHIFT
    1.88-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
    1.89-T{ MSB 1 LSHIFT -> 0 }T
    1.90-
    1.91-T{ 1 0 RSHIFT -> 1 }T
    1.92-T{ 1 1 RSHIFT -> 0 }T
    1.93-T{ 2 1 RSHIFT -> 1 }T
    1.94-T{ 4 2 RSHIFT -> 1 }T
    1.95-T{ 8000 F RSHIFT -> 1 }T         \ BIGGEST
    1.96-T{ MSB 1 RSHIFT MSB AND -> 0 }T      \ RSHIFT ZERO FILLS MSBS
    1.97-T{ MSB 1 RSHIFT 2* -> MSB }T
    1.98-
    1.99-\ ------------------------------------------------------------------------
   1.100-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
   1.101-0 INVERT         CONSTANT MAX-UINT
   1.102-0 INVERT 1 RSHIFT      CONSTANT MAX-INT
   1.103-0 INVERT 1 RSHIFT INVERT   CONSTANT MIN-INT
   1.104-0 INVERT 1 RSHIFT      CONSTANT MID-UINT
   1.105-0 INVERT 1 RSHIFT INVERT   CONSTANT MID-UINT+1
   1.106-
   1.107-0S CONSTANT <FALSE>
   1.108-1S CONSTANT <TRUE>
   1.109-
   1.110-T{ 0 0= -> <TRUE> }T
   1.111-T{ 1 0= -> <FALSE> }T
   1.112-T{ 2 0= -> <FALSE> }T
   1.113-T{ -1 0= -> <FALSE> }T
   1.114-T{ MAX-UINT 0= -> <FALSE> }T
   1.115-T{ MIN-INT 0= -> <FALSE> }T
   1.116-T{ MAX-INT 0= -> <FALSE> }T
   1.117-
   1.118-T{ 0 0 = -> <TRUE> }T
   1.119-T{ 1 1 = -> <TRUE> }T
   1.120-T{ -1 -1 = -> <TRUE> }T
   1.121-T{ 1 0 = -> <FALSE> }T
   1.122-T{ -1 0 = -> <FALSE> }T
   1.123-T{ 0 1 = -> <FALSE> }T
   1.124-T{ 0 -1 = -> <FALSE> }T
   1.125-
   1.126-T{ 0 0< -> <FALSE> }T
   1.127-T{ -1 0< -> <TRUE> }T
   1.128-T{ MIN-INT 0< -> <TRUE> }T
   1.129-T{ 1 0< -> <FALSE> }T
   1.130-T{ MAX-INT 0< -> <FALSE> }T
   1.131-
   1.132-T{ 0 1 < -> <TRUE> }T
   1.133-T{ 1 2 < -> <TRUE> }T
   1.134-T{ -1 0 < -> <TRUE> }T
   1.135-T{ -1 1 < -> <TRUE> }T
   1.136-T{ MIN-INT 0 < -> <TRUE> }T
   1.137-T{ MIN-INT MAX-INT < -> <TRUE> }T
   1.138-T{ 0 MAX-INT < -> <TRUE> }T
   1.139-T{ 0 0 < -> <FALSE> }T
   1.140-T{ 1 1 < -> <FALSE> }T
   1.141-T{ 1 0 < -> <FALSE> }T
   1.142-T{ 2 1 < -> <FALSE> }T
   1.143-T{ 0 -1 < -> <FALSE> }T
   1.144-T{ 1 -1 < -> <FALSE> }T
   1.145-T{ 0 MIN-INT < -> <FALSE> }T
   1.146-T{ MAX-INT MIN-INT < -> <FALSE> }T
   1.147-T{ MAX-INT 0 < -> <FALSE> }T
   1.148-
   1.149-T{ 0 1 > -> <FALSE> }T
   1.150-T{ 1 2 > -> <FALSE> }T
   1.151-T{ -1 0 > -> <FALSE> }T
   1.152-T{ -1 1 > -> <FALSE> }T
   1.153-T{ MIN-INT 0 > -> <FALSE> }T
   1.154-T{ MIN-INT MAX-INT > -> <FALSE> }T
   1.155-T{ 0 MAX-INT > -> <FALSE> }T
   1.156-T{ 0 0 > -> <FALSE> }T
   1.157-T{ 1 1 > -> <FALSE> }T
   1.158-T{ 1 0 > -> <TRUE> }T
   1.159-T{ 2 1 > -> <TRUE> }T
   1.160-T{ 0 -1 > -> <TRUE> }T
   1.161-T{ 1 -1 > -> <TRUE> }T
   1.162-T{ 0 MIN-INT > -> <TRUE> }T
   1.163-T{ MAX-INT MIN-INT > -> <TRUE> }T
   1.164-T{ MAX-INT 0 > -> <TRUE> }T
   1.165-
   1.166-T{ 0 1 U< -> <TRUE> }T
   1.167-T{ 1 2 U< -> <TRUE> }T
   1.168-T{ 0 MID-UINT U< -> <TRUE> }T
   1.169-T{ 0 MAX-UINT U< -> <TRUE> }T
   1.170-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
   1.171-T{ 0 0 U< -> <FALSE> }T
   1.172-T{ 1 1 U< -> <FALSE> }T
   1.173-T{ 1 0 U< -> <FALSE> }T
   1.174-T{ 2 1 U< -> <FALSE> }T
   1.175-T{ MID-UINT 0 U< -> <FALSE> }T
   1.176-T{ MAX-UINT 0 U< -> <FALSE> }T
   1.177-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
   1.178-
   1.179-T{ 0 1 MIN -> 0 }T
   1.180-T{ 1 2 MIN -> 1 }T
   1.181-T{ -1 0 MIN -> -1 }T
   1.182-T{ -1 1 MIN -> -1 }T
   1.183-T{ MIN-INT 0 MIN -> MIN-INT }T
   1.184-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
   1.185-T{ 0 MAX-INT MIN -> 0 }T
   1.186-T{ 0 0 MIN -> 0 }T
   1.187-T{ 1 1 MIN -> 1 }T
   1.188-T{ 1 0 MIN -> 0 }T
   1.189-T{ 2 1 MIN -> 1 }T
   1.190-T{ 0 -1 MIN -> -1 }T
   1.191-T{ 1 -1 MIN -> -1 }T
   1.192-T{ 0 MIN-INT MIN -> MIN-INT }T
   1.193-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
   1.194-T{ MAX-INT 0 MIN -> 0 }T
   1.195-
   1.196-T{ 0 1 MAX -> 1 }T
   1.197-T{ 1 2 MAX -> 2 }T
   1.198-T{ -1 0 MAX -> 0 }T
   1.199-T{ -1 1 MAX -> 1 }T
   1.200-T{ MIN-INT 0 MAX -> 0 }T
   1.201-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
   1.202-T{ 0 MAX-INT MAX -> MAX-INT }T
   1.203-T{ 0 0 MAX -> 0 }T
   1.204-T{ 1 1 MAX -> 1 }T
   1.205-T{ 1 0 MAX -> 1 }T
   1.206-T{ 2 1 MAX -> 2 }T
   1.207-T{ 0 -1 MAX -> 0 }T
   1.208-T{ 1 -1 MAX -> 1 }T
   1.209-T{ 0 MIN-INT MAX -> 0 }T
   1.210-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
   1.211-T{ MAX-INT 0 MAX -> MAX-INT }T
   1.212-
   1.213-\ ------------------------------------------------------------------------
   1.214-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
   1.215-
   1.216-T{ 1 2 2DROP -> }T
   1.217-T{ 1 2 2DUP -> 1 2 1 2 }T
   1.218-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
   1.219-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
   1.220-T{ 0 ?DUP -> 0 }T
   1.221-T{ 1 ?DUP -> 1 1 }T
   1.222-T{ -1 ?DUP -> -1 -1 }T
   1.223-T{ DEPTH -> 0 }T
   1.224-T{ 0 DEPTH -> 0 1 }T
   1.225-T{ 0 1 DEPTH -> 0 1 2 }T
   1.226-T{ 0 DROP -> }T
   1.227-T{ 1 2 DROP -> 1 }T
   1.228-T{ 1 DUP -> 1 1 }T
   1.229-T{ 1 2 OVER -> 1 2 1 }T
   1.230-T{ 1 2 3 ROT -> 2 3 1 }T
   1.231-T{ 1 2 SWAP -> 2 1 }T
   1.232-
   1.233-\ ------------------------------------------------------------------------
   1.234-TESTING >R R> R@
   1.235-
   1.236-T{ : GR1 >R R> ; -> }T
   1.237-T{ : GR2 >R R@ R> DROP ; -> }T
   1.238-T{ 123 GR1 -> 123 }T
   1.239-T{ 123 GR2 -> 123 }T
   1.240-T{ 1S GR1 -> 1S }T   ( RETURN STACK HOLDS CELLS )
   1.241-
   1.242-\ ------------------------------------------------------------------------
   1.243-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
   1.244-
   1.245-T{ 0 5 + -> 5 }T
   1.246-T{ 5 0 + -> 5 }T
   1.247-T{ 0 -5 + -> -5 }T
   1.248-T{ -5 0 + -> -5 }T
   1.249-T{ 1 2 + -> 3 }T
   1.250-T{ 1 -2 + -> -1 }T
   1.251-T{ -1 2 + -> 1 }T
   1.252-T{ -1 -2 + -> -3 }T
   1.253-T{ -1 1 + -> 0 }T
   1.254-T{ MID-UINT 1 + -> MID-UINT+1 }T
   1.255-
   1.256-T{ 0 5 - -> -5 }T
   1.257-T{ 5 0 - -> 5 }T
   1.258-T{ 0 -5 - -> 5 }T
   1.259-T{ -5 0 - -> -5 }T
   1.260-T{ 1 2 - -> -1 }T
   1.261-T{ 1 -2 - -> 3 }T
   1.262-T{ -1 2 - -> -3 }T
   1.263-T{ -1 -2 - -> 1 }T
   1.264-T{ 0 1 - -> -1 }T
   1.265-T{ MID-UINT+1 1 - -> MID-UINT }T
   1.266-
   1.267-T{ 0 1+ -> 1 }T
   1.268-T{ -1 1+ -> 0 }T
   1.269-T{ 1 1+ -> 2 }T
   1.270-T{ MID-UINT 1+ -> MID-UINT+1 }T
   1.271-
   1.272-T{ 2 1- -> 1 }T
   1.273-T{ 1 1- -> 0 }T
   1.274-T{ 0 1- -> -1 }T
   1.275-T{ MID-UINT+1 1- -> MID-UINT }T
   1.276-
   1.277-T{ 0 NEGATE -> 0 }T
   1.278-T{ 1 NEGATE -> -1 }T
   1.279-T{ -1 NEGATE -> 1 }T
   1.280-T{ 2 NEGATE -> -2 }T
   1.281-T{ -2 NEGATE -> 2 }T
   1.282-
   1.283-T{ 0 ABS -> 0 }T
   1.284-T{ 1 ABS -> 1 }T
   1.285-T{ -1 ABS -> 1 }T
   1.286-T{ MIN-INT ABS -> MID-UINT+1 }T
   1.287-
   1.288-\ ------------------------------------------------------------------------
   1.289-TESTING MULTIPLY: S>D * M* UM*
   1.290-
   1.291-T{ 0 S>D -> 0 0 }T
   1.292-T{ 1 S>D -> 1 0 }T
   1.293-T{ 2 S>D -> 2 0 }T
   1.294-T{ -1 S>D -> -1 -1 }T
   1.295-T{ -2 S>D -> -2 -1 }T
   1.296-T{ MIN-INT S>D -> MIN-INT -1 }T
   1.297-T{ MAX-INT S>D -> MAX-INT 0 }T
   1.298-
   1.299-T{ 0 0 M* -> 0 S>D }T
   1.300-T{ 0 1 M* -> 0 S>D }T
   1.301-T{ 1 0 M* -> 0 S>D }T
   1.302-T{ 1 2 M* -> 2 S>D }T
   1.303-T{ 2 1 M* -> 2 S>D }T
   1.304-T{ 3 3 M* -> 9 S>D }T
   1.305-T{ -3 3 M* -> -9 S>D }T
   1.306-T{ 3 -3 M* -> -9 S>D }T
   1.307-T{ -3 -3 M* -> 9 S>D }T
   1.308-T{ 0 MIN-INT M* -> 0 S>D }T
   1.309-T{ 1 MIN-INT M* -> MIN-INT S>D }T
   1.310-T{ 2 MIN-INT M* -> 0 1S }T
   1.311-T{ 0 MAX-INT M* -> 0 S>D }T
   1.312-T{ 1 MAX-INT M* -> MAX-INT S>D }T
   1.313-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
   1.314-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
   1.315-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
   1.316-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
   1.317-
   1.318-T{ 0 0 * -> 0 }T            \ TEST IDENTITIES
   1.319-T{ 0 1 * -> 0 }T
   1.320-T{ 1 0 * -> 0 }T
   1.321-T{ 1 2 * -> 2 }T
   1.322-T{ 2 1 * -> 2 }T
   1.323-T{ 3 3 * -> 9 }T
   1.324-T{ -3 3 * -> -9 }T
   1.325-T{ 3 -3 * -> -9 }T
   1.326-T{ -3 -3 * -> 9 }T
   1.327-
   1.328-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
   1.329-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
   1.330-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
   1.331-
   1.332-T{ 0 0 UM* -> 0 0 }T
   1.333-T{ 0 1 UM* -> 0 0 }T
   1.334-T{ 1 0 UM* -> 0 0 }T
   1.335-T{ 1 2 UM* -> 2 0 }T
   1.336-T{ 2 1 UM* -> 2 0 }T
   1.337-T{ 3 3 UM* -> 9 0 }T
   1.338-
   1.339-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
   1.340-T{ MID-UINT+1 2 UM* -> 0 1 }T
   1.341-T{ MID-UINT+1 4 UM* -> 0 2 }T
   1.342-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
   1.343-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
   1.344-
   1.345-\ ------------------------------------------------------------------------
   1.346-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
   1.347-
   1.348-T{ 0 S>D 1 FM/MOD -> 0 0 }T
   1.349-T{ 1 S>D 1 FM/MOD -> 0 1 }T
   1.350-T{ 2 S>D 1 FM/MOD -> 0 2 }T
   1.351-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
   1.352-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
   1.353-T{ 0 S>D -1 FM/MOD -> 0 0 }T
   1.354-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
   1.355-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
   1.356-T{ -1 S>D -1 FM/MOD -> 0 1 }T
   1.357-T{ -2 S>D -1 FM/MOD -> 0 2 }T
   1.358-T{ 2 S>D 2 FM/MOD -> 0 1 }T
   1.359-T{ -1 S>D -1 FM/MOD -> 0 1 }T
   1.360-T{ -2 S>D -2 FM/MOD -> 0 1 }T
   1.361-T{  7 S>D  3 FM/MOD -> 1 2 }T
   1.362-T{  7 S>D -3 FM/MOD -> -2 -3 }T
   1.363-T{ -7 S>D  3 FM/MOD -> 2 -3 }T
   1.364-T{ -7 S>D -3 FM/MOD -> -1 2 }T
   1.365-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
   1.366-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
   1.367-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
   1.368-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
   1.369-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
   1.370-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
   1.371-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
   1.372-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
   1.373-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
   1.374-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
   1.375-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
   1.376-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
   1.377-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
   1.378-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
   1.379-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
   1.380-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
   1.381-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
   1.382-
   1.383-T{ 0 S>D 1 SM/REM -> 0 0 }T
   1.384-T{ 1 S>D 1 SM/REM -> 0 1 }T
   1.385-T{ 2 S>D 1 SM/REM -> 0 2 }T
   1.386-T{ -1 S>D 1 SM/REM -> 0 -1 }T
   1.387-T{ -2 S>D 1 SM/REM -> 0 -2 }T
   1.388-T{ 0 S>D -1 SM/REM -> 0 0 }T
   1.389-T{ 1 S>D -1 SM/REM -> 0 -1 }T
   1.390-T{ 2 S>D -1 SM/REM -> 0 -2 }T
   1.391-T{ -1 S>D -1 SM/REM -> 0 1 }T
   1.392-T{ -2 S>D -1 SM/REM -> 0 2 }T
   1.393-T{ 2 S>D 2 SM/REM -> 0 1 }T
   1.394-T{ -1 S>D -1 SM/REM -> 0 1 }T
   1.395-T{ -2 S>D -2 SM/REM -> 0 1 }T
   1.396-T{  7 S>D  3 SM/REM -> 1 2 }T
   1.397-T{  7 S>D -3 SM/REM -> 1 -2 }T
   1.398-T{ -7 S>D  3 SM/REM -> -1 -2 }T
   1.399-T{ -7 S>D -3 SM/REM -> -1 2 }T
   1.400-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
   1.401-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
   1.402-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
   1.403-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
   1.404-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
   1.405-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
   1.406-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
   1.407-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
   1.408-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
   1.409-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
   1.410-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
   1.411-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
   1.412-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
   1.413-
   1.414-T{ 0 0 1 UM/MOD -> 0 0 }T
   1.415-T{ 1 0 1 UM/MOD -> 0 1 }T
   1.416-T{ 1 0 2 UM/MOD -> 1 0 }T
   1.417-T{ 3 0 2 UM/MOD -> 1 1 }T
   1.418-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
   1.419-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
   1.420-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
   1.421-
   1.422-: IFFLOORED
   1.423-   [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
   1.424-
   1.425-: IFSYM
   1.426-   [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
   1.427-
   1.428-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
   1.429-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
   1.430-
   1.431-IFFLOORED : T/MOD  >R S>D R> FM/MOD ;
   1.432-IFFLOORED : T/     T/MOD SWAP DROP ;
   1.433-IFFLOORED : TMOD   T/MOD DROP ;
   1.434-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
   1.435-IFFLOORED : T*/    T*/MOD SWAP DROP ;
   1.436-IFSYM     : T/MOD  >R S>D R> SM/REM ;
   1.437-IFSYM     : T/     T/MOD SWAP DROP ;
   1.438-IFSYM     : TMOD   T/MOD DROP ;
   1.439-IFSYM     : T*/MOD >R M* R> SM/REM ;
   1.440-IFSYM     : T*/    T*/MOD SWAP DROP ;
   1.441-
   1.442-T{ 0 1 /MOD -> 0 1 T/MOD }T
   1.443-T{ 1 1 /MOD -> 1 1 T/MOD }T
   1.444-T{ 2 1 /MOD -> 2 1 T/MOD }T
   1.445-T{ -1 1 /MOD -> -1 1 T/MOD }T
   1.446-T{ -2 1 /MOD -> -2 1 T/MOD }T
   1.447-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
   1.448-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
   1.449-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
   1.450-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
   1.451-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
   1.452-T{ 2 2 /MOD -> 2 2 T/MOD }T
   1.453-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
   1.454-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
   1.455-T{ 7 3 /MOD -> 7 3 T/MOD }T
   1.456-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
   1.457-T{ -7 3 /MOD -> -7 3 T/MOD }T
   1.458-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
   1.459-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
   1.460-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
   1.461-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
   1.462-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
   1.463-
   1.464-T{ 0 1 / -> 0 1 T/ }T
   1.465-T{ 1 1 / -> 1 1 T/ }T
   1.466-T{ 2 1 / -> 2 1 T/ }T
   1.467-T{ -1 1 / -> -1 1 T/ }T
   1.468-T{ -2 1 / -> -2 1 T/ }T
   1.469-T{ 0 -1 / -> 0 -1 T/ }T
   1.470-T{ 1 -1 / -> 1 -1 T/ }T
   1.471-T{ 2 -1 / -> 2 -1 T/ }T
   1.472-T{ -1 -1 / -> -1 -1 T/ }T
   1.473-T{ -2 -1 / -> -2 -1 T/ }T
   1.474-T{ 2 2 / -> 2 2 T/ }T
   1.475-T{ -1 -1 / -> -1 -1 T/ }T
   1.476-T{ -2 -2 / -> -2 -2 T/ }T
   1.477-T{ 7 3 / -> 7 3 T/ }T
   1.478-T{ 7 -3 / -> 7 -3 T/ }T
   1.479-T{ -7 3 / -> -7 3 T/ }T
   1.480-T{ -7 -3 / -> -7 -3 T/ }T
   1.481-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
   1.482-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
   1.483-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
   1.484-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
   1.485-
   1.486-T{ 0 1 MOD -> 0 1 TMOD }T
   1.487-T{ 1 1 MOD -> 1 1 TMOD }T
   1.488-T{ 2 1 MOD -> 2 1 TMOD }T
   1.489-T{ -1 1 MOD -> -1 1 TMOD }T
   1.490-T{ -2 1 MOD -> -2 1 TMOD }T
   1.491-T{ 0 -1 MOD -> 0 -1 TMOD }T
   1.492-T{ 1 -1 MOD -> 1 -1 TMOD }T
   1.493-T{ 2 -1 MOD -> 2 -1 TMOD }T
   1.494-T{ -1 -1 MOD -> -1 -1 TMOD }T
   1.495-T{ -2 -1 MOD -> -2 -1 TMOD }T
   1.496-T{ 2 2 MOD -> 2 2 TMOD }T
   1.497-T{ -1 -1 MOD -> -1 -1 TMOD }T
   1.498-T{ -2 -2 MOD -> -2 -2 TMOD }T
   1.499-T{ 7 3 MOD -> 7 3 TMOD }T
   1.500-T{ 7 -3 MOD -> 7 -3 TMOD }T
   1.501-T{ -7 3 MOD -> -7 3 TMOD }T
   1.502-T{ -7 -3 MOD -> -7 -3 TMOD }T
   1.503-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
   1.504-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
   1.505-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
   1.506-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
   1.507-
   1.508-T{ 0 2 1 */ -> 0 2 1 T*/ }T
   1.509-T{ 1 2 1 */ -> 1 2 1 T*/ }T
   1.510-T{ 2 2 1 */ -> 2 2 1 T*/ }T
   1.511-T{ -1 2 1 */ -> -1 2 1 T*/ }T
   1.512-T{ -2 2 1 */ -> -2 2 1 T*/ }T
   1.513-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
   1.514-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
   1.515-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
   1.516-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
   1.517-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
   1.518-T{ 2 2 2 */ -> 2 2 2 T*/ }T
   1.519-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
   1.520-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
   1.521-T{ 7 2 3 */ -> 7 2 3 T*/ }T
   1.522-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
   1.523-T{ -7 2 3 */ -> -7 2 3 T*/ }T
   1.524-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
   1.525-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
   1.526-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
   1.527-
   1.528-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
   1.529-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
   1.530-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
   1.531-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
   1.532-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
   1.533-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
   1.534-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
   1.535-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
   1.536-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
   1.537-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
   1.538-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
   1.539-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
   1.540-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
   1.541-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
   1.542-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
   1.543-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
   1.544-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
   1.545-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
   1.546-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
   1.547-
   1.548-\ ------------------------------------------------------------------------
   1.549-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
   1.550-
   1.551-HERE 1 ALLOT
   1.552-HERE
   1.553-CONSTANT 2NDA
   1.554-CONSTANT 1STA
   1.555-T{ 1STA 2NDA U< -> <TRUE> }T      \ HERE MUST GROW WITH ALLOT
   1.556-T{ 1STA 1+ -> 2NDA }T         \ ... BY ONE ADDRESS UNIT
   1.557-( MISSING TEST: NEGATIVE ALLOT )
   1.558-
   1.559-HERE 1 ,
   1.560-HERE 2 ,
   1.561-CONSTANT 2ND
   1.562-CONSTANT 1ST
   1.563-T{ 1ST 2ND U< -> <TRUE> }T         \ HERE MUST GROW WITH ALLOT
   1.564-T{ 1ST CELL+ -> 2ND }T         \ ... BY ONE CELL
   1.565-T{ 1ST 1 CELLS + -> 2ND }T
   1.566-T{ 1ST @ 2ND @ -> 1 2 }T
   1.567-T{ 5 1ST ! -> }T
   1.568-T{ 1ST @ 2ND @ -> 5 2 }T
   1.569-T{ 6 2ND ! -> }T
   1.570-T{ 1ST @ 2ND @ -> 5 6 }T
   1.571-T{ 1ST 2@ -> 6 5 }T
   1.572-T{ 2 1 1ST 2! -> }T
   1.573-T{ 1ST 2@ -> 2 1 }T
   1.574-T{ 1S 1ST !  1ST @ -> 1S }T      \ CAN STORE CELL-WIDE VALUE
   1.575-
   1.576-HERE 1 C,
   1.577-HERE 2 C,
   1.578-CONSTANT 2NDC
   1.579-CONSTANT 1STC
   1.580-T{ 1STC 2NDC U< -> <TRUE> }T      \ HERE MUST GROW WITH ALLOT
   1.581-T{ 1STC CHAR+ -> 2NDC }T         \ ... BY ONE CHAR
   1.582-T{ 1STC 1 CHARS + -> 2NDC }T
   1.583-T{ 1STC C@ 2NDC C@ -> 1 2 }T
   1.584-T{ 3 1STC C! -> }T
   1.585-T{ 1STC C@ 2NDC C@ -> 3 2 }T
   1.586-T{ 4 2NDC C! -> }T
   1.587-T{ 1STC C@ 2NDC C@ -> 3 4 }T
   1.588-
   1.589-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
   1.590-CONSTANT A-ADDR  CONSTANT UA-ADDR
   1.591-T{ UA-ADDR ALIGNED -> A-ADDR }T
   1.592-T{    1 A-ADDR C!  A-ADDR C@ ->    1 }T
   1.593-T{ 1234 A-ADDR  !  A-ADDR  @ -> 1234 }T
   1.594-T{ 123 456 A-ADDR 2!  A-ADDR 2@ -> 123 456 }T
   1.595-T{ 2 A-ADDR CHAR+ C!  A-ADDR CHAR+ C@ -> 2 }T
   1.596-T{ 3 A-ADDR CELL+ C!  A-ADDR CELL+ C@ -> 3 }T
   1.597-T{ 1234 A-ADDR CELL+ !  A-ADDR CELL+ @ -> 1234 }T
   1.598-T{ 123 456 A-ADDR CELL+ 2!  A-ADDR CELL+ 2@ -> 123 456 }T
   1.599-
   1.600-: BITS ( X -- U )
   1.601-   0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
   1.602-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
   1.603-T{ 1 CHARS 1 < -> <FALSE> }T
   1.604-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
   1.605-( TBD: HOW TO FIND NUMBER OF BITS? )
   1.606-
   1.607-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
   1.608-T{ 1 CELLS 1 < -> <FALSE> }T
   1.609-T{ 1 CELLS 1 CHARS MOD -> 0 }T
   1.610-T{ 1S BITS 10 < -> <FALSE> }T
   1.611-
   1.612-T{ 0 1ST ! -> }T
   1.613-T{ 1 1ST +! -> }T
   1.614-T{ 1ST @ -> 1 }T
   1.615-T{ -1 1ST +! 1ST @ -> 0 }T
   1.616-
   1.617-\ ------------------------------------------------------------------------
   1.618-TESTING CHAR [CHAR] [ ] BL S"
   1.619-
   1.620-T{ BL -> 20 }T
   1.621-T{ CHAR X -> 58 }T
   1.622-T{ CHAR HELLO -> 48 }T
   1.623-T{ : GC1 [CHAR] X ; -> }T
   1.624-T{ : GC2 [CHAR] HELLO ; -> }T
   1.625-T{ GC1 -> 58 }T
   1.626-T{ GC2 -> 48 }T
   1.627-T{ : GC3 [ GC1 ] LITERAL ; -> }T
   1.628-T{ GC3 -> 58 }T
   1.629-T{ : GC4 S" XY" ; -> }T
   1.630-T{ GC4 SWAP DROP -> 2 }T
   1.631-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
   1.632-
   1.633-\ ------------------------------------------------------------------------
   1.634-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
   1.635-
   1.636-T{ : GT1 123 ; -> }T
   1.637-T{ ' GT1 EXECUTE -> 123 }T
   1.638-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
   1.639-T{ GT2 EXECUTE -> 123 }T
   1.640-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
   1.641-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
   1.642-T{ GT1STRING FIND -> ' GT1 -1 }T
   1.643-T{ GT2STRING FIND -> ' GT2 1 }T
   1.644-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
   1.645-T{ : GT3 GT2 LITERAL ; -> }T
   1.646-T{ GT3 -> ' GT1 }T
   1.647-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
   1.648-
   1.649-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
   1.650-T{ : GT5 GT4 ; -> }T
   1.651-T{ GT5 -> 123 }T
   1.652-T{ : GT6 345 ; IMMEDIATE -> }T
   1.653-T{ : GT7 POSTPONE GT6 ; -> }T
   1.654-T{ GT7 -> 345 }T
   1.655-
   1.656-T{ : GT8 STATE @ ; IMMEDIATE -> }T
   1.657-T{ GT8 -> 0 }T
   1.658-T{ : GT9 GT8 LITERAL ; -> }T
   1.659-T{ GT9 0= -> <FALSE> }T
   1.660-
   1.661-\ ------------------------------------------------------------------------
   1.662-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
   1.663-
   1.664-T{ : GI1 IF 123 THEN ; -> }T
   1.665-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
   1.666-T{ 0 GI1 -> }T
   1.667-T{ 1 GI1 -> 123 }T
   1.668-T{ -1 GI1 -> 123 }T
   1.669-T{ 0 GI2 -> 234 }T
   1.670-T{ 1 GI2 -> 123 }T
   1.671-T{ -1 GI1 -> 123 }T
   1.672-
   1.673-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
   1.674-T{ 0 GI3 -> 0 1 2 3 4 5 }T
   1.675-T{ 4 GI3 -> 4 5 }T
   1.676-T{ 5 GI3 -> 5 }T
   1.677-T{ 6 GI3 -> 6 }T
   1.678-
   1.679-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
   1.680-T{ 3 GI4 -> 3 4 5 6 }T
   1.681-T{ 5 GI4 -> 5 6 }T
   1.682-T{ 6 GI4 -> 6 7 }T
   1.683-
   1.684-T{ : GI5 BEGIN DUP 2 >
   1.685-         WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
   1.686-T{ 1 GI5 -> 1 345 }T
   1.687-T{ 2 GI5 -> 2 345 }T
   1.688-T{ 3 GI5 -> 3 4 5 123 }T
   1.689-T{ 4 GI5 -> 4 5 123 }T
   1.690-T{ 5 GI5 -> 5 123 }T
   1.691-
   1.692-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
   1.693-T{ 0 GI6 -> 0 }T
   1.694-T{ 1 GI6 -> 0 1 }T
   1.695-T{ 2 GI6 -> 0 1 2 }T
   1.696-T{ 3 GI6 -> 0 1 2 3 }T
   1.697-T{ 4 GI6 -> 0 1 2 3 4 }T
   1.698-
   1.699-\ ------------------------------------------------------------------------
   1.700-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
   1.701-
   1.702-T{ : GD1 DO I LOOP ; -> }T
   1.703-T{ 4 1 GD1 -> 1 2 3 }T
   1.704-T{ 2 -1 GD1 -> -1 0 1 }T
   1.705-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
   1.706-
   1.707-T{ : GD2 DO I -1 +LOOP ; -> }T
   1.708-T{ 1 4 GD2 -> 4 3 2 1 }T
   1.709-T{ -1 2 GD2 -> 2 1 0 -1 }T
   1.710-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
   1.711-
   1.712-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
   1.713-T{ 4 1 GD3 -> 1 2 3 }T
   1.714-T{ 2 -1 GD3 -> -1 0 1 }T
   1.715-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
   1.716-
   1.717-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
   1.718-T{ 1 4 GD4 -> 4 3 2 1 }T
   1.719-T{ -1 2 GD4 -> 2 1 0 -1 }T
   1.720-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
   1.721-
   1.722-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
   1.723-T{ 1 GD5 -> 123 }T
   1.724-T{ 5 GD5 -> 123 }T
   1.725-T{ 6 GD5 -> 234 }T
   1.726-
   1.727-T{ : GD6  ( PAT: T{0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} )
   1.728-   0 SWAP 0 DO
   1.729-      I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
   1.730-    LOOP ; -> }T
   1.731-T{ 1 GD6 -> 1 }T
   1.732-T{ 2 GD6 -> 3 }T
   1.733-T{ 3 GD6 -> 4 1 2 }T
   1.734-
   1.735-\ ------------------------------------------------------------------------
   1.736-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
   1.737-
   1.738-T{ 123 CONSTANT X123 -> }T
   1.739-T{ X123 -> 123 }T
   1.740-T{ : EQU CONSTANT ; -> }T
   1.741-T{ X123 EQU Y123 -> }T
   1.742-T{ Y123 -> 123 }T
   1.743-
   1.744-T{ VARIABLE V1 -> }T
   1.745-T{ 123 V1 ! -> }T
   1.746-T{ V1 @ -> 123 }T
   1.747-
   1.748-T{ : NOP : POSTPONE ; ; -> }T
   1.749-T{ NOP NOP1 NOP NOP2 -> }T
   1.750-T{ NOP1 -> }T
   1.751-T{ NOP2 -> }T
   1.752-
   1.753-T{ : DOES1 DOES> @ 1 + ; -> }T
   1.754-T{ : DOES2 DOES> @ 2 + ; -> }T
   1.755-T{ CREATE CR1 -> }T
   1.756-T{ CR1 -> HERE }T
   1.757-T{ ' CR1 >BODY -> HERE }T
   1.758-T{ 1 , -> }T
   1.759-T{ CR1 @ -> 1 }T
   1.760-T{ DOES1 -> }T
   1.761-T{ CR1 -> 2 }T
   1.762-T{ DOES2 -> }T
   1.763-T{ CR1 -> 3 }T
   1.764-
   1.765-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
   1.766-T{ WEIRD: W1 -> }T
   1.767-T{ ' W1 >BODY -> HERE }T
   1.768-T{ W1 -> HERE 1 + }T
   1.769-T{ W1 -> HERE 2 + }T
   1.770-
   1.771-\ ------------------------------------------------------------------------
   1.772-TESTING EVALUATE
   1.773-
   1.774-: GE1 S" 123" ; IMMEDIATE
   1.775-: GE2 S" 123 1+" ; IMMEDIATE
   1.776-: GE3 S" : GE4 345 ;" ;
   1.777-: GE5 EVALUATE ; IMMEDIATE
   1.778-
   1.779-T{ GE1 EVALUATE -> 123 }T         ( TEST EVALUATE IN INTERP. STATE )
   1.780-T{ GE2 EVALUATE -> 124 }T
   1.781-T{ GE3 EVALUATE -> }T
   1.782-T{ GE4 -> 345 }T
   1.783-
   1.784-T{ : GE6 GE1 GE5 ; -> }T         ( TEST EVALUATE IN COMPILE STATE )
   1.785-T{ GE6 -> 123 }T
   1.786-T{ : GE7 GE2 GE5 ; -> }T
   1.787-T{ GE7 -> 124 }T
   1.788-
   1.789-\ ------------------------------------------------------------------------
   1.790-TESTING SOURCE >IN WORD
   1.791-
   1.792-: GS1 S" SOURCE" 2DUP EVALUATE
   1.793-       >R SWAP >R = R> R> = ;
   1.794-T{ GS1 -> <TRUE> <TRUE> }T
   1.795-
   1.796-VARIABLE SCANS
   1.797-: RESCAN?  -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
   1.798-
   1.799-T{ 2 SCANS !
   1.800-345 RESCAN?
   1.801--> 345 345 }T
   1.802-
   1.803-: GS2  5 SCANS ! S" 123 RESCAN?" EVALUATE ;
   1.804-T{ GS2 -> 123 123 123 123 123 }T
   1.805-
   1.806-: GS3 WORD COUNT SWAP C@ ;
   1.807-T{ BL GS3 HELLO -> 5 CHAR H }T
   1.808-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
   1.809-T{ BL GS3
   1.810-DROP -> 0 }T            \ BLANK LINE RETURN ZERO-LENGTH STRING
   1.811-
   1.812-: GS4 SOURCE >IN ! DROP ;
   1.813-T{ GS4 123 456
   1.814--> }T
   1.815-
   1.816-\ ------------------------------------------------------------------------
   1.817-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
   1.818-
   1.819-: S=  \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
   1.820-   >R SWAP R@ = IF         \ MAKE SURE STRINGS HAVE SAME LENGTH
   1.821-      R> ?DUP IF         \ IF NON-EMPTY STRINGS
   1.822-    0 DO
   1.823-       OVER C@ OVER C@ - IF 2DROP <FALSE> UNLOOP EXIT THEN
   1.824-       SWAP CHAR+ SWAP CHAR+
   1.825-         LOOP
   1.826-      THEN
   1.827-      2DROP <TRUE>         \ IF WE GET HERE, STRINGS MATCH
   1.828-   ELSE
   1.829-      R> DROP 2DROP <FALSE>      \ LENGTHS MISMATCH
   1.830-   THEN ;
   1.831-
   1.832-: GP1  <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
   1.833-T{ GP1 -> <TRUE> }T
   1.834-
   1.835-: GP2  <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
   1.836-T{ GP2 -> <TRUE> }T
   1.837-
   1.838-: GP3  <# 1 0 # # #> S" 01" S= ;
   1.839-T{ GP3 -> <TRUE> }T
   1.840-
   1.841-: GP4  <# 1 0 #S #> S" 1" S= ;
   1.842-T{ GP4 -> <TRUE> }T
   1.843-
   1.844-24 CONSTANT MAX-BASE         \ BASE 2 .. 36
   1.845-: COUNT-BITS
   1.846-   0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
   1.847-COUNT-BITS 2* CONSTANT #BITS-UD      \ NUMBER OF BITS IN UD
   1.848-
   1.849-: GP5
   1.850-   BASE @ <TRUE>
   1.851-   MAX-BASE 1+ 2 DO         \ FOR EACH POSSIBLE BASE
   1.852-      I BASE !            \ TBD: ASSUMES BASE WORKS
   1.853-      I 0 <# #S #> S" 10" S= AND
   1.854-   LOOP
   1.855-   SWAP BASE ! ;
   1.856-T{ GP5 -> <TRUE> }T
   1.857-
   1.858-: GP6
   1.859-   BASE @ >R  2 BASE !
   1.860-   MAX-UINT MAX-UINT <# #S #>      \ MAXIMUM UD TO BINARY
   1.861-   R> BASE !            \ S: C-ADDR U
   1.862-   DUP #BITS-UD = SWAP
   1.863-   0 DO               \ S: C-ADDR FLAG
   1.864-      OVER C@ [CHAR] 1 = AND      \ ALL ONES
   1.865-      >R CHAR+ R>
   1.866-   LOOP SWAP DROP ;
   1.867-T{ GP6 -> <TRUE> }T
   1.868-
   1.869-: GP7
   1.870-   BASE @ >R    MAX-BASE BASE !
   1.871-   <TRUE>
   1.872-   A 0 DO
   1.873-      I 0 <# #S #>
   1.874-      1 = SWAP C@ I 30 + = AND AND
   1.875-   LOOP
   1.876-   MAX-BASE A DO
   1.877-      I 0 <# #S #>
   1.878-      1 = SWAP C@ 41 I A - + = AND AND
   1.879-   LOOP
   1.880-   R> BASE ! ;
   1.881-
   1.882-T{ GP7 -> <TRUE> }T
   1.883-
   1.884-\ >NUMBER TESTS
   1.885-CREATE GN-BUF 0 C,
   1.886-: GN-STRING   GN-BUF 1 ;
   1.887-: GN-CONSUMED   GN-BUF CHAR+ 0 ;
   1.888-: GN'      [CHAR] ' WORD CHAR+ C@ GN-BUF C!  GN-STRING ;
   1.889-
   1.890-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
   1.891-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
   1.892-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
   1.893-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T   \ SHOULD FAIL TO CONVERT THESE
   1.894-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
   1.895-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
   1.896-
   1.897-: >NUMBER-BASED
   1.898-   BASE @ >R BASE ! >NUMBER R> BASE ! ;
   1.899-
   1.900-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
   1.901-T{ 0 0 GN' 2'  2 >NUMBER-BASED -> 0 0 GN-STRING }T
   1.902-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
   1.903-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
   1.904-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
   1.905-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
   1.906-
   1.907-: GN1   \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
   1.908-   BASE @ >R BASE !
   1.909-   <# #S #>
   1.910-   0 0 2SWAP >NUMBER SWAP DROP      \ RETURN LENGTH ONLY
   1.911-   R> BASE ! ;
   1.912-T{ 0 0 2 GN1 -> 0 0 0 }T
   1.913-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
   1.914-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
   1.915-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
   1.916-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
   1.917-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
   1.918-
   1.919-: GN2   \ ( -- 16 10 )
   1.920-   BASE @ >R  HEX BASE @  DECIMAL BASE @  R> BASE ! ;
   1.921-T{ GN2 -> 10 A }T
   1.922-
   1.923-\ ------------------------------------------------------------------------
   1.924-TESTING FILL MOVE
   1.925-
   1.926-CREATE FBUF 00 C, 00 C, 00 C,
   1.927-CREATE SBUF 12 C, 34 C, 56 C,
   1.928-: SEEBUF FBUF C@  FBUF CHAR+ C@  FBUF CHAR+ CHAR+ C@ ;
   1.929-
   1.930-T{ FBUF 0 20 FILL -> }T
   1.931-T{ SEEBUF -> 00 00 00 }T
   1.932-
   1.933-T{ FBUF 1 20 FILL -> }T
   1.934-T{ SEEBUF -> 20 00 00 }T
   1.935-
   1.936-T{ FBUF 3 20 FILL -> }T
   1.937-T{ SEEBUF -> 20 20 20 }T
   1.938-
   1.939-T{ FBUF FBUF 3 CHARS MOVE -> }T      \ BIZARRE SPECIAL CASE
   1.940-T{ SEEBUF -> 20 20 20 }T
   1.941-
   1.942-T{ SBUF FBUF 0 CHARS MOVE -> }T
   1.943-T{ SEEBUF -> 20 20 20 }T
   1.944-
   1.945-T{ SBUF FBUF 1 CHARS MOVE -> }T
   1.946-T{ SEEBUF -> 12 20 20 }T
   1.947-
   1.948-T{ SBUF FBUF 3 CHARS MOVE -> }T
   1.949-T{ SEEBUF -> 12 34 56 }T
   1.950-
   1.951-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
   1.952-T{ SEEBUF -> 12 12 34 }T
   1.953-
   1.954-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
   1.955-T{ SEEBUF -> 12 34 34 }T
   1.956-
   1.957-\ ------------------------------------------------------------------------
   1.958-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
   1.959-
   1.960-: OUTPUT-TEST
   1.961-   ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
   1.962-   41 BL DO I EMIT LOOP CR
   1.963-   61 41 DO I EMIT LOOP CR
   1.964-   7F 61 DO I EMIT LOOP CR
   1.965-   ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
   1.966-   9 1+ 0 DO I . LOOP CR
   1.967-   ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
   1.968-   [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
   1.969-   ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
   1.970-   [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
   1.971-   ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
   1.972-   5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
   1.973-   ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
   1.974-   S" LINE 1" TYPE CR S" LINE 2" TYPE CR
   1.975-   ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
   1.976-   ."   SIGNED: " MIN-INT . MAX-INT . CR
   1.977-   ." UNSIGNED: " 0 U. MAX-UINT U. CR
   1.978-;
   1.979-
   1.980-T{ OUTPUT-TEST -> }T
   1.981-
   1.982-
   1.983-\ ------------------------------------------------------------------------
   1.984-TESTING INPUT: ACCEPT
   1.985-
   1.986-CREATE ABUF 50 CHARS ALLOT
   1.987-
   1.988-: ACCEPT-TEST
   1.989-   CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
   1.990-   ABUF 50 ACCEPT
   1.991-   CR ." RECEIVED: " [CHAR] " EMIT
   1.992-   ABUF SWAP TYPE [CHAR] " EMIT CR
   1.993-;
   1.994-
   1.995-T{ ACCEPT-TEST -> }T
   1.996-
   1.997-\ ------------------------------------------------------------------------
   1.998-TESTING DICTIONARY SEARCH RULES
   1.999-
  1.1000-T{ : GDX   123 ; : GDX   GDX 234 ; -> }T
  1.1001-
  1.1002-T{ GDX -> 123 234 }T
  1.1003-
  1.1004-CR .( End of Core word set tests) CR
  1.1005-
  1.1006-