AS68, a decent Motorola 6800 cross-assembler

The 6800 processor is the first by Motorola(read about the real first 6800) and it organizes instructions and data using Big-Endian mode (Hi-Byte first) – as opposed to all Intel style processors, which organizes instructions and data in Little-Endian mode (Lo-Byte first).

Below is a short write up on what happens if you use TASM to assemble 6800 assembly code – I’m using version 3.2. Their documents state that it supports the 6800, and it even has a assembler directive in their *.tab file, called “.MSFIRST” to control the Endian mode. Evidently is doesn’t.

This example involved the original source code written in MIKBUG for the SWTPC Eprom Programmer card. This is found on the SWTPC website by Michael Holley.

FIRST, no Assemblers are created equal.
There have been so many flavors of Assemblers – where the syntax between them can be different even for the same processor. This source code is for the MIKBUG Assembler. If you like to use TASM, then you have to convert many of the Assembler directives and mnemonics used in the code. I suppose you already have the -68 option used in your make file. Then you only need the following files in your project dir.

tasm.exe
tasm68.tab

There is a “moto.h” packaged with TASM which helps to define the mikbug directives to help convert programs. You can use the include directive to help with this. But since half of the problem – and just as big – is that not everyone uses the same assembly mnemonics, which makes it a pain in the ass. You can look up the the conversions for 6800 mnemonics from TASM in the “TASMTABS.HTM” file.

For example, [files attached]



———————————————————————————-
MIKBUG                TASM v3.2
———————————————————————————-
ORG                   .ORG             -period before the assembler directive
OFFSET RMB 2          OFFSET .BLOCK 2  -reserves # of memory locations,
FCB $D,$A,0,0         .BYTE $D,$A,0,0  -constants

and the following changes are needed because TASM is just stupid


———————————————————————————-
MIKBUG               TASM v3.2
———————————————————————————-
LDA A                LDAA
LDA A                LDAB
STA A                STAA
STA B                STAB
LDA B                LDAB
CMP A                CMPA
EOR A                EORA
AND A                ANDA
ORA A                ORAA
SUB A                SUBA
SUB B                SUBB
SBC A                SBCA
DEC A                DECA
DEC B                DECB
ASL A                ASLA

and here the kicker,
TASM isn’t completely Endian-aware. The 6800 is a big-endian processor (Hi Btye first). It’s only good for instructions , so you can’t use the .WORD directive to store the address – for index address operations. This is the other problem with the “moto.h” header file. Even though the *.tab file for the 6800 has a directive for big-endian, it’s only good for instructions and not constants.


———————————————————————————-
MIKBUG                TASM v3.2
———————————————————————————-


FDB                   .WORD     ***does not work***

This is what it would look like in the listing file

<MIKBUG>
0149 7126 42       TABLE FCC “B”
0150 7127 70 20          FDB BURN

<TASM>
0149 7126 42       TABLE .TEXT “B”
0150 7127 20 70          .WORD BURN

So a patch in this section would be needed to use TASM, to convert it to support big-endian for the index addressing with the X.reg

;———————————————————————————-
;CONVERT TABLE TO BIG-ENDIAN
;ONLY DONE ONCE IN PROGRAM
;
LDX #TABLE     ;GET POINTER TO TABLE
INX            ;INC X TO POINT TO LO-BYTE
CONVRT   LDAB 0,X       ;GET LO-BYTE
         INX            ;INC X TO POINT TO HI-BYTE
         LDAA 0,X       ;GET HI-BYTE
         STAB 0,X       ;PUT THE LO-BYTE IN BIG-ENDIAN
         DEX            ;DEC TO POINT TO LO-BYTE
         STAA 0,X       ;PUT THE HI-BYTE IN BIG-ENDIAN
;
         CPX #TABLAST   ;LAST ENTRY ?
         BEQ U2708      ;YES, EXIT LOOP
         INX            ;POINT TO NEXT ENTRY
         INX
         INX
         BRA CONVRT     ;LOOP FOR NEXT ENTRY
;———————————————————-
; START
U2708    LDS #$A042     ;GET STACKED
.
.
.
This line gets a new label
TABLAST .WORD TABEND ; NEW LABEL FOR LAST ENTRY OF TABLE
.
.
.
;———————————————————-

 


But you can avoid all this every time you want to use a Cross-Assembler by using a user friendly 6800 Assembler such as AS68 - strange how it’s the programmer who makes it non-user friendly for the same hardware in the first place. This one is almost 95% compatible with the syntax out of the Motorola assembly book. This one is case sensitive, so you have to convert all of the MIKBUG source code to lowercase. But at least it supports big-endian mode !!

I uploaded the AS68 cross-assembler in case you can’t find it online. It was a bit of chore for me to find it and I like to scavenge the Interwebs.
AS68 6800 cross-assembler

The Motorola Assembly workbook is another fine publication written for Motorola in 1977 to teach programmer how to use their 6800 processor. This can be downloaded here too:
Motorola 6800 Programming

EOF