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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第179回]


●Z80逆アセンブラ改良版についてのお知らせ

前回書きましたように、ND80ZVに附属しておりますZ80逆アセンブラ(ZDAS.COM)は、4KB程度しか逆アセンブルできませんでしたので、それを改良して20KBを超えるような大きなマシン語プログラムファイル(バイナリファイル)でも逆アセンブルできるようにしました。

過去にND80ZV組立キットをご購入いただいた方には、ご希望でしたら、改良版のZ80逆アセンブラ(ZDAS.COM)をお送りしますので、メールにてお申し込みください(もちろん無償です)。
折り返しメール添付にてお送りします。
なお今年(2012年)7月出荷分からは改良版のZDAS.COMになっています。

●F80(FORTRAN80)の逆アセンブルリストの一部です

前回はMBASICとFORTRAN80を逆アセンブルして、そのリストをプリントアウトしたものを写真に撮ってお見せしました。
でも写真ではどんなふうに逆アセンブルされているのかというところまではわかりませんから、そのリストのごく一部ですけれど、参考までにお見せすることにいたします。

下はF80(FORTRAN80)の逆アセンブルリストの一部(アドレス3000H〜3101H)です。
F80.COMは実行時には0100H〜70FFHにロードされます。
28KBもあります。

3000 09             ADD HL,BC
3001 73             LD (HL),E
3002 23             INC HL
3003 72             LD (HL),D
3004 C9             RET
3005 C22130         JP NZ,$3021
3008 2AC601         LD HL,($01C6)
300B E5             PUSH HL
300C 2ACC01         LD HL,($01CC)
300F E5             PUSH HL
3010 2A4902         LD HL,($0249)
3013 CD4446         CALL $4644
3016 CD2130         CALL $3021
3019 E1             POP HL
301A CD4446         CALL $4644
301D E1             POP HL
301E 224902         LD ($0249),HL
3021 3A6501         LD A,($0165)
3024 FE03           CP 03
3026 CA3630         JP Z,$3036
3029 3A6F5A         LD A,($5A6F)
302C B7             OR A
302D CA4C30         JP Z,$304C
3030 CD9030         CALL $3090
3033 C33930         JP $3039
3036 CD9530         CALL $3095
3039 3E22           LD A,22
303B CD6137         CALL $3761
303E 2AC601         LD HL,($01C6)
3041 E5             PUSH HL
3042 23             INC HL
3043 23             INC HL
3044 22C601         LD ($01C6),HL
3047 0602           LD B,02
3049 C3832F         JP $2F83
304C 2AC601         LD HL,($01C6)
304F 010B02         LD BC,$020B
3052 CDDE56         CALL $56DE
3055 CDF22E         CALL $2EF2
3058 2A1902         LD HL,($0219)
305B 22C601         LD ($01C6),HL
305E 2A1B02         LD HL,($021B)
3061 C3DB56         JP $56DB
3064 2A4702         LD HL,($0247)
3067 CD4446         CALL $4644
306A 3A6501         LD A,($0165)
306D FE03           CP 03
306F CA7A30         JP Z,$307A
3072 3E11           LD A,11
3074 CDC92E         CALL $2EC9
3077 C38230         JP $3082
307A CD9530         CALL $3095
307D 3EEB           LD A,EB
307F CD6137         CALL $3761
3082 2A4502         LD HL,($0245)
3085 CD4446         CALL $4644
3088 3A6501         LD A,($0165)
308B FE03           CP 03
308D CA9530         JP Z,$3095
3090 3E21           LD A,21
3092 C3C92E         JP $2EC9
3095 3E2A           LD A,2A
3097 C3C92E         JP $2EC9
309A 3E3A           LD A,3A
309C C3C92E         JP $2EC9
309F 3E32           LD A,32
30A1 C3C92E         JP $2EC9
30A4 3E22           LD A,22
30A6 C3C92E         JP $2EC9
30A9 06C2           LD B,C2
30AB C3B030         JP $30B0
30AE 06CA           LD B,CA
30B0 3A1F02         LD A,($021F)
30B3 B7             OR A
30B4 C8             RET Z
30B5 C5             PUSH BC
30B6 CD6931         CALL $3169
30B9 CD2537         CALL $3725
30BC F1             POP AF
30BD C3C92E         JP $2EC9
30C0 3A6202         LD A,($0262)
30C3 B7             OR A
30C4 C8             RET Z
30C5 2A6701         LD HL,($0167)
30C8 225D01         LD ($015D),HL
30CB AF             XOR A
30CC 32E901         LD ($01E9),A
30CF 67             LD H,A
30D0 6F             LD L,A
30D1 226701         LD ($0167),HL
30D4 CDCE49         CALL $49CE
30D7 3A9302         LD A,($0293)
30DA B7             OR A
30DB C8             RET Z
30DC 47             LD B,A
30DD 3A6601         LD A,($0166)
30E0 B7             OR A
30E1 C0             RET NZ
30E2 2ACC01         LD HL,($01CC)
30E5 E5             PUSH HL
30E6 C5             PUSH BC
30E7 CD5131         CALL $3151
30EA 3E22           LD A,22
30EC CDC62E         CALL $2EC6
30EF C1             POP BC
30F0 05             DEC B
30F1 CA1E31         JP Z,$311E
30F4 C5             PUSH BC
30F5 3EEB           LD A,EB
30F7 CD6137         CALL $3761
30FA CD5131         CALL $3151
30FD 3E22           LD A,22
30FF CDC62E         CALL $2EC6

