MSX(Z80)のC言語コンパイラ


2017.3.30更新

現在、C言語でMSX(Z80 CPU)の開発をするには何が最適か考えてみたいと思います。
最近、BDS CとHI-TECH CとMSX-Cを本格的に使ってみました。
やはりどれも一長一短あります。
それと、asu ansi2krというANSI CをK&R Cに(あくまである程度)変換するコンバーターを作ったのでMSXを取り巻くC言語の状況が少し変わってきました。
個人的な結論では最強のMSXのC言語コンパイラをひとつ選ぶとしたらBDS Cになります。
BDS CはHI-TECH CやMSX-Cと違ってメモリが足りないことを理由としたコンパイルエラーが起こりにくく、z88dkが対応していない二次元配列に対応し、MSX-DOSに加えMSX-DISK-BASICにも対応したMSXライブラリもあります。
さらにBDS Cはパブリックドメインでライセンスの問題が全くなくオープンソースでもあります。
BDS C自体はANSI Cに対応していいませんが、asu ansi2krにより、ある程度ANSI化できるようにもなりました。
ですがBDS Cには欠点も多く用途によっては向きません。
BDS Cの他にはHI-TECH C(CP/M)かz88dkがいいと思います。
選択肢に入るのは(人によって変わると思いますが)、z88dk、BDS C、HI-TECH C(CP/M)、LSI C-80(高額)のいずれかになると思います。
どれもこれも面白いように一長一短がありすぎます。

まとめると、

ANSI CからK&Rにソースを変換するトランスレーター
K&R CのBDS CとMSX-Cのために、 asu ansi2krというANSI CをK&R Cに(あくまである程度)変換するコンバーターを作りました。
関数の引数の書式を変換してくれるだけでも随分楽になると思います。
BDS CとMSX-Cの欠点を小さくし延命させることができると思います。
実は似たツールは昔からあるにはありました。
前からあったものは、
ANSI CからK&Rに変換するものが、unprotoize。
K&RからANSI Cに変換するものが、protoize。
GNUツールなんで、GNU/LinuxのUbuntuなどでは簡単にインストールできます。
「sudo apt-get install protoize」みたいな感じの文を打ってインストールかな?(何打ったか忘れましたが)
ですがCygwinにインストールする方法が分かりません。
なんらかの方法でWindowsで使う方法もなくはないと思いますが情報が少なすぎてよく分かりません。
どちらにしろ、unprotizeはプリプロセッサとしてコンパイル処理にかますのは使えません。
なぜなら行が元ソースとずれるから。
行がずれないように変換してくれないと、コンパイルエラーが出た時の行番号が元ソースと合わなくなります。
移植の際に一度だけ変換するのなら行番号はずれてもいいですが、コンパイル毎に常に変換するという用途では非常に困ります。
asu ansi2krは行番号がずれないのでコンパイル毎に使えます。


