[MSX] Z88DKを使ってC言語でマシン語プログラムをつくる #MSX #MSX0

MSX用のマシン語プログラムをC言語で作れるZ88DK

MSXでのプログラムは基本的にBASICでしか書けなかった中の人ですが、カシオのポケコンPB-1000でちょっとだけアセンブラを覚え、MSXでもスロット操作とかでBIOSを使わないといけないようなものだけ、ちょっとだけ書いてはいます。

でもやっぱりアセンブラは中の人にはレベルが高すぎて、書くのがきついです。 BASICで全部かけるのが一番ですが、上記に書いたようにやっぱりBIOS直接呼ばないといけない処理なんかもあるし・・・

と思っていたところで、Z88DKという、C言語のプログラムをZ80CPU用のマシン語にコンパイルしてくれる環境があるというのを知りまして。

ちなみに、SHARPのポケコンPC-G850シリーズもZ80搭載なので、ポケコン用のマシン語プログラムも作れたりします。

Chromebook上でZ88DKを導入する

最近なんとなくChromebookを使っている中の人なので、Z88DKをChromebookに導入してみることにしました。 ちなみに主に使っているのは↓の機種ですが、最近、古くなったCore i5のノートPCにChromeOS Flexを入れたら快適すぎたので、そちらに浮気しております。CZ1はさすがにパフォーマンス的にきつすぎてw

[Chromebook] ASUS Chromebook Detachable CZ1が30,000円を切っていたので買ってみた #chromebook https://mobileff.blogspot.com/2022/04/chromebook-asus-chromebook-detachable.html

Chromebookはたいてい、Linux環境のインストールができますので、Linux環境をまずはインストールします。

あとは、Linux用に導入手順を書いてくださっている方がいるので、その方のページを参考に導入します。

Z88DK を使って MSX のゲームをつくるための環境構築メモ https://maple4estry.netlify.app/z88dk-msx/

中の人の環境では、./build.shを実行する前に、以下のコマンドを追加で実行するとうまくいくようでした。

sudo apt-get install libxml2-dev libxml2-doc

(追記) ChromeOS Flexで試したときは、以下のコマンドも追加で実行する必要がありました。

sudo apt-get install libgmp-dev
sudo apt-get install g++
cd /usr/include
sudo ln -s libxml2/libxml .
sudo apt-get install pkg-config

コンパイルのコマンド

たとえば、以下の3つのソースコードをコンパイルするとします。

hello.c

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

void main() {
    msx_println("Hello!MSX0!");
}

mymsx.h

void msx_chput(char c);
void msx_chput_CRLF();

void msx_print(char[] str);
void msx_println(char[] str);

mymsx.c

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

#asm
CHPUT	EQU	00A2H ;MAIN-ROM BIOS CALL CHPUT
#endasm

void msx_chput(char c) {
#asm
    LD      IX, 2
    ADD     IX, SP
    LD      A, (IX)
    CALL    CHPUT
	RET
#endasm    
}

void msx_chput_CRLF() {
    msx_chput(0x0D);
    msx_chput(0x0A);
}

void msx_print(char[] str) {
    for(int i=0;i<256;i++) {
        if(str[i]==0) {
            return;
        }
        msx_chput(str[i]);
    }
}

void msx_println(char[] str) {
    msx_print(str);
    msx_chput_CRLF();
}

コンパイルのコマンドは以下のようになります。

zcc +msx -create-app hello.c mymsx.c -subtype=disk -o hello.bin -DAMALLOC -lm

オプションについては、中の人の理解ですが、

  • +msx
    • MSX用のバイナリを作るときにつける
  • -create-app
    • 実行用のバイナリを作るときにつける
  • -subtype=disk
    • DiskBASIC上で実行できる形式でコンパイルしたいときにつける。たとえば、BSAVE形式のバイナリを作るときなど。
  • -DAMALLOC
    • プログラム内でmalloc()関数を使うときに必要なオプション
  • -lm
    • プログラム内でmath.hの数学関数を使うときに必要なオプション

という感じです。特に、BASICから実行するBSAVE形式のバイナリにしたいときに重要なのが-subtype=diskで、これを指定すると、コンパイル結果のバイナリは、hello.bin以外にhello.msxというファイルが作成され、これがBSAVE形式(専用のヘッダが付加される)になりますので、MSXからは、

bload "hello.msx",r

とコマンドを打てば実行できるようになります。

ちなみに、作成したバイナリをMSX0に転送したい場合は、有志各位の優れたツールもありますので、そちらを使っていただくか、拙作のserbinsvもよろしければ使ってみてください。

[MSX0] シリアルコンソール経由でファイル転送するプログラム #MSX #MSX0 https://mobileff.blogspot.com/2023/12/msx0.html

とりあえず現場からは以上です。

コメント