z88dkを使ったMSX向け開発環境の作り方

コンピューター

さいきんMSXで遊べるゲームを作って楽しんでいます。
あんまり情報がなくて色々と試行錯誤しましたので、自分用の備忘も兼ねてこちらに記録します。
今回はZ80CPU向けクロス開発環境であるz88dkのインストールと、簡単なプログラムをコンパイルしてMSXエミュレーターで実行するところまでです。
使用しているPCはWindows11です。C言語とインラインアセンブラで書いたプログラムを動かします。

z88dkのインストール

z88dkはZ80CPU向けのクロス開発環境です。
MSXをはじめさまざまな機種に対応しています。
私はまだMSXにしか使ったことがないですが、ゲームボーイも面白そうなのでそのうちチャレンジしたいと思っています。

z88dkの公式サイトはこちらです。
https://z88dk.org/site/

さっそくインストールしていきましょう。
インストールに必要なファイルはGitHubで公開されています。
こちらのサイトにアクセスしてください。
https://github.com/z88dk/z88dk

少し下にスクロールすると、右側にリリースへのリンクがあります。

Releaseをクリックすると、下のページに移ります。

少し下にスクロールすると、各OS向けのファイルへのリンクが表示されます。

今回はWindowsですので、z88dk-win32-2.2.zipをダウンロードします。

ダウンロードできたらzipを展開してください。

ファイル数が多いのでしばらくかかります。気長に待ちましょう。

展開が終わったら、任意の場所に移動します。
パスに空白文字がない場所にしましょう。
私はどのPCでも同じパスになるように、Cドライブ直下に入れています。

インストールはこれで終わりです。
次は、動かすための環境設定をしていきます。

環境設定

z88dkを動かすための環境変数を設定していきます。
Windowsキーを押して、歯車マークの設定をクリックします。

システムの一番下にある「バージョン情報」をクリックします。

「システム詳細設定」のリンクをクリックします。

システムのプロパティというダイアログボックスが表示されますので、「環境変数」のボタンをクリックします。

環境変数で設定するのは3つです。

「新規」で2つ追加してください。
変数「Z88DK_HOME」には先ほどインストールしたパスを入力してください。
「ZCCCFG」には「%Z88DK_HOME%\lib\config」を入力しましょう。

あとから作業がしやすいように「Path」にも追加しましょう。
「%Z88DK_HOME%\bin」を新規追加してください。
私はなるべくコマンド操作したいので、エミュレーター(blueMSX)とテキストエディター(秀丸エディタ)のパスも追加してあります。お好みでどうぞ。

さいごに、問題なくインストールと環境設定できたか確認します。
コマンドプロンプトを起動してください。
Windowsキー+R 「cmd」と入力してEnterで起動します。

「zcc」と入力してEnterを押してください。

下のような表示がずらっと出たら、z88dkを動かすための環境設定ができています。

次に、小さなプログラムを実際にコンパイルしてMSXエミュレーターで動かしてみましょう。

動作確認用のプログラムを作る

いきなり情報量が多すぎると理解できないので、今回はおなじみのHELLO WORLDを動かします。
作業用のフォルダーを作ってください。
ここからの例では
C:\Develop\msx\sample\001_environment_for_windows
で作業しています。どこでもいいです。

まずはテキストエディターでソースファイルを作りましょう。
3つ作ってください。コピペでいいです。

app.c

#include <stdlib.h>
#include "msx.h"


void main()
{
	msx_print(0, 0, (uint8_t*)"HELLO MSX!");
	msx_beep();
}

msx.h

//
// BASICのBEEPと同じです。
//
void msx_beep();

//
// 指定座標に文字列を表示します。
// BASICのLOCATEとPRINTを組み合わせた感じです。
// VRAMにブロック転送しますのでBASICより高速です。
//
void msx_print(uint8_t x, uint8_t y, const uint8_t* s);

//
// RAMからVRAMにブロック転送します。
// addr_r 転送元(RAM)の開始アドレス  addr_v 転送先(VRAM)の開始アドレス  len バイト数
//
void msx_ram2vram(uint16_t addr_r, uint16_t addr_v, uint16_t len);

msx.c

#include <stdlib.h>
#include "msx.h"