BDS C
ANSI Cはasu ansi2krというANSI C to K&Rコンバーターである程度対応。
、現在は無料、セルフコンパイラ、Windows非ネイティブ
インラインアセンブル不可。
変数の宣言と同時の初期化ができず、static変数にも対応していません。
long,float,double非対応。関数名は8文字までで大文字小文字区別なし。
区別できる形で認識できる関数名はANSI Cの31文字よりずっと少ないですがMSX-Cより2文字長いです。
機能不足だが私が作ったMSXライブラリがあり、MSX-DOSの他、MSX-DISK-BASICにも対応する。
コンパイラ、リンカ、ライブラリマネージャーなどのソースあり。
アセンブラとのリンクは任意のアセンブラ(Windows版のzmac可)が使える。
アセンブラのリンクのためのプリプロセッサはWindowsに移植済み。(ZCASMB)
BDS C公式サイト
からダウンロードできます。
未だに公式サイトがあるというのはCP/MやMSX-DOSの商用コンパイラではとても珍しく、強みになると思います。
CP/M、MSX-DOSのセルフコンパイラですがCP/M program EXEcutor for Win32などのDOS窓で動くCP/Mエミュレーターを使えばWindowsでもまるでWindowsソフトのように動かせます。
市販品でしたが現在はパブリックドメインで無料になっています。
ランタイムライブラリのライセンスも問題ありません。
アセンブリ言語で記述されたコンパイラなのでコンパイル速度がCP/M版としては最速ではないかと思います。
z88dkが全く対応していない二次元配列に対応。
HI-TECH C CP/M版やMSX-Cが対応していない二次元配列の引数渡しにも対応。
作ったプログラムの動作速度がLSI C-80やMSX-Cよりも遅いという欠点があります。
MSX-C、LSIC-80のCP/M版が少し関数が大きくなっただけでコンパイルエラーが出るのに対してBDS Cは多少大きい関数もコンパイルできます。
HI-TECH Cが1000行程度のソースでエラーを出してコンパイルできなくなったりするのに対してBDS Cは多少大きいソースもコンパイルできます。
大きな制限もありますが実用レベルにあると思います。
私が作った簡単なMSXのミニゲームCR3のソースもフリーで公開しています。
z88dk、HI-TECH C CP/M版、MSX-Cをちょっと試して見ましたが、これらは、BDS C Ver 1.5に付いていたオセロプログラムのソースを移植できないほどコンパイル能力が低いです。
(gcc、clang、C++ Builderのbcc32などの現在主流のコンパイラには簡単に移植できたのでソースがおかしいわけではないと思います。)
特にMSX-Cはメモリ不足エラーで止まる症状がありコンパイル能力が低いです。
ですが、BDS Cも変数の宣言と同時に初期化ができないとかいろいろ問題があります。


LSI C-80 Windowsパック
公式サイト
98000円。
ANSI C対応。
long,float,double対応。
最新バージョンはVer 3.6
名称に含まれる-80は、8ビットCPUの8080のコードを出力できるという意味だと思います。
MSXのCPUのZ80は8080上位互換です。
SolarisパックやFreeBSD/Linuxパックもあります。
CP/Mライブラリがあります。
価格を考慮せず、自分でZ80アセンブリ言語を使ってMSXライブラリをいちから自作するのならこれが最適かも知れません。
MSXの標準C言語コンパイラのMSX-Cは、LSI C-80のCP/M版をOEMで元にしたサブセットではないかと思います。
もし昔買ったLSI C-80のMS-DOS版があれば、それを(64ビットWindowsの場合は)MS-DOSエミュレーターで動かしてもよいと思います。
LSI C-80のMS-DOS版は昔、仕事で使っていたことがありますがコンパイル能力に問題はありませんでした。
LSI C-80のMS-DOS版は現在は販売していません。
問題は98000円という値段です。
すでに過去のパソコンとなってしまったMSXの開発のためにこの金額を出せる人は少ないでしょう。
需要のピークを過ぎているので買うにしても在庫があるのかどうか分かりません。
ラインタイムライブラリのライセンスの問題はありません。
MSX-C用のグラフィックなどのMSX固有の機能を使うためのライブラリのMSX-C Libraryが使えるかどうかは分かりません。


