z88dkを使う
z88dkはhttps://z88dk.orgで公開されているZ80ファミリを対象にしたC言語およびアセンブラのフリーのクロス開発環境です。
printfなどの標準関数もMZ-80/700/800に対応いるようでMZ-1500でも使用できます。
ビルド時にオブジェクトはMZT形式やWAV形式ファイルでも同時出力できます。
※ よく間違えるのですが ”z80dk”ではありません、”z88dk”です。
ここではWindows10pro前提ですが、開発環境の構築手順、動作確認までをまとめておきたいと思います。
1.z88dkをダウンロードする
z88dkサイトの「Downloads」からGitHubのリンクを辿ってreleased のダウンロードしてください
(本記事作成時はVersion2.1でした)
z88dk-win32-x.x.zip (x.xはバージョン)のリンクがあると思います。解凍すると「z88dk」フォルダができます。
ここでは、C:\z88dk に置いたとします。
2.パス、環境変数を設定する
実行ファイル、ライブラリなどの位置を環境変数に登録する必要があります。
システム環境変数の”Path" に "C:\z88dk\bin" を登録追加しました。
同じくシステム環境変数に"ZCCCFG"の変数名で ”C:\z88dk\lib\config"の値を登録しました。
登録したら念のためにPCを再起動しました。
3.試してみる
この時点でコマンドプロンプトなどからコンパイラを実行できます。
z88dkでは「zcc」というフロントエンドコマンドを使用します。
とりあえずHello Worldでも表示させてみましょう。
テキストエディタでtest.cを作成しました。
(MicrosoftのVisual Studio Codeでも良いです。)
zccコマンドでtest.cをビルドします。
「zcc +mz -o 'test' -create-app test.c」を実行してください。
ビルドされ、test.mztファイルが生成されます。
※オプションに"-Cz--audio”を付加するとWAV形式ファイルも生成されます。
MZTファイルをエミュレータで実行します。
IPLから起動します。
めでたく「HELLO WORLD!!」と表示されました。
printfでは小文字は大文字に変換されるようです。
IPLの文字が残っていて残念です。
画面をクリアしてみましょう。
色々方法はあるのですが、MZのモニタサブルーチンを利用してみましょう。
main関数にインラインアセンブラを突っ込んでみました。
バンク切替は意識してません。
再度ビルドしてエミュレータで実行してみました。
今度は画面クリアされて表示されました。
ちなみにmain関数が終了するとモニタに戻りますが、$00ADにジャンプしているようです。(MZ-700だから?)
mainはスタートアップルーチンからコールされているのですが、MZ-1500は$EAA7なので飛び先が違います。
4.スタートアップを変更
スタートアップルーチンは z88dk\lib\target\mz\classicフォルダ内にある
mz_crt0.asm ファイルになります。
ジャンプ先を変えてしまいましょう。QDコマンド等が使えるはずです。
また、スタートアップルーチンは別で作成して、オーバーライドすることが可能です。その場合、zccコマンドで”-ctr0" オプションでスタートアップルーチンを指定することにより可能です。
5.その他留意事項
・生成されたオブジェクトの開始アドレスはデフォルトで $1200になります。
変更する場合は zccコマンドのオプションに 「-zorg=0x2000」を追加すると指定されたアドレスからの開始に変更できます。(アドレスは16進数の指定でもOKなようです)
・以前のz88dkでは2次元配列が使えなかったようですが、いつの間にか対応していたようです。Version2.1で確認したところローカル変数で2次元配列を定義した場合は正しく動作しませんでした。グローバル変数で定義した2次元配列は正しくアクセスできました。
以上 z88dkを簡単に紹介しました。
機種依存の部分はライブラリを作成するなどで対応できると思います。
MZ-1500専用のBASICコンパイラ等がなく、アセンブラで組まないといけなかったのですが、z88dkを利用することによりC言語かつフリーで利用できるのは大きいと思います。
他のサイトでMSXでの利用のページもあるので本家サイト以外にも参考にすると良いかもです。