CPM.EXE for Win32 で HI-TECH C を使う (original) (raw)
概要
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 中のものです。
上のページから、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 にパッチをあて、終了コード領域をクリアしないようにします。具体的には 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)(CC) (CC)(CFLAGS) -c $*.c
.as.obj: (AS)(AS) (AS)(ASFLAGS) $*.as
CPM.EXE に同梱のユーティリティ(RCCP と 4Gclock)も、アセンブラのプログラムですが make 一発でビルドできます。 配布セットの utl ディレクトリで make (または nmake)してください。