home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / source / lib5.seq < prev    next >
Encoding:
Text File  |  1991-02-12  |  25.6 KB  |  813 lines

  1. \ LIB5.SEQ            6805 Target Library Source        by Andrew McKewan
  2.  
  3. \ ***************************************************************************
  4. \ Target specific words used by the compiler to complete compilation of
  5. \ the the various types of library and target definitions.  These words
  6. \ will need to be re-written when a new traget is being written.
  7.  
  8. \ ***************************************************************************
  9. \                       Target Library words
  10. \ ***************************************************************************
  11.  
  12. >LIBRARY
  13.  
  14. TARGET DEFINITIONS
  15.  
  16. \ ***************************************************************************
  17. \ This macro puts a literal number on the data stack. The instructon
  18. \ sequence used is not optimal, but is likely to be optimized later by the
  19. \ automatic POP optimizer.
  20.  
  21. MACRO (LIT)     ( n1 -- )       \ Special macro to compile an inline number
  22.                 # LDA,          \ to the stack.
  23.                 PUSH
  24.                 END-MACRO       NO-INTERPRET
  25.  
  26. ' (LIT) >EXECUTE IS COMP_SINGLE \ link into number compiler
  27.  
  28.  
  29. MACRO EXIT      ( -- )
  30.                 EXIT_OPT        END-MACRO       NO-INTERPRET
  31.  
  32. MACRO ?EXIT     ( f1 -- )       \ If boolean f1 is true, exit from definition
  33.                 POP
  34.                 A TST,
  35.                 0= NOT IF,  RTS,
  36.                 THEN,           END-MACRO       NO-INTERPRET
  37.  
  38. \ ***************************************************************************
  39. \ Compiler Control Structures
  40.  
  41. MACRO BEGIN     ( -- )
  42.                 BEGIN,
  43.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  44.  
  45. MACRO AGAIN     ( -- )
  46.                 AGAIN,
  47.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  48.  
  49. MACRO IF        ( f -- )
  50.                 POP
  51.                 A TST,
  52.                 0= NOT IF,
  53.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  54.  
  55. TARGET ' IF ALIAS WHILE     ( f1 -- )
  56.  
  57. MACRO ELSE      ( -- )
  58.                 ELSE,
  59.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  60.  
  61. MACRO THEN      ( -- )
  62.                 THEN,
  63.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  64.  
  65. MACRO REPEAT    ( -- )
  66.                 REPEAT,
  67.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  68.  
  69. MACRO UNTIL     ( f1 -- )
  70.                 POP
  71.                 A TST,
  72.                 0= NOT UNTIL,
  73.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  74.  
  75.  
  76. \ ***************************************************************************
  77. \ CASE STATEMENT NOT IMPLEMENTED
  78.  
  79. COMMENT:
  80.  
  81. FORTH   >FORTH
  82.  
  83. 0 VALUE #CASES          \ a CASE counter
  84.  
  85. FORTH
  86.  
  87. : %CASE          ( -- )
  88.                 [FORTH]
  89.                 OFF> #CASES ;
  90.  
  91. FORTH
  92.  
  93. : CASE          ( -- )
  94.                 [FORTH]
  95.                 ?LIB
  96.                 IF      COMPILE %CASE
  97.                 ELSE    %CASE
  98.                 THEN
  99.                 [TARGET]
  100.                 ; IMMEDIATE
  101.  
  102. TARGET  >LIBRARY
  103.  
  104. MACRO OF        ( n1 n2  -- n1 )  ( n1 n2 -- )
  105.                 [FORTH]
  106.                 LIT/MEM_OPT ?DUP
  107.                 IF      0<
  108.                         IF
  109.                                 [5ASSEMBLER]
  110.                                 CMP BX, # ( xxxx )
  111.                                 [FORTH]
  112.                         ELSE
  113.                                 [5ASSEMBLER]
  114.                                 CMP BX, ( xxxx )
  115.                                 [FORTH]
  116.                         THEN
  117.                 ELSE
  118.                         [5ASSEMBLER]
  119.                         LODSW
  120.                         XCHG AX, BX
  121.                         CMP BX, AX
  122.                         [FORTH]
  123.                 THEN
  124.                 INCR> #CASES                    \ bump number of cases
  125.                 ?LONG
  126.                 IF      [5ASSEMBLER]
  127.                         JZ here 5 +     A;      \ branch around JMP
  128.                         JMP +BR# $ WORD A;
  129.                         [FORTH]
  130.                 ELSE    [5ASSEMBLER]
  131.                         JNZ +BR# $       A;
  132.                         [FORTH]
  133.                 THEN
  134.                 [5ASSEMBLER]
  135.                 LOAD_BX         END-MACRO       NO-INTERPRET
  136.  
  137. MACRO ENDOF     ( -- )
  138.                 JMP +BR# $ WORD
  139.                 BR#SWAP
  140.                 -BR# DUP $:| 01LAB
  141.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  142.  
  143. MACRO ENDCASE   ( -- )          \ resolve branch
  144.                 [FORTH]
  145.                 SAVE> ?LONG             \ save current branch length flag
  146.                 LONG_BRANCH             \ we default to long for ENDCASE
  147.                 #CASES  0               \ resolve #CASES case statments
  148.                 DO      [5ASSEMBLER]
  149.                         -BR# DUP $:| 01LAB
  150.                         [FORTH]
  151.                 LOOP
  152.                 OFF> #CASES
  153.                 RESTORE> ?LONG          \ restore branch length flag
  154.                 [5ASSEMBLER]
  155.                 OPT_OFF1        END-MACRO       NO-INTERPRET
  156.  
  157. COMMENT;
  158.  
  159.  
  160. \ ***************************************************************************
  161. \ Runtime Primatives for for/next loop
  162.  
  163. CODE (FOR)      ( n -- )
  164.                 %LOOP 1+ LDA,  %LOOP 2+ STA,
  165.                 %LOOP LDA,  %LOOP 1+ STA,
  166.                 POP,  %LOOP STA,
  167.                 RTS,                            END-CODE
  168.  
  169. CODE (NEXT)     ( -- )
  170.                 %LOOP 1+ LDA,  %LOOP STA,
  171.                 %LOOP 2+ LDA,  %LOOP 1+ STA,
  172.                 RTS,                            END-CODE
  173.  
  174. MACRO FOR       ( n1 -- )
  175.                 F['] (FOR) TARG_COMPILE
  176.                 BEGIN,
  177.                 OPT_OFF1                        END-MACRO       NO-INTERPRET
  178.  
  179. MACRO NEXT      ( -- )
  180.                 %LOOP DEC,
  181.                 0= UNTIL,
  182.                 F['] (NEXT) TARG_COMPILE        END-MACRO       NO-INTERPRET
  183.  
  184. MACRO I         ( -- n )
  185.                 %LOOP LDA,  PUSH                END-MACRO       NO-INTERPRET
  186.  
  187. MACRO LEAVE     ( -- )          \ LEAVE forces an exit at the end
  188.                                 \ of the loop by setting the index to 1.
  189.                 1 # LDA,
  190.                 %LOOP STA,                      END-MACRO       NO-INTERPRET
  191.  
  192.  
  193. \ ***************************************************************************
  194. \ Stack Operators
  195.  
  196. MACRO DROP      ( n1 -- )
  197.                 X INC,                  END-MACRO       EXECUTES> DROP
  198.  
  199. MACRO DUP       ( n1 -- n1 n1 )
  200.                 [FORTH]
  201.                 PUSH_OPT
  202.                 IF      PUSH
  203.                         PUSH
  204.                 ELSE    [5ASSEMBLER] 0 ,X LDA, [FORTH]
  205.                         PUSH
  206.                 THEN    [TARGET]        END-MACRO       EXECUTES> DUP
  207.  
  208. CODE SWAP       ( n1 n2 -- n2 n1 )
  209.                 0 ,X LDA,  TEMP STA,
  210.                 1 ,X LDA,  0 ,X STA,
  211.                 TEMP LDA,  1 ,X STA,
  212.                 RTS,                    END-CODE        EXECUTES> SWAP
  213.  
  214. MACRO OVER      ( n1 n2 -- n1 n2 n1 )
  215.                 1 ,X LDA,  PUSH         END-MACRO       EXECUTES> OVER
  216.  
  217. CODE ROT        ( n1 n2 n3 -- n2 n3 n1 )
  218.                 0 ,X LDA,  TEMP STA,
  219.                 1 ,X LDA,  TEMP 1+ STA,
  220.                 2 ,X LDA,     0 ,X STA,
  221.                 TEMP LDA,     1 ,X STA,
  222.                 TEMP 1+ LDA,  2 ,X STA,
  223.                 RTS,                    END-CODE        EXECUTES> ROT
  224.  
  225. MACRO NIP       ( n1 n2 -- n2 )
  226.                 POP  0 ,X STA,          END-MACRO       EXECUTES> NIP
  227.  
  228. CODE TUCK       ( n1 n2 -- n2 n1 n2 )
  229.                 0 ,X LDA,  TEMP STA,
  230.                 1 ,X LDA,  0 ,X STA,
  231.                 TEMP LDA,  1 ,X STA,
  232.                 PUSH,  RTS,             END-CODE        EXECUTES> TUCK
  233.  
  234. CODE ?DUP       ( n -- n | n n )
  235.                 0 ,X LDA,  0= NOT IF,  PUSH,  THEN,
  236.                 RTS,                    END-CODE        EXECUTES> ?DUP
  237.  
  238. CODE (PICK)     ( n1 -- n2 )
  239.                 TEMP STX,
  240.                 0 ,X LDA,  TEMP ADD,  TAX,  1 ,X LDA,
  241.                 TEMP LDX,  0 ,X STA,
  242.                 RTS,                    END-CODE
  243.  
  244. MACRO PICK      ( n1 -- n2 )
  245.                 [FORTH]
  246.                 LIT_OPT
  247.                 IF
  248.                         [5ASSEMBLER]
  249.                         ( xxx ) ,X LDA,
  250.                         [FORTH]
  251.                         PUSH
  252.                 ELSE
  253.                         F['] (PICK) TARG_COMPILE
  254.                 THEN
  255.                 [TARGET]                END-MACRO      NO-INTERPRET
  256.  
  257. \ ***************************************************************************
  258. \ Double stack operators
  259.  
  260. MACRO 2DROP     ( n1 n2 -- )
  261.                 X INC,  X INC,          END-MACRO       EXECUTES> 2DROP
  262.  
  263. CODE 2DUP       ( n1 n2 -- n1 n2 n1 n2 )
  264.                 1 ,X LDA,  PUSH,
  265.                 1 ,X LDA,  PUSH,
  266.                 RTS,                    END-CODE        EXECUTES> 2DUP
  267.  
  268. \ ***************************************************************************
  269. \ Arithmetic/logical operators
  270.  
  271. MACRO +         ( n1 n2 -- n3 )
  272.                 [FORTH]
  273.                 LIT_LIT_OPT
  274.         IF      +
  275.                 [5ASSEMBLER] # LDA, [FORTH]
  276.                 PUSH
  277.         ELSE
  278.                 PUSH_LIT/MEM_OPT ?DUP
  279.                 IF
  280.                         0<
  281.                         IF      [5ASSEMBLER]   # ADD, [FORTH]
  282.                         ELSE    [5ASSEMBLER] MEM ADD, [FORTH]
  283.                         THEN    PUSH
  284.                 ELSE
  285.                         POP
  286.                         [5ASSEMBLER]
  287.                         0 ,X ADD,
  288.                         0 ,X STA,
  289.                         [FORTH]
  290.                 THEN
  291.         THEN    [TARGET]                END-MACRO       EXECUTES> +
  292.  
  293.  
  294. MACRO -         ( n1 n2 -- n3 )
  295.                 [FORTH]
  296.                 LIT_LIT_OPT
  297.         IF      -
  298.                 [5ASSEMBLER] # LDA, [FORTH]
  299.                 PUSH
  300.         ELSE
  301.                 PUSH_LIT/MEM_OPT ?DUP
  302.                 IF
  303.                         0<
  304.                         IF      [5ASSEMBLER]   # SUB, [FORTH]
  305.                         ELSE    [5ASSEMBLER] MEM SUB, [FORTH]
  306.                         THEN    PUSH
  307.                 ELSE
  308.                         POP
  309.                         [5ASSEMBLER]
  310.                         0 ,X SUB,
  311.                         A NEG,
  312.                         0 ,X STA,
  313.                         [FORTH]
  314.                 THEN
  315.         THEN    [TARGET]                END-MACRO       EXECUTES> -
  316.  
  317.  
  318. MACRO AND       ( n1 n2 -- n3 )
  319.                 [FORTH]
  320.                 LIT_LIT_OPT
  321.         IF      AND
  322.                 [5ASSEMBLER] # LDA, [FORTH]
  323.                 PUSH
  324.         ELSE
  325.                 PUSH_LIT/MEM_OPT ?DUP
  326.                 IF
  327.                         0<
  328.                         IF      [5ASSEMBLER]   # AND, [FORTH]
  329.                         ELSE    [5ASSEMBLER] MEM AND, [FORTH]
  330.                         THEN    PUSH
  331.                 ELSE
  332.                         POP
  333.                         [5ASSEMBLER]
  334.                         0 ,X AND,
  335.                         0 ,X STA,
  336.                         [FORTH]
  337.                 THEN
  338.         THEN    [TARGET]                END-MACRO       EXECUTES> AND
  339.  
  340.  
  341. MACRO OR        ( n1 n2 -- n3 )
  342.                 [FORTH]
  343.                 LIT_LIT_OPT
  344.         IF      OR
  345.                 [5ASSEMBLER] # LDA, [FORTH]
  346.                 PUSH
  347.         ELSE
  348.                 PUSH_LIT/MEM_OPT ?DUP
  349.                 IF
  350.                         0<
  351.                         IF      [5ASSEMBLER]   # ORA, [FORTH]
  352.                         ELSE    [5ASSEMBLER] MEM ORA, [FORTH]
  353.                         THEN    PUSH
  354.                 ELSE
  355.                         POP
  356.                         [5ASSEMBLER]
  357.                         0 ,X ORA,
  358.                         0 ,X STA,
  359.                         [FORTH]
  360.                 THEN
  361.         THEN    [TARGET]                END-MACRO       EXECUTES> OR
  362.  
  363.  
  364. MACRO XOR       ( n1 n2 -- n3 )
  365.                 [FORTH]
  366.                 LIT_LIT_OPT
  367.         IF      XOR
  368.                 [5ASSEMBLER] # LDA, [FORTH]
  369.                 PUSH
  370.         ELSE
  371.                 PUSH_LIT/MEM_OPT ?DUP
  372.                 IF
  373.                         0<
  374.                         IF      [5ASSEMBLER]   # EOR, [FORTH]
  375.                         ELSE    [5ASSEMBLER] MEM EOR, [FORTH]
  376.                         THEN    PUSH
  377.                 ELSE
  378.                         POP
  379.                         [5ASSEMBLER]
  380.                         0 ,X EOR,
  381.                         0 ,X STA,
  382.                         [FORTH]
  383.                 THEN
  384.         THEN    [TARGET]                END-MACRO       EXECUTES> XOR
  385.  
  386.  
  387. LABEL (*)       ( u1 u2 -- u3 )
  388.                 POP
  389.                 TEMP STX,  0 ,X LDX,  MUL,
  390.                 TEMP LDX,  0 ,X STA,
  391.                 RTS,            END-CODE
  392.  
  393. MACRO *         ( u1 u2 -- u3 )
  394.                 [FORTH]
  395.                 PUSH_LIT/MEM_OPT ?DUP
  396.         IF      0<
  397.                 IF
  398.                         [5ASSEMBLER]
  399.                         TEMP STX,
  400.                         ( xxx ) # LDX,
  401.                         MUL,
  402.                         TEMP LDX,
  403.                         [FORTH]
  404.                         PUSH
  405.                 ELSE
  406.                         [5ASSEMBLER]
  407.                         TEMP STX,
  408.                         ( xxx ) LDX,
  409.                         MUL,
  410.                         TEMP LDX,
  411.                         [FORTH]
  412.                         PUSH
  413.                 THEN
  414.         ELSE
  415. \                 F['] (*) TARG_COMPILE
  416.                 POP
  417.                 [5ASSEMBLER]
  418.                 TEMP STX,  0 ,X LDX,  MUL,
  419.                 TEMP LDX,  0 ,X STA,
  420.                 [FORTH]
  421.         THEN    [TARGET]                END-MACRO       EXECUTES> *
  422.  
  423. CODE M*         ( u1 u2 -- ud )
  424.                 TEMP STX,
  425.                 0 ,X LDA,  1 ,X LDX,  MUL,  TEMP 1+ STX,
  426.                 TEMP LDX,  1 ,X STA,
  427.                 TEMP 1+ LDA,  0 ,X STA,
  428.                 RTS,            END-CODE
  429.  
  430.  
  431.  
  432. ( NO DIVIDE YET !!! )
  433.  
  434. \ ***************************************************************************
  435. \ Unary arithmetic/logical operators
  436.  
  437. MACRO NEGATE    ( n1 -- n2 )
  438.                 [FORTH]
  439.                 PUSH_OPT
  440.         IF
  441.                 [5ASSEMBLER]
  442.                 A NEG,
  443.                 [FORTH]
  444.                 PUSH
  445.         ELSE
  446.                 [5ASSEMBLER]
  447.                 0 ,X NEG,
  448.                 [FORTH]
  449.         THEN    [TARGET]                END-MACRO       EXECUTES> NEGATE
  450.  
  451. MACRO NOT       ( n1 -- n2 )
  452.                 [FORTH]
  453.                 PUSH_OPT
  454.         IF
  455.                 [5ASSEMBLER]
  456.                 A COM,
  457.                 [FORTH]
  458.                 PUSH
  459.         ELSE
  460.                 [5ASSEMBLER]
  461.                 0 ,X COM,
  462.                 [FORTH]
  463.         THEN    [TARGET]                END-MACRO       EXECUTES> NOT
  464.  
  465. MACRO 2*        ( n1 -- n2 )
  466.                 [FORTH]
  467.                 PUSH_OPT
  468.         IF
  469.                 [5ASSEMBLER]
  470.                 A LSL,
  471.                 [FORTH]
  472.                 PUSH
  473.         ELSE
  474.                 [5ASSEMBLER]
  475.                 0 ,X LSL,
  476.                 [FORTH]
  477.         THEN    [TARGET]                END-MACRO       EXECUTES> 2*
  478.  
  479. MACRO 2/        ( n1 -- n2 )
  480.                 [FORTH]
  481.                 PUSH_OPT
  482.         IF
  483.                 [5ASSEMBLER]
  484.                 A LSR,
  485.                 [FORTH]
  486.                 PUSH
  487.         ELSE
  488.                 [5ASSEMBLER]
  489.                 0 ,X LSR,
  490.                 [FORTH]
  491.         THEN    [TARGET]                END-MACRO       EXECUTES> 2/
  492.  
  493. $FF CONSTANT TRUE
  494. $00 CONSTANT FALSE
  495.  
  496. \ ***************************************************************************
  497. \ Program control
  498.  
  499. MACRO SP!       ( ? -- )        \ reset data stack pointer
  500.                 SP0 # LDX,              END-CODE        NO-INTERPRET
  501.  
  502. MACRO RP!       ( -- )          \ reset return stack pointer
  503.                 RSP,                    END-MACRO       NO-INTERPRET
  504.  
  505. MACRO NOOP      ( -- )          \ no operation
  506.                 NOP,                    END-MACRO       EXECUTES> NOOP
  507.  
  508. \ ***************************************************************************
  509. \ 6805 Special instructions
  510. \ MAYBE PUT THESE IN INTERRUPT LIBRARY FILE
  511.  
  512. MACRO EI        ( -- )          \ enable interrupts
  513.                 CLI,                    END-MACRO       NO-INTERPRET
  514.  
  515. MACRO DI        ( -- )          \ disable interrupts
  516.                 SEI,                    END-MACRO       NO-INTERPRET
  517.  
  518. MACRO SWI       ( -- )          \ software interrupt
  519.                 SWI,                    END-MACRO       NO-INTERPRET
  520.  
  521. MACRO WAIT      ( -- )          \ wait for interrupt
  522.                 WAIT,                   END-MACRO       NO-INTERPRET
  523.  
  524. MACRO STOP      ( -- )          \ stop processor
  525.                 STOP,                   END-MACRO       NO-INTERPRET
  526.  
  527. \ ***************************************************************************
  528. \ Memory operations
  529.  
  530. CODE (@)        ( addr -- n )      \ default subroutine call
  531.                 TEMP STX,
  532.                 0 ,X LDX,  0 ,X LDA,
  533.                 TEMP LDX,
  534.                 0 ,X STA,
  535.                 RTS,         END-CODE
  536.  
  537. MACRO @         ( -- )          \ The ! MACRO
  538.                 [FORTH]
  539.                 LIT_OPT
  540.                 IF
  541.                         [5ASSEMBLER]
  542.                         ( xxx ) LDA,
  543.                         [FORTH]
  544.                         PUSH
  545.                 ELSE
  546.                         F['] (@) TARG_COMPILE
  547.                 THEN
  548.                 [TARGET]                END-MACRO      NO-INTERPRET
  549.  
  550. ' @ >EXECUTE IS COMP_FETCH              \ link into compiler
  551.  
  552.  
  553. CODE (!)        ( n a -- )              \ default subroutine
  554.                 TEMP STX,
  555.                 1 ,X LDA,  0 ,X LDX,
  556.                 0 ,X STA,
  557.                 TEMP LDX,
  558.                 X INC,  X INC,
  559.                 RTS,                    END-CODE
  560.  
  561. MACRO !         ( n addr -- )
  562.                 [FORTH]
  563.                 LIT_OPT
  564.                 IF
  565.                         POP
  566.                         [5ASSEMBLER]
  567.                         ( xxx ) STA,
  568.                         [FORTH]
  569.                 ELSE
  570.                         F['] (!) TARG_COMPILE
  571.                 THEN
  572.                 [TARGET]                END-MACRO       NO-INTERPRET
  573.  
  574. ' ! >EXECUTE IS COMP_STORE      \ link to compiler
  575.  
  576.  
  577. CODE (+!)       ( n addr -- )             \ default subroutine
  578.                 TEMP STX,
  579.                 1 ,X LDA,  0 ,X LDX,
  580.                 0 ,X ADD,  0 ,X STA,
  581.                 TEMP LDX,
  582.                 X INC,  X INC,
  583.                 RTS,                    END-CODE
  584.  
  585. MACRO +!        ( n addr -- )
  586.                 [FORTH]
  587.                 LIT_OPT
  588.                 IF
  589.                         [5ASSEMBLER]
  590.                         POP
  591.                         DUP ( xxx ) ADD,
  592.                             ( xxx ) STA,
  593.                         [FORTH]
  594.                 ELSE
  595.                         F['] (+!) TARG_COMPILE
  596.                 THEN
  597.                 [TARGET]                END-MACRO       NO-INTERPRET
  598.  
  599. ' +!   >EXECUTE IS COMP_PSTORE     \ link to compiler
  600.  
  601.  
  602. CODE (ON)       ( addr -- )             \ default subroutine
  603.                 TEMP STX,
  604.                 0 ,X LDX,  $FF # LDA,  0 ,X STA,
  605.                 TEMP LDX,  X INC,
  606.                 RTS,                    END-CODE
  607.  
  608. MACRO ON        ( addr -- )
  609.                 [FORTH]
  610.                 LIT_OPT
  611.                 IF
  612.                         [5ASSEMBLER]
  613.                         $FF # LDA,
  614.                         ( xxx ) STA,
  615.                         [FORTH]
  616.                 ELSE
  617.                         F['] (ON) TARG_COMPILE
  618.                 THEN
  619.                 [TARGET]                END-MACRO       NO-INTERPRET
  620.  
  621. ' ON  >EXECUTE IS COMP_ON         \ link to compiler
  622.  
  623.  
  624. CODE (OFF)      ( addr -- )             \ default subroutine
  625.                 TEMP STX,
  626.                 0 ,X LDX,  0 ,X CLR,
  627.                 TEMP LDX,  X INC,
  628.                 RTS,                    END-CODE
  629.  
  630. MACRO OFF       ( addr -- )
  631.                 [FORTH]
  632.                 LIT_OPT
  633.                 IF
  634.                         [5ASSEMBLER]
  635.                         ( xxx ) CLR,
  636.                         [FORTH]
  637.                 ELSE
  638.                         F['] (OFF) TARG_COMPILE
  639.                 THEN
  640.                 [TARGET]                END-MACRO       NO-INTERPRET
  641.  
  642. ' OFF >EXECUTE IS COMP_OFF        \ link to compiler
  643.  
  644.  
  645. CODE (INCR)     ( addr -- )             \ default subroutine
  646.                 TEMP STX,
  647.                 0 ,X LDX,  0 ,X INC,
  648.                 TEMP LDX,  X INC,
  649.                 RTS,                    END-CODE
  650.  
  651. MACRO INCR      ( addr -- )
  652.                 [FORTH]
  653.                 LIT_OPT
  654.                 IF
  655.                         [5ASSEMBLER]
  656.                         ( xxx ) INC,
  657.                         [FORTH]
  658.                 ELSE
  659.                         F['] (INCR) TARG_COMPILE
  660.                 THEN
  661.                 [TARGET]                END-MACRO       NO-INTERPRET
  662.  
  663. ' INCR >EXECUTE IS COMP_INCR       \ link to compiler
  664.  
  665.  
  666. CODE (DECR)     ( addr -- )             \ default subroutine
  667.                 TEMP STX,
  668.                 0 ,X LDX,  0 ,X DEC,
  669.                 TEMP LDX,  X INC,
  670.                 RTS,                    END-CODE
  671.  
  672. MACRO DECR      ( addr -- )
  673.                 [FORTH]
  674.                 LIT_OPT
  675.                 IF
  676.                         [5ASSEMBLER]
  677.                         ( xxx ) DEC,
  678.                         [FORTH]
  679.                 ELSE
  680.                         F['] (DECR) TARG_COMPILE
  681.                 THEN
  682.                 [TARGET]                END-MACRO       NO-INTERPRET
  683.  
  684. ' DECR >EXECUTE IS COMP_DECR       \ link to compiler
  685.  
  686. \ ***************************************************************************
  687. \ Double Memory Operarors
  688.  
  689. CODE 2@         ( adr -- n1 n2 )
  690.                 TEMP STX,
  691.                 0 ,X LDX,  0 ,X LDA,  TEMP 1+ STA,
  692.                 TEMP LDX,
  693.                 0 ,X LDX,  1 ,X LDA,
  694.                 TEMP LDX,  0 ,X STA,
  695.                 TEMP 1+ LDA,  PUSH,
  696.                 RTS,                            END-CODE
  697.  
  698. CODE 2!         ( n1 n2 adr -- )
  699.                 POP,  TEMP 1+ STA,
  700.                 TEMP STX,
  701.                 0 ,X LDA,  TEMP 1+ LDX,  0 ,X STA,
  702.                 TEMP LDX,
  703.                 1 ,X LDA,  TEMP 1+ LDX,  1 ,X STA,
  704.                 TEMP LDX,
  705.                 X INC,  X INC,
  706.                 RTS,                            END-CODE
  707.  
  708. \ ***************************************************************************
  709. \ Block Memory Operators
  710.  
  711. CODE MOVE       ( from to len -- )
  712.                 POP,  TEMP STA,     ( len )
  713.                 POP,  TEMP 1+ STA,  ( to )
  714.                 POP,  TEMP 2+ STA,  ( from )
  715.                 TEMP 3 + STX,  ( save X )
  716.                 TEMP TST,  0= NOT
  717.                 IF,     BEGIN,  TEMP 2+ LDX,  0 ,X LDA,
  718.                                 TEMP 1+ LDX,  0 ,X STA,
  719.                                 TEMP 2+ INC,  TEMP 1+ INC,
  720.                                 TEMP DEC,  0=
  721.                         UNTIL,
  722.                 THEN,
  723.                 TEMP 3 + LDX,  RTS,     END-CODE
  724.  
  725. CODE FILL       ( adr len n -- )
  726.                 POP,  TEMP STA,     ( n )
  727.                 POP,  TEMP 1+ STA,  ( len )
  728.                 POP,  TEMP 2+ STA,  ( addr )
  729.                 TEMP 3 + STX,  ( save X )
  730.                 TEMP 1+ TST,  0= NOT
  731.                 IF,     TEMP LDA,  TEMP 2+ LDX,
  732.                         BEGIN,  0 ,X STA,  X INC,
  733.                                 TEMP 1+ DEC,  0=
  734.                         UNTIL,
  735.                 THEN,
  736.                 TEMP 3 + LDX,  RTS,     END-CODE
  737.  
  738. : ERASE         ( addr len -- )  0 FILL ;
  739.  
  740. \ ***************************************************************************
  741. \ Comparison Operators
  742.  
  743. CODE 0=         ( n -- f )
  744.                 0 ,X LDA,
  745.                 0= IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  746.                 0 ,X CLR,  RTS,  END-CODE
  747.  
  748. CODE 0<>        ( n -- f )
  749.                 0 ,X LDA,
  750.                 0= NOT IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  751.                 0 ,X CLR,  RTS,  END-CODE
  752.  
  753. CODE 0<         ( n -- f )
  754.                 0 ,X LDA,
  755.                 0< IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  756.                 0 ,X CLR,  RTS,  END-CODE
  757.  
  758. CODE 0>         ( n -- f )
  759.                 0 ,X LDA,
  760.                 0= IF,  0 ,X CLR,  RTS,  THEN,
  761.                 0< IF,  0 ,X CLR,  RTS,  THEN,
  762.                 $FF # LDA,  0 ,X STA,  RTS,  END-CODE
  763.  
  764. CODE =          ( n n1 -- f )
  765.                 POP,
  766.                 0 ,X CMP,
  767.                 0= IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  768.                 0 ,X CLR,  RTS,  END-CODE
  769.  
  770. CODE <>         ( n n1 -- f )
  771.                 POP,
  772.                 0 ,X CMP,
  773.                 0= NOT IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  774.                 0 ,X CLR,  RTS,  END-CODE
  775.  
  776. CODE <          ( n n1 -- f )
  777.                 POP,
  778.                 0 ,X CMP,
  779.                 > IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  780.                 0 ,X CLR,  RTS,  END-CODE
  781.  
  782. CODE >          ( n n1 -- f )
  783.                 POP,
  784.                 0 ,X CMP,
  785.                 < IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  786.                 0 ,X CLR,  RTS,  END-CODE
  787.  
  788. CODE <=         ( n n1 -- f )
  789.                 POP,
  790.                 0 ,X CMP,
  791.                 < NOT IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  792.                 0 ,X CLR,  RTS,  END-CODE
  793.  
  794. CODE >=         ( n n1 -- f )
  795.                 POP,
  796.                 0 ,X CMP,
  797.                 > NOT IF,  $FF # LDA,  0 ,X STA,  RTS,  THEN,
  798.                 0 ,X CLR,  RTS,  END-CODE
  799.  
  800. \ ***************************************************************************
  801.  
  802. CODE MS         ( n -- )                \ Delay for N milliseconds
  803.                 POP,  TEMP CLR,
  804.                 BEGIN,  BEGIN,  TEMP DEC,  0= UNTIL,  A DEC, 0=
  805.                 UNTIL,  RTS,  END-CODE
  806.  
  807. : 500MS         ( -- )                  \ Delays approximately 500 msec.
  808.                 250 MS  250 MS ;
  809.  
  810.  
  811. >FORTH
  812.  
  813.