home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-12-18 | 5.8 KB | 203 lines | [04] ASCII Text (0x0000) |
- \ ==============================================================
- \ FORTH ASSEMBLER FOR 6502
- \ ADAPTED FROM DR. DOBBS TOOLBOOK ARTICLE
- \ BY WILLIAM F. RAGSDALE, JULY 1, 1980
- \ ==============================================================
-
- HEX
- VOCABULARY ASSEMBLER IMMEDIATE
- ASSEMBLER DEFINITIONS
-
- \ REGISTER ASSIGNMENT FOR MAD APPLE FORTH
-
- EB CONSTANT XSAVE \ USED FOR SAVING X-REG
- FA CONSTANT W \ FORTH WORD CURRENTLY BEING EXECUTED
- FC CONSTANT IP \ NEXT ADDRESS IN THE COLON DEFINITION
- 01 CONSTANT N \ USER WORKSPACE FROM N-1 TO N+7
- \ NOT SURE WHAT TO DO ABOUT REGISTER "UP"
-
- \ NUCLEUS LOCATIONS SPECIFIC TO MAD APPLE FORTH
-
- ' (DO) 12 + CONSTANT POP \ POP 16BIT VALUE & EXIT
- ' (DO) 10 + CONSTANT POPTWO \ POP 2 16BIT VALUES & EXIT
- ' LIT 13 + CONSTANT PUT \ REPLACE 16BIT WITH A & STK
- ' LIT 11 + CONSTANT PUSH \ ADD A & STK TO DATA STACK
- ' LIT 1A + CONSTANT NEXT \ EXIT TO INTERPRETER
- ' EXECUTE NFA 13 - CONSTANT SETUP \ ?????NOT SURE WHAT USED FOR
-
- VARIABLE INDEX 0 INDEX ! -2 ALLOT \ OVERWRITE THE VARIABLE
- 0909 , 1505 , 0115 , 8011 , 8009 , 1D0D , 8019 , 8080 ,
- 0080 , 1404 , 8014 , 8080 , 8080 , 1C0C , 801C , 2C80 ,
-
- VARIABLE MODE 2 MODE !
- : .A 0 MODE ! ; \ ACCUMULATOR ADDRESSING MODE
- : # 1 MODE ! ; \ IMMEDIATE
- : MEM 2 MODE ! ; \ ABSOLUTE
- : ,X 3 MODE ! ; \ INDEXED BY X
- : ,Y 4 MODE ! ; \ INDEXED BY Y
- : X) 5 MODE ! ; \ INDEXED INDIRECT BY X
- : )Y 6 MODE ! ; \ INDIRECT INDEXED BY Y
- : ) F MODE ! ; \ INDIRECT JMP
-
- \ *** STACK IS LOCATED AT $300 IN MAD APPLE FORTH
- : BOT ,X 300 ; \ ADDRESS BOTTOM OF STACK
- : SEC ,X 302 ; \ ADDRESS SECOND ITEM ON STACK
- : RP) ,X 101 ; \ ADDRESS BOTTOM OF RETURN STACK
-
- : -DUP DUP IF DUP ENDIF ;
-
- : UPMODE ( ADDR F -- ADDR F )
- \ ADJUSTS MODE AND SETS FLAG IF ERROR
- 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 ( N --- ) \ SIMPLE ONE BYTE ML COMMANDS
- CREATE 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
- CREATE 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, \ FIRST BYTE = ML COMMAND
- MODE C@ 7 AND IF
- MODE C@ 0F AND 7 < IF
- C, \ EITHER ONE BYTE
- ELSE
- , \ OR 2 BYTE OPERAND
- 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,
-
- \
- \ IMPROVED IF-THEN-ELSE STRUCTURE
- \ CORRECTS BUG FOR OVERFLOWS
-
- HEX
-
- \ BRANCHING TESTS
-
-
- : NOT 20 - ;
- B0 CONSTANT CS \ BCS CS NOT = BCC=B0-20=90
- F0 CONSTANT 0= \ BEQ 0= NOT = BNE=F0-20=D0
- 30 CONSTANT 0< \ BMI 0< NOT = BPL=30-20=10
- 70 CONSTANT VS \ BVS VS NOT = BVC=70-20=50
-
-
- : IF,
- C, \ STORE THE BRANCH
- 3 C, \ TO INSTR FOLLOWING THE JMP
- 4C C, \ JMP
- HERE \ LEAVE THIS ADRS FOR LATER MODIFICATION
- 0 , \ STORE A ZERO ADRS FOR NOW
- 2 \ LEAVE ERROR CHECK CODE
- ; IMMEDIATE
-
- : THEN,
- ?EXEC 2 ?PAIRS \ MAKE SURE CALLED OK
- HERE \ STK=PREV-ADRS NEW-ADRS
- SWAP ! \ RESOLVE THE OLD JMP
- ; IMMEDIATE
-
- : ELSE,
- ?EXEC 2 ?PAIRS \ MAKE SURE CALLED OK
- 4C C, \ SET UP NEW JMP
- HERE 0 , \ STK = ADR1 ADR2
- SWAP HERE \ STK = ADR2 ADR1 ADR3
- SWAP ! \ RESOLVE OLD JMP
- 2 \ LEAVE ADR2 AND ERRCHK FOR THEN,
- ; IMMEDIATE
-
- : BEGIN,
- HERE 1 \ SAVE ADRS AND ERRCHK
- ; IMMEDIATE
-
- : UNTIL,
- ?EXEC >R \ HOLD CONDITION ON RET STK
- 1 ?PAIRS R> \ TEST ERRCHK, IF OK RESTORE COND
- C, 3 C, \ COMPILE BRANCH OVER THE JMP
- 4C C, , \ COMPILE JMP USING BEGIN ADRS
- ; IMMEDIATE
-
- : WHILE,
- ?EXEC >R \ HOLD CONDITION ON RET STACK
- 1 ?PAIRS R> \ TEST ERRCHK, IF OK RESTORE COND
- C, 3 C, \ COMPILE BRANCH OVER THE JMP
- 4C C, \ JMP
- HERE SWAP \ STK = NEW-ADRS OLD-ADRS
- 0 , \ THE JMP IS UNRESOLVED
- 3 \ ERRCHK FOR REPEAT
- ; IMMEDIATE
-
-
- : REPEAT,
- ?EXEC 3 ?PAIRS \ TEST ERRCHK
- 4C C, , \ JMP BACK TO OLD-ADRS
- HERE SWAP \ RESOLVE JMP FROM WHILE
- ! \ WITH THIS ADRS
- ;
-
-
-
- : END-CODE
- CURRENT @ CONTEXT !
- ?EXEC ?CSP SMUDGE
- ; IMMEDIATE
-
- FORTH DEFINITIONS
-
- HEX
- : L ( ADDR --- ) \ MONITOR DISASSEMBLER: EX: 300 L
- 3A ! FE61 CALL CR
- ;
-
- : LL ( -- ) \ CONTINUES DISASSEMBLY STARTED BY L
- 3A @ L
- ;
-
- DECIMAL
-
-
- : CODE
- ?EXEC
- ASSEMBLER \ NEEDED FOR "MEM" BELOW
- [COMPILE] ASSEMBLER \ CHANGES TO ASSEMBLER VOCAB
- CREATE \ HEADER FOR CODE WORD
- MEM
- HERE DUP CFA ! \ CHANGE PFA TO POINT TO ML CODE
- SP@ CSP ! \ SAVE STACK PTR FOR LATER TEST
- ; IMMEDIATE
-
- FORTH
-