Yamamoto's Laboratory
 
Lesson
 2.コンパイル
 
 

Lesson 2CP/Mによるコンパイル・アセンブルZ80 エミュレーター YAZE-AG

YAZE-AG の CP/M の環境を使ってプログラム開発の練習をします.C言語のサンプルプログラムは「Hello World」,アセンブリ言語は「HELLO WORLD」と鈴木哲哉著「古典電脳物語」の Tiny BASIC です.

目次


C言語

YAZE-AGには,HI Tech Soft社のCコンパイラーが,Hドライブにあります.これを使うと,C言語のプログラムの実行ファイルをつくることができます.そして,CP/M上で実行できます.

ここでは,"Hello world"のプログラムをコンパイル・実行してみましょう.

  1. まずは,適当なエディタで C 言語のソースプログラム(hello.c)

    C言語の Hello World

    #include <stdio.h>
    
    int main(void){
    
      printf("Hello world !!\n");
      return 0;
    
    }	
    を作成します.改行コードは,CR+LF とします.作成したファイルを CP/M の C ドライブにコピーします.Cドライブは,Linuxの場合には$HOME/cpm/disksort/で,WindowsではC:\yaze-ag-2.30.2\disksortとなります.
  2. 後は,YAZE-AG を起動してコンパイルするだけです.まずは,YAZEの起動です.
    $ yaze
  3. Cドライブに,ソースファイル「hello.c」があることを確認します.
    A> DIR  C:
    ちょっと分かりにくいですが,「HELLO    C」と表示されます.
  4. HI-TECH C COMPILER がある H ドライブに移動します.
    A> H:
  5. コンパイルします.
    H> C  C:HELLO.C
    最初の「C」がコンパイラーの実行命令です.実行ファイル「HELLO.COM」が H ドライブに作成されます.
  6. 実行します.
    H> HELLO
    すると,「Hello World !!」と表示されます.
  7. 実行の確認ができたら,不要のファイルを削除します.
    H> ERA  HELLO.COM

CP/M 2.2 でアセンブリ言語開発

この WEB サイト「ソフトウェア基礎コース」の目的は,アセンブリ言語で Tiny Basic を記述し,それを理解することです.そのため,アセンブリ言語の開発環境は必須です.ここでは,その練習を行います.

CP/M はいろいろなバージョンがあります.その中で,CP/M 2.2 が最も普及しました.そのため,本 WEB サイトでのアセンブリ言語の開発は,CP/M で行います.その一方,ここで使う Z80 エミュレーター YAZE-AG のデフォルトは CP/M 3.1 です.ここでは,YAZE-AG の CP/M 2.2 でアセンブリ言語の開発方法を示します.

ここでは,Intel 8080 のニーモニックを使うマクロアセンブラー MAC を使った「Hello World」プログラムを作成します.Intel 8080 のニーモニックについては,「MPU基礎システム:Lesson 8. Instruction」,マクロアセンブラー については「CP/M MAC MACRO ASSEMBLER」が参考になります.

準備

Lesson 1の「コマンド/プログラムの追加」で示した LOAD.COM と PIP.COM が必要です.これらの A ドライブにコピーするだけで準備は完了です.

プログラム開発例

先ほどの C 言語に引き続き,アセンブリ言語の HELLO WORLD のプログラムを作成・実行します.作成するプログラムは,リスト 2 の通りです.これを適当なエディターで記述します.改行コードは「CR+LF」とします.その作成したソースプログラムは,CP/M の Cドライブにコピーします(参考).プログラムの内容については,Lesson 3 の「システムコールについて」で説明します.

アセンブリ言語の HELLO WORLD (HELLO.ASM)

01   ;---------------------------------------------------
02   ; "HELLO WORLD" PROGRAM USING BDOS
03   ;---------------------------------------------------
04           ORG     100H
05   START:
06           MVI     C,09H
07           LXI     D,TEXT
08           CALL    0005H
09           RET
10   TEXT:   DB      0DH,0AH,'HELLO WORLD',0DH,0AH,'$'
11           END

