Screen 0 not modified 0 \ FORTH-6502 ASSEMBLER WFR ) cas 26jan06 1 ( BASIS: FORTH DIMENSIONS VOL III NO. 5) 2 3 Load from Screen 1 for the transient assembler: 4 This 6502 Forth Assembler can be loaded into the heap 5 and then not be saved in the final binary to save memory. 6 7 Load from Screen 2 for the regular assembler: 8 This 6502 Forth Assembler will be loaded into normal 9 memory and will be saved into the final binary. 10 11 12 13 14 15 Screen 1 not modified 0 \ TRANSIENT FORTH-6502 ASSEMBLER WFR ) er14dez88 1 ( BASIS: FORTH DIMENSIONS VOL III NO. 5) 2 3 ( INTERNAL LOADING 04MAY85BP/RE) 4 hex 5 \ HERE $200 HALLOT HEAP DP ! 6 &10 LOAD 7 &11 LOAD 8 3 &8 THRU 9 &9 LOAD \ for System-Assembler 10 11 \ DP ! 12 13 ONLYFORTH 14 decimal 15 Screen 2 not modified 0 \ FORTH-65 ASSEMBLER WFR ) er14dez88 1 ( BASIS: FORTH DIMENSIONS VOL III NO. 5) 2 ONLYFORTH 3 Vocabulary tassembler 4 TASSEMBLER ALSO DEFINITIONS 5 hex 6 7 8 +load \ relocate 8 1 6 +THRU 9 \ 7 +load \ System Assembler 10 decimal 11 12 13 14 15 Screen 3 not modified 0 \ FORTH-83 6502-ASSEMBLER ) er14dez88 1 : END-CODE CONTEXT 2- @ CONTEXT ! ; 2 CREATE INDEX 3 09 c, 09 c, 05 c, 15 c, 15 c, 01 c, 11 c, 80 c, 4 09 c, 80 c, 0D c, 1D c, 19 c, 80 c, 80 c, 80 c, 5 80 c, 00 c, 04 c, 14 c, 14 c, 80 c, 80 c, 80 c, 6 80 c, 80 c, 0C c, 1C c, 1C c, 80 c, 80 c, 2C c, 7 8 | VARIABLE MODE 9 10 : MODE: ( N -) CREATE C, DOES> ( -) C@ MODE ! ; 11 12 0 MODE: .A 1 MODE: # 2 | MODE: MEM 3 MODE: ,X 13 4 MODE: ,Y 5 MODE: X) 6 MODE: )Y 0F MODE: ) 14 6 MODE: )Y 0F MODE: ) 6 MODE: )Y 0F MODE: ) 15 6 MODE: )Y 0F MODE: ) 6 MODE: )Y 0F MODE: ) Screen 4 not modified 0 \ UPMODE CPU ) er14dez88 1 | : UPMODE ( ADDR0 F0 - ADDR1 F1) 2 IF MODE @ 8 OR MODE ! THEN 1 MODE @ 0F AND ?DUP IF 3 0 DO DUP + LOOP THEN OVER 1+ @ AND 0= ; 4 5 : CPU ( 8B -) CREATE C, DOES> ( -) C@ >c, MEM ; 6 7 00 CPU BRK 18 CPU CLC D8 CPU CLD 8 58 CPU CLI B8 CPU CLV CA CPU DEX 9 88 CPU DEY E8 CPU INX C8 CPU INY 10 EA CPU NOP 48 CPU PHA 08 CPU PHP 11 68 CPU PLA 28 CPU PLP 40 CPU RTI 12 60 CPU RTS 38 CPU SEC F8 CPU SED 13 78 CPU SEI AA CPU TAX A8 CPU TAY 14 BA CPU TSX 8A CPU TXA 9A CPU TXS 15 98 CPU TYA Screen 5 not modified 0 \ M/CPU ) er14dez88 1 2 : M/CPU ( MODE OPCODE -) CREATE C, , DOES> 3 DUP 1+ @ 80 AND IF 10 MODE +! THEN OVER FF00 AND UPMODE UPMODE 4 IF MEM TRUE ABORT" INVALID" THEN 5 C@ MODE @ INDEX + C@ + >c, MODE @ 7 AND 6 IF MODE @ 0F AND 7 < IF >c, ELSE >, THEN THEN MEM ; 7 8 1C6E 60 M/CPU ADC 1C6E 20 M/CPU AND 1C6E C0 M/CPU CMP 9 1C6E 40 M/CPU EOR 1C6E A0 M/CPU LDA 1C6E 00 M/CPU ORA 10 1C6E E0 M/CPU SBC 1C6C 80 M/CPU STA 0D0D 01 M/CPU ASL 11 0C0C C1 M/CPU DEC 0C0C E1 M/CPU INC 0D0D 41 M/CPU LSR 12 0D0D 21 M/CPU ROL 0D0D 61 M/CPU ROR 0414 81 M/CPU STX 13 0486 E0 M/CPU CPX 0486 C0 M/CPU CPY 1496 A2 M/CPU LDX 14 0C8E A0 M/CPU LDY 048C 80 M/CPU STY 0480 14 M/CPU JSR 15 8480 40 M/CPU JMP 0484 20 M/CPU BIT Screen 6 not modified 0 \ ASSEMBLER CONDITIONALS ) er14dez88 1 2 | : RANGE? ( BRANCH -- BRANCH ) 3 DUP ABS 07F U> ABORT" OUT OF RANGE " ; 4 5 : [[ ( BEGIN) >here ; 6 : ?] ( UNTIL) >c, >here 1+ - RANGE? >c, ; 7 : ?[ ( IF) >c, >here 0 >c, ; 8 : ?[[ ( WHILE) ?[ SWAP ; 9 : ]? ( THEN) >here OVER >c@ IF SWAP >! 10 ELSE OVER 1+ - RANGE? SWAP >c! THEN ; 11 : ][ ( ELSE) >here 1+ 1 JMP 12 SWAP >here OVER 1+ - RANGE? SWAP >c! ; 13 : ]] ( AGAIN) JMP ; 14 : ]]? ( REPEAT) JMP ]? ; 15 Screen 7 not modified 0 \ ASSEMBLER CONDITIONALS ) er14dez88 1 2 90 CONSTANT CS B0 CONSTANT CC 3 D0 CONSTANT 0= F0 CONSTANT 0<> 4 10 CONSTANT 0< 30 CONSTANT 0>= 5 50 CONSTANT VS 70 CONSTANT VC 6 7 : NOT 20 [ FORTH ] XOR ; 8 9 : BEQ 0<> ?] ; : BMI 0>= ?] ; 10 : BNE 0= ?] ; : BPL 0< ?] ; 11 : BCC CS ?] ; : BVC VS ?] ; 12 : BCS CC ?] ; : BVS VC ?] ; 13 14 15 Screen 8 not modified 0 \ 2INC/2DEC WINC/WDEC KS 19 MAY 84 ) er14dez88 1 2 : 2INC 3 DUP LDA CLC 2 # ADC DUP STA CS ?[ SWAP 1+ INC ]? ; 4 5 : 2DEC 6 DUP LDA SEC 2 # SBC DUP STA CC ?[ SWAP 1+ DEC ]? ; 7 8 : WINC DUP INC 0= ?[ SWAP 1+ INC ]? ; 9 10 : WDEC DUP LDA 0= ?[ OVER 1+ DEC ]? DEC ; 11 12 : ;C: RECOVER JSR END-CODE ] 0 LAST ! 0 ; 13 14 15 Screen 9 not modified 0 \ ;CODE CODE CODE> BP 03 02 85) er14dez88 1 ONLYFORTH 2 3 : ASSEMBLER ASSEMBLER [ ASSEMBLER ] MEM ; 4 5 : ;CODE [COMPILE] DOES> -3 >allot 6 [COMPILE] ; -2 >allot ASSEMBLER ; IMMEDIATE 7 8 : CODE CREATE >here DUP 2- >! ASSEMBLER ; 9 10 : >LABEL ( ADR -) 11 >here | CREATE SWAP , 4 HALLOT 12 HEAP 1 AND HALLOT ( 6502-ALIGN) HERE 4 - HEAP 4 CMOVE 13 HEAP LAST @ COUNT 01F AND + ! DP ! DOES> ( - ADR) @ ; 14 15 : LABEL [ ASSEMBLER ] >here >LABEL ASSEMBLER ; Screen 10 not modified 0 \ Code generating primitives er14dez88 1 2 Variable >codes 3 | Create nrc ] c, , c@ here allot ! c! [ 4 5 : nonrelocate nrc >codes ! ; nonrelocate 6 7 | : >exec Create c, 8 Does> c@ >codes @ + @ execute ; 9 10 | 0 >exec >c, | 2 >exec >, | 4 >exec >c@ 11 | 6 >exec >here | 8 >exec >allot | $0A >exec >! 12 | $0C >exec >c! 13 14 15 Screen 11 not modified 0 \ FORTH-65 ASSEMBLER WFR ) er14dez88 1 ( BASIS: FORTH DIMENSIONS VOL III NO. 5) 2 ONLYFORTH 3 4 ASSEMBLER ALSO DEFINITIONS 5 6 7 8 9 10 11 12 13 14 15