home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
forth
/
compiler
/
fpc
/
source
/
asm5.seq
< prev
next >
Wrap
Text File
|
1991-02-12
|
6KB
|
179 lines
\ 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