YouTube に ZCCで "Hello, world" する動画を上げました。
"Hello, world" under CP/M-8000
ZCCを使ってみて気づいた注意点を上げておきます。なにせK&R時代の古いCコンパイラなので、今の感覚でコードを書くと、思わぬところでエラーの嵐に遭遇します。
・=- に注意
「x=-1」 は、「x = -1」ではなく「x -= 1」に解釈されます。コンパイル時にwarningがでますが、オブジェクトファイルが出力されリンクも正常にできるので注意が必要です。実行してみて意図した動作をしないことで気づきましたが、理由がわからずしばらく悩みました。 かなり古い(K&R以前?)の書き方のようです。
・関数のプロトタイプ宣言に引数の型を含めない & 戻り値がなくても int で宣言
これもかなりハマりました。次のように宣言します。
int foo(a, b);
foo(a, b) int a, b;
{
/* 戻り値なしの処理 */
}
・unsigned char が使えない?
unsigned int は使えるのですが、unsigned char はサポートしていないようです。
・関数名、ラベル名、変数名は8文字まで
Cコンパイラは名前の前に "_" をつけるので、実質使えるのは7文字です。それ以上の文字は無視されるので、気を付けないと違う名前を付けたのに同じと判別されてしまいます。アセンブラとリンカが8文字までしかとらない仕様なので、これは仕方ありません。
・コンパイラの -D オプションが働かない
これは、The Unofficial CP/M Web Siteに書かれていました。試したところ本当に働きません。ヘッダファイルに、#define で定義しておく必要があります。
・コンパイラのオプションがわからない
ZCCのドキュメントが失われているようで、コンパイラーに指定できるオプションがわかりません。今のところわかっているのは、上の働かない-Dぐらいです。CP/M-68KのCコンパイラにはドキュメントが残っているようなので、参考になるかもしれません。
・改行コードと終端コードに注意
改行コードがCR+LFで、テキストがEOFで終端されていないとエラーに悩まされます。これはZCCというよりCP/Mの仕様なのですが、意味のわからないエラーメッセージがでるので悩まされます。CP/M上でコードを編集する場合は大丈夫ですが、LinuxやWindows上で編集している場合に問題になります。改行コードは指定しておけば問題ないのですが、末尾にEOFをいれてくれるエディターはないようなので、意図的に入れる必要があります。VimだとCtrl+Zで入れられます。EOFのあとにテキストが入っていても無視されます。
癖がわかってくると、ZCCは結構使える気がします。アセンブリ言語で書くよりは格段に楽ですから、多少の制約は我慢できます。