!!! X-FORTH 6502 Assembler

{{{

(  FORTH-65 ASSEMBLER                                WFR-79JUN03  )
( X-FORTH Version 01/2003 )
HEX
VOCABULARY  ASSEMBLER  IMMEDIATE       ASSEMBLER   DEFINITIONS

( REGISTER ASSIGNMENT SPECIFIC TO IMPLEMENTATION  )
FF CONSTANT XSAVE
FB CONSTANT W
FD CONSTANT UP
F8 CONSTANT IP
F0 CONSTANT N

( NUCLEUS LOCATIONS ARE IMPLEMENTATION SPECIFIC )
' (DO) 10 + CONSTANT POP
' (DO) 0D + CONSTANT POPTWO
' LIT  15 + CONSTANT PUT
' LIT  13 + CONSTANT PUSH
' LIT  18 + CONSTANT NEXT
' EXECUTE NFA 11 - CONSTANT SETUP

0 VARIABLE INDEX -2 ALLOT
0909 , 1505 , 0115 , 8011 ,
8009 , 1D0D , 8019 , 8080 ,
0080 , 1404 , 8014 , 8080 ,
8080 , 1C0C , 801C , 2C80 ,

2 VARIABLE MODE
: .A  0 MODE ! ;
: #   1 MODE ! ;
: MEM 2 MODE ! ;
: ,X  3 MODE ! ;
: ,Y  4 MODE ! ;
: X)  5 MODE ! ;
: )Y  6 MODE ! ;
: )   F MODE ! ;

: BOT ,X 0 ; ( ADDRESS THE BOTTOM OF THE STACK *)
: SEC ,X 2 ; ( ADDRESS SECOND ITEM ON STACK  *)
: RP) ,X 101 ; ( ADDRESS BOTTOM OF RETURN STACK *)

( UPMODE, CPU WFR-78OCT23 )

: UPMODE
   IF MODE @ 8 AND 0=
     IF 8 MODE +! THEN 
   THEN
   1 MODE @ 0F AND -DUP
   IF 0 DO DUP + LOOP THEN
   OVER 1+ @ AND 0= ;

:  CPU <BUILDS C, DOES> C@ C, MEM ;

00 CPU BRK,
18 CPU CLC,
D8 CPU CLD,
58 CPU CLI,
B8 CPU CLV,
CA CPU DEX,
88 CPU DEY,
E8 CPU INX,
C8 CPU INY,
EA CPU NOP,
48 CPU PHA,
08 CPU PHP,
68 CPU PLA,
28 CPU PLP,
40 CPU RTI,
60 CPU RTS,
38 CPU SEC,
F8 CPU SED,
78 CPU SEI,
AA CPU TAX,
A8 CPU TAY,
BA CPU TSX,
8A CPU TXA,
9A CPU TXS,
98 CPU TYA,

( M/CPU, MULTI-MODE OP-CODES WFR-79MAR26  )

: M/CPU <BUILDS C, ,
        DOES>
         DUP 1+ @ 80 AND
         IF 10 MODE +! THEN
         OVER FF00 AND UPMODE
         UPMODE IF
           MEM CR LATEST ID. 3 ERROR
         THEN
         C@ MODE C@
         INDEX + C@ + C,
         MODE C@ 7 AND
         IF MODE C@ 0F AND 7 <
           IF C,
           ELSE ,
           THEN
         THEN MEM ;

1C6E 60 M/CPU ADC,
1C6E 20 M/CPU AND,
1C6E C0 M/CPU CMP,
1C6E 40 M/CPU EOR,
1C6E A0 M/CPU LDA,
1C6E 00 M/CPU ORA,
1C6E E0 M/CPU SBC,
1C6C 80 M/CPU STA,
0D0D 01 M/CPU ASL,
0C0C C1 M/CPU DEC,
0C0C E1 M/CPU INC,
0D0D 41 M/CPU LSR,
0D0D 21 M/CPU ROL,
0D0D 61 M/CPU ROR,
0414 81 M/CPU STX,
0486 E0 M/CPU CPX,
0486 C0 M/CPU CPY,
1496 A2 M/CPU LDX,
0C8E A0 M/CPU LDY,
048C 80 M/CPU STY,
0480 14 M/CPU JSR,
8480 40 M/CPU JMP,
0484 20 M/CPU BIT,

( ASSEMBLER CONDITIONALS WFR-79MAR26  )
: BEGIN, HERE 1 ; IMMEDIATE
: UNTIL, ?EXEC >R 1 ?PAIRS R> C, HERE
    1+ - C, ; IMMEDIATE
: IF, C, HERE 0 C, 2 ; IMMEDIATE
: THEN, ?EXEC 2 ?PAIRS HERE OVER C@
    IF SWAP ! 
    ELSE OVER 1+ - SWAP C! 
    THEN ; IMMEDIATE
: ELSE, 2 ?PAIRS HERE 1+ 1 JMP,
     SWAP HERE OVER 1+ - 
     SWAP C! 2 ; IMMEDIATE
: NOT 20 + ;

( REVERSE ASSEMBLY TEST )
90 CONSTANT CS ( ASSEMBLE TEST FOR CARRY SET )
D0 CONSTANT 0= ( ASSEMBLER TEST FOR EQUAL ZERO )
10 CONSTANT 0< ( ASSEMBLE TEST FOR LESS THAN ZERO )
90 CONSTANT >= ( ASSEMBLE TEST FOR GREATER OR EQUAL ZERO )
( >= IS ONLY CORRECT AFTER SUB, OR CMP,  )

(  USE OF ASSEMBLER WFR-79APR28  )
: END-CODE ( END OF CODE DEFINITION  *)
  CURRENT @ CONTEXT !
  ?EXEC ?CSP SMUDGE ; IMMEDIATE

FORTH  DEFINITIONS DECIMAL
: CODE ( CREATE WORD AT ASSEMBLY CODE   LEVEL  *)
  ?EXEC CREATE ~[COMPILE] ASSEMBLER
  ASSEMBLER MEM !CSP ; IMMEDIATE

( LOCK ASSEMBLER INTO SYSTEM )
' ASSEMBLER CFA ' ;CODE 8 + !
  ( OVER-WRITE SMUDGE )
   LATEST 12 +ORIGIN ! ( TOP  NFA  )
   HERE 28 +ORIGIN ! ( FENCE  )
   HERE 30 +ORIGIN ! ( DP )
   ' ASSEMBLER 6 + 32 +ORIGIN !
   ( VOC-LINK )
   HERE  FENCE !


}}}