aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【MSX】Z80マシン語入門してみた(第2回)

さて、前回から間を置いてしまいましたが、今回からは、私が制作したオールマシン語ゲーム「Corridor Runner」の制作過程を追って、どのように1つのゲームを作っていったのかを書いていこうと思います。
マシン語もゲーム制作も、私の独学ですので一般的なものではありませんが、MSXに限らずこれからゲームを作る人のヒントになれば幸いです。

いざ、オールマシン語へ!

最初は、前回作成した逆スクロールの処理を使って、なにかひとつBASIC+マシン語でゲームを作ってみようと考えました。
しかし、どうしても滑らかに複数のキャラクターを動かしたく、それにはやはりBASICでは役不足で、マシン語に頼るしかありません。
また、逆スクロールのプログラムを作ったことで、なんとなくアセンブリ言語でのプログラムの作り方がイメージできたので、思い切ってオールマシン語に挑戦することにしました。

実は中学生の頃に一度マシン語に挑戦したのですが、挫折した経験があるので、そのリベンジという気持ちもありました。

プログラムを作る準備

まず、開発環境を準備します。
個人的にメインのデスクトップ環境をLinuxubuntu)にしていることもあって、マルチプラットホームで使えるものが条件になりました。

現状では、Windows+WSL2の環境にLinuxを入れる、という手もありますね。

アセンブラ

はじめは、一番重要なZ80アセンブラです。
これがなくては何も始まりません。
今では便利なことに、PCでZ80のコードをアセンブルすることができます(クロスアセンブラ)。 代表的なものでは以下があります。

  • SDCC
    8ビットの各種プロセッサのバイナリを生成可能なCコンパイラで、WindowsMac OS XLinuxをサポートしています。
    MSXで利用できる形式(romイメージやテープイメージなど)を直接出力できないので、変換が必要です。
    こちらに詳しい説明がまとまっています。

  • z88dk
    SDCCと同じく、8ビットの各種プロセッサのバイナリを生成可能なCコンパイラです。
    こちらもWindowsMac OS XLinuxをサポートしています。
    各マシンで直接ロード可能な実行バイナリを生成することができます。

  • pasmo
    MSXPenで採用されているコンパイラです。
    MSXのBLOAD形式でロードできるバイナリを出力できます。
    このコンパイラを使用したzDevStudioという統合環境もあるようです。

  • ZASM
    Z80アセンブラですが、8080構文をZ80に変換可能な機能を持っています。
    SDCCのCソースをインクルード可能で、ZX7を使用した自動圧縮やリストファイルにCPU累積サイクルを含めることができる、ユニークな機能を持っています。

  • Z80AS
    Win32コンソール上で動作する、Z80コンパイラです。
    日本人の方が作成されています。
    Intel HEX形式の他、SHARP MZシリーズ用のテープイメージ形式、MZ2000用のディスクイメージ形式、PC8801用のディスクイメージ形式での出力が可能なのが特徴です。
    ダウンロードはこちらで可能です。(ver0.12)

  • AILZ80ASM
    .NET 6環境で動作するZ80アセンブラです。C言語はサポートされていません。
    この中では比較的新しく作成されており、作者の方も日本人ですので、ドキュメントも参照しやすいものになっています。

この中から、以下の条件で絞り込みました。

  • WindowsLinuxの両方で使える
  • MSXのromイメージ、テープイメージで出力できる
  • (将来的にやるかもしれないので)C言語も扱える
  • (将来的にやるかもしれないので) MSX以外の他のZ80マシンのオブジェクトも出力できる

また、開発が活発に行われているということもメリットとして考え、私はz88dkを選択しました。

もちろん、どれも一長一短ありますので、お好きなものを選択頂いて構わないと思います。
特に、C言語は不要で、ドキュメントが読みやすいほうが良いという方は、Z80ASやAILZ80ASMを選択したほうが良いと思います。

エディタ

次にエディタです。 何でも良いのですが、言語を問わず無料で利用でき、Gitも使え、プラグインが充実しているVisual Studio Codeを選択しました。
導入したプラグインは、以下です。

  • ASM Code Lens
    アセンブラ構文の強調表示、入力補完、ラベルなどの参照検索、シンボルのコメントをホバー表示、シンボルの名前変更、ラベルの参照数表示など、強力なサポート機能を持っています。
    正直、これがないと、とてもではないですが開発できませんでした…。

  • MSX Z80
    MSXBIOSエントリやワークエリアのシンボルがサポートされます。
    ですが、ASM Code Lensが強力すぎて、いまいちこのプラグインの効果がわかりません…。

  • Z80 Assembly Meter
    Z80アセンブリソースコードからクロックサイクルとバイトコードサイズを測定するプラグインです。
    ソースの選択範囲についてクロック数とバイトサイズが計算され、画面下のステータスバーに表示されます。
    かなり便利で、MSXでのM1サイクルにも対応しており(要設定変更) 、処理速度を求めるロジックのコーディングに役立ちました。

  • Z80 Instruction Set
    Z80ニーモニックのオペコードと説明、フラグの変化などがホバー表示されます。
    ちょっとした命令の確認を非常に効率的に行うことができて便利です。

だいたいこのあたりで十分だったのですが、他にも便利なプラグインがありましたら教えていただけるとありがたいです。

