home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / source / lib80.seq < prev    next >
Encoding:
Text File  |  1990-05-18  |  50.3 KB  |  1,447 lines

  1. \\ KERNEL80.SEQ          Z80 Kernel for TCOM
  2.  
  3. {
  4.  
  5. >LIBRARY
  6.  
  7. TARGET DEFINITIONS
  8.  
  9.  
  10. CODE UNNEST
  11.         RP LHLD   M C MOV   H INX   M B MOV   H INX   RP SHLD
  12.         >NEXT JMP    END-CODE
  13.  
  14. CODE EXIT     ( -- )
  15.         RP LHLD   M C MOV   H INX   M B MOV   H INX   RP SHLD
  16.         >NEXT JMP    END-CODE
  17.  
  18. CODE (LIT)   ( -- n )
  19.         IP LDAX  IP INX  A L MOV  IP LDAX  IP INX  A H MOV
  20.         HPUSH JMP  END-CODE
  21.  
  22. CODE (LIT+2)    ( -- n )
  23.         IP LDAX  IP INX  A L MOV  IP LDAX  IP INX  A H MOV
  24.         H INX H INX
  25.         HPUSH JMP  END-CODE             NO-INTERPRET
  26.  
  27. FORTH   >FORTH
  28.  
  29. : %UNNEST       ( -- )
  30.                 F['] UNNEST RES_COMP_CALL ;
  31.  
  32. ' %UNNEST IS DO_RET                     \ link into optimizer file
  33.  
  34. : %(LIT)        ( n1 -- )
  35.                 F['] (LIT) RES_COMP_CALL ,-T ;
  36.  
  37. ' %(LIT) IS COMP_SINGLE                 \ link into number compiler
  38.  
  39. \ ***************************************************************************
  40. \ Forward store and fetch words
  41. \ define words that pickup the following word and use it like a variable
  42.  
  43. : for_does>80   ( a1 -- )
  44.                 [forth]
  45.                 ' ?lib
  46.                 if      compile res_comp_cll f['] (lit+2) x,
  47.                         compile res_comp_cll x,
  48.                         @ x,
  49.                 else    f['] (lit+2) res_comp_call
  50.                                       compile_call
  51.                                            perform
  52.                 then    ;
  53.  
  54. ' for_does>80 is for_does>
  55.  
  56. \ ***************************************************************************
  57.  
  58.  
  59. : NEXT          >NEXT JMP ;
  60. : IP>HL         B H MOV C L MOV ;
  61.  
  62. TARGET  >LIBRARY
  63.  
  64.  
  65. \ Run Time Code for Control Structures                04MAR83HHL
  66.  
  67. CODE BRANCH   ( -- )
  68.      IP>HL   M C MOV H INX M B MOV   NEXT   END-CODE
  69.  
  70. CODE ?BRANCH  ( f -- )
  71.         H POP   L A MOV   H ORA   0 $ JNZ
  72.         IP>HL   M C MOV H INX M B MOV   NEXT
  73. 0 $:    IP INX   IP INX     NEXT   END-CODE
  74.  
  75. FORTH   >FORTH
  76.  
  77. : %IF           ( -- )
  78.                 F['] ?BRANCH RES_COMP_CALL +BR# $ ,-T ;
  79.  
  80. : %ELSE         ( -- )
  81.                 F['] BRANCH RES_COMP_CALL +BR# $ ,-T
  82.                 BR#SWAP -BR# DUP $:F 01LAB ;
  83.  
  84. : %THEN         ( -- )
  85.                 -BR# DUP $:F 01LAB ;
  86.  
  87. : %BEGIN        ( -- )
  88.                 +BR# $:F ;
  89.  
  90. : %WHILE        ( -- )
  91.                 F['] ?BRANCH RES_COMP_CALL +BR# $ ,-T ;
  92.  
  93. : %REPEAT       ( -- )
  94.                 F['] BRANCH RES_COMP_CALL
  95.                 BR#SWAP -BR# DUP $ ,-T 01LAB
  96.                         -BR# DUP $:F   01LAB ;
  97.  
  98. : %AGAIN        ( -- )
  99.                 F['] BRANCH RES_COMP_CALL
  100.                 -BR# DUP $ ,-T 01LAB ;
  101.  
  102. : %UNTIL        ( -- )
  103.                 F['] ?BRANCH RES_COMP_CALL
  104.                 -BR# DUP $ ,-T 01LAB ;
  105.  
  106. : IF            ( -- )
  107.                 ?LIB    [FORTH]
  108.                 IF      COMPILE %IF
  109.                 ELSE    %IF
  110.                 THEN    ; IMMEDIATE
  111.  
  112. : ELSE          ( -- )
  113.                 ?LIB    [FORTH]
  114.                 IF      COMPILE %ELSE
  115.                 ELSE    %ELSE
  116.                 THEN    ; IMMEDIATE
  117.  
  118. : THEN          ( -- )
  119.                 ?LIB    [FORTH]
  120.                 IF      COMPILE %THEN
  121.                 ELSE    %THEN
  122.                 THEN    ; IMMEDIATE
  123.  
  124. : BEGIN         ( -- )
  125.                 ?LIB    [FORTH]
  126.                 IF      COMPILE %BEGIN
  127.                 ELSE    %BEGIN
  128.                 THEN    ; IMMEDIATE
  129.  
  130. : WHILE         ( -- )
  131.                 ?LIB    [FORTH]
  132.                 IF      COMPILE %WHILE
  133.                 ELSE    %WHILE
  134.                 THEN    ; IMMEDIATE
  135.  
  136. : REPEAT        ( -- )
  137.                 ?LIB    [FORTH]
  138.                 IF      COMPILE %REPEAT
  139.                 ELSE    %REPEAT
  140.                 THEN    ; IMMEDIATE
  141.  
  142. : AGAIN         ( -- )
  143.                 ?LIB    [FORTH]
  144.                 IF      COMPILE %AGAIN
  145.                 ELSE    %AGAIN
  146.                 THEN    ; IMMEDIATE
  147.  
  148. : UNTIL         ( -- )
  149.                 ?LIB    [FORTH]
  150.                 IF      COMPILE %UNTIL
  151.                 ELSE    %UNTIL
  152.                 THEN    ; IMMEDIATE
  153.  
  154. TARGET  >LIBRARY
  155.  
  156. \ Run Time Code for Control Structures                07JUL83HHL
  157.  
  158. CODE (LOOP)   ( -- )
  159.         RP LHLD   M INR 0 $ JNZ
  160.         H INX M INR 0 $ JNZ
  161.         RP LHLD  6 D LXI   D DAD   RP SHLD
  162.         IP INX IP INX   NEXT
  163. 0 $:    IP>HL   M C MOV H INX M B MOV   NEXT   END-CODE
  164.  
  165. CODE (+LOOP)   ( n -- )
  166.         RP LHLD   M E MOV H INX M D MOV
  167.         H POP  H A MOV A ORA 2 $ JM
  168.         D DAD 1 $ JC
  169. 0 $:    XCHG RP LHLD E M MOV H INX D M MOV
  170.         IP>HL   M C MOV H INX M B MOV   NEXT
  171. 2 $:    D DAD  0 $ JC
  172. 1 $:    RP LHLD  6 D LXI   D DAD   RP SHLD
  173.         IP INX IP INX
  174.         NEXT    END-CODE
  175.  
  176. FORTH   >FORTH
  177.  
  178. : %LOOP         ( -- )
  179.                 F['] (LOOP) RES_COMP_CALL
  180.                 -BR# DUP $ ,-T 01LAB
  181.                 -BR# DUP $:F   01LAB ;
  182.  
  183. : %+LOOP        ( -- )
  184.                 F['] (+LOOP) RES_COMP_CALL
  185.                 -BR# DUP $ ,-T 01LAB
  186.                 -BR# DUP $:F   01LAB ;
  187.  
  188. : LOOP          ( -- )
  189.                 ?LIB    [FORTH]
  190.                 IF      COMPILE %LOOP
  191.                 ELSE    %LOOP
  192.                 THEN    ; IMMEDIATE
  193.  
  194. : +LOOP         ( -- )
  195.                 ?LIB    [FORTH]
  196.                 IF      COMPILE %+LOOP
  197.                 ELSE    %+LOOP
  198.                 THEN    ; IMMEDIATE
  199.  
  200. TARGET  >LIBRARY
  201.  
  202. \ Execution Control                                   07SEP83HHL
  203.  
  204. CODE EXECUTE    ( cfa -- )
  205.                 H POP      >NEXT1 JMP
  206.                 END-CODE                NO-INTERPRET
  207.  
  208. CODE PERFORM    ( addr-of-cfa -- )
  209.                 H POP  M E MOV  H INX  M D MOV  XCHG  >NEXT1 JMP
  210.                 END-CODE                NO-INTERPRET
  211.  
  212. FORTH   >FORTH
  213.  
  214. : %PERFORM      ( n1 -- )
  215.                 F['] PERFORM RES_COMP_CALL ;
  216.  
  217. ' %PERFORM IS COMP_PERFORM              \ link into number compiler
  218.  
  219. TARGET  >LIBRARY
  220.  
  221. CODE GO         ( addr -- )
  222.                 RET   END-CODE          NO-INTERPRET
  223.  
  224. CODE NOOP   NEXT   END-CODE             NO-INTERPRET
  225.  
  226. CODE PAUSE  NEXT   END-CODE             NO-INTERPRET
  227.  
  228. \ Execution Control                                   01Oct83map
  229.  
  230. CODE I   ( -- n )
  231.    RP LHLD   M E MOV H INX M D MOV
  232.    H INX M A MOV H INX M H MOV   A L MOV   D DAD
  233.    HPUSH JMP   END-CODE                 NO-INTERPRET
  234.  
  235. CODE J   ( -- n )
  236.    RP LHLD   6 D LXI   D DAD  M E MOV H INX M D MOV
  237.    H INX M A MOV H INX M H MOV   A L MOV   D DAD
  238.    HPUSH JMP   END-CODE                 NO-INTERPRET
  239.  
  240. CODE (LEAVE)   ( -- )
  241.    RP LHLD   H INX H INX H INX H INX
  242.    M C MOV H INX M B MOV H INX   RP SHLD   NEXT   END-CODE
  243.                                         NO-INTERPRET
  244. CODE (?LEAVE)   ( f -- )
  245.         H POP   H A MOV L ORA 0 $ JZ   NEXT
  246. 0 $:    RP LHLD   H INX H INX H INX H INX
  247.         M C MOV H INX M B MOV H INX   RP SHLD   NEXT   END-CODE
  248.                                         NO-INTERPRET
  249.  
  250. FORTH   >FORTH
  251.  
  252. : %LEAVE        ( -- )
  253.                 F['] (LEAVE) RES_COMP_CALL ;
  254.  
  255. : %?LEAVE       ( -- )
  256.                 F['] (?LEAVE) RES_COMP_CALL ;
  257.  
  258. : LEAVE         ( -- )
  259.                 ?LIB    [FORTH]
  260.                 IF      COMPILE %LEAVE
  261.                 ELSE    %LEAVE
  262.                 THEN    ; IMMEDIATE
  263.  
  264. : ?LEAVE        ( -- )
  265.                 ?LIB    [FORTH]
  266.                 IF      COMPILE %?LEAVE
  267.                 ELSE    %?LEAVE
  268.                 THEN    ; IMMEDIATE
  269.  
  270. TARGET  >LIBRARY
  271.  
  272. \ 16 and 8 bit Memory Operations                      19Jan87TJZ
  273.  
  274. CODE @     ( addr -- n )
  275.    H POP   M E MOV   H INX   M D MOV   D PUSH   NEXT  END-CODE
  276.                                         EXECUTES> @-T
  277.  
  278. CODE !     ( n addr -- )
  279.    H POP   D POP   E M MOV   H INX   D M MOV   NEXT  END-CODE
  280.                                         EXECUTES> !-T
  281.  
  282. FORTH   >FORTH
  283.  
  284. : %@            ( n1 -- )
  285.                 F['] @ RES_COMP_CALL ;
  286.  
  287. ' %@ IS COMP_FETCH              \ link into number compiler
  288.  
  289. : %!            ( n1 -- )
  290.                 F['] ! RES_COMP_CALL ;
  291.  
  292. ' %! IS COMP_STORE              \ link into number compiler
  293.  
  294. TARGET  >LIBRARY
  295.  
  296. CODE C@     ( addr -- char )
  297.    H POP   M L MOV   0 H MVI   HPUSH JMP  END-CODE
  298.                                         EXECUTES> C@-T
  299. CODE C!     ( char addr -- )
  300.    H POP   D POP   E M MOV   NEXT  END-CODE
  301.                                         EXECUTES> C!-T
  302. \ Block Move Memory Operations                        24FEB83HHL
  303.  
  304. CODE CMOVE      (  from to count -- )
  305.    IP>HL   B POP  D POP  XTHL ( STACK=IP BC=len DE=to HL=from )
  306.    BEGIN   B A MOV  C ORA  0= NOT WHILE
  307.       M A MOV  H INX  D STAX  D INX  B DCX
  308.    REPEAT  B POP  NEXT  END-CODE        NO-INTERPRET
  309.  
  310. CODE CMOVE>   ( from to count -- )
  311.    IP>HL   B POP  D POP  XTHL ( STACK=IP BC=len DE=to HL=from )
  312.    B DAD H DCX   XCHG   B DAD H DCX    XCHG
  313.    BEGIN   B A MOV   C ORA   0= NOT WHILE
  314.       M A MOV H DCX D STAX   D DCX B DCX
  315.    REPEAT   B POP   NEXT   END-CODE     NO-INTERPRET
  316.  
  317. \ 16 bit Stack Operations                             24FEB83HHL
  318.  
  319. CODE SP@     ( -- n )
  320.      0 H LXI   SP DAD   HPUSH JMP   END-CODE
  321.                                         NO-INTERPRET
  322. CODE SP!     ( n -- )
  323.      H POP    SPHL   NEXT   END-CODE    NO-INTERPRET
  324.  
  325. CODE RP@     ( -- addr )
  326.      RP LHLD   HPUSH JMP   END-CODE     NO-INTERPRET
  327.  
  328. CODE RP!     ( n -- )
  329.      H POP   RP SHLD   NEXT   END-CODE  NO-INTERPRET
  330.  
  331. \ 16 bit Stack Operations                             24FEB83HHL
  332.  
  333. CODE DROP    ( n1 -- )
  334.      H POP   NEXT   END-CODE            EXECUTES> DROP
  335.  
  336. CODE DUP      ( n1 -- n1 n1 )
  337.    H POP   H PUSH   HPUSH JMP END-CODE  EXECUTES> DUP
  338.  
  339. CODE SWAP     ( n1 n2 -- n2 n1 )
  340.    H POP   XTHL   HPUSH JMP    END-CODE EXECUTES> SWAP
  341.  
  342. CODE OVER     ( n1 n2 -- n1 n2 n1 )
  343.    D POP H POP H PUSH DPUSH JMP END-CODE
  344.                                         EXECUTES> OVER
  345.  
  346. CODE TUCK     ( n1 n2 -- n2 n1 n2 )
  347.    H POP   D POP   H PUSH   DPUSH JMP   END-CODE
  348.                                         NO-INTERPRET
  349. CODE NIP      ( n1 n2 -- n2 )
  350.    H POP  D POP  HPUSH JMP   END-CODE   EXECUTES> NIP
  351.  
  352. CODE ROT   ( n1 n2 n3 --- n2 n3 n1 )
  353.    D POP H POP XTHL DPUSH JMP END-CODE  EXECUTES> ROT
  354.  
  355. CODE -ROT   ( n1 n2 n3 --- n3 n1 n2 )
  356.    H POP D POP XTHL XCHG DPUSH JMP END-CODE
  357.                                         NO-INTERPRET
  358. CODE FLIP   ( n -- n )
  359.    D POP   E H MOV  D L MOV  HPUSH JMP   END-CODE
  360.                                         EXECUTES> FLIP
  361. : ?DUP      ( n -- [n] n )
  362.    DUP IF   DUP   THEN   ;              EXECUTES> ?DUP
  363.  
  364. \ 16 bit Stack Operations                             24FEB83HHL
  365.  
  366. CODE R>     ( -- n )
  367.    RP LHLD   M E MOV   H INX   M D MOV   H INX
  368.    RP SHLD   D PUSH   NEXT   END-CODE   NO-INTERPRET
  369.  
  370. CODE >R     ( n -- )
  371.    D POP   RP LHLD   H DCX   H DCX   RP SHLD
  372.    E M MOV   H INX   D M MOV   NEXT   END-CODE
  373.                                         NO-INTERPRET
  374. CODE R@
  375.    RP LHLD   M E MOV   H INX   M D MOV   D PUSH   NEXT END-CODE
  376.                                         NO-INTERPRET
  377. CODE PICK    ( nm ... n2 n1 k -- nm ... n2 n1 nk )
  378.    H POP H DAD SP DAD   M E MOV H INX M D MOV
  379.    D PUSH NEXT END-CODE                 NO-INTERPRET
  380.  
  381. \ 16 bit Logical Operations                           13Apr84map
  382.  
  383. CODE AND     ( n1 n2 -- n3 )
  384.    D POP   H POP   E A MOV   L ANA   A L MOV
  385.    D A MOV   H ANA   A H MOV   HPUSH JMP  END-CODE
  386.                                         EXECUTES> AND
  387. CODE OR      ( n1 n2 -- n3 )
  388.    D POP   H POP   E A MOV   L ORA   A L MOV
  389.    D A MOV   H ORA   A H MOV   HPUSH JMP  END-CODE
  390.                                         EXECUTES> OR
  391. CODE XOR      ( n1 n2 -- n3 )
  392.    D POP   H POP   E A MOV   L XRA   A L MOV
  393.    D A MOV   H XRA   A H MOV   HPUSH JMP  END-CODE
  394.                                         EXECUTES> XOR
  395. CODE NOT     ( n -- n' )
  396.    H POP  L A MOV  CMA  A L MOV  H A MOV  CMA  A H MOV
  397.    HPUSH JMP  END-CODE                  EXECUTES> NOT
  398.  
  399. -1 CONSTANT TRUE
  400.  0 CONSTANT FALSE
  401.  
  402.  
  403.  
  404. \ Logical Operations                                  16Oct83map
  405.  
  406. CODE CSET   ( b addr -- )
  407.    H POP D POP   M A MOV  E ORA  A M MOV   NEXT   END-CODE
  408.                                         NO-INTERPRET
  409. CODE CRESET   ( b addr -- )
  410.    H POP D POP   E A MOV CMA A E MOV
  411.                  M A MOV  E ANA  A M MOV   NEXT   END-CODE
  412.                                         NO-INTERPRET
  413. CODE CTOGGLE  ( b addr -- )
  414.    H POP   D POP   M A MOV   E XRA   A M MOV   NEXT   END-CODE
  415.                                         NO-INTERPRET
  416. CODE ON   ( addr -- )
  417.    $FFFF  H LXI XTHL H PUSH
  418.    H POP   D POP   E M MOV   H INX   D M MOV   NEXT  END-CODE
  419.                                         NO-INTERPRET
  420.  
  421. CODE OFF   ( addr -- )
  422.    $0000 H LXI XTHL H PUSH
  423.    H POP   D POP   E M MOV   H INX   D M MOV   NEXT  END-CODE
  424.                                         NO-INTERPRET
  425.  
  426. FORTH   >FORTH
  427.  
  428. : %ON           ( n1 -- )
  429.                 F['] ON RES_COMP_CALL ;
  430.  
  431. ' %ON IS COMP_ON                \ link into number compiler
  432.  
  433. : %OFF          ( n1 -- )
  434.                 F['] OFF RES_COMP_CALL ;
  435.  
  436. ' %OFF IS COMP_OFF                \ link into number compiler
  437.  
  438. TARGET  >LIBRARY
  439.  
  440. \ 16 bit Arithmetic Operations                        13Apr84map
  441.  
  442. CODE +   ( n1 n2 -- sum )
  443.    D POP   H POP   D DAD   HPUSH JMP   END-CODE
  444.                                         EXECUTES> +
  445. CODE NEGATE   ( n -- n' )
  446.    H POP  H DCX  H PUSH
  447.    H POP  L A MOV  CMA  A L MOV  H A MOV  CMA  A H MOV
  448.    HPUSH JMP  END-CODE                  EXECUTES> NEGATE
  449.  
  450. CODE -  ( n1 n2 -- n1-n2 )
  451.         D POP H POP   D A MOV CMA A D MOV   E A MOV CMA A E MOV
  452.         D INX    D DAD   HPUSH JMP   END-CODE
  453.                                         EXECUTES> -
  454. CODE ABS   ( n -- n )
  455.         H POP H PUSH   H A MOV A ORA 0 $ JM
  456.         H POP  H DCX  H PUSH
  457.         H POP  L A MOV  CMA  A L MOV  H A MOV  CMA  A H MOV
  458.         HPUSH JMP
  459. 0 $:    NEXT    END-CODE                EXECUTES> ABS
  460.  
  461. CODE +! ( n addr -- )
  462.         H POP   D POP   M A MOV   E ADD   A M MOV
  463.                 H INX   M A MOV   D ADC   A M MOV   NEXT   END-CODE
  464.                                         NO-INTERPRET
  465.  
  466. FORTH   >FORTH
  467.  
  468. : %+!           ( n1 -- )
  469.                 F['] +! RES_COMP_CALL ;
  470.  
  471. ' %+! IS COMP_PSTORE            \ link into number compiler
  472.  
  473. TARGET  >LIBRARY
  474.  
  475.  
  476. \ 16 bit Arithmetic Operations                        26Sep83map
  477.  
  478. CODE 2*   ( n -- 2*n )
  479.    H POP   H DAD   HPUSH JMP   END-CODE EXECUTES> 2*
  480.  
  481. CODE 2/   ( n -- n/2 )
  482.    H POP   H A MOV   RLC RRC RAR   A H MOV
  483.    L A MOV   RAR   A L MOV   HPUSH JMP   END-CODE
  484.                                         EXECUTES> 2/
  485. CODE U2/   ( u -- u/2 )
  486.    H POP   A ORA   H A MOV   RAR   A H MOV
  487.    L A MOV   RAR   A L MOV   HPUSH JMP   END-CODE
  488.                                         EXECUTES> U2/
  489. CODE 8*   ( n -- 8*n )
  490.    H POP   H DAD   H DAD   H DAD   HPUSH JMP   END-CODE
  491.                                         NO-INTERPRET
  492. CODE 1+      H POP H INX HPUSH JMP END-CODE
  493.                                         EXECUTES> 1+
  494. CODE 2+      H POP H INX H INX HPUSH JMP END-CODE
  495.                                         EXECUTES> 2+
  496. CODE 1-      H POP H DCX HPUSH JMP END-CODE
  497.                                         EXECUTES> 1-
  498. CODE 2-      H POP H DCX H DCX HPUSH JMP END-CODE
  499.                                         EXECUTES> 2-
  500. : ROLL   ( n1 n2 .. nk n -- wierd )
  501.    >R R@ PICK   SP@ DUP 2+   R> 1+ 2* CMOVE>  DROP  ;
  502.                                         NO-INTERPRET
  503. \ 16 bit Arithmetic Operations   Unsigned Multiply    26Sep83map
  504.  
  505. CODE UM*      ( n1 n2 -- d )
  506.      D POP      H POP     B PUSH   H B MOV   L A MOV
  507.      0 H LXI   ( 0=Partial Product )
  508.              4 C MVI   ( Loop Counter )
  509.         BEGIN  H DAD ( Shift AHL left by 24 bits )
  510.              RAL CS IF D DAD   0 ACI THEN
  511.              H DAD   RAL CS IF D DAD   0 ACI THEN
  512.              C DCR
  513.         0= UNTIL
  514.      H PUSH   A H MOV   B A MOV    H B MOV
  515.      0 H LXI   ( 0=Partial Product )
  516.              4 C MVI   ( Loop Counter )
  517.         BEGIN  H DAD ( Shift AHL left by 24 bits )
  518.              RAL CS IF D DAD   0 ACI THEN
  519.              H DAD   RAL CS IF D DAD   0 ACI THEN
  520.              C DCR
  521.         0= UNTIL
  522.      D POP    D C MOV     B DAD      0 ACI   L D MOV    H L MOV
  523.    A H MOV      B POP     DPUSH JMP END-CODE NO-INTERPRET
  524.  
  525. : U*D   ( n1 n2 -- d )   UM*  ;         NO-INTERPRET
  526.  
  527. \ 16 bit Arithmetic Operations   Unsigned Divide      25FEB83HHL
  528.  
  529. CODE UM/MOD   ( d1 n1 -- Remainder Quotient )
  530.         IP>HL    B POP D POP XTHL XCHG
  531.         ( HLDE = Numerator  BC = Denominator )
  532.         L A MOV C SUB   H A MOV B SBB   0 $ JNC
  533.         H A MOV L H MOV D L MOV 8 D MVI D PUSH
  534.         2 $ CALL
  535.         D POP H PUSH E L MOV
  536.         2 $ CALL
  537.         A D MOV H E MOV B POP C H MOV B POP
  538.         D PUSH HPUSH JMP
  539. 0 $:    -1 H LXI   B POP   H PUSH   HPUSH JMP
  540. 1 $:    A E MOV H A MOV C SUB   A H MOV E A MOV B SBB
  541.         CS IF
  542.                 H A MOV C ADD   A H MOV E A MOV D DCR RZ
  543. 2 $:            H DAD RAL   1 $ JNC
  544.                 A E MOV H A MOV C SUB   A H MOV E A MOV B SBB
  545.         THEN
  546.         L INR D DCR   2 $ JNZ   RET END-CODE NO-INTERPRET
  547.  
  548. \ 16 bit Comparison Operations                        13Apr84map
  549.  
  550. CODE 0=      ( n -- f )
  551.    H POP   L A MOV   H ORA
  552.         0 $ JZ $0000 H LXI   HPUSH JMP
  553. 0 $:    $FFFF H LXI HPUSH JMP END-CODE   EXECUTES> 0=
  554.  
  555. CODE 0<      ( n -- f )
  556.    H POP   H DAD
  557.         0 $ JC $0000 H LXI   HPUSH JMP
  558. 0 $:    $FFFF H LXI HPUSH JMP  END-CODE  NO-INTERPRET
  559.  
  560. CODE 0>   ( n -- f )
  561.    H POP H A MOV A ORA  1 $ JM   L ORA
  562.         0 $ JNZ $0000 H LXI   HPUSH JMP
  563. 0 $:    $FFFF H LXI HPUSH JMP
  564. 1 $:    $0000 H LXI HPUSH JMP END-CODE  NO-INTERPRET
  565.  
  566. CODE 0<>  ( n -- f )
  567.    H POP   L A MOV   H ORA
  568.         0 $ JNZ $0000 H LXI   HPUSH JMP
  569. 0 $:    $FFFF H LXI HPUSH JMP END-CODE   NO-INTERPRET
  570.  
  571. CODE =       ( n1 n2 -- f )
  572.    H POP D POP   L A MOV E CMP   0 $ JNZ
  573.                  H A MOV D CMP   0 $ JNZ
  574.                $FFFF H LXI   HPUSH JMP
  575. 0 $:           $0000 H LXI   HPUSH JMP  END-CODE
  576.                                         NO-INTERPRET
  577. : <>     ( n1 n2 -- f )   = NOT   ;     NO-INTERPRET
  578.  
  579. : ?NEGATE    ( n1 n2 -- n3 )   0< IF    NEGATE   THEN   ;
  580.                                         NO-INTERPRET
  581. \ 16 bit Comparison Operations                        13Apr84map
  582.  
  583. CODE U<   ( n1 n2 -- f )   H POP  D POP
  584.         H A MOV D CMP   0 $ JC   1 $ JNZ
  585.         L A MOV  E CMP   0 $ JC   1 $ JNZ
  586. 0 $:    $0000 H LXI HPUSH JMP
  587. 1 $:    $FFFF H LXI HPUSH JMP END-CODE  NO-INTERPRET
  588.  
  589. CODE U>   ( n1 n2 -- f )
  590.         D POP  H POP  H A MOV D CMP   0 $ JC   1 $ JNZ
  591.         L A MOV  E CMP   0 $ JC   1 $ JNZ
  592. 0 $:    $0000 H LXI HPUSH JMP
  593. 1 $:    $FFFF H LXI HPUSH JMP END-CODE  NO-INTERPRET
  594.  
  595. CODE <   ( n1 n2 -- f )
  596.         H POP  D POP D A MOV 128 XRI A D MOV  H A MOV 128 XRI
  597.         D CMP   0 $ JC   1 $ JNZ
  598.         L A MOV  E CMP   0 $ JC   1 $ JNZ
  599. 0 $:    $0000 H LXI HPUSH JMP
  600. 1 $:    $FFFF H LXI HPUSH JMP END-CODE  NO-INTERPRET
  601.  
  602. CODE >   ( n1 n2 -- f )
  603.         D POP  H POP  D A MOV 128 XRI A D MOV  H A MOV 128 XRI
  604.         D CMP   0 $ JC   1 $ JNZ
  605.         L A MOV  E CMP   0 $ JC   1 $ JNZ
  606. 0 $:    $0000 H LXI HPUSH JMP
  607. 1 $:    $FFFF H LXI HPUSH JMP END-CODE  NO-INTERPRET
  608.  
  609. : BETWEEN   ( n1 min max -- f )
  610.    >R  OVER >  SWAP R> >  OR NOT  ;     NO-INTERPRET
  611.  
  612. : WITHIN   ( n1 min max -- f )   1- BETWEEN  ;
  613.                                         NO-INTERPRET
  614. \ 32 bit Memory Operations                            09MAR83HHL
  615.  
  616. CODE 2@     ( addr -- d )
  617.    H POP   2 D LXI   D DAD   M E MOV   H INX   M D MOV   D PUSH
  618.           -3 D LXI   D DAD   M E MOV   H INX   M D MOV   D PUSH
  619.           NEXT   END-CODE               NO-INTERPRET
  620.  
  621. CODE 2!     ( d addr -- )
  622.    H POP   D POP   E M MOV   H INX   D M MOV   H INX
  623.            D POP   E M MOV   H INX   D M MOV   NEXT  END-CODE
  624.                                         NO-INTERPRET
  625. \ 32 bit Memory and Stack Operations                  13Apr84map
  626.  
  627. CODE 2DROP     ( d -- )
  628.    H POP H POP   NEXT   END-CODE        EXECUTES> 2DROP
  629.  
  630. CODE 2DUP     ( d -- d d )
  631.    H POP D POP   D PUSH H PUSH   DPUSH JMP   END-CODE
  632.                                         NO-INTERPRET
  633. CODE 2SWAP     ( d1 d2 -- d2 d1 )
  634.    H POP D POP XTHL H PUSH
  635.    5 H LXI SP DAD M A MOV D M MOV A D MOV
  636.    H DCX M A MOV E M MOV A E MOV  H POP DPUSH JMP END-CODE
  637.                                         EXECUTES> 2SWAP
  638. CODE 2OVER      ( d2 d2 -- d1 d2 d1 )
  639.    7 H LXI SP DAD M D MOV H DCX M E MOV D PUSH
  640.             H DCX M D MOV H DCX M E MOV D PUSH   NEXT  END-CODE
  641.                                         NO-INTERPRET
  642. : MIN   ( n1 n2 -- n3 )   2DUP > IF   SWAP   THEN   DROP   ;
  643.                                         NO-INTERPRET
  644. : MAX   ( n1 n2 -- n3 )   2DUP < IF   SWAP   THEN   DROP   ;
  645.                                         NO-INTERPRET
  646. \ Run Time Code for Control Structures                02MAR83HHL
  647.  
  648. : (DO)   ( n1 n2 -- )
  649.    R> DUP @ >R 2+ -ROT    SWAP DUP >R   - >R   >R   ;
  650.                                         NO-INTERPRET
  651. : (?DO)   ( n1 n2 -- )
  652.    2DUP = IF   DROP DROP R> @ >R
  653.    ELSE    R> DUP @ >R 2+ -ROT
  654.            SWAP DUP >R   - >R   >R   THEN ;
  655.                                         NO-INTERPRET
  656. FORTH   >FORTH
  657.  
  658. : %(DO)         ( -- )
  659.                 F['] (DO) RES_COMP_CALL +BR# $ ,-T
  660.                 +BR# $:F ;
  661.  
  662. : %(?DO)        ( -- )
  663.                 F['] (?DO) RES_COMP_CALL +BR# $ ,-T
  664.                 +BR# $:F ;
  665.  
  666. : DO            ( -- )
  667.                 ?LIB    [FORTH]
  668.                 IF      COMPILE %(DO)
  669.                 ELSE    %(DO)
  670.                 THEN    ; IMMEDIATE
  671.  
  672. : ?DO           ( -- )
  673.                 ?LIB    [FORTH]
  674.                 IF      COMPILE %(?DO)
  675.                 ELSE    %(?DO)
  676.                 THEN    ; IMMEDIATE
  677.  
  678. TARGET  >LIBRARY
  679.  
  680. : 3DUP  ( a b c -- a b c a b c )        DUP 2OVER ROT   ;
  681.                                         NO-INTERPRET
  682. : 4DUP  ( a b c d -- a b c d a b c d )  2OVER 2OVER   ;
  683.                                         NO-INTERPRET
  684. : 2ROT  ( a b c d e f --- c d e f a b )  5 ROLL 5 ROLL ;
  685.                                         NO-INTERPRET
  686. \ 32 bit Arithmetic Operations                        13Apr84map
  687.  
  688. CODE D+  ( d1 d2 -- dsum )
  689.    6 H LXI  SP DAD  M E MOV C M MOV  H INX
  690.    M D MOV  B M MOV  B POP  H POP  D DAD  XCHG
  691.    H POP  L A MOV  C ADC  A L MOV  H A MOV  B ADC
  692.    A H MOV  B POP  DPUSH JMP   END-CODE NO-INTERPRET
  693.  
  694. CODE DNEGATE  ( d# -- d#' )
  695.    H POP  D POP  A SUB  E SUB  A E MOV  0 A MVI  D SBB
  696.    A D MOV  0 A MVI     L SBB  A L MOV  0 A MVI  H SBB
  697.    A H MOV  DPUSH JMP  END-CODE         NO-INTERPRET
  698.  
  699. CODE   S>D      ( n -- d )
  700.    D POP 0 H LXI D A MOV 128 ANI 0= NOT IF   H DCX   THEN
  701.    DPUSH JMP   END-CODE                 NO-INTERPRET
  702.  
  703. CODE DABS   ( d# -- d# )
  704.         H POP H PUSH   H A MOV A ORA 0 $ JM
  705.         H POP  D POP  A SUB  E SUB  A E MOV  0 A MVI  D SBB
  706.         A D MOV  0 A MVI     L SBB  A L MOV  0 A MVI  H SBB
  707.         A H MOV  DPUSH JMP
  708. 0 $:    NEXT    END-CODE                NO-INTERPRET
  709.  
  710. \ 32 bit Arithmetic Operations                        2Oct86 TJZ
  711.  
  712. CODE D2*   ( d -- d*2 )
  713.    H POP   D POP
  714.    E A MOV   STC CMC
  715.              RAL   A E MOV   D A MOV   RAL   A D MOV
  716.    L A MOV   RAL   A L MOV   H A MOV   RAL   A H MOV
  717.    DPUSH JMP   END-CODE                 NO-INTERPRET
  718.  
  719. CODE D2/   ( d -- d/2 )
  720.    H POP   D POP
  721.    H A MOV   RLC RRC RAR   A H MOV   L A MOV   RAR   A L MOV
  722.    D A MOV   RAR           A D MOV   E A MOV   RAR   A E MOV
  723.    DPUSH JMP   END-CODE                 NO-INTERPRET
  724.  
  725. : D-    ( d1 d2 -- d3 )  DNEGATE D+ ;   NO-INTERPRET
  726.  
  727. : ?DNEGATE  ( d1 n -- d2 )     0< IF   DNEGATE   THEN   ;
  728.                                         NO-INTERPRET
  729. \ 32 bit Comparison Operations                        05Oct83map
  730.  
  731. : D0=   ( d -- f )        OR 0= ;       NO-INTERPRET
  732.  
  733. : D=    ( d1 d2 -- f )    D-  D0=  ;    NO-INTERPRET
  734.  
  735. : DU<   ( ud1 ud2 -- f )   ROT SWAP 2DUP U<
  736.    IF   2DROP 2DROP $FFFF
  737.    ELSE  <> IF   2DROP $0000  ELSE  U<  THEN
  738.    THEN  ;                              NO-INTERPRET
  739.  
  740. : D<    ( d1 d2 -- f )   2 PICK OVER =
  741.    IF   DU<   ELSE  NIP ROT DROP <  THEN  ;
  742.                                         NO-INTERPRET
  743. : D>    ( d1 d2 -- f )    2SWAP D<   ;  NO-INTERPRET
  744.  
  745. : DMIN  ( d1 d2 -- d3 )   4DUP D> IF   2SWAP   THEN   2DROP ;
  746.                                         NO-INTERPRET
  747. : DMAX  ( d1 d2 -- d3 )   4DUP D< IF   2SWAP   THEN   2DROP ;
  748.                                         NO-INTERPRET
  749. \ Mixed Mode Arithmetic                               01Oct83map
  750.  
  751. : *D   ( n1 n2 -- d# )
  752.    2DUP  XOR  >R  ABS  SWAP  ABS  UM*  R>  ?DNEGATE  ;
  753.                                         NO-INTERPRET
  754. : M/MOD   ( d# n1 -- rem quot )
  755.    ?DUP
  756.    IF  DUP >R  2DUP XOR >R  >R DABS R@ ABS  UM/MOD
  757.      SWAP R> ?NEGATE
  758.      SWAP R> 0< IF  NEGATE OVER IF  1- R@ ROT - SWAP  THEN THEN
  759.      R> DROP
  760.    THEN  ;                              NO-INTERPRET
  761.  
  762. : MU/MOD  ( d# n1 -- rem d#quot )
  763.    >R  0  R@  UM/MOD  R>  SWAP  >R  UM/MOD  R>   ;
  764.                                         NO-INTERPRET
  765. \ 16 bit multiply and divide                          27Sep83map
  766.  
  767. : *   ( n1 n2 -- n3 )   UM* DROP   ;    EXECUTES> *
  768.  
  769. : /MOD  ( n1 n2 -- rem quot )   >R  S>D  R>  M/MOD  ;
  770.                                         NO-INTERPRET
  771. : /     ( n1 n2 -- quot )   /MOD  NIP ; EXECUTES> /
  772.  
  773. : MOD   ( n1 n2 -- rem )    /MOD DROP ; EXECUTES> MOD
  774.  
  775. : */MOD  ( n1 n2 n3 -- rem quot )
  776.    >R  *D  R>  M/MOD  ;                 NO-INTERPRET
  777.  
  778. : */    ( n1 n2 n3 -- n1*n2/n3 )     */MOD  NIP  ;
  779.                                         NO-INTERPRET
  780.  
  781. \ Machine dependent IO words                          04Apr84map
  782.  
  783. CODE PC@        ( port# -- n )
  784.                 D POP  HERE 5 + H LXI ( Sorry self modifying code )
  785.                 E M MOV  0 IN  A L MOV  0 H MVI
  786.                 HPUSH JMP   END-CODE    NO-INTERPRET
  787.  
  788. CODE PC!        ( n port# -- )
  789.                 D POP  HERE 7 + H LXI  ( Sorry self modifying code again )
  790.                 E M MOV  H POP  L A MOV  0 OUT
  791.                 NEXT END-CODE           NO-INTERPRET
  792.  
  793. \ Task Dependant USER Variables                       21Jan87TJZ
  794.  
  795. VARIABLE  TOS         ( TOP OF STACK )
  796. VARIABLE  ENTRY       ( ENTRY POINT, CONTAINS MACHINE CODE )
  797. VARIABLE  LINK        ( LINK TO NEXT TASK )
  798. VARIABLE  SP0         ( INITIAL PARAMETER STACK )
  799. VARIABLE  RP0         ( INITIAL RETURN STACK )
  800. VARIABLE  DP          ( DICTIONARY POINTER )
  801. VARIABLE  #OUT        ( NUMBER OF CHARACTERS EMITTED )
  802. VARIABLE  #LINE       ( THE NUMBER OF LINES SENT SO FAR )
  803. VARIABLE  OFFSET      ( RELATIVE TO ABSOLUTE DISK BLOCK 0 )
  804. VARIABLE  BASE        ( FOR NUMERIC INPUT AND OUTPUT )
  805. VARIABLE  HLD         ( POINTS TO LAST CHARACTER HELD IN PAD )
  806. VARIABLE  PRINTING
  807.  
  808. \ System VARIABLEs                                    22Jan87TJZ
  809.  
  810. VARIABLE  SCR       ( SCREEN LAST LISTED OR EDITED )
  811. VARIABLE  PRIOR     ( USED FOR DICTIONARY SEARCHES )
  812. VARIABLE  STATE     ( COMPILATION OR INTERPRETATION )
  813. VARIABLE  WARNING   ( GIVE USER DUPLICATE WARNINGS IF ON )
  814. VARIABLE  DPL       ( NUMERIC INPUT PUNCTUATION )
  815. VARIABLE  R#        ( EDITING CURSOR POSITION )
  816. VARIABLE  LAST      ( POINTS TO NFA OF LATEST DEFINITION )
  817. VARIABLE  CSP       ( HOLDS STACK POINTER FOR ERROR CHECKING )
  818. VARIABLE  CURRENT   ( VOCABULARY WHICH GETS DEFINITIONS )
  819. 8 CONSTANT #VOCS    ( THE NUMBER OF VOCABULARIES TO SEARCH )
  820. VARIABLE  CONTEXT   ( VOCABULARY SEARCHED FIRST )
  821.         #VOCS 2* ALLOT-T
  822. \     HERE THERE #VOCS 2* DUP ALLOT ERASE
  823.  
  824. \ System Variables                                    21Jan87TJZ
  825.  
  826. VARIABLE  'TIB      ( ADDRESS OF TERMINAL INPUT BUFFER )
  827. VARIABLE  WIDTH     ( WIDTH OF NAME FIELD )
  828. VARIABLE  VOC-LINK  ( POINTS TO NEWEST VOCABULARY )
  829. VARIABLE  >IN       ( OFFSET INTO INPUT STREAM )
  830. VARIABLE  SPAN      ( NUMBER OF CHARACTERS EXPECTED )
  831. VARIABLE  #TIB      ( NUMBER OF CHARACTERS TO INTERPRET )
  832. VARIABLE  END?      ( TRUE IF INPUT STREAM EXHAUSTED )
  833.  
  834. \ Devices                     Strings                 13Apr84map
  835.  
  836.    32 CONSTANT BL
  837.     8 CONSTANT BS
  838.     7 CONSTANT BELL
  839.  
  840. VARIABLE CAPS
  841.  
  842. CODE FILL         (  start-addr count char -- )
  843.    IP>HL  D POP  B POP  XTHL  XCHG
  844.    BEGIN   B A MOV   C ORA   0= NOT WHILE
  845.       L A MOV   D STAX  D INX   B DCX
  846.    REPEAT    B POP  NEXT     END-CODE   NO-INTERPRET
  847.  
  848. : ERASE      ( addr len -- )   0 FILL   ;
  849.                                         NO-INTERPRET
  850. : BLANK      ( addr len -- )   BL FILL   ;
  851.                                         NO-INTERPRET
  852. CODE COUNT   ( addr -- addr+1 len )
  853.    H POP   M E MOV 0 D MVI   H INX   XCHG   DPUSH JMP END-CODE
  854.                                         NO-INTERPRET
  855. CODE LENGTH  ( addr -- addr+2 len )
  856.    H POP  M E MOV  H INX  M D MOV
  857.    H INX   XCHG   DPUSH JMP END-CODE    NO-INTERPRET
  858.  
  859. : MOVE   ( from to len -- )
  860.    -ROT   2DUP U< IF   ROT CMOVE>   ELSE   ROT CMOVE   THEN ;
  861.                                         NO-INTERPRET
  862. \ Devices                     Strings                 13Apr84map
  863.  
  864. CODE UPC   ( char -- char' )
  865.         H POP  L A MOV
  866.         'a' CPI  RC  'z' 1+ CPI  RNC  BL SUI
  867.         A L MOV  H PUSH  NEXT  END-CODE NO-INTERPRET
  868.  
  869. CODE UPPER   ( addr len -- )
  870.         D POP H POP   BEGIN      D A MOV E ORA 0= NOT WHILE
  871.         M A MOV 'a' CPI  RC  'z' 1+ CPI  RNC  BL SUI
  872.         A M MOV
  873.         H INX D DCX REPEAT   NEXT   END-CODE
  874.                                         NO-INTERPRET
  875.  
  876. : HERE   ( -- addr )   DP @   ;         EXECUTES> HERE-T
  877.  
  878. : PAD    ( -- addr )   HERE 80 +   ;    NO-INTERPRET
  879.  
  880. \ : -TRAILING   ( addr len -- addr len' )
  881. \    DUP 0 ?DO   2DUP + 1- C@   BL <> ?LEAVE   1-   LOOP   ;
  882. \                                        NO-INTERPRET
  883.  
  884. \ Devices                     Strings                 26Sep83map
  885.  
  886. CODE COMP   ( addr1 addr2 len -- -1 | 0 | 1 )
  887.    C L MOV  B H MOV  B POP  D POP  XTHL
  888.    ( Stack=IP  BC=len  DE=addr2  HL=addr1 )
  889.    BEGIN   B A MOV  C ORA  0= NOT WHILE
  890.      M A MOV  XCHG  M CMP  XCHG
  891.      0= IF   D INX  H INX  B DCX
  892.         ELSE    0< IF   1 H LXI   ELSE   -1 H LXI   THEN
  893.                  B POP   HPUSH JMP   THEN
  894.    REPEAT   0 H LXI   B POP   HPUSH JMP   END-CODE
  895.                                         NO-INTERPRET
  896. \ Devices                     Strings                 26Sep83map
  897.  
  898. CODE CAPS-COMP   ( addr1 addr2 len -- -1 | 0 | 1 )
  899.    C L MOV  B H MOV  B POP  D POP  XTHL
  900.    ( Stack=IP  BC=len  DE=addr2  HL=addr1 )
  901.    BEGIN   B A MOV  C ORA  0= NOT WHILE
  902.         M A MOV  'a' CPI  RC  'z' 1+ CPI  RNC  BL SUI
  903.         B PUSH  A C MOV  XCHG
  904.         M A MOV  'a' CPI  RC  'z' 1+ CPI  RNC  BL SUI
  905.         C CMP   B POP    XCHG
  906.      0= IF   D INX  H INX  B DCX
  907.         ELSE    0< IF   1 H LXI   ELSE   -1 H LXI   THEN
  908.                  B POP   HPUSH JMP   THEN
  909.    REPEAT   0 H LXI   B POP   HPUSH JMP   END-CODE
  910.                                         NO-INTERPRET
  911. : COMPARE   ( addr1 addr2 len -- -1 | 0 | 1 )
  912.         CAPS @ IF  CAPS-COMP  ELSE  COMP  THEN  ;
  913.                                         NO-INTERPRET
  914.  
  915. \ Devices      Terminal IO via CP/M                 21Jan87TJZ
  916.  
  917. CODE BDOS       ( n fun -- m )
  918.                 H POP   D POP   B PUSH   L C MOV
  919.                 5 CALL
  920.                 0 H MVI   A L MOV   B POP
  921.                 HPUSH JMP   END-CODE    NO-INTERPRET
  922.  
  923. : KEY?          ( -- f )
  924.                 0 11 0<>   ;            NO-INTERPRET
  925.  
  926. : KEY           ( -- char )
  927.                 BEGIN   PAUSE   KEY? UNTIL
  928.                 0 8 BDOS ;              NO-INTERPRET
  929.  
  930. : (CONSOLE)     ( char -- )
  931.                 PAUSE  6 BDOS DROP
  932.                 1 #OUT +! ;             NO-INTERPRET
  933.  
  934. : (PRINT)       ( char -- )
  935.                 PAUSE
  936.                 5 BDOS DROP 1 #OUT +! ; NO-INTERPRET
  937.  
  938. : EMIT          ( char -- )
  939.                 PRINTING @
  940.                 IF      DUP (PRINT)  -1 #OUT +!
  941.                 THEN    (CONSOLE)  ;    EXECUTES> EMIT
  942.  
  943. : CR            ( -- )
  944.                 13 EMIT   10 EMIT   #OUT OFF
  945.                 1 #LINE +! ;            EXECUTES> CR
  946.  
  947. : TYPE          ( addr len -- )
  948.                 0 ?DO  COUNT EMIT  LOOP   DROP   ;
  949.                                         NO-INTERPRET
  950. : SPACE         ( -- )
  951.                 BL EMIT   ;             EXECUTES> SPACE
  952.  
  953. : SPACES        ( n -- )
  954.                 0 MAX   0 ?DO   SPACE   LOOP   ;
  955.                                         EXECUTES> SPACES
  956. : BACKSPACES    ( n -- )
  957.                 0 ?DO BS EMIT -2 #OUT +! LOOP ;
  958.                                         NO-INTERPRET
  959. : BEEP          ( -- )
  960.                 BELL EMIT -1 #OUT +! ;  EXECUTES> BEEP
  961.  
  962. \ Devices   System Dependent Control Characters       19Jan87TJZ
  963.  
  964. : BS-IN         ( n c -- 0 | n-1 )
  965.                 DROP DUP IF   1-   BS   ELSE BELL THEN EMIT -2 #OUT +! ;
  966.                                         NO-INTERPRET
  967. : DEL-IN        ( n c -- 0 | n-1 )
  968.                 DROP DUP IF  1-  BS EMIT SPACE BS
  969.                 ELSE  BELL  THEN  EMIT -2 #OUT +! ;
  970.                                         NO-INTERPRET
  971. : BACK-UP       ( n c -- 0 )
  972.                 DROP   DUP BACKSPACES   DUP SPACES   BACKSPACES   0   ;
  973.                                         NO-INTERPRET
  974. : RES-IN        ( c -- )
  975.                 DROP ( $FFFF ABORT" Reset" ) ;
  976.                                         NO-INTERPRET
  977. : P-IN          ( c -- )
  978.                 DROP   PRINTING @ NOT PRINTING !  ;
  979.                                         NO-INTERPRET
  980. : ESC-IN        ( c -- )
  981.                 DROP   2DUP  + @ EMIT  1+  ;
  982.                                         NO-INTERPRET
  983. \ Devices                     Terminal Input          24AUG84MJM
  984.  
  985. : CR-IN         ( m a n c -- m a m )
  986.                 DROP   SPAN !   OVER   BL EMIT   ;
  987.                                         NO-INTERPRET
  988. : CHAR          ( a n char -- a n+1 )
  989.                 3DUP EMIT + C!   1+   ;
  990.                                         NO-INTERPRET
  991. : EXEC:         ( n1 -- )
  992.                 2* R> + PERFORM ;       NO-INTERPRET
  993.  
  994. : DO_ACHAR      ( n1 -- )
  995.         EXEC:
  996.         CHAR    CHAR   CHAR   RES-IN CHAR   CHAR    CHAR   CHAR
  997.         BS-IN   CHAR   CHAR   CHAR   CHAR   CR-IN   CHAR   CHAR
  998.         P-IN    CHAR   CHAR   CHAR   CHAR   BACK-UP CHAR   CHAR
  999.         BACK-UP CHAR   CHAR   ESC-IN CHAR   CHAR    CHAR   CHAR ;
  1000.                                         NO-INTERPRET
  1001.  
  1002. : EXPECT   ( adr len -- )
  1003.         DUP SPAN !   SWAP 0   ( len adr 0 )
  1004.         BEGIN   2 PICK OVER - ( len adr #so-far #left )
  1005.         WHILE   KEY DUP 127 AND BL <
  1006.                 IF      DUP DO_ACHAR
  1007.                 ELSE    DUP 127 = IF   DEL-IN   ELSE   CHAR   THEN
  1008.                 THEN
  1009.         REPEAT    2DROP DROP   ;        NO-INTERPRET
  1010.  
  1011.  
  1012. : TIB     ( -- adr )   'TIB @  ;        NO-INTERPRET
  1013.  
  1014. : QUERY   ( -- )
  1015.    TIB 80 EXPECT  SPAN @ #TIB !   >IN OFF  ;
  1016.                                         NO-INTERPRET
  1017. : BOUNDS        ( adr len -- lim first )
  1018.                 OVER + SWAP   ;         NO-INTERPRET
  1019.  
  1020. \ : VIEW#    ( -- addr )    FILE @ 40 +   ;
  1021.  
  1022. \ Interactive Layer           Number Input            04Apr84map
  1023.  
  1024. CODE DIGIT   ( char base -- n true | char false )
  1025.    H POP   D POP  D PUSH   E A MOV   '0' SUI   0 $ JM
  1026.    10 CPI   0< NOT IF   7 SUI   10 CPI     0 $ JM  THEN
  1027.    L CMP 0 $ JP   A E MOV    H POP D PUSH
  1028.         $FFFF H LXI   HPUSH JMP
  1029. 0 $:    $0000 H LXI   HPUSH JMP  END-CODE
  1030.                                         NO-INTERPRET
  1031. : DOUBLE?   ( -- f )      DPL @ 1+   0<> ;
  1032.                                         NO-INTERPRET
  1033. : CONVERT   ( +d1 adr1 -- +d2 adr2 )
  1034.    BEGIN  1+  DUP >R  C@  BASE @  DIGIT
  1035.    WHILE  SWAP  BASE @ UM*  DROP  ROT  BASE @ UM*  D+
  1036.       DOUBLE?  IF  1 DPL +!  THEN  R>
  1037.    REPEAT  DROP  R>  ;                  NO-INTERPRET
  1038.  
  1039. \ Interactive Layer           Number Output           03Apr84map
  1040.  
  1041. : HOLD   ( char -- )   -1 HLD +!   HLD @ C!   ;
  1042.                                         NO-INTERPRET
  1043. : <#     ( -- )     PAD  HLD  !  ;      NO-INTERPRET
  1044.  
  1045. : #>     ( d# -- addr len )    2DROP  HLD  @  PAD  OVER  -  ;
  1046.                                         NO-INTERPRET
  1047. : SIGN   ( n1 -- )  0< IF  '-'  HOLD  THEN  ;
  1048.                                         NO-INTERPRET
  1049. : #      ( -- )
  1050.   BASE @ MU/MOD ROT 9 OVER < IF  7 + THEN '0'  +  HOLD  ;
  1051.                                         NO-INTERPRET
  1052. : #S     ( -- )     BEGIN  #  2DUP  OR  0=  UNTIL  ;
  1053.                                         NO-INTERPRET
  1054.  
  1055. : HEX        ( -- )   16 BASE !  ;      EXECUTES> HEX
  1056.  
  1057. : DECIMAL    ( -- )   10 BASE !  ;      EXECUTES> DECIMAL
  1058.  
  1059. : OCTAL      ( -- )    8 BASE !  ;      NO-INTERPRET
  1060.  
  1061. \ Interactive Layer           Number Output           24FEB83HHL
  1062.  
  1063. : (U.)  ( u -- a l )   0    <# #S #>   ;
  1064.                                         NO-INTERPRET
  1065. : U.    ( u -- )       (U.)   TYPE SPACE   ;
  1066.                                         NO-INTERPRET
  1067. : U.R   ( u l -- )     >R   (U.)   R> OVER - SPACES   TYPE   ;
  1068.                                         NO-INTERPRET
  1069.  
  1070. : (.)   ( n -- a l )   DUP ABS 0   <# #S   ROT SIGN   #>   ;
  1071.                                         NO-INTERPRET
  1072. : .     ( n -- )       (.)   TYPE SPACE   ;
  1073.                                         EXECUTES> .
  1074. : .R    ( n l -- )     >R   (.)   R> OVER - SPACES   TYPE   ;
  1075.                                         EXECUTES> .R
  1076.  
  1077. : (UD.) ( ud -- a l )  <# #S #>   ;     NO-INTERPRET
  1078.  
  1079. : UD.   ( ud -- )      (UD.)   TYPE SPACE   ;
  1080.                                         NO-INTERPRET
  1081. : UD.R  ( ud l -- )    >R   (UD.)   R> OVER - SPACES   TYPE  ;
  1082.                                         NO-INTERPRET
  1083. : (D.)  ( d -- a l )   TUCK DABS   <# #S   ROT SIGN  #>   ;
  1084.                                         NO-INTERPRET
  1085. : D.    ( d -- )       (D.)   TYPE SPACE   ;
  1086.                                         NO-INTERPRET
  1087. : D.R   ( d l -- )     >R   (D.)   R> OVER - SPACES   TYPE   ;
  1088.                                         NO-INTERPRET
  1089. \ Interactive Layer           Parsing                 30Sep83map
  1090.  
  1091. CODE  SKIP   ( addr len char -- addr' len' )
  1092.         IP>HL   B POP D POP XTHL
  1093.         ( C=char DE=length  HL=addr )
  1094.         BEGIN   D A MOV  E ORA  0<>
  1095.         WHILE   M A MOV  C CMP   0 $ JNZ    H INX  D DCX
  1096.         REPEAT
  1097. 0 $:    B POP   H PUSH   D PUSH   NEXT   END-CODE NO-INTERPRET
  1098.  
  1099. CODE  SCAN   ( addr len char -- addr' len' )
  1100.         IP>HL   B POP  D POP  XTHL
  1101.         ( C=char DE=length HL=addr )
  1102.         BEGIN   D A MOV  E ORA  0<>
  1103.         WHILE   M A MOV   C CMP   0 $ JZ    H INX  D DCX
  1104.         REPEAT
  1105. 0 $:    B POP   H PUSH   D PUSH   NEXT   END-CODE NO-INTERPRET
  1106.  
  1107. \ Interactive Layer           Parsing                 02Apr84map
  1108.  
  1109. : /STRING   ( addr len n -- addr' len' )
  1110.    OVER MIN   ROT OVER +   -ROT -   ;   NO-INTERPRET
  1111.  
  1112. : PLACE     ( str-addr len to -- )
  1113.    3DUP  1+ SWAP MOVE  C! DROP  ;       NO-INTERPRET
  1114.  
  1115. : SOURCE        ( -- addr len )
  1116.                 TIB #TIB @   ;          NO-INTERPRET
  1117.  
  1118. : PARSE-WORD   ( char -- addr len )
  1119.    >R  SOURCE TUCK  >IN @ /STRING  R@ SKIP  OVER SWAP R> SCAN
  1120.    >R OVER -  ROT R>  DUP 0<> + - >IN !  ;
  1121.                                         NO-INTERPRET
  1122. : PARSE   ( char -- addr len )
  1123.    >R   SOURCE >IN @ /STRING   OVER SWAP R> SCAN
  1124.    >R OVER -  DUP R>  0<> -  >IN +!  ;  NO-INTERPRET
  1125.  
  1126. \ Interactive Layer           Parsing                 07Mar84map
  1127.  
  1128. : 'WORD         ( -- adr )
  1129.                 HERE  ;                 NO-INTERPRET
  1130.  
  1131. : WORD          ( char -- addr )
  1132.                 PARSE-WORD  'WORD PLACE
  1133.                 'WORD DUP COUNT + BL SWAP C!   ( Stick Blank at end )   ;
  1134.                                         NO-INTERPRET
  1135.  
  1136. CODE TRAVERSE   ( addr direction -- addr' )
  1137.                 D POP H POP   127 A MVI
  1138.                 BEGIN   D DAD  M CMP  0< UNTIL
  1139.                 HPUSH JMP   END-CODE    NO-INTERPRET
  1140.  
  1141. : DONE?         ( n -- f )
  1142.                 STATE @ <>   END? @ OR   END? OFF   ;
  1143.                                         NO-INTERPRET
  1144.  
  1145. \ Interactive Layer           Dictionary              04Apr84map
  1146.  
  1147. : N>LINK     2-   ;                     NO-INTERPRET
  1148.  
  1149. : L>NAME     2+   ;                     NO-INTERPRET
  1150.  
  1151. : BODY>      2-   ;                     NO-INTERPRET
  1152.  
  1153. : NAME>      1 TRAVERSE   1+   ;        NO-INTERPRET
  1154.  
  1155. : LINK>      L>NAME   NAME>   ;         NO-INTERPRET
  1156.  
  1157. : >BODY      2+   ;                     NO-INTERPRET
  1158.  
  1159. : >NAME      1- -1 TRAVERSE   ;         NO-INTERPRET
  1160.  
  1161. : >LINK      >NAME   N>LINK   ;         NO-INTERPRET
  1162.  
  1163. : >VIEW      >LINK   2-   ;             NO-INTERPRET
  1164.  
  1165. : VIEW>      2+   LINK>   ;             NO-INTERPRET
  1166.  
  1167. \ Interactive Layer           Dictionary              27Oct86TJZ
  1168.  
  1169. CODE HASH   ( str-addr voc-ptr -- thread )
  1170.    D POP H POP    H INX M A MOV ( 7 ) 3 ANI
  1171.    A L MOV 0 H MVI H DAD D DAD HPUSH JMP   END-CODE
  1172.                                         NO-INTERPRET
  1173. CODE (FIND)     ( here nfa -- here false | cfa flag )
  1174.  H POP H A MOV L ORA   1 $ JZ
  1175.  BEGIN   D POP  D PUSH  H PUSH  H INX  H INX
  1176.     D LDAX  M XRA  63 ANI  0= IF
  1177.        BEGIN D INX H INX D LDAX M XRA A ADD 0= IF 2SWAP CS UNTIL
  1178.        H INX D POP XTHL XCHG
  1179.        H INX H INX  M A MOV  64 ANI 0 $ JZ  1 H LXI HPUSH JMP
  1180.     THEN THEN
  1181.     H POP  M E MOV  H INX  M D MOV
  1182.     XCHG   H A MOV   L ORA
  1183.  0= UNTIL
  1184. 1 $:    $0000 H LXI   HPUSH JMP
  1185. 0 $:    $FFFF H LXI   HPUSH JMP  END-CODE NO-INTERPRET
  1186.  
  1187. : (")    ( -- addr len )   R> COUNT 2DUP + >R  ;
  1188.  
  1189. : BYE   ( -- )
  1190.         0 0 BDOS  ;                     NO-INTERPRET
  1191.  
  1192. VARIABLE ABORT_FUNC
  1193.  
  1194. : ABORT         ( -- )          \ Just leave when we abort
  1195.                 ABORT_FUNC @ ?DUP
  1196.                 IF      EXECUTE
  1197.                 ELSE    CR BYE
  1198.                 THEN    ;                               EXECUTES> ABORT
  1199.  
  1200. : ?ABORT"       ( f1 a1 n1 -- ) \ display string a1,n1 & abort if f1 true
  1201.                 ROT
  1202.                 IF      TYPE ABORT
  1203.                 ELSE    2DROP
  1204.                 THEN    ;
  1205.  
  1206. FORTH   >FORTH
  1207.  
  1208. : %T"80         ( a1 -- )               \ compile string into target
  1209.                 F['] (") RES_COMP_CALL
  1210.                 [FORTH]
  1211.                 DUP C@ 1+ S,-T          \ compile string to data area
  1212.                 ;
  1213. ' %T"80 IS %T"                          \ link into compiler
  1214.  
  1215. : %T."          ( | string" -- )
  1216.                 [COMPILE] T"
  1217.                 F['] TYPE RES_COMP_CALL ; IMMEDIATE
  1218. ' %T." IS T."
  1219.  
  1220. : %L."          ( | string" -- )
  1221.                 [COMPILE] L"
  1222.                 COMPILE RES_COMP_CLL F['] TYPE X, ; IMMEDIATE
  1223. ' %L." IS L."
  1224.  
  1225. : %T[']         ( | <name> -- a1 )
  1226.                 F['] (LIT)    RES_COMP_CALL
  1227.                 [FORTH] '     RES_COMP_CALL ; IMMEDIATE
  1228. ' %T['] IS T[']
  1229.  
  1230. : %L[']         ( | <name> -- a1 )
  1231.                 COMPILE RES_COMP_CLL F['] (LIT) X,
  1232.                 COMPILE RES_COMP_CLL [FORTH] '  X, ; IMMEDIATE
  1233. ' %L['] IS L[']
  1234.  
  1235. : %TABORT"      ( | string" -- )
  1236.                 [COMPILE] T" F['] ?ABORT" COMP_CALL ; IMMEDIATE
  1237. ' %TABORT" IS TABORT"
  1238.  
  1239. : %LABORT"      ( | string" -- )
  1240.                 [COMPILE] L"
  1241.                 COMPILE <'> COMPILE ?ABORT" COMPILE COMP_CALL ; IMMEDIATE
  1242. ' %LABORT" IS LABORT"
  1243.  
  1244. : [COMPILE]     ( | <name> -- )
  1245.                 COMPILE RES_COMP_CLL [FORTH] '  X, ; IMMEDIATE
  1246.  
  1247. : IMMEDIATE     ( -- )
  1248.                 [FORTH]
  1249.                 64 ( Precedence bit ) TLAST @  CSET-T  ;
  1250.  
  1251. TARGET  >LIBRARY
  1252.  
  1253. \ Interactive Layer           Dictionary              27Oct86TJZ
  1254.  
  1255. ( 8 ) 4 CONSTANT #THREADS
  1256. : FIND   ( addr -- cfa flag | addr false )
  1257.      DUP C@ IF   PRIOR OFF   $0000   #VOCS 0
  1258.        DO   DROP CONTEXT I 2* + @ DUP
  1259.          IF   DUP PRIOR @ OVER PRIOR !   =
  1260.            IF   DROP $0000
  1261.            ELSE   OVER SWAP HASH @ (FIND)  DUP ?LEAVE
  1262.          THEN THEN   LOOP
  1263.      ELSE  DROP END? ON  ['] NOOP 1  THEN  ;
  1264.  
  1265. : ?UPPERCASE    ( adr -- adr )
  1266.                 CAPS @ IF  DUP COUNT UPPER   THEN  ;
  1267.  
  1268. : DEFINED       ( -- here 0 | cfa [ -1 | 1 ] )
  1269.                 BL WORD  ?UPPERCASE  FIND   ;
  1270.  
  1271. : ?STACK        ( -- )   ( System dependant )
  1272.                 SP@ SP0 @ SWAP U<       ABORT" Stack Underflow"
  1273.                 SP@ PAD U<              ABORT" Stack Overflow"   ;
  1274.  
  1275. : ALLOT         ( n -- )      DP +!   ;
  1276.  
  1277. : ,             ( n -- )   HERE !   2 ALLOT   ;
  1278.  
  1279. : C,            ( char -- )   HERE C!   1 ALLOT ;
  1280.  
  1281. : COMPILE       ( -- )   R> DUP 2+ >R   @ ,   ;
  1282.  
  1283. : CRASH         ( -- )
  1284.                 TRUE ABORT"  Uninitialized execution vector."  ;
  1285.  
  1286. : ?MISSING      ( f -- )        IF 'WORD COUNT TYPE TRUE ABORT"  ?" THEN ;
  1287.  
  1288. \ Interactive Layer           Number Input            06Oct83map
  1289.  
  1290. : (NUMBER?)   ( adr -- d flag )
  1291.    0 0  ROT  DUP 1+  C@  '-'  =  DUP  >R  -  -1 DPL !
  1292.    BEGIN   CONVERT  DUP C@  ',' '/' BETWEEN
  1293.    WHILE   0 DPL !
  1294.    REPEAT  -ROT  R> IF  DNEGATE  THEN   ROT C@ BL =  ;
  1295.                                         NO-INTERPRET
  1296. : NUMBER?   ( adr -- d flag )
  1297.    $0000  OVER COUNT BOUNDS
  1298.    ?DO  I C@ BASE @ DIGIT NIP IF  DROP $FFFF LEAVE THEN  LOOP
  1299.    IF  (NUMBER?)  ELSE  DROP  0 0 $0000  THEN  ;
  1300.                                         NO-INTERPRET
  1301. : NUMBER        ( adr -- d# )
  1302.                 NUMBER? NOT ?MISSING  ; NO-INTERPRET
  1303.  
  1304. : INTERPRET     ( -- )
  1305.                 BEGIN   ?STACK DEFINED
  1306.                         IF     EXECUTE
  1307.                         ELSE   NUMBER  DOUBLE? NOT IF  DROP  THEN
  1308.                         THEN   FALSE DONE?
  1309.                 UNTIL   ;
  1310.  
  1311. : ,"            ( -- )          '"' PARSE  TUCK 'WORD PLACE  1+ ALLOT ;
  1312. : ?CONDITION    ( f -- )        NOT ABORT" Conditionals Wrong"   ;
  1313. : >MARK         ( -- addr )     HERE 0 ,   ;
  1314. : >RESOLVE      ( addr -- )     HERE SWAP !   ;
  1315. : <MARK         ( -- addr )     HERE    ;
  1316. : <RESOLVE      ( addr -- )     ,   ;
  1317. : ?>MARK        ( -- f addr )   $FFFF >MARK   ;
  1318. : ?>RESOLVE     ( f addr -- )   SWAP ?CONDITION >RESOLVE  ;
  1319. : ?<MARK        ( -- f addr )   $FFFF   <MARK   ;
  1320. : ?<RESOLVE     ( f addr -- )   SWAP ?CONDITION <RESOLVE  ;
  1321. : LEAVE         COMPILE (LEAVE)                                 ; IMMEDIATE
  1322. : ?LEAVE        COMPILE (?LEAVE)                                ; IMMEDIATE
  1323.  
  1324. : ,VIEW         ( -- )   0 ,  ;
  1325.  
  1326. : "CREATE       ( str -- )   COUNT HERE 4 + PLACE
  1327.                 ,VIEW  HERE 0 , ( reserve link )
  1328.                 HERE LAST ! ( remember nfa )   HERE  ( lfa nfa )   WARNING @
  1329.                 IF  FIND
  1330.                   IF  CR HERE COUNT TYPE ."  isn't unique " THEN  DROP HERE
  1331.                 THEN  ( lfa nfa )  CURRENT @ HASH DUP @ ( lfa tha prev )
  1332.                 HERE 2- ROT !  ( lfa prev )   SWAP !   ( Resolve link field)
  1333.                 HERE  DUP  C@  WIDTH  @    MIN  1+  ALLOT
  1334.                 128 SWAP CSET   128 HERE 1- CSET   ( delimiter Bits )
  1335.                 ( DOCREATE ) $137 , ;
  1336.  
  1337. : CREATE        ( -- )
  1338.                 BL WORD  ?UPPERCASE  "CREATE  ;
  1339.  
  1340. : !CSP          ( -- )   SP@ CSP !   ;
  1341.  
  1342. : ?CSP          ( -- )   SP@ CSP @ <> ABORT" Stack Changed"   ;
  1343.  
  1344. : HIDE          ( -- )
  1345.                 LAST @   DUP N>LINK @    SWAP CURRENT @ HASH !   ;
  1346.  
  1347. : REVEAL        ( -- )
  1348.                 LAST @ DUP N>LINK        SWAP CURRENT @ HASH !   ;
  1349.  
  1350. \ : (;USES)       ( -- )   R> @  LAST @ NAME>  !  ;
  1351. \ : ;USES         ( -- )   ?CSP   COMPILE  (;USES)
  1352. \                 [COMPILE] [   REVEAL   ; IMMEDIATE
  1353. \ : (;CODE)       ( -- )   R>    LAST @ NAME>  !  ;
  1354. \ : ;CODE         ( -- )   ?CSP   COMPILE  (;CODE)
  1355. \                 [COMPILE] [   REVEAL   ; IMMEDIATE
  1356. \ : DOES>         ( -- )
  1357. \                 COMPILE (;CODE)
  1358. \                 ( CALL )        $CD  C,
  1359. \                 ( DODOES )      $126  , ; IMMEDIATE
  1360.  
  1361. : [             ( -- )   STATE OFF   ;   IMMEDIATE
  1362.  
  1363. : ]             ( -- )
  1364.                 STATE ON   BEGIN   ?STACK   DEFINED DUP
  1365.                 IF      0> IF    EXECUTE   ELSE   ,   THEN
  1366.                 ELSE    DROP   NUMBER  DOUBLE?
  1367.                         IF             [COMPILE] DLITERAL
  1368.                         ELSE    DROP   [COMPILE] LITERAL   THEN
  1369.                 THEN    TRUE DONE? UNTIL   ;
  1370.  
  1371. \ : :   ( -- ) !CSP   CURRENT @ CONTEXT ! CREATE HIDE ] ;USES   NEST ,
  1372. \ : ;   ( -- ) ?CSP   COMPILE UNNEST REVEAL [COMPILE] [ ; IMMEDIATE
  1373.  
  1374. : RECURSIVE     ( -- )   REVEAL ;   IMMEDIATE
  1375.  
  1376. \ : CONSTANT   ( n -- )   CREATE ,   ;USES DOCONSTANT ,
  1377. \ : VARIABLE  ( -- )      CREATE 0 ,   ;USES DOCREATE ,
  1378. \ : DEFER   ( -- )        CREATE   ['] CRASH ,  ;USES   DODEFER ,
  1379. \ : 2CONSTANT CREATE   , ,     ( d# -- ) DOES>   2@   ;   ( -- d# )
  1380. \ : 2VARIABLE 0 0 2CONSTANT   ( -- ) DOES>        ;  ( -- addr )
  1381. \ : >IS   ( cfa -- data-address )         >BODY   ;
  1382. \ : (IS)      ( cfa --- )                 R@ @  >IS !   R> 2+ >R   ;
  1383. \ : IS  ( cfa --- ) STATE @ IF COMPILE (IS) ELSE ' >IS !  THEN ; IMMEDIATE
  1384.  
  1385. : RUN           ( -- )
  1386.                 STATE @
  1387.                 IF      ]   STATE @ NOT
  1388.                         IF      INTERPRET
  1389.                         THEN
  1390.                 ELSE    INTERPRET
  1391.                 THEN   ;
  1392.  
  1393. DEFER STATUS
  1394.  
  1395. : BOOT          ( -- )
  1396.                 ['] CR !> STATUS ;
  1397.  
  1398. : QUIT          ( -- )
  1399.                 SP0 @ 'TIB !    [COMPILE] [
  1400.                 BEGIN   RP0 @ RP! STATUS QUERY  RUN
  1401.                         STATE @ NOT IF   ."  ok"   THEN
  1402.                 AGAIN   ;
  1403.  
  1404. : WARM          ( -- )
  1405.                 $FFFF ABORT" Warm Start"   ;
  1406.  
  1407. : COLD          ( -- )
  1408.                 BOOT QUIT   ;
  1409.  
  1410. \ : '   ( -- cfa )   DEFINED 0= ?MISSING   ;
  1411. \ : ['] ( -- )       ' [COMPILE] LITERAL   ; IMMEDIATE
  1412. \ : [COMPILE]   ( -- )   ' ,   ; IMMEDIATE
  1413. \ : >TYPE         ( adr len -- )
  1414. \                 TUCK PAD SWAP CMOVE   PAD SWAP TYPE  ;
  1415. \ : .(   ( -- )   ')' PARSE >TYPE  ; IMMEDIATE
  1416. \ : (    ( -- )   ')' PARSE 2DROP  ; IMMEDIATE
  1417. \ : \S   ( -- )   END? ON ;  IMMEDIATE
  1418. \ : IMMEDIATE ( -- )   64 ( Precedence bit ) LAST @  CSET  ;
  1419. \ : LITERAL   ( n -- )    COMPILE (LIT)   ,   ;   IMMEDIATE
  1420. \ : DLITERAL    ( d# -- )
  1421. \       SWAP   [COMPILE] LITERAL  [COMPILE] LITERAL  ; IMMEDIATE
  1422. \ : ASCII     ( -- n )   BL WORD   1+ C@
  1423. \         STATE @ IF   [COMPILE] LITERAL   THEN   ; IMMEDIATE
  1424. \ : CONTROL   ( -- n )   BL WORD   1+ C@  31 AND
  1425. \    STATE @ IF   [COMPILE] LITERAL   THEN   ; IMMEDIATE
  1426.  
  1427. : BEGIN         ?<MARK                                          ; IMMEDIATE
  1428. : THEN          ?>RESOLVE                                       ; IMMEDIATE
  1429. : DO            COMPILE (DO)   ?>MARK                           ; IMMEDIATE
  1430. : ?DO           COMPILE (?DO)  ?>MARK                           ; IMMEDIATE
  1431. : LOOP          COMPILE (LOOP)  2DUP 2+ ?<RESOLVE ?>RESOLVE     ; IMMEDIATE
  1432. : +LOOP         COMPILE (+LOOP) 2DUP 2+ ?<RESOLVE ?>RESOLVE     ; IMMEDIATE
  1433. : UNTIL         COMPILE ?BRANCH    ?<RESOLVE                    ; IMMEDIATE
  1434. : AGAIN         COMPILE  BRANCH    ?<RESOLVE                    ; IMMEDIATE
  1435. : REPEAT        2SWAP [COMPILE] AGAIN   [COMPILE] THEN          ; IMMEDIATE
  1436. : IF            COMPILE  ?BRANCH  ?>MARK                        ; IMMEDIATE
  1437. : ELSE          COMPILE  BRANCH ?>MARK  2SWAP ?>RESOLVE         ; IMMEDIATE
  1438. : WHILE         [COMPILE] IF                                    ; IMMEDIATE
  1439.  
  1440.  
  1441. ' !> ALIAS =: IMMEDIATE
  1442. ' !> ALIAS IS IMMEDIATE
  1443.  
  1444. FORTH >FORTH
  1445.  
  1446.  
  1447.