ソースプログラム (HELLO.ASM) が準備できたので,それを C ドライブから A ドライブにコピーし,アセンブル・実行ファイル作成,実行を行います.具体的な手順は以下の通りです.

  1. YAZE-AG の CP/M 2.2 を起動します.
    $ yaze  -l  -1  -b  yaze.boot
  2. C ドライブにある HELLO.ASM を A ドライブにコピーします.
    A> PIP  A:HELLO.ASM=C:HELLO.ASM
  3. B ドライブにあるマクロアセンブラで,アセンブリ言語のソースプログラムからに機械語に変換します.
    A> B:MAC  HELLO
    CP/M MACRO ASSEM 2.0
    0119
    000H USE FACTOR
    END OF ASSEMBLY
    これで,インテル形式の機械語のファイル (HELLO.HEX) とアセンブラ言語 – 機械語との対応が書かれたファイル (HELLO.PRN) が作成されます.同時に作成される HELLO.SYM はシンボルテーブルが書かれています.
  4. インテル形式の機械語のファイル (HELLO.HEX) から実行ファイル (HELLO.COM)を作成します.
    A> LOAD  HELLO
    
    FIRST ADDRESS 0100
    LAST  ADDRESS 0118
    BYTES READ    0019
    RECORDS WRITTEN 01
    これで,プログラムを実行する準備ができました.
  5. 完成したプログラムを実行します.
    A> HELLO
    
    HELLO WORLD
     

これで,アセンブリ言語の開発環境が整いました.実用的なプログラムの作成方法は,Lesson 3 以降で示します.

Zilog Z80 アセンブリー言語開発

ここでは,Zilog Z80 のアセンブリー言語でのプログラム開発について,簡単に説明します.最初に,Intel 8080 形式のニーモニックで記述するアセンブラー MAC で Z80 での拡張命令 (8080にない命令) を使う方法です.引き続き,Zilog Z80 形式のニーモニックが使えるアセンブラー Z80ASM と MACRO-80 について説明します.

MAC で Z80 拡張命令を使う

マクロアセンブラ MAC は Intel 8080 のアセンブラです.Intel 8080 形式のニーモニックで記述し,それを処理すると 8080 のマシン語を生成します.Intel 8085 や Zilog Z80 はバイナリーレベルで8080 と上位互換のため,この MAC が生成するマシン語が動作します.

マクロアセンブラ MAC で 8080 には無い Z80 特有の命令(8085の拡張命令)を使う場合には,マクロライブラリー「Z80.LIB」を使います.リスト3はその例で,Z80.LIB を使い,8080には無いインデックスレジスター(IX)を使ったプログラムになっています.無理矢理,インデックスレジスターを使ったので変なプルグラムになっていますが,・・・

Z80.LIB を使った例 (HWZ80.MAC)

01   ;---------------------------------------------------
02   ; "HELLO WORLD" PROGRAM USING BDOS
03   ;---------------------------------------------------
04           ORG     100H
05           MACLIB  Z80
06   START:
07           LXIX    TEXT            ;LD   IX,TEXT
08   NEXT:   LDX     E,00H           ;LD   E,(IX)
09           MVI     C,02H           ;LD   C,02H
10           CALL    0005H
11           INXIX                   ;INC  IX
12           LDX     A,00H           ;LD   A,(IX)
13           CPI     '$'             ;CP   '$'
14           JNZ     NEXT            ;JP   NZ,NEXT
15           RET
16   TEXT:   DB      0DH,0AH,'HELLO WORLD',0DH,0AH,'$'
17           END

