BDS C の使い方 - マシン語とのリンク(M80.COM を使う)
>BDS C の使い方 - 目次
インテルニーモニック編の続きです。M80 の代わりに ZASM.EXE を使う例もご覧ください。
windows 用の Z80 アセンブラでも試してみましたが、BDS C でうまくリンクできませんでした M80.COM L80.COM の代わりに、MS-DOS版の ZASM.EXE を使うことが出来ました。そちらもご覧ください。)
http://www.retroarchive.org/ さんの CP/M のページで M80.COM と L80.COM をダウンロードできるようになっているのですが、ライセンスについての記述を見つけることが出来ませんでした。
今回は MSX-DOS TOOLS に入っている物を使用しました。持っててよかった MSX-DOS TOOLS。
M80.COM L80.COM をコンパイラのあるフォルダにコピーしておきます。
bsdc160\ZCASM.LBR ZCASM のソースコードなどが入っているアーカイブファイル
bsdc160\LDIR.COM .LBR ファイルの内容を表示するツール
bsdc160\LBREXT.COM .LBR ファイルから内容を取り出すツール
extra\BDSCIO.H BDS C 1.5 のヘッダファイル(ZCASMのコンパイルに必要)
extra\DEFF15.CRL BDS C 1.5 のライブラリ(ZCASMのコンパイルに必要)
をコンパイラのあるフォルダにコピーします。
まず ZCASM.LBR の中にどんなファイルが入っているか見てみます。
ZCASM.LBR を解凍します。
解凍されたファイルに ZCASM.COM が含まれていますが、古いバージョンなので削除して、ZCASM15.C をコンパイルして新しく作ります。
ASM.COM と M80.COM では、ソースコード記述の決まりがすこし異なるので、ヘッダファイルの修正が必要です。 M80.COM でアセンブルできるように、BDS.LIB 内にある
して、別名で保存します。今回は BDSZ.LIB という名前にしました。
ザイログニーモニックでアセンブラの関数を作成します。インテルニーモニックの時と同じ書き方です。
使用したasmfuncはインテルニーモニックの時に使用したものです。
L80 でオーバーラップの警告が出ていますが、出力ファイル先頭に L80 が生成するジャンプ命令と、CRL ファイルのディレクトリデータのアドレスが重複す為だと思います。バイナリエディタで生成された CRL ファイルを見てみると正しい値になっているので、異常無いと思います。
L80 のマニュアルを見ても、L80 では実行ファイル先頭のジャンプ命令を、生成しないように指定できないようでした。
>BDS C の使い方 - 目次
インテルニーモニック編の続きです。M80 の代わりに ZASM.EXE を使う例もご覧ください。
必要なファイルの準備
M80.COM L80.COM
ザイログニーモニックのソースをアセンブルするために、CP/M で動くマイクロソフト社のアセンブラ M80.COM と、リンカ L80.COM が必要になりますので、なんとか入手してください。(http://www.retroarchive.org/ さんの CP/M のページで M80.COM と L80.COM をダウンロードできるようになっているのですが、ライセンスについての記述を見つけることが出来ませんでした。
今回は MSX-DOS TOOLS に入っている物を使用しました。持っててよかった MSX-DOS TOOLS。
M80.COM L80.COM をコンパイラのあるフォルダにコピーしておきます。
ZCASM.COM
CASM.COM のザイログニーモニック用である、ZCASM.COM のソースコードがBDS C のアーカイブに含まれているので、BDS C でコンパイルしてバイナリを作成します。bsdc160\ZCASM.LBR ZCASM のソースコードなどが入っているアーカイブファイル
bsdc160\LDIR.COM .LBR ファイルの内容を表示するツール
bsdc160\LBREXT.COM .LBR ファイルから内容を取り出すツール
extra\BDSCIO.H BDS C 1.5 のヘッダファイル(ZCASMのコンパイルに必要)
extra\DEFF15.CRL BDS C 1.5 のライブラリ(ZCASMのコンパイルに必要)
をコンパイラのあるフォルダにコピーします。
まず ZCASM.LBR の中にどんなファイルが入っているか見てみます。
>cpm ldir zcasm
Library File = zcasm .LBR
Name Length Method Cre Date Mod Date Comments
============ ============ ======== ==================== =================
ZCASM .CZ 90r 11.25k Crunched 17 Feb 89 17 Feb 89 (--> ZCASM.C )
ZCASM .CZM 90r 11.25k Crunched 17 Feb 89 17 Feb 89 (--> ZCASM.COM)
ZCASM .DZC 29r 3.62k Crunched 17 Feb 89 17 Feb 89 (--> ZCASM.DOC)
ZCASM .SUB 1r 0.12k -- 17 Feb 89 17 Feb 89
ZCASM15 .CZ 97r 12.12k Crunched 16 Oct 89 16 Oct 89 (--> ZCASM15.C )
ZCASM.LBR を解凍します。
>cpm lbrext zcasm *.* U
File: ZCASM.CZ (02/17/89) ---> B0:ZCASM.C
File: ZCASM.CZM (02/17/89) ---> B0:ZCASM.COM
File: ZCASM.DZC (02/17/89) ---> B0:ZCASM.DOC
File: ZCASM.SUB (02/17/89) ---> B0:
File: ZCASM15.CZ (10/16/89) ---> B0:ZCASM15.C
解凍されたファイルに ZCASM.COM が含まれていますが、古いバージョンなので削除して、ZCASM15.C をコンパイルして新しく作ります。
>cpm cc zcasm15
BD Software C Compiler v1.60 (part I)
20K elbowroom
BD Software C Compiler v1.60 (part II)
23K to spare
>cpm clink zcasm15 deff15 <-- BDS C V1.5のライブラリを指定するのを忘れない
BD Software C Linker v1.60
Last code address: 5A70
Externals start at 5A71, occupy 256F bytes, last byte at 7FDF
Top of memory: FDFF
Stack space: 7E20
Writing output...
32K link space remaining
>del zcasm.com
>ren zcasm15.com ZCASM.COM
>cpm zcasm
BDS C CRL-format M80/L80 Preprocessor ver. 1.5
Usage: zcasm [-c] [-o <name>] <filename>
-C: don't strip comments from input and output
-O <name>: Call the output file <name>.MAC
ZCASM.COM の V1.5 が出来上がりました。BDS.LIB の修正
ASM.COM と M80.COM では、ソースコード記述の決まりがすこし異なるので、ヘッダファイルの修正が必要です。 M80.COM でアセンブルできるように、BDS.LIB 内にある
- equ のシンボルフィールド(ラベル)末尾の コロン ':' を削除
- ds と db のラベルの末尾の コロン ':' の付いていないところに コロン ':' を追加
- if not cpm のブロック内をコメントアウト
して、別名で保存します。今回は BDSZ.LIB という名前にしました。
↓ equ 命令のシンボル(ラベル)から コロン ':' を全部削除する
base: equ 0000h ;either 0 or 4200h for CP/M systems
fcb: equ base+5ch ;default file control block
tbuff: equ base+80h ;sector buffer
↓ ds と db 命令のシンボル(ラベル)に コロン ':' をつける
errnum: ds 1 ;error code from file I/O operations
rseed: ds 8 ;the random generator seed
args: ds 14 ;"arghak" puts args passed on stack here.
↓ この三行をコメントアウトする
if not cpm
;CCCORG EQU WHATEVER ;if not runninng under cp/m, set this to load addr,
;RAM EQU WHATEVER2 ;set this to address of CCC's ram area
;BASE EQU WHATEVER3 ;and this to the base of system memory (`base' is
;the re-boot location under cp/m; for non-cp/m oper-
;ation, it should be set to a safe place to jump to on
;error or user-abort.
endif
M80のマニュアルを見ても文法合ってるようなんだけど、アセンブルされてしまってラベルの二重定義になってしまう
準備はこれで終了です。アセンブラで関数の作成
ザイログニーモニックでアセンブラの関数を作成します。インテルニーモニックの時と同じ書き方です。
; BDS C でマシン語とのリンクのテスト
; ザイログニーモニック
; M80.COM と L80.COM が必要
.Z80 ; M80 に Z80 命令セットモードを指示
ASEG ; PC絶対モード
; ソースの先頭に必要なので、忘れないように注意
INCLUDE "BDSZ.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
アセンブル、リンクして実行してみました。使用したasmfuncはインテルニーモニックの時に使用したものです。
>cpm zcasm test\testfunc
BDS C CRL-format M80/L80 Preprocessor ver. 1.5
Processing the TESTFUNC function...
Processing the DI function...
Processing the EI function...
C:testfunc.MAC is ready to be assembled.
>cpm m80 = test\testfunc
No Fatal error(s)
>cpm l80 test\testfunc, test\testfunc.crl/n/e
MSX.L-80 1.00 01-Apr-85 (c) 1981,1985 Microsoft
%Overlaying Program area
Data 0100 069C < 1436>
52376 Bytes Free
[0000 069C 6]
>cpm clink test\asmfunc test\testfunc
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言語のリンクができれば、何でも出来ますね。L80 でオーバーラップの警告が出ていますが、出力ファイル先頭に L80 が生成するジャンプ命令と、CRL ファイルのディレクトリデータのアドレスが重複す為だと思います。バイナリエディタで生成された CRL ファイルを見てみると正しい値になっているので、異常無いと思います。
L80 のマニュアルを見ても、L80 では実行ファイル先頭のジャンプ命令を、生成しないように指定できないようでした。
>BDS C の使い方 - 目次