ご覧いただきますように、マシン語の命令コードをZ80のニーモニックに翻訳してくれますから、マシン語だけに比べれば確かに理解しやすくはなりますが、しかし命令として理解できるということと、それがプログラムとして何をやっているのかがわかる、ということとの間には大きなギャップがあります。
それに加えてなにしろマシン語コードにして28KBものサイズのプログラムですから、その全てを解読するなどということは、不可能とは言いませんけれど、余程の覚悟と根性がなければ出来ませんでしょう。

しかしながら。
FORTRAN80はビル・ゲイツ氏がポール・アレン氏とMicrosoft社を設立してから販売した2本目の言語プログラムとのことですから(1本目はBASIC80(MBASIC)です)、おそらくビル・ゲイツ氏自身がプログラム開発に携わったと思われます。

若き日のビル・ゲイツ氏自身が書いたであろうプログラムを、その一部でも解読して、彼のプログラムテクニックに学んでみるのも、なかなかに興味深いことではありませんでしょうか。

ところで。
特に言語プログラムなどを逆アセンブルすると、全く意味不明な部分に出くわしてしまうことがあります。
下もFORTRAN80の逆アセンブルリストの一部(アドレス4000H〜40FFH)ですが、全く意味不明な命令が連続しています。
ちょっと見ると何か意味がありそうですが。
たとえばアドレス4005H〜4007Hを見ますと、
4005 65    LD H,L
4006 6D    LD L,L
4007 65    LD H,L
となっていて、これでは何の意味もありません。

