なぜか今更MSX-DOS(MS-DOSの誤植ではない)で動くHello Worldを作ってみたw

さて、どうやって作るかだ。クロスコンパイラや実機で動くMSX-Cやら方法はあるけど、とりあえずWindows上で動くアセンブラを使ってみようと思う。実際に使うのはWindows用ではなくMS-DOS用なんだけどね。

今現在(2019年3月現在)手に入りそうなZ80アセンブラを探してみると、

  • ZASM(パソコン通信全盛期にフリーで配布されていたもの。MS-DOS用)
  • zasm(MS-DOS用のZASMとはたぶん別物。Unix系OS用)
  • Z80-ASM(Unix系OS用)
  • SDCC - Small Device C Compiler(クロスCコンパイラだけどアセンブラも含まれている。Unix系OS、Windows用)

などがある。

使ったことがあるのはMS-DOS用のZASMとSDCCのアセンブラだ。SDCCのアセンブラは記述がちょっと違うんで今回はMS-DOS用のZASMを使ってみる。

まずは、Hello Worldのプログラムはこんな感じ。

hello.asm

            ; プログラムの開始アドレス
		ORG		0100H

            ; システムコールのアドレス
BDOS		EQU		0005H

		; 文字列を出力するシステムコール
		LD		C,09H
		LD		DE,HELLO	; $で終わる文字列のアドレスをセットする。
		CALL	BDOS

            ; 終了
		RET

            ; 表示する文字列($で終わる)
HELLO		DB		"Hello World.$"
		END

DEレジスタに文字列の先頭アドレスをセットして文字列を出力するシステムコール(09H)を呼んでる。ここで渡す文字列はC言語の文字列と違って$で終わっている。このシステムコールはCP/M-80と互換性があるものなのでCP/M-80でも動作するはずだ。

これをMS-DOS用のZASMでアセンプルしてみる。
64ビットのWindowsではMS-DOS用のプログラムは動かなくなっている。また、最近の32ビットWindowsでもデフォルトでは動かないようだ。(オプション機能の追加で動くようになる)

ということで、MS-DOSのエミュレータを使ってZASMを実行しようと思う。

TAKEDA, toshiya's HOME PAGEにあるMS-DOS Playerを使って動かすことにする。

MS-DOS PlayerとZASMの実行ファイルの置いてあるディレクトリにパスを通しておいて、
コマンドプロンプトから次のように実行する。

msdos zasm -CHELLO hello.asm

実行するとHELLO.COMと言うファイルができるので、MSX実機に持って行くと実行できる。

ソースファイルの説明のところで書いたようにこのプログラムはCP/M-80でも動くはずなので、TAKEDA, toshiya's HOME PAGEにあるCP/M Playerを使って動かすこともできるし、MSX以外にPC-8001やX1などのCP/M-80でも動くはずだ。

次は、これをMSX Playerで動かす方法を書こうかな~(たぶん)
久しぶりにMSX Playerで動かそうとしたら、どうやったら良かったのか忘れてたのでメモを残しときたいという意味もある。

PS.ここで使ったMS-DOS PlayerみたいなUnix系OSのターミナルで動くやつ、欲しいな~。なんて。探してみたんだけど見当たらないんだよね。がっつりPCをエミュレートしてその中で動くやつでシェルスクリプトからUnixのコマンドと一緒に使えるようなのが見当たらないんだよね。あるのかな?あと、MS-DOS Playerのソース公開されているから見てみたけど、移植するの大変そうなんだよね(^^;)