z88dk
無料でWindowsで動きます。
ANSI Cに(どの程度か知りませんが)対応しています。
コメントにC++の // も使えます。
long,float,double対応。
インラインアセンブラ対応。
ラインタイムライブラリのライセンスの問題も(多分)ないと思います。
昔のSmall CというCP/M版のコンパイラがベースです。
Small Cは格安もしくは無料だったと思いますが能力の問題からあまり使われなかったと思います。
z88dkはSmall Cの問題をひきずったままのようです。
なんと二次元配列に対応していません。
次のソースがエラーになります。
main() { char a[3][3]; }
二次元配列を使いさえしなければ他は全てよいのか、それとも他にも重大な問題が次々出て来るのか分かりませんがこんな基本的機能に対応していないのでは使うことを躊躇します。
個人的にz88dkに深入りできていないのは主に二次元配列に対応していないことが理由です。
二次元配列が使えないことからコンパイルしたい複数のソースがz88dkではエラーになってコンパイルできませんでした。
二次元配列機能がなくても一次元配列や構造体の使用により同じ処理は実現できますが、z88dk以外のコンパイラが複数存在する以上、ソースをz88dkだけのために大きく書き直したり制限の中で書き進めるよりはz88dkが選択肢から外れるほうが自然に流れになると思います。
しかしながら無料でWindowsネイティブで関数の引数の記述がANSI Cの書き方でできてライタイムライブラリのライセンスも問題なさそうなのは魅力です。
あとはターゲット指定にCP/Mの他MSXがあるようです。
MSXはMSX-DOSとBASICのBLOADファイルとROMカートリッジとカセットテープに対応しています。
MSX-DOSでもBLOADファイルでもROMカートリッジでもprintfが使えます。
MSX機能はありますがMSX以外の機種もたくさん対応していてメインではないようです。
インラインアセンブラが使えるのでC言語ソースにアセンブリ言語埋め込みでMSXライブラリを自作できます。
MSXのターゲット指定ではデフォルトではファイルアクセスができないかも知れずMSX-DOSでないとできないかも知れません。(試していません)
少し動かしてみたところHello World(テキスト文字を表示するだけ)のプログラムは動きましたが、z88dkサイトのForumにあったグラフィックを使うプログラムはコンパイルエラーになりました。
二次元配列が使えない欠点はあれど利点が多く、もし情報が充実していれば使えそうです。
ただ情報が充実していないような気がしています。
BLOADファイル(MSXディスクBASICのマシン語ファイル)はデフォルトでORGが0x9C40になっているようです。
0x8100ぐらいに下げないと大きなプログラムがメモリに入り切らないと思いますが変更できるのかな?
よく調べてないのもありますが情報が少なく謎なところがあります。 Z80のCコンパイラとしては珍しく発展、バージョンアップし続けているように見えます。
現在二次元配列に対応していない欠点がありますが一番将来性がありそうです。


SDCC (Small Device C Compiler)
これはちょっと使えないような気がします。
無料、Windowsを含む各種OSサポート、ANSI C対応と魅力的な部分も多いです。
しかし、CP/MまたはMSX-DOSがターゲットに含まれていません。
ということはデフォルトではprintfすら動きません。
付属ライブラリやランタイムライブラリもそのまま使えないので自作するか改造するかしないといけません。
最低限動かせるようにするための労力が大きいです。
そしてランタイムライブラリのライセンスはGPLv2+LEです。(LEの意味は知らない。)
作ったプログラムがGPL感染するのかしないのかも考えなくてはいけません。
printfも使わない、ファイルアクセスもしないといった割り切った使い方ならできるかも知れませんが非常に使いにくいと思います。


HI-TECH C CP/M版
ANSI Cにある程度対応しているのが大きな魅力です。
#defineなどの#ではじまる文が行頭でないといけないなどK&R Cのままの部分もあるようです。
long,float,double対応(多分)。関数名大文字小文字区別する。(多分)
インラインアセンブラ対応。
1000行程度のソースでエラーが出てコンパイル不能になる。
内部変数を多く取るとワーニングが出る。このワーニングが出ると誤動作するのだうか?
内部変数の大きな配列を他の変数の後ろ側に置くとこのワーニングが出なくなることが多い。
私はまだそういう事態に遭遇していませんが複雑な式(例えばif文で&&が三つ四つある場合)に分解しないとエラーになるらしいです。
MSXライブラリはあるけどもMSX-DOS版のみでMSX-DISK-BASICはない。
できないと言ってきましたがいろいろ調べて、HI-TECH CでMSX-DISK-BASICで動くプログラムを作る方法が分かりました。
まだMSX-DISK-BASICで動かすことができることは分かりましたがMSXライブラリの作成や標準ライブラリの移植など開発環境の整備はまだできていません。
標準ライブラリのソースはありますがCコンパイラやリンカ、ライブラリマネージャー、CP/M用のスタートアップルーチンのソースはありません。
他の情報はここを見てください。
販売終了後にフリーソフトになったようです。
本家サイトは既に配布していませんが転載されたサイトから入手できます。
本家サイトにフリーソフトになったという記述が残っていないのが少し気になります。
使ってみると問題がいくつか見つかりました。
まず以下のように二次元配列を引数で渡すとエラーになりました。
void sub1(char b[8][8]) { } int main(void) { char b[8][8]; sub1(b); return 0; }
そのためBDS Cに付いていた二次元配列を使ったオセロのプログラムをコンパイルできません。
それが個人的に残念。
asu ansi2krというANSI C to K&Rコンバーターの初版はC++ BuilderとBDS Cの他にHI-TECH C(CP/M)でもコンパイルできていたんですがバージョンアップしてソースが大きくなったらHI-TECH Cではエラーが出るようになってコンパイルできなくなりました。
1000行ちょっとぐらいのサイズでした。
ソースを分割して分ければいいんでしょうが、そんなことしなくてもBDS CはコンパイルできたのでBDS Cを使いました。
BDS CでもMSX-Cでもコンパイルできたのに(ただし関数名縮めて関数分割して複雑な式を分解とMSX-Cのために大改造はしました。)HI-TECH Cだけがコンパイルできなかったんです。
MSXのミニゲームCR3はBDS Cの他にHI-TECH Cにも対応していてHI-TECH Cのソースも公開しています。
またMSX-C Library互換ライブラリ for HI-TECH Cが無料で公開されています。
使ってみましたがちゃんと動きました。
CR3はHI-TECH Cでコンパイルする場合も自前のソースだけで完結して他のMSXライブラリを必要としませんがMSX-Cライブラリ互換にしている関数を「MSX-C Library互換ライブラリ for HI-TECH C」と簡単に入れ替えることができます。
ライセンス問題を回避し、ANSI対応で、MSX用グラフィックライブラリもあるというのは大きな利点だと思います。
大きな利点もある中、他のコンパイラにはない欠点もあり用途やニーズによって使えたり使えなかったりするような感じです。
ライブラリ以外はクローズドソースで開発は終了されていてCP/M版であることから現状のまま使い続けることはできても改良は期待できない。


