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

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

[第430回]


●MS−COBOL(2)

前回からの続きです。
H様からのメールにはデバッグの過程を記録したログファイルが添付されていて、メール本文にはその要点が記されていました。
私はこういうものをデバッグする場合にはZB3DOSのBP(ブレークポイント)やCMコマンド,DMコマンドを使うのですが、H様はCP/MユーティリティのDDT(Dynamic Debugging Tool、通称8080デバッガ)を使われたとのことです。
H様がどこからDDTを入手されたのかはお聞きしていませんが、私も独自に探してみて入手先をみつけました。
DDTの入手先につきましては次回あたりにご紹介いたします。

さてそのDDTを使ってのデバッグなのですが、着目点といい、デバッグの手順といい、もうお見事というほかはありません。
H様にデバッグをしていただいたお蔭で、問題点をクリアすることができました。

メールでの解説も簡潔かつ的確で皆様の参考にもなると思いますので、いただいたメールもそのまま転載させていただきます。
ことはZB3DOSの上でMS−COBOLが動かない(正確にはMS−COBOLで生成した実行プログラムが動かない)ことに端を発しているわけで、これはちょいといただけない困った事態なのですが、しかし、CP/MユーティリティでありますDDT.COMがZB3DOSの上でちゃんと正しく機能している、という点には大いに注目していただきたいと思います。

こちらがH様からいただいたメール本文です(一部省略)。

いろいろとテストを実行して、調べていただきたいところを特定できたので、報告します。
結果的に、MS-COBOLのコンパイラとリンカは、正常に動作していました。
問題は、SQUAROを起動したときに、「** COBOL Executor not found」というメッセージを表示して終了するのですが、意味は「COBOLのランタイムルーチンがありません」という意味のようです。
添付したログファイルを見ていただければ解るのですが、該当のファイル(RUNCOB.COM)はログの@に存在します。
DDTを利用して追っかけてみました。
○最初にDIRコマンドでファイルの一覧を表示しています。
○DDTを起動しSQUARO.COMを読み込みます。A
○このプログラムは読み込むと0180Hからのプログラムを4C00H以降に転送しています。
○正常に転送されていることを確認しました。B
○sq0.disは転送前、sq.disは転送後の逆アセンブルのリストです。
○sq.disの5171HでDMAのセットをしています。
 セット時のレジスタの値とメモリーダンプです。C
○sq.disの5176HでFCBのセットを行って、ファイルのオープンへ飛んでいます。D
○sq.disの517EHでBDOSから帰ってきたときのレジスターです。E
 A=FFでオープンエラーになっています。
○sq.disの51A9Hからメッセージを出力して終了しています。F
 ○sq.disの51BAHはメッセージのメモリーダンプです。G
○RUNCOB.COMが破損しているのか疑ったのですが、問題ないようです。
○ドライブは、全体を通して、Cドライブです。

以上が、私がいろいろやってみて、解った状況です。
どうも結果を見ると、RUNCOB.COMを互換DOSがファイルオープンに失敗していると思われます。ファイルオープンの周りを調べていただきたいのですが。

[注記]sq0.dis、sq.disもメールに添付されていましたが、ここでは省略いたしました。

こちらがログファイルです。

logfile nd80zlog\06261317.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - *** nd80z3 basic ****
>/cpm
loading zbds4j.bin ...19c1(6593)bytes loaded,from CC00 to E5C0
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>c:
C>dir
C: ACK      PLI : DFACT    PLI : LIB      COM : LINK     COM
C: OPTIMIST PLI : PLI      COM : PLI0     OVL : PLI1     OVL
C: PLI2     OVL : PLILIB   IRL : RMAC     COM : XREF     COM
C: DFACT    REL : CDADDS   MAC : CDADDS   REL : CDADM3   MAC
C: CDADM3   REL : CDANSI   MAC : CDANSI   REL : CDBEE    MAC
C: CDBEE    REL : CDHZ15   MAC : CDHZ15   REL : CDISB    MAC
C: CDISB    REL : CDPERK   MAC : CDPERK   REL : CDSROC   MAC
C: CDSROC   REL : CDWH19   MAC : CDWH19   REL : CDZEPH   MAC
C: CDZEPH   REL : COBLBX   REL : COBLIB   REL : COBLOC      
C: COBOL    COM : COBOL1   OVR : COBOL2   OVR : COBOL3   OVR
C: COBOL4   OVR : CREF80   COM : CRTDRV   REL : CRTEST   COB
C: CVISAM   COM : DEBUG    REL : L80      COM : LD80     COM
C: M80      COM : REBUILD  COM : RECOVR   COB : RUNCOB   COM    ←@
C: SEQCVT   COM : SQUARO   COB : SQUARO   PRN : SQUARO   REL
C: SQUARO   COM : SQUARO   DBG : DDT      COM
C>ddt squaro.com ←ーーーーーーーーーーーーーーーーーーーーーーーA
DDT VERS 2.2
NEXT  PC
0880 0100
-l0100
  0100  LXI  H,4C00
  0103  LXI  B,06CD
  0106  LXI  D,0180
  0109  DAD  B
  010A  XCHG 
  010B  DAD  B
  010C  INX  B
  010D  MOV  A,M
  010E  STAX D
  010F  DCX  H
  0110  DCX  D
