home *** CD-ROM | disk | FTP | other *** search
- \ ASM5.SEQ 6805 Assembler by Andrew McKewan
-
- \ Adapted to TCOM following TCOM96
-
- warning off
-
- ONLY FORTH DEFINITIONS
- VOCABULARY 5ASSEMBLER
- ' 5ASSEMBLER ALIAS [5ASSEMBLER] IMMEDIATE
- ONLY FORTH ALSO assembler also 5ASSEMBLER DEFINITIONS ALSO
-
- \ some alias headers so we dont have to redefine these words in
- \ the new target assembler.
-
- ' a; alias a;
- ' a;! alias a;!
- ' $ alias $
- ' $: alias $:
-
- ' $: alias $:|
- ' $:F alias $$:F
- \ ' $:| alias $:| add back when long labels defined
- \ ' $$:F alias $$:F
-
- ' L$ alias L$
- ' L$: alias L$:
- ' ll-global? alias ll-global?
- ' ll-errs? alias ll-errs?
- ' end-code alias end-code immediate
- ' end-code alias c; immediate
- ' c, alias c,
- ' , alias ,
- ' here alias here
- ' tc@ alias tc@
- ' tc! alias tc!
- ' t! alias t!
-
- FORTH DEFINITIONS
-
- : DOASSEM05 ( --- )
- ['] RUN-A; IS RUN
- 0 ['] DROP A;!
- APRIOR 4 + 2@ APRIOR 2!
- ll-global? 0=
- if llab-init \ in case labels used
- then
- ALSO 5ASSEMBLER ;
-
- : SETASM05 ['] DOASSEM05 IS SETASSEM ;
- : SETASM86 ['] DOASSEM IS SETASSEM ;
-
- SETASM05
-
- ONLY FORTH ALSO 5ASSEMBLER DEFINITIONS ALSO
-
- HEX
-
- \ Addressing Modes
-
- VARIABLE (MM) ( holds opcode mode )
- : MM CREATE , DOES> @ (MM) ! ; ( byte offsets in table )
- 0 MM MEM 18 MM # 30 MM A 48 MM X 60 MM ,X MEM
-
- : ADJUST ( table address, operand --- table address+offset )
- DUP E000 AND IF DROP 9 + EXIT THEN
- DUP FF00 AND IF DROP 6 + EXIT THEN
- IF 3 + EXIT THEN ;
-
- : ERR MEM 1 ABORT" Assembly Error" ;
-
- : OP C, ; ( compile opcode )
- : OP+B C, C, ; ( compile opcode and byte operand )
- : OP+W C, SPLIT C, C, ; ( opcode and word operand )
- : OP+0 C, DROP ; ( opcode for 0,X mode )
-
- \ The follinng definition is for use with library labels in TCOM.
- \ If PARITY is a library label,
- \ use PARITY $D6 OP,
- \ instead of PARITY LDA,
- \ because PARITY will not return its correct address until after
- \ it is compiled and the wrong addressing mode may be used.
-
- : OP, ( operand opcode -- ) OP+W ;
- : CALL, ( adr -- ) $CD OP, ; \ FOR JSR, TO LABEL ROUTINES
-
-
- \ Relative branch resolution:
- : SIZE? ( to, from --- offset, flag ) 1+ - DUP 80 + -100 AND ;
- : ?S ( to, from -- offset ) SIZE? ABORT" Range Error in Branch" ;
-
-
- : Modes ( n -- ) \ build opcode jump table
- 0 DO BL WORD NUMBER DROP C, ' , LOOP ;
-
- CREATE M-Table ( holds address modes )
-
- ( zero byte word >1fff zero byte word >1fff )
- 8 Modes 30 OP+B 30 OP+B 00 ERR 00 ERR B0 OP+B B0 OP+B C0 OP+W 00 ERR
- 8 Modes 00 ERR 00 ERR 00 ERR 00 ERR A0 OP+B A0 OP+B 00 ERR 00 ERR
- 8 Modes 40 OP 40 OP 40 OP 40 OP 00 ERR 00 ERR 00 ERR 00 ERR
- 8 Modes 50 OP 50 OP 50 OP 50 OP 00 ERR 00 ERR 00 ERR 00 ERR
- 8 Modes 70 OP+0 60 OP+B 00 ERR 00 ERR F0 OP+0 E0 OP+B D0 OP+W 00 ERR
-
- : (OPC) ( operand proto-byte -- assemble to memory )
- C@ M-Table (MM) @ + 2 PICK ADJUST OVER 80 AND IF 0C + THEN
- COUNT ROT OR SWAP @ EXECUTE MEM ;
-
-
- : 1MI ( -- ) \ single-byte instructions
- CREATE C, DOES> C@ C, .INST ;
-
- : 2MI ( mem bit -- ) \ bit set and clear
- CREATE C, DOES> C@ SWAP 2* + C, SPLIT IF ERR THEN C, .INST ;
-
- : 3MI ( operand -- ) \ multimode instructions
- CREATE C, DOES> (OPC) .INST ;
-
- : 4MI ( operand -- ) \ jump and call optimized
- CREATE C,
- DOES> OVER HERE 1+ SIZE? ( big ) (MM) @ 60 = ( ,x ) OR
- IF DROP (OPC)
- ELSE SWAP C@ 08C = ( jmp )
- IF 020 ELSE 0AD THEN C, C, DROP THEN .INST ;
-
- : 5MI ( dest -- ) \ branch instructions
- CREATE C, DOES> C@ C, HERE ?S C, .INST ;
-
- : 6MI ( dest mem bit -- ) \ bit test and branch
- CREATE C,
- DOES> C@ SWAP 2* + C, SPLIT IF ERR THEN C, HERE ?S C, .INST ;
-
-
- 89 3MI ADC, 8B 3MI ADD, 84 3MI AND, 08 3MI ASL,
- 07 3MI ASR, 24 5MI BCC, 11 2MI BCLR, 25 5MI BCS,
- 27 5MI BEQ, 28 5MI BHCC, 29 5MI BHCS, 22 5MI BHI,
- 24 5MI BHS, 2F 5MI BIH, 2E 5MI BIL, 85 3MI BIT,
- 25 5MI BLO, 23 5MI BLS, 2C 5MI BMC, 2B 5MI BMI,
- 2D 5MI BMS, 26 5MI BNE, 2A 5MI BPL, 20 5MI BRA,
- 01 6MI BRCLR, 21 5MI BRN, 00 6MI BRSET, 10 2MI BSET,
- AD 5MI BSR, 98 1MI CLC, 9A 1MI CLI, 0F 3MI CLR,
- 81 3MI CMP, 03 3MI COM, 83 3MI CPX, 0A 3MI DEC,
- 88 3MI EOR, 0C 3MI INC, 8C 3MI JMP, 8D 3MI JSR,
- 86 3MI LDA, 8E 3MI LDX, 08 3MI LSL, 04 3MI LSR,
- 42 1MI MUL, 00 3MI NEG, 9D 1MI NOP, 8A 3MI ORA,
- 09 3MI ROL, 06 3MI ROR, 9C 1MI RSP, 80 1MI RTI,
- 81 1MI RTS, 82 3MI SBC, 99 1MI SEC, 9B 1MI SEI,
- 87 3MI STA, 8E 1MI STOP, 8F 3MI STX, 80 3MI SUB,
- 83 1MI SWI, 97 1MI TAX, 0D 3MI TST, 9F 1MI TXA,
- 8F 1MI WAIT,
-
-
- \ Stuctured Conditionals
-
- : ?<MARK ( -- adr f ) HERE TRUE ;
- : ?<RESOLVE ( adr f -- ) ?CONDITION HERE ?S C, ;
- : ?>MARK ( -- adr f ) HERE 0 C, TRUE ;
- : ?>RESOLVE ( adr f -- ) ?CONDITION HERE OVER ?S SWAP TC! ;
-
- 24 CONSTANT CS 26 CONSTANT 0= 2A CONSTANT 0<
- 2E CONSTANT IRQHI 23 CONSTANT > 24 CONSTANT <
-
- : NOT 1 XOR ;
- : SET 2* FF01 + ;
- : CLEAR SET NOT ;
-
- : IF, SPLIT SWAP C, IF C, THEN ?>MARK .INST ;
- : THEN, ?>RESOLVE ;
- : ELSE, 20 IF, 2SWAP THEN, ;
- : BEGIN, ?<MARK ;
- : UNTIL, SPLIT SWAP C, IF C, THEN ?<RESOLVE .INST ;
- : AGAIN, 20 UNTIL, ;
- : WHILE, IF, 2SWAP ;
- : REPEAT, AGAIN, THEN, ;
-
- DECIMAL
-
- ONLY FORTH ALSO DEFINITIONS
-
-