モトローラ6800アセンブラ

MC6800

githubでモトローラの書式のアセンブラソースをアセンブリできるクロスアセンブラが公開されていました。けっこう前から公開されていたみたいでしたが、気がついてませんでした。
これだと、古い形式で書かれた6800アセンブラソースを打ち込んでアセンブリするのに便利そうです。

モトローラの古い書式(疑似命令)のソースをアセンブリしたい

MIKBUGのオリジナルソースなんかもそうですけど、MC6800向けのアセンブラソースの疑似命令が最近のクロスアセンブラとちょっと違って独特です。文字列が / /で括られていたり、文字定数のシングルクォートが左側1つだけだったり…..MIKBUG2.0のソースの一部ですが以下のような感じ。

*
* JUMP TABLE TO ROUTINE
*
FCTABL	EQU	*
	FCC	/B/
	FDB	PNTBRK
	FCC	/C/
	FDB	CONT
	FCC	/D/
	FDB	DELBRK
	FCC	/G/
     :
LOAD4	EQU	*
	CMPA	#'S
	BNE	LOAD3
	BSR	INCH
	CMPA	#'3
     :

そんなに行数は無いので修正してアセンブリを通せば良いという話もありますが、オリジナルのままアセンブリできると便利そう….で、知らなかったんですが、DOS時代のモトローラアランブラがUNIX系で動くように移植されているではないですか。これは使ってみたい

クロスアセンブラのビルド

MC6800向けのクロスアセンブラですが、以下のgithubで公開されています。

GitHub - JimInCA/motorola-6800-assembler: This is the assembler for the Motorola 6800 family of 8bit microprocessors.
This is the assembler for the Motorola 6800 family of 8bit microprocessors. - JimInCA/motorola-6800-assembler

gccでコンパイルできますので、LinuxやMacでコンパイル環境があればすぐにビルドできます。上記リポジトリのREADMEにかいてあるとおり、リポジトリをcloneしてきて `make all` するだけです。

ビルドに成功すると、以下の実行ファイルが出来上がります。適当にパスが通ったところにCOPYしましょう。6800だけではなくて、モトローラ系CPUのいろいろなアセンブラが出来上がります。

./bin/as0   6800/6802 processors
./bin/as1   6801 processor
./bin/as4   6804 processor
./bin/as5   6805 processor
./bin/as9   6809 processor
./bin/as11  68HC11 processor

MC6800アセンブラソースのアセンブリ

クロスアセンブラができたので、MC6800用のソースをアセンブリしてみます。クロスアセンブラをコマンドラインで起動するのも良いですが、トライアンドエラーがつづくと思いましたので、Makefileをつくってみました。アセンブラの起動コマンド等は上記githubのリポジトリの `documentation`フォルダにPDFも入ってますんで読むといろいろなオプションがわかります。
ちなみに雛形はUniversal Monitorのソースに入っていたものであります。ありがとうございます!!

.SUFFIXES: .asm .hex .s19

all:	mikbug2.hex

.s19.hex:
	srec_cat $*.s19 -o $*.hex -Intel

.asm.s19:
	as0 $*.asm -l cre c s > $*.lst

rom:
	srec_cat mikbug2.hex -Intel -offset -0X8000 -o conv_mikbug2.hex -Intel

rom_write:
	miniprohex -p CAT28C256 -w conv_mikbug2.hex

clean:
	rm -f *.hex *.lst *.s19

ちなみに、上記のMakefileはアセンブラが出力するモトローラS形式ダンプファイルをIntelHex形式へ変換するのにSRecordを使ってまして、出来上がったIntelHex形式のファイルを 28C256 フラッシュROMへ書き込むために 書き込みアドレスを変更したIntelHex形式ファイルを生成。最後はminiproコマンドでROMへ書き込みまでやっちゃおうという欲張り仕様です。^^)
Makefileにまだ慣れてないので、ファイル名直書きがたくさんあってイマイチですが….

実際のアセンブリですが、以下のようにmakeコマンドを実施することで mikbug2.asm から mikbug2.hexができちゃうわけです。便利です。

$ make

注意点

ちょっと何点か注意点がありまして….
あまりエラーを出さないので意図しないオブジェクトコードが生成されることがあります。

インデクスアドレシングの書式

以下のように、インデクスレジスタ Xを使ってインデクスアドレシングでストア、コンペア、ジャンプなどを書きたい場合 `STAA X`などと書くとたいていの最近のアセンブラではエラーを吐きますが、このアセンブラはエラーを吐かずエクステンデッドアドレシングの謎なコードを吐いてきます。

STAA X  ⇢ STAA ,X
CMPA X  ⇢ CMPA ,X
JMP  X  ⇢ JMP ,X

ただしくは `STAA ,X`のように書かないと、インデクスアドレシングになった正しいコードが生成されないので注意してください。

「文字」の定義は シングルクォート 1つ

モトローラのオリジナルのアセンブラの書式に準拠してますので、最近のクロスアセンブラと違って「文字」の定義はシングルクォートが1つだけです。

    FCB   'A,'B,'C,0
    STAA  #'Z

以下のように書くとエラーは出ませんが、コード生成が途中で止まったりとヘンテコになりますので注意してください。(エラーが出てほしいなぁ…)

    FCB 'A','B','C',0     ☓この書き方はダメ

これで古い?表記のアセンブラソースもバッチリ

このクロスアセンブラで、MIKBUG2.0のソースみたいな古い表記のMC6800 CPUアセンブラソースもバッチリアセンブリできまして、ROM化もできますよ。みなさまも、ぜひぜひ。

コメント