ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
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
|
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
|
8056 21D8FF LD HL,ZFFD8 |