-l
  0111  DCX  B
  0112  MOV  A,B
  0113  ORA  C
  0114  JNZ  010D
  0117  JMP  4CEE
  011A  NOP  
  011B  NOP  
  011C  NOP  
  011D  NOP  
  011E  NOP  
  011F  NOP  
-g,0117
*0117
-t
C0Z1M0E1I0 A=00 B=0000 D=4BFF H=017F S=0100 P=0117 JMP  4CEE*4CEE
-t
C0Z1M0E1I0 A=00 B=0000 D=4BFF H=017F S=0100 P=4CEE NOP  *4CEF
-t
C0Z1M0E1I0 A=00 B=0000 D=4BFF H=017F S=0100 P=4CEF SHLD 02A8*4CF2
-d0180 ←ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーB
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01D0 31 30 30 30 30 20 00 00 00 00 53 51 55 41 52 45 10000 ....SQUARE
01E0 20 52 4F 4F 54 20 4F 46 20 20 00 00 00 00 00 00  ROOT OF  ......
01F0 00 00 00 00 00 00 00 00 00 00 20 49 53 20 00 00 .......... IS ..
0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 ..............  
0210 23 20 49 54 45 52 41 54 49 4F 4E 53 20 3D 00 00 # ITERATIONS =..
0220 2E 20 00 00 00 4C 00 5C 00 6C 00 7C 00 8C 00 9C . ...L.\.l.|....
0230 00 AC 00 BC 00 CC 00 DC 00 EC 00 FC 00 0C 00 1C ................
-d4c00
4C00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
4C10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
4C20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
4C30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
4C40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
4C50 31 30 30 30 30 20 00 00 00 00 53 51 55 41 52 45 10000 ....SQUARE
4C60 20 52 4F 4F 54 20 4F 46 20 20 00 00 00 00 00 00  ROOT OF  ......
4C70 00 00 00 00 00 00 00 00 00 00 20 49 53 20 00 00 .......... IS ..
4C80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 20 ..............  
4C90 23 20 49 54 45 52 41 54 49 4F 4E 53 20 3D 00 00 # ITERATIONS =..
4CA0 2E 20 00 00 00 4C 00 5C 00 6C 00 7C 00 8C 00 9C . ...L.\.l.|....
4CB0 00 AC 00 BC 00 CC 00 DC 00 EC 00 FC 00 0C 00 1C ................
-t
C0Z1M0E1I0 A=00 B=0000 D=4BFF H=017F S=0100 P=4CF2 NOP  *4CF3
-g,5171
*5171
-t
C1Z0M1E0I0 A=3A B=0000 D=0100 H=5121 S=5119 P=5171 MVI  C,1A*5173 ←ーーC
-d0100
0100 21 00 4C 01 CD 06 11 80 01 09 EB 09 03 7E 12 2B !.L..........~.+
0110 1B 0B 78 B1 C2 0D 01 C3 EE 4C 00 00 00 00 00 00 ..x......L......
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-t
C1Z0M1E0I0 A=3A B=001A D=0100 H=5121 S=5119 P=5173 CALL 0005*0005
-t
C1Z0M1E0I0 A=3A B=001A D=0100 H=5121 S=5117 P=0005 JMP  C400*C400
-t
C1Z0M1E0I0 A=3A B=001A D=0100 H=5121 S=5117 P=C400 JMP  CAA2*CAA2
-t
C1Z0M1E0I0 A=3A B=001A D=0100 H=5121 S=5117 P=CAA2 XTHL *CAA3
-g,5176
*5176
-t
C0Z1M0E1I0 A=00 B=001A D=0100 H=DC55 S=5119 P=5176 LXI  D,513D*5179 ← D
-d0100
0100 21 00 4C 01 CD 06 11 80 01 09 EB 09 03 7E 12 2B !.L..........~.+
0110 1B 0B 78 B1 C2 0D 01 C3 EE 4C 00 00 00 00 00 00 ..x......L......
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-d5130
5130 C8 3E FF B7 C9 01 00 4C 3A 00 00 CC 52 00 52 55 .>.....L:...R.RU
5140 4E 43 4F 42 20 20 43 4F 4D 00 48 E4 15 75 39 31 NCOB  COM.H..u91
5150 75 57 31 61 01 00 36 00 4F A2 30 66 D3 3E 3E 00 uW1a..6.O.0f.>>.
5160 5D 3A 38 51 FE 41 DA 6E 51 D6 40 32 3D 51 11 00 ]:8Q.A.nQ.@2=Q..
5170 01 0E 1A CD 05 00 11 3D 51 0E 0F CD 05 00 3C CA .......=Q.....<.
5180 A9 51 AF 32 5D 51 21 00 01 EB D5 0E 1A CD 05 00 .Q.2]Q!.........
5190 11 3D 51 0E 14 CD 05 00 D1 B7 C0 21 80 00 19 3A .=Q........!...:
51A0 37 51 BC DA B4 51 C3 89 51 11 BA 51 0E 09 CD 05 7Q...Q..Q..Q....
51B0 00 C3 00 00 11 D8 51 C3 AC 51 2A 2A 20 43 4F 42 ......Q..Q** COB
51C0 4F 4C 20 45 78 65 63 75 74 6F 72 20 6E 6F 74 20 OL Executor not 
51D0 66 6F 75 6E 64 0D 0A 24 2A 2A 20 43 4F 42 4F 4C found..$** COBOL
51E0 20 45 78 65 63 75 74 6F 72 20 74 6F 6F 20 6C 61  Executor too la
-t
C0Z1M0E1I0 A=00 B=001A D=513D H=DC55 S=5119 P=5179 MVI  C,0F*517B
-t
C0Z1M0E1I0 A=00 B=000F D=513D H=DC55 S=5119 P=517B CALL 0005*0005
-d5130
5130 C8 3E FF B7 C9 01 00 4C 3A 00 00 CC 52 00 52 55 .>.....L:...R.RU
5140 4E 43 4F 42 20 20 43 4F 4D 00 48 E4 15 75 39 31 NCOB  COM.H..u91
5150 75 57 31 61 01 00 36 00 4F A2 30 66 D3 3E 3E 00 uW1a..6.O.0f.>>.
5160 5D 3A 38 51 FE 41 DA 6E 51 D6 40 32 3D 51 11 00 ]:8Q.A.nQ.@2=Q..
5170 01 0E 1A CD 05 00 11 3D 51 0E 0F CD 05 00 3C CA .......=Q.....<.
5180 A9 51 AF 32 5D 51 21 00 01 EB D5 0E 1A CD 05 00 .Q.2]Q!.........
5190 11 3D 51 0E 14 CD 05 00 D1 B7 C0 21 80 00 19 3A .=Q........!...:
51A0 37 51 BC DA B4 51 C3 89 51 11 BA 51 0E 09 CD 05 7Q...Q..Q..Q....
51B0 00 C3 00 00 11 D8 51 C3 AC 51 2A 2A 20 43 4F 42 ......Q..Q** COB
51C0 4F 4C 20 45 78 65 63 75 74 6F 72 20 6E 6F 74 20 OL Executor not 
51D0 66 6F 75 6E 64 0D 0A 24 2A 2A 20 43 4F 42 4F 4C found..$** COBOL
51E0 20 45 78 65 63 75 74 6F 72 20 74 6F 6F 20 6C 61  Executor too la
-d0100
0100 21 00 4C 01 CD 06 11 80 01 09 EB 09 03 7E 12 2B !.L..........~.+
0110 1B 0B 78 B1 C2 0D 01 C3 EE 4C 00 00 00 00 00 00 ..x......L......
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
01B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-t
C0Z1M0E1I0 A=00 B=000F D=513D H=DC55 S=5117 P=0005 JMP  C400*C400
-t
C0Z1M0E1I0 A=00 B=000F D=513D H=DC55 S=5117 P=C400 JMP  CAA2*CAA2
-g,517e
*517E
-t
C0Z1M0E0I0 A=FF B=000F D=513D H=E88A S=5119 P=517E INR  A*517F ←ーーーE
-t
C0Z1M0E0I1 A=00 B=000F D=513D H=E88A S=5119 P=517F JZ   51A9*51A9
-t
C0Z1M0E0I1 A=00 B=000F D=513D H=E88A S=5119 P=51A9 LXI  D,51BA*51AC ←F
-t
C0Z1M0E0I1 A=00 B=000F D=51BA H=E88A S=5119 P=51AC MVI  C,09*51AE
-t
C0Z1M0E0I1 A=00 B=0009 D=51BA H=E88A S=5119 P=51AE CALL 0005*0005
-t
C0Z1M0E0I1 A=00 B=0009 D=51BA H=E88A S=5117 P=0005 JMP  C400*C400
-g,51b1
** COBOL Executor not found
*51B1
-d51ba
51BA 2A 2A 20 43 4F 42 ** COB ←ーーーーーーーーーーーーーーーーーーーーG
51C0 4F 4C 20 45 78 65 63 75 74 6F 72 20 6E 6F 74 20 OL Executor not 
51D0 66 6F 75 6E 64 0D 0A 24 2A 2A 20 43 4F 42 4F 4C found..$** COBOL
51E0 20 45 78 65 63 75 74 6F 72 20 74 6F 6F 20 6C 61  Executor too la
51F0 72 67 65 0D 0A 24 0E 30 11 1C 52 21 AF 01 23 1A rge..$.0..R!..#.
5200 13 77 23 1A 13 77 23 0D C2 FE 51 0E 10 11 7C 52 .w#..w#...Q...|R
5210 21 48 02 1A 77 13 23 0D C2 13 52 C9 8E 52 99 52 !H..w.#...R..R.R
5220 A2 52 B3 52 B4 52 B5 52 B3 52 B6 52 B1 52 B0 52 .R.R.R.R.R.R.R.R
5230 B2 52 AF 52 BC 52 BC 52 BC 52 BC 52 BC 52 BC 52 .R.R.R.R.R.R.R.R
5240 BC 52 BC 52 BC 52 BB 52 BB 52 BB 52 BB 52 BB 52 .R.R.R.R.R.R.R.R
5250 BB 52 BB 52 BB 52 BB 52 B8 52 C7 52 C6 52 C6 52 .R.R.R.R.R.R.R.R
5260 C7 52 C7 52 C7 52 C7 52 C6 52 C6 52 C0 52 C3 52 .R.R.R.R.R.R.R.R
-g0