05行目でマクロライブラリー「Z80.LIB」を読み込んでいます.これはテキストファイルなので,マクロ命令を見ることができます.私はこのファイルのマシン語(16進数)を見て,Z80 の命令と対応を付けました.結構面倒な作業です.

  1. リスト 3 のプログラムを適当なエディタで作成します.改行コードは,「CR+LF」でなくてはなりません.加えて,ファイル名の拡張子は「ASM」でなくてはなりません.そして,前節「CP/M 2.2 でアセンブリ言語開発」と同様,完成したファイルを CP/M の A ドライブにコピーします.
  2. マクロアセンブラ MAC を使い,ソースプログラムをコンパイルします.
    A> B:MAC  HWZ80  $LB
    CP/M MACRO ASSEM 2.0
    0127
    01BH USE FACTOR
    END OF ASSEMBLY
    アセンブリパラメーター「$LB」は,マクロライブラリー「Z80.LIB」が B ドライブにあることを示しています.
  3. インテル形式の機械語のファイル (HWZ80.HEX) から実行ファイル (HWZ80.COM)を作成します.
    A> LOAD  HWZ80
    
    FIRST ADDRESS 0100
    LAST  ADDRESS 0126
    BYTES READ    0027
    RECORDS WRITTEN 01
    これで,プログラムを実行する準備ができました.
  4. 完成した実行ファイルをメモリーにロードし,実行します.
    A> HWZ80
    
    HELLO WORLD
        

マクロアセンブラで 8080 に無い命令を使うと分かり難いプログラムになります.以降に示す用に,Zilog Z80 のニーモニックを使うことを推奨します.

Zilog ニーモニックを使う

マクロアセンブラ MAC は全ての Z80 の命令が使えるものの,ニーモニックが Intel 形式であるため,Zilog のニーモニックに慣れた人には Z80 の開発には少しばかり不便です.そこで,Zilog のニーモニックを使えるアセンブラ「Z80ASM」と「MACRO-80」を紹介します.簡単なプログラム開発には Z80ASM がお勧めです.ソースファイルを分割する場合には MACRO-80 を推奨します.

Zilog Z80 のニーモニックは,「8ビット CPU Z80 命令セット」が参考になります.

Z80ASM

SLR 社の Z80ASM を使うと Zilog 形式のニーモニックで書かれた Z80 のアセンブリー言語の開発が可能です.YAZE-AG の A ドライブの「Z80ASM.DOC」には,このアセンブラの使い方が書かれています.

リスト 4 は,リスト 2 と同じ「HELLO WORLD」のプログラムを Zilog のニーモニックで記述した例です.これを Z80ASM を使い,実行ファイルを作成し,実行します.

アセンブリ言語の HELLO WORLD (HWZ80.Z80)

01   ;---------------------------------------------------
02   ; "HELLO WORLD" PROGRAM USING BDOS
03   ;---------------------------------------------------
04           ORG     100H
05   START:
06           LD      C,09H
07           LD      DE,TEXT
08           CALL    0005H
09           RET
10   TEXT:   DB      0DH,0AH,'HELLO WORLD',0DH,0AH,'$'
11           END
  1. リスト 4 のプログラムを適当なエディタで作成します.改行コードは,「CR+LF」でなくてはなりません.加えて,ファイル名の拡張子は「Z80」でなくてはなりません.そして,これまで同様,完成したファイルを CP/M の A ドライブにコピーします.
  2. Z80ASM を使い,ソースプログラムをコンパイルします.
    A> Z80ASM  HWZ80/A
    
    Z80ASM Copyright (C) 1983-86 by SLR Systems Rel. 1.32 #AB1234
    
     HWZ80/A
    End of file Pass 1
     0 Error(s) Detected.
     25 Absolute Bytes. 2 Symbols Detected.
          
    Z80ASM の引数は,「ソースファイル名/スイッチ」となっています.スイッチを「A」をすると.実行ファイルが作成されます.
  3. 完成した実行ファイルをメモリーにロードし,実行します.
    A> HWZ80
    
    HELLO WORLD
        

ここで示した Z80ASM を使うと,お手軽に Zilog 形式のニーモニックで書かれたアセンブリ言語のソースファイルから実行ファイルを作成することができます.また,Z80ASM.DOC に記載されているスイッチを選択するといろいろなファイルを作ることができます.例えば「H」を選択すると,Intel HEX Format のファイルが作成されます.

