BDS C の使い方 - マシン語とのリンク(ZASM.EXE を使う)
>BDS C の使い方 - 目次
M80 編の続きです。ZCASM の準備は M80 編をご覧ください。
ザイログニーモニックのソースをアセンブルするために、MS-DOS 上で動作する、川端晃史 さんの Z80アセンブラ ZASM を使用します。CP/M の ASM.COM とほとんど同じというところが、今回の用途に都合が良いです。
ダウンロードしたら、ZASM.EXE をコンパイラと同じフォルダにコピーしておきます。
こちらもダウンロードしたら、MSDOS.EXE をコンパイラと同じフォルダにコピーしておきます。
ASM.COM と ZASM.EXE では、ソースコード記述の決まりが少し異なるので、ヘッダファイルの修正が必要です。 ZASM.EXE でアセンブルできるように、BDS.LIB 内にある
修正をして、別名で保存します。今回は BDSZASM.LIB という名前にしました。
準備はこれで終了です。
ザイログニーモニックでアセンブラの関数を作成します。インテルニーモニックの時と同じ書き方です。
アセンブル、リンクして実行します。
使用したasmfuncはインテルニーモニックの時に使用したものです。
ZASM の説明書に書いてありますが、ZASM で直接バイナリファイルを出力させると ORG 命令が複数あるとき一部のコードが出力されないので、HEX ファイルで出力させてから、 CLOAD.COM でバイナリ(CRL)に変換しています。(CLOAD.COM については、インテルニーモニック編をご覧ください)
M80 の時より ZASM のほうがすっきりしていいですね。
>BDS C の使い方 - 目次
M80 編の続きです。ZCASM の準備は M80 編をご覧ください。
必要なファイルの準備
ZASM.EXE
ザイログニーモニックのソースをアセンブルするために、MS-DOS 上で動作する、川端晃史 さんの Z80アセンブラ ZASM を使用します。CP/M の ASM.COM とほとんど同じというところが、今回の用途に都合が良いです。ダウンロードしたら、ZASM.EXE をコンパイラと同じフォルダにコピーしておきます。
MSDOS.EXE
64ビット版 Windows のコマンドプロンプトでは、MS-DOS の(16ビット)アプリケーションが動作しませんので、Windows のコマンドプロンプトで MS-DOS のエミュレーションを行う TAKEDA, toshiya さんの MS-DOS Player for Win32-x64 を使用します。こちらもダウンロードしたら、MSDOS.EXE をコンパイラと同じフォルダにコピーしておきます。
BDS.LIB の修正
ASM.COM と ZASM.EXE では、ソースコード記述の決まりが少し異なるので、ヘッダファイルの修正が必要です。 ZASM.EXE でアセンブルできるように、BDS.LIB 内にある
- page 命令を削除
- if ~ endif 命令をすべて削除
- if not cpm ~ endif ブロックは、ブロックごと削除
- if cpm ~ endif ブロックは ブロック内を残す
修正をして、別名で保存します。今回は BDSZASM.LIB という名前にしました。
準備はこれで終了です。
アセンブラで関数の作成
ザイログニーモニックでアセンブラの関数を作成します。インテルニーモニックの時と同じ書き方です。
; BDS C でマシン語とのリンクのテスト
; ザイログニーモニック
; ZASM.EXE 用
INCLUDE "BDSZASM.LIB" ; アセンブラから c.ccc (ccc.asm)
; にアクセスするのに必要なヘッダファイル
FUNCTION testfunc ; int testfunc(int a, int b)
; a + b の結果を返す関数
CALL ma1toh ; 1つ目の引数を HLとAレジスタに入れる
EX DE,HL
CALL ma2toh ; 2つ目の引数を HLとAレジスタに入れる
; 同じように 7番目の引数まで取り込める
ADD HL,DE ; HL=HL+DE
RET ; HL が返り値になる
ENDFUNC
FUNCTION di ; 割り込み禁止
DI
RET
ENDFUNC
FUNCTION ei ; 割り込み許可
EI
RET
ENDFUNC
END
TESTZASM.CZM という名前で保存しました。アセンブル、リンクして実行します。
使用したasmfuncはインテルニーモニックの時に使用したものです。
>cpm zcasm test\testzasm
BDS C CRL-format M80/L80 Preprocessor ver. 1.5
Processing the TESTFUNC function...
Processing the DI function...
Processing the EI function...
C:testzasm.MAC is ready to be assembled.
>msdos zasm test\testzasm.mac
/// ZASM /// Z-80 Assembler, MS-DOS version 1.64
Copyright (C) 1988-1994 by K.KAWABATA (Bunbun)
** Pass 1 ** Symbol table size 2000 Symbols
** Pass 2 **
0 warning(s), 0 error(s) in assembly.
>cpm cload test\testzasm
CASM Image Hex-to-Crl Converter -- v1.6
Copyright (c) 1983 William C. Colley III
C:testzasm.CRL successfully generated.
>cpm clink test\asmfunc test\testzasm
BD Software C Linker v1.60
Last code address: 0EA0
Externals start at 0EA1, occupy 0006 bytes, last byte at 0EA6
Top of memory: FDFF
Stack space: EF59
Writing output...
51K link space remaining
>cpm test\asmfunc
123 + 456 = 579
>
無事動きました。マシン語と C言語のリンクができれば、何でも出来ますね。ZASM の説明書に書いてありますが、ZASM で直接バイナリファイルを出力させると ORG 命令が複数あるとき一部のコードが出力されないので、HEX ファイルで出力させてから、 CLOAD.COM でバイナリ(CRL)に変換しています。(CLOAD.COM については、インテルニーモニック編をご覧ください)
M80 の時より ZASM のほうがすっきりしていいですね。
>BDS C の使い方 - 目次