エミュレータ

実は開発開始時点ではMSXの実機を持っていなかったのと、動作確認はPCで行う方が早いので、エミュレータを導入しました。
現状、開発に使える(デバッガに対応している)MSXエミュレータは、以下があります。

  • BlueMSX
    古くからある有名なエミュレータで、デバッガも搭載されています。
    サイトやエミュレータも日本語に対応していて導入しやすいのですが、10年以上更新されていないため、やや精度には劣るのと、Windows以外のバイナリが配布されていません。

  • openMSX
    現在も活発に開発が進んでいるエミュレータです。
    WindowsMac OSLinuxで利用できます。
    少々使い勝手にクセがありますが、開発でも便利な機能があり、debuggerも用意されています。

今回はLinuxで開発したいので、消去法でopenMSXになりました。

ただ、openMSXのデバッガの使い勝手がイマイチだったので、最終的にはMAMEを使用しています(後述)。

デバッガ

さて、最後にデバッガです。
プログラムが期待した動作をしなかったとき、画面に情報を表示させておくのも有効ですが、途中で暴走などをしてしまう場合はデバッガでメモリ(プログラムカウンタ、スタック)やレジスタの状態を確認する必要があります。 デバッガとして使えるツールは、以下のものがあります。

  • openMSX debugger
    openMSXと組み合わせて使えるデバッガです。
    コンパイルして生成したリストファイルを読ませて、openMSXに接続することで、ブレークポイントの設定やメモリやレジスタの確認・更新を行えます。
    また、VRAMの内容も参照できます。
    z88dkのリストファイルにはそのままでは対応していないので、パッチを当てて、ソースからビルドする必要があり、少々敷居が高いです。

  • DeZog
    Visual Studio Codeプラグインで動作する、Z80デバッガです。
    ソースコードに直接ブレイクポイントを設定してデバッグ実行させることが可能になります。
    ただし、DeZogからopenMSXへの接続がうまくいかないため、エミュレータにはMAMEにC-BIOSを組み込んだものを使用します。
    このあたりの導入については、こちらに詳しく説明がありますので、参照してみてください。

開発当初はopenMSX debuggerを使用していましたが、DeZogの作者の方にz88dkのリストファイルに対応頂いたので、現在はDeZogを使わせて頂いています。

プログラム以外で必要だったもの

プログラミング以外では、グラフィックとサウンドのツールを準備しました。

グラフィック関連ツール

グラフィック用の準備したツールは、以下になります。

  • Edge
    Windows用のグラフィックエディタです。
    パターンの回転やアニメーションの確認などもできるため、私はこれにMSX1のカラーパレットを定義して、各方向のキャラクターパターンやエンディングの1枚絵を書きました。
    作成したデータは画像ファイル形式でしか保存できませんので、以下の各ツールで打ち込み直しています。
    wineを使えばLinuxでも動作可能させることができます。

  • nMSXTiles
    MSXのSCREEN2/4に対応したグラフィックエディタです。
    編集したデータはアセンブリソース形式、バイナリ形式などで出力可能です。
    パターンネームテーブルのデータだけ使えば、SCREEN 1でのデータとしても使うことができます。
    スプライトパターンも作れるようですが、私には使い方がよくわかりませんでした…。

  • TinySprite
    Webブラウザ上で使えるスプライトパターンエディタです。
    必要最低限の機能しかありませんが、16x16ドットのキャラクターが基本であれば問題ないと思います。
    作成したパターンはBASICのDATA文、アセンブリソース形式などで出力できます。

今回は採用を見送りましたが、他にも以下のツールがあります。

  • 99x8Edit
    日本の方が開発された、TMS9918/V9938をターゲットにしたグラフィックエディタで、タイル、スプライト、マップの各データの作成が可能です。
    また、PNG画像のインポートやエクスポートデータの圧縮、CRTフィルタといった機能もサポートしています。
    .NETアプリケーションですがWindows固有のAPIを使用しているためか、Linux(Ubuntu)では動作しなかったため、使用は見送りましたが、Windows環境で開発される方は是非利用してみてください。

サウンド関連ツール

サウンド用に準備したツールは、以下になります。

  • PSGSoundDriver
    ゲームに使うサウンドドライバを探してみたのですが、汎用的なものでは以外と要件(簡単に使えて効果音も鳴らせるもの)に合致するものが見つからなかったので、自作しました。
    これについては、別途記事にしたいと思います。(いつになることやら…)

  • LovelyComposer
    Python製のチップチューン作曲ツールです。
    有料アプリですが安価であること、PSGと近い構成であること、感覚的に作曲できることから、利用させていただきました。
    データはjson形式なので、自作サウンドドライバ用のデータに変換するツールも作成しています。

いよいよ開発へ!

さあ、道具が一通り揃ったところで、ようやく開発できるようになりました!
ここから長い長〜い道のりが待っているのですが、長くなったので今回はここまで。
しかし、ツールの選択だけでも大変なんですよね…。
30年以上前のMSXマイコンですらこうですから、今のWebアプリケーションの開発などはもっと大変なのではないでしょうか。
この記事が、少しでも皆さんのツール選定のヒントになってくれると嬉しいです。
では、次回をお楽しみに。