MACRO-80

Microsoft 社の MACRO-80 でも,Zilog 形式のニーモニックを使い Z80 のアセンブリー言語の開発が可能です.YAZE-AG の A ドライブには,MACRO-80 のコンパイラー M80.COM とリンカー L80.COM が含まれています.それらを使い,コンパイル → リンク の手順で実行ファイルを作ることができます.

リスト 5 も,リスト 2 と同じ「HELLO WORLD」のプログラムを Zilog のニーモニックで記述した例です.リスト 4 とは,拡張子が異なるだけです.これを MACRO-80 を使い,実行ファイルを作成し,実行します.

アセンブリ言語の HELLO WORLD (HWZ80.MAC)

01   ;---------------------------------------------------
02   ; "HELLO WORLD" PROGRAM USING BDOS
03   ;---------------------------------------------------
04           ASEG
05           ORG     100H
06   START:
07           LD      C,09H
08           LD      DE,TEXT
09           CALL    0005H
10           RET
11   TEXT:   DB      0DH,0AH,'HELLO WORLD',0DH,0AH,'$'
12           END
  1. リスト 5 のプログラムを適当なエディタで作成します.改行コードは,「CR+LF」でなくてはなりません.加えて,ファイル名の拡張子は「MAC」でなくてはなりません.そして,これまで同様,完成したファイルを CP/M の A ドライブにコピーします.
  2. M80.COM を使い,ソースプログラムをコンパイルします.
    A> M80  HWZ80,HWZ80=HWZ80/Z
    
    No Fatal error(s)
          
    M80.COM の引数は,「RELファイル名,PRNファイル名=ソースファイル名/スイッチ」となっています.REL ファイルはリロケータブルのオブジェクトファイル,PRN ファイルはリストファイルです.「Z」は Zilog Z80 のニーモニックをアセンブル時のスイッチです.Intel 8085 のニーモニックをアセンブルするときは「I」(デフォルト)とします.
  3. オブジェクトファイルは一つですが,リンカーを使い実行ファイルを作成します.
    A> L80  HWZ80,HWZ80/E/N
    
    Link-80  3.44  09-Dec-81  Copyright (c) 1981 Microsoft
    
    Data    0100    0119    <   25>
    
    49185 Bytes Free
    [0000   0119        1]
          
    L80.COM の引数は,「リンクするオブジェクトファイル名,実行ファイル名/スイッチ」です.カンマで区切ることにより,複数のオブジェクトファイルを指定できます.スイッチ「E」はリンク後は CPM に戻る,「N」は完成した実行ファイルをディスクに保存する — を表しています.
  4. 完成した実行ファイルをメモリーにロードし,実行します.
    A> HWZ80
    
    HELLO WORLD
        

ここで使った MACRO-80 は強力で,複数のソースファイルからひとつの実行ファイルを作成することができます.

Tiny BASIC のアセンブルと実行

次に,CP/M 2.2 を使って,Intel 8080 形式のニーモニックで記述されたアセンブリ言語で書かれた Tiny BASIC の実行ファイルを作成し,それを実行します.「CP/M 2.2 でアセンブリ言語開発」で示した CP/ 2.2 の実行環境が整っている必要があります.

ソースファイルの準備

この WEB サイトでの最終的な目標は「Tiny BASIC を理解する」ことです.ここでは,その理解の前にのアセンブラ言語のソースコードをアセンブルし,実行します.そのソースは,古典電脳物語-80系プログラムの開発の 80 系プログラム開発のページにあります.そこにある「TBCPM.zip」を使います.これは,鈴木哲哉著「古典電脳物語」の Tiny BASIC のソースです.この書籍は,かなりおもしろいのでお勧めです.

実行ファイルの作成

