2014年9月13日土曜日

BDS C の使い方 - マシン語とのリンク(M80.COM を使う)

>BDS C の使い方 - 目次

インテルニーモニック編の続きです。M80 の代わりに ZASM.EXE を使う例もご覧ください。

必要なファイルの準備


M80.COM L80.COM

ザイログニーモニックのソースをアセンブルするために、CP/M で動くマイクロソフト社のアセンブラ M80.COM と、リンカ L80.COM が必要になりますので、なんとか入手してください。(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 をコンパイラのあるフォルダにコピーしておきます。

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 のシンボルフィールド(ラベル)末尾の コロン ':' を削除
  • dsdb のラベルの末尾の コロン ':' の付いていないところに コロン ':' を追加
  • 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 の使い方 - 目次