C>/exit
>
0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed Jun 26 13:30:15 2013

そうなのですよねえ。
よくよく考えてみると、マシン語の実行ファイルなのに、なんでCOBOL Executorなんてものが要るの?ということなのですが(コンパイラのはずなのに…)。
なるほど実行時にランタイムファイルが必要だったのですね。
H様が調べられたところによると、それがRUNCOB.COMというファイルとのことです。
つまりCOBOLの実行プログラムは単独では実行できなくて、RUNCOB.COMを同梱する必要がある、と。
なるほど。
そこまではわかりました。

で。
そのRUNCOB.COMがカレントドライブにちゃんと存在しているのに、ファイルオープンでこけてしまっているのはなぜか?
アドレス517BのCALL 0005がファイルオープン(Cレジスタ=0F)です。
DEレジスタ=513DはFCBのアドレスです。
そこには(アドレス513D以下には)間違いなくファイル名RUNCOB COMの文字があります。
それなのに、その次の517E(E)ではAレジスタ=FFでエラーになっています。
そこがおかしいのではないか?

というのがH様がデバッグされて得た結論でした。

このログファイルを拝見して、なぜファイルオープンできなかったのかがわかりました。

えっ。まさかあ?
これってルール違反じゃないのお?
これじゃオープンできませんよお。

え…と。
本日は解決編のつもりだったのですけれど。
また時間がなくなってしまいました。
次回に続きます。

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

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