鈴木哲哉さんの Tiny BASIC をダウンロードし,実行ファイルを作成します.

  1. TBCPM.zip」をダウンロードをダウンロードします.そして,ダウンロードしたディレクトリーに移動し,解凍します.
    $ unzip  TBCPM.zip
  2. するといろいろなファイルが現れます.その中の Tiny Basic のソースファイル「TBCPM.ASM」を CP/M の C ドライブにコピーします.
    $ cp  TBCPM.ASM  $HOME/cpm/disksort
  3. CP/M環境でアセンブリ言語環境の開発を進めるために,YAZE-AG の CP/M 2.2 を起動します.
    $ yaze  -l  -1  -b  yaze.boot
  4. C ドライブにあるソースファイル「TBCPM.ASM」を A ドライブにコピーします.
    A> PIP  A:TBCPM.ASM=C:TBCPM.ASM
  5. アセンブリ言語のソースファイル「TBCPM.ASM」をマクロアセンブラー MAC アセンブルします.
    A> MAC  TBCPM
    CP/M MACRO ASSEM 2.0
    8014
    00AH USE FACTOR
    END OF ASSEMBLY
    コマンドタイプ後は,マクロアセンブラのバージョン,????,???,終了メッセージが表示されます.そして,Intel HEXフォーマットの機械語ファイル「TBCPM.HEX」が出来上がります.
  6. 次に,実行ファルを作成します.
    A> LOAD  TBCPM
    
    FIRST ADDRESS 0100
    LAST  ADDRESS 08E0
    BYTES READ    07E1
    RECORDS WRITTEN 10
    コマンドタイプ後は,マシン語の最初のアドレス,最後のアドレス,バイト数,フロッピーディスクのページ数 (128 Byte/page) が表示されます.いずれも 16 進数が表示されます,そして,実行ファイル「TBCPM.COM」が出来上がります.

以上の処理で,アセンブリ言語で書かれた Tiny BASIC の実行ファイルが出来上がります.

プログラムの実行と終了

せっかくなので,Tiny BASIC でプログラムを実行しましょう.ここでは,お約束の Hello World のプログラムを実行します.これだと,BASIC のプログラムは 1 行なので,つまらないものになってしまいます.そこで,Hello World を 5 回連続で表示させます.

作成したプログラムはCP/M 2.2 で実行します.CP/M 3.1 では,SYSTEM コマンドがフリーズします.

  1. 次に,先ほど作成した実行ファイル「TBCPM」(Tiny BASIC) を起動します.
    A>TBCPM
    
    PALO ALTO TINY BASIC
    PORTABLE 8080 VERSION
    CP/M EDITION
    
    OK
    以上で起動完了で,Tiny BASIC の入力待ち状態になります.
  2. 次にプログラムを書きます.Tiny BASIC のコマンド入力状態で直接プログラウを入力します.
    >10 FOR I=1 TO 5
    >20 PRINT I, " HELLO WORLD !!"
    >30 NEXT I
    コマンド「LIST」をタイプするとプログラムリストが表示されます.プログラムに間違いが有れば,行番号から再度入力します.行を削除するには行番号のみをタイプします.
  3. プログラムの入力が完了したら,コマンド「RUN」でプログラムが実行されます.
    A>RUN
         1 HELLO WORLD !!
         2 HELLO WORLD !!
         3 HELLO WORLD !!
         4 HELLO WORLD !!
         5 HELLO WORLD !!
    
    OK
  4. Tiny BASIC の終了は,コマンド「SYSTM」をタイプします.
    A> SYSTEM
    これで,CP/Mの入力待ちになります.

ページ作成情報

参考資料

  1. YAZE の WEB サイト
  2. 村瀬康治 著「応用 CP/M」, アスキー出版局, 1988年
  3. 古典電脳物語―8085,Z80,CP/M,タイニーBASIC…
    鈴木 哲哉
    4899771614

更新履歴

2014年10月12日 ページの新規作成
2014年11月01日 「CP/M 2.2 でアセンブリ言語開発」を記述.


no counter