MSX-C
K&R(ANSI C未対応)、セルフコンパイラ、Windows非ネイティブ
Ver 1.0 詳細不明。作成したバイナリの配布許可あり。
Ver 1.1 MSX-DOS、MSX-DOS2。(CP/Mで動作せず)。作成したバイナリの配布許可なし。
Ver 1.2 MSX-DOS2専用。(CP/Mで動作せず)。作成したバイナリの許可は?
当時は有料。現在は販売しておらずフリーソフトにもなっていません。
long,float,double非対応。関数名は6文字までで大文字小文字区別なし。
関数名6文字しか対応しないM80とL80を使っているのは問題です。
関数を小さく分けないとコンパイルできず複雑な式も分解しないとコンパイルできません。
他のどのコンパイラよりもその傾向にあります。
(これはオプション指定で緩和できるかも知れませんが)
#pragma noregalo をソースに書いてCF.COMに -tオプションをつけないとソースが正しくてコンパイルは通っても誤動作するプログラムを生成する場合があります。
コンパイル速度が遅い、CP/Mエミュレーターで動かない、ライセンスにも問題があることから非常に使いにくいと思います。
利点は最適化が非常に効き、MSX標準のCコンパイラで、MSX-C Libraryがあり、MSX-C入門 上巻、下巻という有用な入門書が発売されていたことです。
2005年発売のMSX MAGAZINE永久保存版3の付録にWindowsソフトとしてのMSXエミュレーターの仮想フロッピーディスクイメージの中にMSX-DOS2込みアセンブラ込み、MSX-C Library込みでMSX-C Ver 1.2が収録されています。
MSXエミュレーターにインストール済みの形で使えます。
そして、MSX-C Liblrayや説明書や当時のMSX-C関連の書籍もPDFで付いています。
MSX-C入門の上巻と下巻もPDFで付いていますが少なくとも下巻のほうは抜粋であり大事な部分が書かれていません。
MSX-C入門は絶版で(普通には)買えません。
Ver 1.1とVer 1.2の入手自体はネットから簡単にできますが、おそらくはライセンス違反になるのではないかと思います。
例えばここにあります。
また、作成した自作プログラムは、Ver 1.1は配布許可がないようで、Ver 1.2も配布許可がないかも知れないし、MSX-C Libraryの説明書には「MSX-C Ver 1.1およびMSX-C Libraryを使用して作成されプログラムの販売については,下記にお問い合わせください。」とあり、問い合わせ先に株式会社 アスキー システム事業部の住所と電話番号が書いてあります。
無料なら配布できるのかも知れません。
ライセンス的に問題がありすぎて使えないような気がします。
ただし、C言語でMSX機能を使う例としての価値はあり、MSX-C Libraryにはソースもありますし他のC言語コンパイラを使う場合も決して無視できず参考になると思います。
BDS CやHI-TECH CのCP/M版のように販売終了後にフリーソフト化宣言してくれなかったのは痛いところです。
現在可能かも知れない合法な入手方法は、たとえ中古でも「MSX MAGAZINE永久保存版3」を手に入れることかも知れません。
2005年発売のMSX MAGAZINE永久保存版3の付録のWindowsで動く開発ツールはMSXエミュレーターの上でMSX-C Ver 1.2が動き、DOS窓での開発はできませんがまあこれでもいいかも知れません。
そのMSXエミュレーター(MSX Player)はフロッピーディスクをマウントできるので仮想フロッピーディスクドライバ(ImDisk Virtual Disk Driverなど)を使ってWindows側のファイルとやりとりすることが可能です。
(フロッピーディスクのサイズは737280バイトを指定)
CP/Mエミュレーターで動作しないのは残念です。
MSX-C Ver 1.1と32ビットのWinodwosのDOS窓の組み合わせであればMS-ODS版のMSX-DOSエミュレーターのMSX-DOS Emulatorを使ってコンパイルすることができます。
64ビットのWindowsのDOS窓ではこのMSX-DOS Emulatorは動作せず、MS-DOS playerやDOSBoxなどのMS-DOSエミュレーターの上でさらにMSX Emulatorを動かす二重エミュレートをしてもMSX-Cは動きませんでした。
MSX2実機で動かす場合はコンパイル速度が非常に遅く全く実用にならなかった感じです。
MSXturboRでさえも今となってはMSX-Cのコンパイル速度は遅いです。
久しぶりに動かしてみましたが、HI-TECH C同様に以下のような二次元配列の引数渡しができませんでした。
sub1(char b[8][8]) { } main() { char b[8][8]; sub1(b); }
それだけでなく、式を分けないとヒープオーバーフローでコンパイル不能。
例えば、以下のソースはエラー
notake(b,p,o,e,x,y) char b[8][8]; char p,o,e; int x,y; { return notak1(b,p,o,e,x,y,0,1)&& notak1(b,p,o,e,x,y,1,1)&& notak1(b,p,o,e,x,y,1,0)&& notak1(b,p,o,e,x,y,1,-1); }
MSX-Cでコンパイルするには式を以下のように分解します。
notake(b,p,o,e,x,y) char b[8][8]; char p,o,e; int x,y; { int a1,a2,a3,a4; a1 = notak1(b,p,o,e,x,y,0,1); a2 = notak1(b,p,o,e,x,y,1,1); a3 = notak1(b,p,o,e,x,y,1,0); a4 = notak1(b,p,o,e,x,y,1,-1); return a1 && a2 && a3 && a4; }


