ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.1
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆Z80アセンブラとZ80逆アセンブラ
ND80ZVには8080アセンブラのほかにZ80アセンブラとZ80逆アセンブラが附属しています。
そのZ80アセンブラ、Z80逆アセンブラの紹介です。

[第80回]

●ZASM.COM(Z80アセンブラ)

前回は8080アセンブラで作成したバイナリファイルsound6.binを読み込んで、Z80逆アセンブラZDAS.COMで、Z80アセンブラ用のソースプログラムファイルsound6.dtxを逆作成しました。

sound6.binには8080のマシン語命令とは関係のない、音階データが含まれているのですが、Z80逆アセンブラZDAS.COMは、その音階データも強引にZ80の命令に翻訳してしまいました。
Z80逆アセンブラプログラムでは、そのコードがマシン語の命令なのかそうではないデータなのかを区別することはできませんから、とにかくすべてがZ80の命令コードだと判断して、Z80のニーモニックに翻訳してしまいますが、それは仕方のないことなのです。

しかし、そのように、いわば間違って命令ではないものまで、Z80の命令として翻訳してしまって作成されたソースプログラムが、果たしてZ80アセンブラでエラー無くバイナリファイルを生成することができるでしょうか?

Z80アセンブラで試してみましょう。
Z80アセンブラは、ZASM.COMです。これも私が自分で作ったオリジナルのアセンブラプログラムです。
すでに紹介しました、ASM80.COM(8080アセンブラ)、ZDAS.COM(Z80逆アセンブラ)とともに、ND80ZV組立キットの附属ソフトウェアとしてCDROMで供給する予定です。

sound6.dtxをZASM.COMにかけるとバイナリファイルsound6.binが作成されます。
今回の作業のもとになった、ASM80.COM(8080アセンブラ)で作成したsound6.binと同じファイル名ですから、もとのファイルを新しいファイルで上書きしてしまいます。

同じファイル名で上書きされないように、前回同様、ren(rename)コマンドでsound6.dtxを別の名前に書き換えます。

dirコマンドで確認してみました。

ZASM.COMを実行します。

zasm sound6_2.dtz[Enter]と入力しました。
実行の結果を確認するためにdirコマンドで確認しました。
sound6_2.binファイルが作成されました。

あれ?
ちょっとおかしいです…。
オリジナルのsound6.binは87バイトなのに、ZASM.COMの実行によって新しく作成されたsound6_2.binは89バイトです。
むむ。2バイト、多いではないか?

なにはともあれ、リストを見て確認してみることにしましょう。
sound6_2.binと一緒に作成された、sound6_2.lstです。

2010/7/26  6:25  sound6_2.dtx
END=8058
                    ORG $8000
                    Z0247=$0247
                    Z2C2F=$2C2F
                    Z384B=$384B
                    ZFFD8=$FFD8
8000 CD4702   Z8000:CALL Z0247
8003 3C             INC A
8004 CA0080         JP Z,Z8000
8007 3D             DEC A
8008 CD0E80         CALL Z800E
800B C30080         JP Z8000
800E F5       Z800E:PUSH AF
800F E5             PUSH HL
8010 D5             PUSH DE
8011 C5             PUSH BC
8012 213F80         LD HL,Z803F
8015 85             ADD A,L
8016 6F             LD L,A
8017 46             LD B,(HL)
8018 1E1A           LD E,1A
801A 50       Z801A:LD D,B
801B 3EEF           LD A,EF
801D D398           OUT (98),A
801F E5       Z801F:PUSH HL
8020 E5             PUSH HL
8021 E1             POP HL
8022 E1             POP HL
8023 00             NOP
8024 15             DEC D
8025 C21F80         JP NZ,Z801F
8028 50             LD D,B
8029 3ECF           LD A,CF
802B D398           OUT (98),A
802D E5       Z802D:PUSH HL
802E E5             PUSH HL
802F E1             POP HL
8030 E1             POP HL
8031 00             NOP
8032 15             DEC D
8033 C22D80         JP NZ,Z802D
8036 1D             DEC E
8037 C21A80         JP NZ,Z801A
803A C1             POP BC
803B D1             POP DE
803C E1             POP HL
803D F1             POP AF
803E C9             RET
803F 7F       Z803F:LD A,A
8040 77             LD (HL),A
8041 71             LD (HL),C
8042 6A             LD L,D
8043 5F             LD E,A
8044 59             LD E,C
8045 54             LD D,H
8046 4F             LD C,A
8047 47             LD B,A
8048 43             LD B,E
8049 3F             CCF
804A 3B             DEC SP
804B 35             DEC (HL)
804C 322F2C         LD (Z2C2F),A
804F 25             DEC H
8050 27             DAA
8051 2A4B38         LD HL,(Z384B)
8054 64             LD H,H
8055 23             INC HL
8056 21D8FF         LD HL,ZFFD8
Z0247        =0247  Z2C2F        =2C2F  Z384B        =384B  
Z8000        =8000  Z800E        =800E  Z801A        =801A  
Z801F        =801F  Z802D        =802D  Z803F        =803F  
ZFFD8        =FFD8  