//
// BASICのBEEPと同じです。
//
void msx_beep()
{
#asm
    CALL        0x00C0  ; BEEP
    RET
#endasm
}

//
// 指定座標に文字列を表示します。
// BASICのLOCATEとPRINTを組み合わせた感じです。
// VRAMにブロック転送しますのでBASICより高速です。
//
void msx_print(uint8_t x, uint8_t y, const uint8_t* s)
{
    msx_ram2vram(s, 0x1800 + y * 32 + x, strlen((const char*) s));
}

//
// RAMからVRAMにブロック転送します。
// addr_r 転送元(RAM)の開始アドレス  addr_v 転送先(VRAM)の開始アドレス  len バイト数
//
void msx_ram2vram(uint16_t addr_r, uint16_t addr_v, uint16_t len)
{
#asm
    LD      IX, 2
    ADD     IX, SP
    LD      C, (IX)
    INC     IX
    LD      B, (IX)
    INC     IX
    LD      E, (IX)
    INC     IX
    LD      D, (IX)
    INC     IX
    LD      L, (IX)
    INC     IX
    LD      H, (IX)
    CALL    0x005C      ; LDIRVM
    RET
#endasm
}

app.cがメインのプログラムです。
左上端に「HELLO MSX!」を表示してビープ音を鳴らします。

msx.hとmsx.cはMSXのハードウェア向けに作った関数です。
インラインアセンブラで書いてあります。
(2023.08.11 いきなりマニアックすぎるのでBIOSコールのサンプルに修正しました)
今回の目的から外れますので説明は省略しますが、もし需要がありましたら他の関数も載せていきます。
試行錯誤しながら自分用の関数を充実させていくと理解が深まります。

ROMイメージを作って動作確認する

MSX(今回はエミュレーターを使います)で動かせるようにコンパイルしましょう。

まずはROM形式にしてみます。
ソースファイルが置いてある作業フォルダーで、以下のコマンドを実行してください。
(プログラミング中に何回も繰り返しますので、バッチファイルにしておくと便利です)

zcc +msx -subtype=rom -create-app msx.c app.c -o app.rom

無事にコンパイルできたら、app.romというファイルができます。

さっそく動かしてみましょう。
今回はブラウザーでMSXが動かせるエミュレーター、WebMSXを使用します。
こちらにアクセスしてください。
https://webmsx.org/

MSXが起動しますので、画面下にあるカートリッジのアイコンから Load ROM Image を選択してください。

先ほど作ったROMファイルを指定します。

左上端に「HELLO MSX!」が表示されてピッと鳴れば成功です。

これでMSX向けの開発環境ができました。
お疲れさまでした。

おまけコーナー

フロッピーディスクから動かす

実機で動かすなどフロッピーディスクに入れて動かしたい場合は、コマンドオプションを変更してください。

zcc +msx -create-app -subtype=disk msx.c app.c -o app.msx

app.msxというファイルをBLOADで読み込んで実行できます。

BLOAD "APP.MSX",R

2DDのフロッピー(もしくは2HDのフロッピーの窓をテープでふさぐ)に入れて実機で楽しみましょう。

MSX-DOS形式にもできますが、作り方で気を付けるポイントがあるので今回は省略します。
大きいサイズのプログラムを作るようになったらMSX-DOSにチャレンジしましょう。

ノスタルジックにテープから読み込んで動かす

カセットテープに録音(もしくはヘッドホン端子から直結)して実機で動かす方法もあります。
コマンドオプションを変更すると、テープ音声ファイル(wav)とテープイメージファイル(cas)ができます。

zcc +msx -create-app -subtype=wav msx.c app.c -o app.wav

エミュレーターで実行する場合はapp.casファイル、テープに録音する場合はapp.wavファイルを使用してください。

BLOAD "CAS:",R

たまにはテープも風情があって良いのではないでしょうか。

さいごに

今回はz88dkをインストールしてMSX向けの開発環境を作る記事を書きました。
さいきんは毎日ふざけたゲームを作っているので頭に入っていますが、もしブランクができたら忘れてしまうので備忘録として残しておきます。
もしお役に立てれば幸いです。

ご質問や、間違ってるぞー!、とかありましたらTwitterまでお願いします。

タイトルとURLをコピーしました