Softools ZiLOG WinIDE
公式サイト
ANSI C対応のC言語コンパイラとアセンブラを含むIDE環境。
Windowsで動くクロスコンパイラです。
415ドルと高額です。30日間の試用が可能です。
ターゲットがCP/M、MSX-DOS未対応のため使えないと思います。
ROM番地とRAM番地をプロジェクト作成時に指定しますが後から変更したり設定内容を見たりできないような気がしました。
(使い方を知らないだけかも知れませんが)
ROM化前提で全部RAMという指定が多分できずMSX-DOSで動くプログラムを作りにくいです。
C言語のライブラリはあってもCP/MやMSX-DOS、MSX用ではないのでprintfすら動きません。
ヘキサファイルまたはバイナリを出力できます。
バイナリ出力は開始アドレスまでゴミで埋めるため(MSX-DOSファイルやbloadファイルでは)開始アドレスまでのゴミを自分で削除する必要があります。
IDEはWATCOM C/C++という古い開発環境で作られていて、ヘルプは旧式のためおそらくヘルプはWindows 8とそれ以降では動かないのではないかと思います。
(Windows 7では動きました。)
コマンドラインツールもあるようですが試していません。


ccz80++
公式サイト
C++のような独自言語で、C++でもC言語でもありません。
フリーです。
構文はC++に似ていますがC++標準ライブラリもC言語標準ライブラリもなく実用性はないと思います。
CP/MやMSXのライブラリが一応あるようです。
サイトに載っている"Hello World"表示プログラムをバイナリ出力させたところ29バイトという極端に小さいファイルができて動きませんでした。
アセンブリ言語でも出力させてみましたが、どのアセンブラに対応しているのが分かりません。
結局どうやったら動作するプログラムを作れるのかは分かりませんでした。
Hello Worldのプラグラムは以下のようになり、printfもcoutも使えません。
include Text.ccz80++ class Program { static void main() { Text.PrintString("Hello World"); } }


