標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第565回]
●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と同じように実行することができます。
本日もまた時間がなくなってしまいました。
この続きは次回にすることにいたします。
2010.7.27upload
前へ
次へ
ホームページトップへ戻る