2014年9月15日月曜日

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

>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 の使い方 - 目次