4000 2053           JR NZ,53
4002 74             LD (HL),H
4003 61             LD H,C
4004 74             LD (HL),H
4005 65             LD H,L
4006 6D             LD L,L
4007 65             LD H,L
4008 6E             LD L,(HL)
4009 74             LD (HL),H
400A 204E           JR NZ,4E
400C 75             LD (HL),L
400D 6D             LD L,L
400E 62             LD H,D
400F 65             LD H,L
4010 F24E6F         JP P,$6F4E
4013 74             LD (HL),H
4014 2061           JR NZ,61
4016 2056           JR NZ,56
4018 61             LD H,C
4019 72             LD (HL),D
401A 69             LD L,C
401B 61             LD H,C
401C 62             LD H,D
401D 6C             LD L,H
401E 65             LD H,L
401F 204E           JR NZ,4E
4021 61             LD H,C
4022 6D             LD L,L
4023 E5             PUSH HL
4024 49             LD C,C
4025 6C             LD L,H
4026 6C             LD L,H
4027 65             LD H,L
4028 67             LD H,A
4029 61             LD H,C
402A 6C             LD L,H
402B 204C           JR NZ,4C
402D 6F             LD L,A
402E 67             LD H,A
402F 69             LD L,C
4030 63             LD H,E
4031 61             LD H,C
4032 6C             LD L,H
4033 2046           JR NZ,46
4035 6F             LD L,A
4036 72             LD (HL),D
4037 6D             LD L,L
4038 204F           JR NZ,4F
403A 70             LD (HL),B
403B 65             LD H,L
403C 72             LD (HL),D
403D 61             LD H,C
403E 74             LD (HL),H
403F 6F             LD L,A
4040 F24461         JP P,$6144
4043 74             LD (HL),H
4044 61             LD H,C
4045 2050           JR NZ,50
4047 6F             LD L,A
4048 6F             LD L,A
4049 6C             LD L,H
404A 204F           JR NZ,4F
404C 76             HALT
404D 65             LD H,L
404E 72             LD (HL),D
404F 66             LD H,(HL)
4050 6C             LD L,H
4051 6F             LD L,A
4052 77             LD (HL),A
4053 3B             DEC SP
4054 204F           JR NZ,4F
4056 75             LD (HL),L
4057 74             LD (HL),H
4058 206F           JR NZ,6F
405A 66             LD H,(HL)
405B 204D           JR NZ,4D
405D 65             LD H,L
405E 6D             LD L,L
405F 6F             LD L,A
4060 72             LD (HL),D
4061 F9             LD SP,HL
4062 4C             LD C,H
4063 69             LD L,C
4064 74             LD (HL),H
4065 65             LD H,L
4066 72             LD (HL),D
4067 61             LD H,C
4068 6C             LD L,H
4069 2053           JR NZ,53
406B 74             LD (HL),H
406C 72             LD (HL),D
406D 69             LD L,C
406E 6E             LD L,(HL)
406F 67             LD H,A
4070 2069           JR NZ,69
4072 73             LD (HL),E
4073 2074           JR NZ,74
4075 6F             LD L,A
4076 6F             LD L,A
4077 206C           JR NZ,6C
4079 61             LD H,C
407A 72             LD (HL),D
407B 67             LD H,A
407C E5             PUSH HL
407D 49             LD C,C
407E 6E             LD L,(HL)
407F 76             HALT
4080 61             LD H,C
4081 6C             LD L,H
4082 69             LD L,C
4083 64             LD H,H
4084 2044           JR NZ,44
4086 61             LD H,C
4087 74             LD (HL),H
4088 61             LD H,C
4089 204C           JR NZ,4C
408B 69             LD L,C
408C 73             LD (HL),E
408D 74             LD (HL),H
408E 2045           JR NZ,45
4090 6C             LD L,H
4091 65             LD H,L
4092 6D             LD L,L
4093 65             LD H,L
4094 6E             LD L,(HL)
4095 74             LD (HL),H
4096 2069           JR NZ,69
4098 6E             LD L,(HL)
4099 2049           JR NZ,49
409B 2F             CPL
409C CF             RST 1
409D 55             LD D,L
409E 6E             LD L,(HL)
409F 62             LD H,D
40A0 61             LD H,C
40A1 6C             LD L,H
40A2 61             LD H,C
40A3 6E             LD L,(HL)
40A4 63             LD H,E
40A5 65             LD H,L
40A6 64             LD H,H
40A7 2044           JR NZ,44
40A9 4F             LD C,A
40AA 204E           JR NZ,4E
40AC 65             LD H,L
40AD 73             LD (HL),E
40AE F44964         CALL P,$6449
40B1 65             LD H,L
40B2 6E             LD L,(HL)
40B3 74             LD (HL),H
40B4 69             LD L,C
40B5 66             LD H,(HL)
40B6 69             LD L,C
40B7 65             LD H,L
40B8 72             LD (HL),D
40B9 2054           JR NZ,54
40BB 6F             LD L,A
40BC 6F             LD L,A
40BD 204C           JR NZ,4C
40BF 6F             LD L,A
40C0 6E             LD L,(HL)
40C1 E7             RST 4
40C2 49             LD C,C
40C3 6C             LD L,H
40C4 6C             LD L,H
40C5 65             LD H,L
40C6 67             LD H,A
40C7 61             LD H,C
40C8 6C             LD L,H
40C9 204F           JR NZ,4F
40CB 70             LD (HL),B
40CC 65             LD H,L
40CD 72             LD (HL),D
40CE 61             LD H,C
40CF 74             LD (HL),H
40D0 6F             LD L,A
40D1 F24D69         JP P,$694D
40D4 73             LD (HL),E
40D5 6D             LD L,L
40D6 61             LD H,C
40D7 74             LD (HL),H
40D8 63             LD H,E
40D9 68             LD L,B
40DA 65             LD H,L
40DB 64             LD H,H
40DC 2050           JR NZ,50
40DE 61             LD H,C
40DF 72             LD (HL),D
40E0 65             LD H,L
40E1 6E             LD L,(HL)
40E2 74             LD (HL),H
40E3 68             LD L,B
40E4 65             LD H,L
40E5 73             LD (HL),E
40E6 69             LD L,C
40E7 F3             DI
40E8 43             LD B,E
40E9 6F             LD L,A
40EA 6E             LD L,(HL)
40EB 73             LD (HL),E
40EC 65             LD H,L
40ED 63             LD H,E
40EE 75             LD (HL),L
40EF 74             LD (HL),H
40F0 69             LD L,C
40F1 76             HALT
40F2 65             LD H,L
40F3 204F           JR NZ,4F
40F5 70             LD (HL),B
40F6 65             LD H,L
40F7 72             LD (HL),D
40F8 61             LD H,C
40F9 74             LD (HL),H
40FA 6F             LD L,A
40FB 72             LD (HL),D
40FC F3             DI
40FD 49             LD C,C
40FE 6D             LD L,L
40FF 70             LD (HL),B