秋月電子通商のAKI-80用のCコンパイラ
詳細は良く分かりませんが、秋月電子通商のZ80 CPUボードのスーパーAKI-80(4980円)に、ガイオテクノロジー社の統合開発環境のC言語コンパイラが付属するようです。
また、AKI-80用モニターROM&Cコンパイラセットが1000円で売られています。
「統合環境型のZ80用Cコンパイラ」と書いてあります。
もしターゲットがCP/Mに対応していないなら使うのは難しいと思います。
個人的には海外在住なので購入は難しいです。


ZCC
MS-DOS版のZCC Ver 0.96をダウンロードしてみました。
C言語コンパイラです。
MS-DOS/UNIX共用のソースが付いていたのでWindowsのC言語コンパイラ(C++ Builderのbcc32.exe)でコンパイルしてみました。
プロトタイプのワーニングを無視するオプションを付けるとコンパイラ、プリプロセッサ、アセンブラ、リンカの全てが難なくコンパイルできたのには驚きました。
(Makefileはそのまま使えませんでしたが)
コンパイラ部分はSmall Cで、二次元配列に対応していない物でした。
コンパイルして一応Windowsで動くようにはなったのですが、
C言語ライブラリはないし、開始アドレス指定の方法も分からなかったしHEXファイルを出力してバイナリ出力できないみたいでした。
ターゲットはCP/Mに対応していません。
ということでコンパイルしたものを動かすことはできませんでした。
使うにはC言語ライブラリを自作して、開始アドレスを指定する方法も見つけなければいけません。
同じSmall C系のz88dkがあるので需要はほぼないですがC言語コンパイラを作ってみたい人には参考になるかも知れません。


Windows上のCP/Mエミュレーター
当時のMSX-DOSまたはCP/M向けのC言語コンパイラを今ではCP/MエミュレーターでまるでWindows用ソフトのように動かすこともできます。
現在当時のセルフコンパイラを使うのであれば、MSXエミュレーター上ではなくて、DOS窓で動くWindowsのCP/Mエミュレーター上で開発するのがおすすめです。
DOS窓で動くCP/MエミュレーターはCP/M program EXEcutor for Win32などがあります。
コマンドラインでコンパイラだけ動いてくれればいいんです。
ディスクイメージを使用してCP/Mの内部コマンドまでエミュレートするものは正直ばかばかしくて使えないです。
わざわざCP/Mの仮想ディスク上でCP/Mのエディタを使ってテキストを書いて、CP/Mの内部コマンドでファイル操作して開発しなくていいんです。
CP/M program EXEcutor for Win32 などのDOS窓で動くCP/Mエミュレーターは、Windowsが認識している普通のハードディスクなどが仮想ディスクを介さずそのまま使え、Windowsのテキストエディタが使えます。
作ったプログラムはWindowsにコピーする作業は必要なく最初からWindows上の普通のファイルシステムに出力されています。
CP/M program EXEcutor for Win32 の使い方は、CP/M(MSX-DOS)のコマンドラインのプログラムのコマンドの前に、「cpm 」を付けるだけです。
BDS Cを例に取ると、cpm cc test.c の後に、cpm clink test で、実行ファイルのtest.COMができます。
test.COMがコマンドラインのプログラムなら、cpm test で実行できます。
もしMSX固有の機能を使っていたらMSXエミュレーター上でしか動きませんが。



MSX(Z80)のセルフコンパイラ

MSX (パソコン)


あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