6800用に提供されたALTAIR 680 BASICが68HC11で動きましたので紹介します。

モトローラ最初の8ビットマイクロプロセッサ6800には、ALTAIR 680 BASICという強い味方がいるのですが、6803/6303は6800の直系の発展形であるにもかかわらず、残念なことにALTAIR 680 BASICを使用することができません。

ALTAIR 680 BASICはSレコードフォーマットのバイナリファイルとして提供されておりソースコードがないので、移植対象のマシンに適合させるために簡単に書き換えることができません。また、ALTAIR 680 BASICは0番地からローディングして利用するようになっていますが、6803/6303の0番地からは、内蔵ペリフェラルの制御用レジスタが配置されていて、それらと重複してしまうという問題があります。このため、ALTAIR 680 BASICは6803/6303で簡単には利用できないという問題がありました。

68HC11は6803をさらに発展させたマイクロプロセッサで、6803と同様にいくつかのペリフェラルが組み込まれていますが、その制御用のレジスタは6803とは異なり、アプリケーションの都合に合わせてメモリ上の配置を変更できるようになっています。このため、制御用レジスタをALTAIR 680 BASICの使用領域と重複しない場所に配置することにより、ALTAIR 680 BASICを6800と同様に68HC11上で動かすことができます。

この場合にも6800で行ったように、ALTAIR 680 BASICのコンソール入出力の3つのルーチンにパッチをあてることで、移植作業を行います。

ALTAIR 680 BASICの以前の移植記事では、ACIAを直接操作する方式のパッチ例を示しましたが、今回はモニタのコンソールルーチンを活用する方式でパッチをあてることで、汎用化を図った方法を示します。

修正したパッチを以下に示します。

 NAM MITS
*TO PATCH BASIC TO 6800/68HC11-CORE WITH UNIMON

CONINU		EQU	$FF9B
CONOUT		EQU	$FF8C
CONRXF		EQU	$FFAD

	ORG	$EF40

*POLE FOR CHARACTER
*SETS CARRY IF CHARACTER IS IN BUFFER
*CLOBBERS B REG
POLCAT	PSHA
	JSR	CONRXF
	CLC
	BEQ	POLCAT0
	SEC
POLCAT0
	PULA
	RTS

*INPUT ONE CHARACTER ACC B
INCH	PSHA
	JSR	CONINU
	TAB
	PULA
	RTS

*OUTCH OUTPUT CHARACTER ACC A
OUTCH	ANDA	#$7F
	JMP     CONOUT

*PATCHES TO MITS BASIC
	ORG	$041F
	JSR	INCH

	ORG	$0618
	JSR	POLCAT

	ORG	$08AD
	JSR	OUTCH

*BASIC START ADDRESS SETTING
	ORG	$EFF0
	FDB	$0

	END

以前に示したパッチでは、6800と組み合わせて使用してるACIAとその配置アドレスに依存するものになっていましたが、今回は、プロセッサが異なっていても、同じ系統のモニタ(ここではUniversal Monitor)が搭載されていれば、シリアル通信コントローラやその配置アドレスに依存しない方式となっています。

ということで、このパッチが当たったALTAIR 680 BASICは、68HC11-COREだけでなく、6800-COREでも同じように動作します。

残念ながら、6800-CORE/68HC11-COREともに、計時機能に利用するNMIは使用しないようにショートピンを抜いておく必要があります。

68HC11は、6809と異なり6800のバイナリコードをそのまま利用できるうえに、インデックスレジスタが2本になったり、乗除算命令が追加されたり、いろいろと強化されています。ALTAIR 680 BASICではこれらの拡張機能は使われないのですが、6800に比較して同一周波数で15%程度処理速度が向上しているようです。これは、6803(6801)が開発された際に実施された様々な命令のクロックサイクルの削減による高速化が貢献しているものと思われます。