MSX用クロス開発のすすめ(z88dk)
今の時代MSX用にプログラムを開発する際、実機もしくはエミュレータ上でアセンブラやコンパイラを使うのは苦痛でしかない。コマンドラインのエディタ。K&R時代のコンパイラと付き合って、当時のままの重く、メモリも足りない環境で開発するのはあまりよい方法ではない。とはいえ、Windows上などでクロス開発するのは敷居が高いと思うだろう。いわゆる「マイコンクロス開発」と同様に、コンパイルしたバイナリを転送して、動かして、デバッグも大変でと、クロス開発ならではの苦労も想像できる。でもMSXエミュレータとホストOSの関係は実は意外と軽い。
openMSXというMSXエミュレータは、ホストOS上のディレクトリをフロッピーとしてマウントする機能をもっている。
これを使うとMSXエミュレータからWindows上のファイルがそのままMSX-DOSのファイルとして見え、実行することもできる。なのでそこにMSX用ソフトを出力するようにすればWindowsでMSXの開発が行えるのだ。
で、MSX用に開発できるクロス開発環境を考える。さすがにかつてのMSX-DOS TOOLSで実現されてるほどにBASICと遜色ない環境を整えているものはない。だが、まあMSXにはBIOSとBDOSという、アセンブラからでも比較的容易に使える機能がてんこもりなので、とりあえず「動く」バイナリが出力できればなんとかなる。その上でいいなと思ったのがz88dkというC開発環境である。
z88dkはZ80を使用した様々なコンピューター用の実行ファイルを作成することを目的にした開発環境である。サンプルの豊富さなどからシンクレアZXスペクトラム用がもともとの用途なのだと思うが、TRS-80、コレコビジョン、CP/M、S-OS、シャープMZシリーズおよびX1、NEC PC6001シリーズ、セガSC-3000とマスターシステム、ソードM5なんかにも対応している。出力するプログラムも、カセットテープ用音声ファイルからディスクBASICでBLOADして動かすバイナリ、ロムカセット、DOS用などを切り替えられるという親切さだ。もちろんMSX向けにも出力できる。
安定版のインストーラも提供されているが、最後の安定版が出てから大きく改良されているのでNightlyビルド版をダウンロードした方がいい。プログラムのビルド方法なども変化しているし。
たとえばWindowsなら、
http://nightly.z88dk.org/z88dk-win32-latest.zip
をダウンロード、展開して、どこでも好きな場所に置く。cドライブ直下にz88dkフォルダを置いたとして説明すると、このあと環境変数をいくつか設定する。コントロールパネルの「システム」を開いて、「システムの詳細設定」から「環境変数」を開く
PATHの末尾に ;c:\z88dk\bin
を追加。
あとZ80_OZFILESという変数を作成して変数値を c:\z88dk\Lib
ZCCCFGという変数を作成して変数値を c:\z88dk\Lib\Config
としておく。これでOK。あとはopenMSXにマウントしたフォルダ上でターミナルを開き、ソースファイルをコンパイルして、そのままエミュ上で実行可能になる。
例えば
#include <stdio.h>
main()
{
printf("Hello World");
}
これをtest.cとして保存し、ターミナルでコンパイルする
zcc +msx -subtype=msxdos test.c -o test.com
コンパイルオプションで '+msx'とつけることでMSX用になる。 -subtypeを指定しない場合、BASICからBLOADで読み込んで実行するバイナリになるようだ。-subtype=romというのもあって、ROMカセット形式のバイナリを作成できる。
なお、デフォルトではディスクI/Oをダミー関数に置き換えたndosライブラリがリンクされ、ファイルの読み書きができない。ゲームを作るなら構わないだろうが、普通にファイルの読み書きをするプログラムを書く場合はz88dk\lib\config\msx.cfgを編集して
CLIB default -lmsx_clib -lndos
とある行を
CLIB default -lmsx_clib
と書き換えるといい。-lndosオプションがダミーライブラリの指定になっているのでこれを削除すれば普通にファイルI/Oが使えるようになる。
ちなみにMSX-Cと違って、z88dkは32ビットのlong型も普通に使えるし、ほぼANSI-C準拠なのでわりと今時の感覚で使える。
なお、M80用のアセンブラをz88dkのz80asmで通るようにするには以下のようにする。
equによる定数は使えない。
FOO equ 0FF00H
みたいな指定は
DEFC FOO = 0FF00H
と書き換える。DEFCは32ビット定数の宣言。
マクロは使えないっぽいので展開して書き換える。
コードとデータのセクション設定は
SECTION code
SECTION data
などと書く。
DB DWなどの定数擬似命令はエラーになるようだ。
DEFB DEFWと書き換えればOK