このリストのどこがオリジナルのsound6.binと異なっているのか、それを確認するために、オリジナルのリストsound6.lstと比較してみましょう。
sound6.lstは前回もお見せしましたが、もう一度、再掲いたします。

2010/7/20  21:25  sound6.txt
END=8056
              ;;;SOUND6.TXT
              ;;; sound for ND80Z3 clock=6MHz
              ;;; 10/3/18 10/6/15 7/20
              ;;;
              	ORG $8000
              ;
              	KEY=$0247
              ;
8000 CD4702   SND:CALL KEY
8003 3C       	INR A
8004 CA0080   	JZ SND
8007 3D       	DCR A
8008 CD0E80   	CALL SNDSB
800B C30080   	JMP SND
              ;
800E F5       SNDSB:PUSH PSW
800F E5       	PUSH H
8010 D5       	PUSH D
8011 C5       	PUSH B
8012 213F80   	LXI H,SNDTBL
8015 85       	ADD L
8016 6F       	MOV L,A
8017 46       	MOV B,M
8018 1E1A     	MVI E,1A
801A 50       SNDS1:MOV D,B
801B 3EEF     	MVI A,EF;sp out=H,DMAoff
801D D398     	OUT 98
801F E5       SNDS2:PUSH H;11---------
8020 E5       	PUSH H;11       | 11+11+10+10+4+4+10=60
8021 E1       	POP H;10        | 60/6=10
8022 E1       	POP H;10        |
8023 00       	NOP;4;          | 10microsec
8024 15       	DCR D;4         |
8025 C21F80   	JNZ SNDS2;10----
8028 50       	MOV D,B
8029 3ECF     	MVI A,CF;sp out=L,DMAoff
802B D398     	OUT 98
802D E5       SNDS3:PUSH H;11---------
802E E5       	PUSH H;11       | 11+11+10+10+4+4+10=60
802F E1       	POP H;10        | 60/6=10
8030 E1       	POP H;10        |
8031 00       	NOP;4;          | 10microsec
8032 15       	DCR D;4         |
8033 C22D80   	JNZ SNDS3;10----
8036 1D       	DCR E
8037 C21A80   	JNZ SNDS1
803A C1       	POP B
803B D1       	POP D
803C E1       	POP H
803D F1       	POP PSW
803E C9       	RET
              ;
              ; SOUND TABLE
803F 7F       SNDTBL:DB 7F;so4
8040 77       	DB 77;so#4
8041 71       	DB 71;ra4
8042 6A       	DB 6A;ra#4
8043 5F       	DB 5F;do5
8044 59       	DB 59;do#5
8045 54       	DB 54;re5
8046 4F       	DB 4F;re#5
8047 47       	DB 47;fa5
8048 43       	DB 43;fa#5
8049 3F       	DB 3F;so5
804A 3B       	DB 3B;so#5
804B 35       	DB 35;ra#5
804C 32       	DB 32;si5
804D 2F       	DB 2F;do6
804E 2C       	DB 2C;do#6
804F 25       	DB 25;mi6
8050 27       	DB 27;re#6
8051 2A       	DB 2A;re6
8052 4B       	DB 4B;mi5
8053 38       	DB 38;ra5
8054 64       	DB 64;si4
8055 23       	DB 23;fa6
8056 21       	DB 21;fa#6
              ;END
KEY          =0247  SND          =8000  SNDS1        =801A  
SNDS2        =801F  SNDS3        =802D  SNDSB        =800E  
SNDTBL       =803F 

おわかりいただけましたでしょうか?
オリジナルのsound6.lstではプログラムの最後は21で終わっています。
ここは繰り返し説明しましたように、マシン語の命令ではなくて、音階データテーブルの最後のデータです。

ではsound6_2.lstの同じところを見てみましょう。

8056 21D8FF         LD HL,ZFFD8

8056は21なのですが、その後ろにオリジナルにはなかった余計な2バイトがついています。
なぜこのようなおかしなことになってしまったのでしょうか?

その原因は、音階データテーブルを逆アセンブルしたことにあります。
アドレス8056のデータ21はただのデータで、命令コードではないのですけれど、Z80アセンブラはこの21を命令コードだと解釈してZ80ニーモニックに翻訳しようとします。
Z80の命令コードで21はLD HL命令です。
LD HL命令は3バイト命令ですから、その後ろに2バイトのデータ部があります。
オリジナルのバイナリファイルsound6.binの最後のデータは21で終わっているのですが、Z80逆アセンブラは、それをLD HL命令だと判断するために、強引にその後ろの2バイトのデータ(これはバイナリファイルと無関係の入力バッファにもとからあったデータです)を持ってきてしまったのです。
それがオリジナルのsound6.binよりも、あらたに作られたsound6_2.binのほうが2バイト多くなってしまった理由です。

そのほかの部分はsound6.binとsound6_2.binとでは全く同じですから、sound6_2.binをND80ZVにLOADしても、sound6.binと同じように実行することができます。

本日もまた時間がなくなってしまいました。
この続きは次回にすることにいたします。
CPUをつくろう!第565回(2010.7.27upload)を再編集

ワンボードマイコンをつくろう![第80回]
2011.7.1upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る