SMALL C/Plus v1.0

Z80のアセンブリ言語を出力するコンパイラとアセンブラ、リンカとオプチマイザを持っています。

このツールの入手は http://www.cpm.z80.de/ の下の所からできます。

FIG1.jpg(12492 byte)

フリーで配布されていたHITECH-CのCP/M80版は現在(2007.12.25)はサイトから無くなってい るようですから入手可能なCP/M80のZ80版のCコンパイラとして取り上げてみます。

 
   使い方

FIG2.jpg(13258 byte)

コンパイラが CC0.COM 、アセンブラが ZMAC.COM 、リンカが ZLINK.COM 、オプチマイザが ZOPT.COM です。 これらを下のように CP/Mエミュレータ を使って tests.c の実行プログラムの TESTS.COM を得ます。

ZRES.COMCLIB.LIB から TESTS.C が必要とするもの抜き出して CLIB.OBJ を作っているようです。 リンカでは拡張子が OBJ のファイルをリンクしています。




FIG3A.jpg(42665 byte)

FIG3B.jpg(51949 byte)

FIG3C.jpg(44002 byte)

FIG3D.jpg(59606 byte)


各プログラムの使い方は付属のドキュメントファイルを参照してください。

FIG4.jpg(18107 byte)

TESTS.COM
BIN2HEX TESTS.COM 100 > TESTS.HEX
でインテルへクスファイルに変換してCPMアダプタの動いているメモリモニタの基板に転送します。 これを実行したものが左です。
最初にファイル操作のシステムコールを発行しているようです。
また本コンパイラの出力するプログラムはコンソールの入力に対してエコーを返さないようなので 通信プログラムの local echo を有効にしないと入力する文字が見えなくなります。



 
   インラインアセンブラ

FIG5.jpg(20417 byte)

Z80のアセンブリ言語でのインラインアセンブラが使えます。
左は hello world!! の後にコンソールから "N" の入力を待って次を続けるプログラムです。
インラインアセンブラの中では #define 文などで定義された定数は使えないようでした。


 
   IO直接操作

FIG6.jpg(21094 byte)


printf 文などを使わずに直接IOを操作して文字列を送信するプログラムを書いてみました。 プログラム上では必要ないのですがコンパイルの次のアセンブルで未定義エラーがでるので stdio .h はいかなる場合も必要とするようです。 インラインアセンブラではローカル変数の位置がわからないのでグローバル変数を使いました char a はコンパイラのアセンブリ言語の出力を見ると qa になっているようです。

FIG7.jpg(17051 byte)

組み込み用途のコンパイラでなければシステムコールを使っていないようなプログラムでも バージョン番号などの取り出しのシステムコールはほぼ行っていると思って間違いありません。 他にシステムコールを呼び出すときのBDOSの位置でシステムのメモリの大きさを判定している場合などもあります。 CP/Mのないところで実行させることも難しいこではありませんがシステムコールやBIOSの直接の呼び出しにも少しですが対応する必要もあります。 このプログラムの大きさは 3.75K バイトでした。