CPM.EXE for Win32 で HI-TECH C を使う

2012年10月

概要

HI-TECH C は、HI-TECH SoftWare社の C コンパイラです。幾つかの CPU 用のものがありますが、これらのルーツともいえる Z80 CP/M 版が今ではフリーソフトとして配布されています。これと CP/M エミュレータを併用すれば、Z80 をターゲットとする C 言語+アセンブラの手軽なクロス開発環境が手に入ります。

(2012/10追記) HI-TECH Software 社はマイクロチップ社に買収され、HI-TECH C は PIC 専用コンパイラになってしまったようです。Z80版も本家からはダウンロードできなくなっています。下記は Walnut Creek CP/M CD-ROM online 中のものです。

HI-TECH Z80 CP/M C Compiler

上のページから、z80v309.exe(DOS の自己解凍ファイル)をダウンロードして適当なディレクトリに展開すれば、そこでコンパイルができるようになります。

CPM.EXE の DOS 版では、このように HI-TECH C のディレクトリで作業せざるを得ませんが、Win32 版では別のソースディレクトリ上で作業することができるようになりました。また DOS/UNIX と同様に make ユーティリティと併用して「make 一発」でアプリケーションをビルドすることもできます。

このページでは、Win32 版で快適なコンパイル環境を構築する方法を紹介します。

環境設定

まず CPM.EXE を、PATH の通ったディレクトリに置いておきます。例えば C:\bin に他の Win32 コマンドラインツールと一緒においておくのが良いでしょう。

次に、HI-TECH C を展開するディレクトリ(例えば C:\bin\cpm\hitech)を作成し、そこでダウンロードした z80v309.exe を実行します。中身はカレントディレクトリに展開されます。このディレクトリを環境変数 CPMPATH で指定するサーチパスに加えます。

これで、どのディレクトリからでも、以下のように HI-TECH C コンパイラを実行できるようになります。

cpm c hello.c

なお、DOS 版 CPM.EXE では、ソースファイルに最後に 1Ah(^Z)を入れて置かないとコンパイルエラーになってしまう場合がありましたが、Win32 版ではその必要はありません。ファイル読み出し時、最後のレコードが 128 バイトに満たない場合、自動的に 1Ah を補うようになりました。

$EXEC.COM にパッチを当てる

HI-TECH C 80 でコンパイルしたプログラムは CPM.EXE の -h オプションつきで実行することで終了コードを返すことができます。 これは HI-TECH C 80 プリプロセッサ (CPP.COM) やコンパイラ本体 (CGEN.COM) リンカ (LINK.COM) も同じです。

しかし、残念なことにコンパイラドライバ (C.COM) は、いつでも成功 0 しか返しません。このため Makefile 中で cpm -h c prog.c などとした場合、コンパイルエラーが起こっても make を中断することができませんでした。

そこで、C.COM から呼ばれて実際にプリプロセッサ・コンパイラ本体・リンカ等を実行する $EXEC.COM にパッチをあて、終了コード領域をクリアしないようにします。具体的には $EXEC.COM の 1BBh バイト目から3バイトを 00h (NOP) にします。

バイナリエディタをお持ちならそれを使うのが簡単ですが、なければ ZSID や DDT とCPM.EXE に付属の RCCP を使ってパッチを当てることもできます。

なお、CPM.EXE には、ZSID と RCCP を使って上記パッチを当てるための入力ファイル patch$exec.txt も同梱しています。これを使用する場合は以下のように入力をリダイレクトします。

cpm rccp <patch$exec.txt

make を使う

まず、未だ持っていないなら Win32 用 make ユーティリティを入手します。大抵の場合 C コンパイラに付属していると思います。VC++ 付属の make は nmake という名前です。

後は以下のような定義を追加した Makefile を作成すれば make 一発で Z80 プログラムをビルドできます。

.SUFFIXES:	.c .obj .as .lib

LIBR	= cpm -h libr
AS	= cpm -h zas
CC	= cpm -h c
LINK	= cpm -h link
OBJHEX	= cpm -h objtohex

CFLAGS = -O -x
AFLAGS = -j

.c.obj:
	$(CC) $(CFLAGS) -c $*.c

.as.obj: 
	$(AS) $(ASFLAGS) $*.as

CPM.EXE に同梱のユーティリティ(RCCP と 4Gclock)も、アセンブラのプログラムですが make 一発でビルドできます。 配布セットの utl ディレクトリで make (または nmake)してください。