MITS(Micro Instrumentation and Telemetry Systems)から1976年に、MC6800を搭載したマイクロコンピュータALTAIR 680が出荷されました。

ALTAIR 680の概要は、例えば以下のようなページで確認できます。

ALTAIR 680 BASICの移植

そのALTAIR 680用にマイクロソフトが開発した実数型BASICが提供されていました。このAltair Basic for the 6800のドキュメントやバイナリコードが下記のページで公開されています。

バイナリコードは、MITS_RAW.TXTというファイル名でSレコードフォーマットで提供されています。ダウンロードしたMITS_RAW.TXTの改行はLFのみだったので、マイクロコンピュータが改行の検査対象として用いているCRを含むよう、CRLFに変更して使用します。

ALTAIR 680 BASICのソースコートがないので、ALTAIR 680と異なるハードウェア・ソフトウェア構成の6800-CORE に移植することは一般的には難しいと思われます。

しかしながら、幸いにもこのページで提供されている文書 Introduction.pdf の最後の2ページを参照すると、コンソール入出力に関連する3か所のみにパッチを当てれば、どのようなマシンにでも移植できることや、その3か所に組み込むべきルーチンの仕様が書かれています。

さらには、そのパッチの例がPATCH.TXTとして提供されています。

パッチには、ACIAを使用するコンソール入出力用のルーチンが記述され、そのルーチンに飛ぶようにBASICプログラム本体にパッチを当てるコードが書かれています。

提供されているPATCH.TXTを以下に示します。

 NAM MITS
*TO PATCH BASIC TO SWTP
*WITH ACIA AT PORT 1
*JAN 11 1978  MICHAEL HOLLEY
*REV 4   SEPT 4, 1978

 ORG $A016
ACIACS EQU $8004
ACIADA EQU $8005

*POLE FOR CHARACTER
*SETS CARRY IF CHARACTER IS IN BUFFER
*CLOBBERS B REG
POLCAT LDA B ACIACS ACIA STATUS TO B
 ASR B ROTATE RDRF BIT INTO CARRY
 RTS RETURN

*INPUT ONE CHARACTER ACC B
INCH BSR POLCAT
 BCC INCH
 LDA B ACIADA GET CHAR
 RTS

*OUTCH OUTPUT CHARACTER ACC A
OUTCH BSR POLCAT
 ASR B
 BCC OUTCH
 STA A ACIADA OUTPUT
 RTS

*PATCHES TO MITS BASIC
 ORG $041F
 JSR INCH

 ORG $0618
 JSR POLCAT

 ORG $08AD
 JSR OUTCH

 END

このパッチは、ACIAを使用したコードになっています。6800-COREもACIAを使用しているので、移植は簡単です。パッチプログラムに以下の様な修正を加えて移植しました。

  • アドレスマップSTDを対象として、ACIAのアドレスやパッチコードの配置アドレスを書き換えた。
  • パッチを修正して本体のプログラムに当てると、6800-COREでALTAIR BASICが簡単に動いたが、文字化け(出力文字の一部が漢字や記号になる)がひどいという問題に遭遇した。そこで、出力ルーチンに出力文字の最上位ビットを落とすコードを追加し、問題を解決した。
  • 当時のコンピュータは英小文字は入力できなかったので、入力ルーチンに英小文字をすべて英大文字に変化する機能を追加した。
  • Universal MonitorにBASICの起動アドレスを設定する記述を追加した。

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

 NAM MITS
*TO PATCH BASIC TO SWTP
*WITH ACIA AT PORT 1
*JAN 11 1978  MICHAEL HOLLEY
*REV 4   SEPT 4, 1978

; ORG $A016
	ORG	$E380
ACIACS	EQU	$CC00
ACIADA	EQU	$CC01

*POLE FOR CHARACTER
*SETS CARRY IF CHARACTER IS IN BUFFER
*CLOBBERS B REG
POLCAT	LDAB	ACIACS	ACIA STATUS TO B
	ASRB		ROTATE RDRF BIT INTO CARRY
	RTS		RETURN

*INPUT ONE CHARACTER ACC B
INCH	BSR	POLCAT
	BCC	INCH
	LDAB	ACIADA	GET CHAR
	CMPB	#'a'
	BCS	UPE
	CMPB	#'z'+1
	BCC	UPE
	ADDB	#'A'-'a'
UPE:
	RTS

*OUTCH OUTPUT CHARACTER ACC A
OUTCH	BSR	POLCAT
	ASRB
	BCC	OUTCH
	ANDA	#$7F
	STAA	ACIADA OUTPUT
	RTS

*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

パッチファイルはアークピットのX6801でアセンブルしました。

最後に、オリジナルのMITS_RAW.TXTのSレコードの末尾にあるS9を削除し、代わりにアセンブラで生成されたパッチのSレコードファイルを追加します。追加したファイルは、例えばALTAIR680BASIC.SRECとして保存します。

ALTAIR 680 BASICのロードと起動

STD構成での使用例を示します。

ALTAIR 680 BASICの使用に先立って、6800-COREのJP3のショートピンを抜いて、NMIに対するタイマー割込みを無効にしておいてください。ALTAIR 680 BASICの処理の詳細は解析していないのでわかりませんが、NMI割り込みが発生すると処理が正しく行われなくなるので、その対策です。

6800はインデックスレジスタが1本しかないため、ALTAIR 680 BASICの処理でも当時の多くのプログラムと同様に、処理速度の向上を意図してSPをデータ処理用のポインタとして流用しているのではないかと思われます。このため、SPが本来の目的以外に流用されている時にNMIが発生すると、プログラムもしくはデータが破壊されることになります。

JP3にショートピンがついていないことを確認して、Universal MonitorのLコマンドでパッチを追加したALTAIR680BASIC.SRECを読み込みます。

Lとエンターを押すとマイクロコンピュータは待機状態になるので、TeraTermの[File -> Send File…]を選択します。ファイルダイアログが開くので、ALTAIR680BASIC.SRECを選択し読み込ませます。

その後Gコマンドを使用し、BASICに制御を移すことで、BASICを起動します。

具体的にはGもしくはG0と入力します。

BASICが起動すると、3つの質問が出力されます。

[MEMORY SIZE]に対しては何も指定せずエンターを入力します。これで、6800-COREで使用できるRAM全てをBASICで使用することを指定したことになります。[TERMINAL SIZE]に対しては80、[WHAT SIN-COS-TAN-ATAN]に対してはYを入力してください。

これらの入力後の端末画面を以下に示します。

ALTAIR BASICの起動画面

おめでとうございます。これで1976年当時のマイクロコンピュータでのBASICプログラミング体験ができる環境が整いました。

例えば、BASICで書かれたゲームプログラムが以下のページからダウンロードできますので、興味のあるものを選んで実行するのも楽しみです。