逆アセンブラは万能ではありません。
こういうプログラム部分には全く無力です。
こんなときは、DMコマンドが威力を発揮します。
下は同じ範囲をDMコマンドを使って表示したものです。

4000  20 53 74 61 74 65 6D 65-6E 74 20 4E 75 6D 62 65   Statement Numbe
4010  F2 4E 6F 74 20 61 20 56-61 72 69 61 62 6C 65 20  .Not a Variable 
4020  4E 61 6D E5 49 6C 6C 65-67 61 6C 20 4C 6F 67 69  Nam.Illegal Logi
4030  63 61 6C 20 46 6F 72 6D-20 4F 70 65 72 61 74 6F  cal Form Operato
4040  F2 44 61 74 61 20 50 6F-6F 6C 20 4F 76 65 72 66  .Data Pool Overf
4050  6C 6F 77 3B 20 4F 75 74-20 6F 66 20 4D 65 6D 6F  low; Out of Memo
4060  72 F9 4C 69 74 65 72 61-6C 20 53 74 72 69 6E 67  r.Literal String
4070  20 69 73 20 74 6F 6F 20-6C 61 72 67 E5 49 6E 76   is too larg.Inv
4080  61 6C 69 64 20 44 61 74-61 20 4C 69 73 74 20 45  alid Data List E
4090  6C 65 6D 65 6E 74 20 69-6E 20 49 2F CF 55 6E 62  lement in I/マUnb
40A0  61 6C 61 6E 63 65 64 20-44 4F 20 4E 65 73 F4 49  alanced DO Nes.I
40B0  64 65 6E 74 69 66 69 65-72 20 54 6F 6F 20 4C 6F  dentifier Too Lo
40C0  6E E7 49 6C 6C 65 67 61-6C 20 4F 70 65 72 61 74  n.Illegal Operat
40D0  6F F2 4D 69 73 6D 61 74-63 68 65 64 20 50 61 72  o.Mismatched Par
40E0  65 6E 74 68 65 73 69 F3-43 6F 6E 73 65 63 75 74  enthesi.Consecut
40F0  69 76 65 20 4F 70 65 72-61 74 6F 72 F3 49 6D 70  ive Operator.Imp

思わず、
おお、
と声が出てしまいそうになりますでしょう。
プログラムの解読も、ちょいと謎解きのようなところがあって、なかなかに面白いものです。

上のDMリストは、ND80ZVをフルRAMに改造して、そこでCP/M互換DOSを起動して、実際にF80.COMをロードした状態でDMコマンドを実行したものです。
また逆アセンブル作業はND80ZVではなくてWindowsのMSDOSプロンプト(コマンドプロンプト)上で実行しますが、そのZ80逆アセンブラ(ZDAS.COM)もND80ZV組立キットに附属しています。

自画自賛ですけれど。
ここまでできてしまうND80ZVって、なかなかにすぐれものだと思いますよ。

でも。
こんなもんじゃ終わらないのです。
自画自賛、手前味噌のお話はまだ続きます。

ワンボードマイコンでCP/Mを![第179回]
2012.7.22upload

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