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

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

[第419回]


●/BATで遠隔デバッグ!

ZB3DOS(CP/M互換DOS)の使用結果などについての報告を毎日のようにメールで送って下さる長野県のN様からまた不具合のメールをいただきました。
その前にご指摘いただいたバグを修正したZB3DOSプログラムをお送りしたところ、トランジェントコマンドを受け付けなくなってしまった、とのご指摘です。
/CPMでエントリ後すぐにたとえば
A>WS[Enter]
と入力すると、
WS?
と表示されてしまいます。
WSに限らず、M80でもF80でも、あるいはアセンブラで作成したユーザープログラムでも同じことなのだそうです。
ところが一度DIRコマンドを使ってドライブの中身を表示させてから、
A>WS[Enter]
と入力すると、今度は今までと同じようにWordStarが起動するようになります。

そんなばかなことは…?
と思ってその通りの操作をして試してみましたが、そんなおかしな症状は出ません。
ごく普通にプログラムが実行されます。

こういうトラブルが一番厄介です。
お客様の手元ではエラーが発生するのに、そっくり同じことをこちらでやってみても全くエラーにならず普通に実行できてしまいます。
ということになりますと、なんとも手の打ちようがありません。

とにかくエラーが発生している場合はブレークポイントを設定してブレークさせながらレジスタやメモリの値を確認することで、バグをみつけることができます。
というのが私の定番のデバッグ方法です。
しかしお客様のところではエラーになるのに、私のところのパソコンでは正常に実行されてしまう、というのではデバッグすることができません。

カレントドライブに登録されているはずのファイルを実行しようとして、そのファイル名を入力しても、?が表示されてしまう、ということはおそらくキー入力したファイル名とディスクディレクトリに登録されているファイル名との比較に失敗している可能性が高いということになります。
しかも一度DIRコマンドを実行すると、その次からはエラーにならず普通にファイル名が認識される、ということになりますと、多分ある特定のメモリの値がDIRを実行することで正しくセットされる、ということだろうと思われます(DIRを実行する前までは必要な値が設定されていないことが考えられます)。
それならお客様にブレーク処理をしてもらって、その結果のレポートをもらえれば、何かがわかるかもしれません。
しかし私はずっと昔からその方法でデバッグしてきましたから、難なく普通に操作できますが、おそらくほとんどの方はそういうデバッグはしたことがない、と思われますから、こうやって、ああやって、とやり方を説明しましても、なかなか要領を得ないのでは、と思います。

むむ。
なにかいい方法が…。
で、思いついたのがバッチ処理でした。
デバッグの手順を記述したバッチファイルを作成して、それをお客様に送って/BATコマンドを実行してもらう、というようにすれば、お客様のところでもデバッグができてしまうではありませんか。

もちろんそのためには、プログラムのどの辺にブレークポイントを仕掛ければよいか、という目星がつかなければ、その芸当はできません。
しかし今回の場合にはおおよそどの辺りかという見当はついています。
それでN様にそのようにしていただくつもりで、念のためにお送りするバッチファイルを実際に使ってみようとしましたところ、前回書きました通り、/BATがまさかのハングアップをしてしまったのでした。

その問題はこれも前回書きましたように、ほぼ1日を費やした結果、やっと解決できましたので、/BATが動くように修正したZB3DOSプログラムとともにバッチファイルをN様にお送りして、テストをしていただくように依頼いたしました。

こちらがN様にお送りしたバッチファイルです。

p '*** /CPM TEST2 batch program exec PI.COM
/CPM
ZB3
BP D159
/CPM,D
PI
BP D1D8
RT@
DM E93C,E95F
BP D1DF
RT@
/EXIT

これじゃ何がなんだかわかりませんですね。

でも、このファイルを/BATコマンドで実行すると下のようになります。
下はN様から送っていただいた実行結果のログファイルです。

logfile nd80zlog\06142151.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - *** nd80z3 basic ****
>/bat batt2pi.txt
  '*** /CPM TEST2 batch program exec PI.COM
>/CPM
loading zbds4h.bin ...19c1(6593)bytes loaded,from CC00 to E5C0
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>ZB3
end of ZBDOS
>BP D159
>/CPM,D
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>PI

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
003A 0200 D49F E100 0000 0000 0000 0000 D159 F800 0000 0000 FF 00111010
>BP D1D8
>RT@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0044 0007 E93F E93C 0000 0000 0000 0000 D1D8 F7FC 0000 0000 FF 01000100
>DM E93C,E95F
E93C  00 50 49 20 20 20 20 20-20 43 4F 4D 01 00 00 0D  .PI      COM....
E94C  61 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  a...............
E95C  0D 00 00 00 00 00 00 E8-02 00 00 E1 02 00 00 E1  ................
>BP D1DF
>RT@

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0050 0004 E93C E88A 0000 0000 0000 0000 D1DF F7FC 0000 0000 FF 01010000
>/EXIT
0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Jun 14 21:52:12 2013

何をやっているのかを簡単に説明します。
N様からはその前のメールでWordStarだけではなくて、PI.COM(N様が作成したトランジェントプログラム)でも同じ現象が発生することを知らされていました。
PI.COMはこれもそれよりもずっと前にN様から別のバグの動作確認のために送っていただいていましたので、同じファイルが私のところのパソコンの仮想Aドライブにも入っておりましたので、このファイルを開くときに何がおきるのかをチェックする手順をバッチファイルにしたのです。

/BATはZB3DOS(正確にはZB3BASIC)のコマンドです。
ZB3DOSを起動したらすぐに/BATコマンドを実行してもらいました。
バッチ処理の中で/CPMコマンドが実行され、それからすぐにZB3コマンドでZB3BASICに戻り、そこでアドレスD159にブレークポイントが設定されて、/CPM,Dコマンドで再びZB3DOS(CP/Mモード)にエントリしています。
そこでPI[Enter]が実行されると、そこでブレークします。
そのあとアドレスD1D8、D1DFにブレークポイントが設定されています。
その間DMコマンドでメモリの値を表示させています。
アドレスE93C〜はシステム用のFBCエリアです。
この内容とディスクディレクトリの中身が比較されます。

ここでブレークポイントを設定したアドレスはZB3DOS(CPM互換DOS)の一部であるZCCP.BIN(コンソールコマンドプロセッサ)の、ユーザプログラムをファイルサーチする部分です。
下にそのリストを示します。

 ;
              ;*** TRANSIENT COMMAND ***
              ;
D153 3A0400   USRCMD:LD A,(CURDRV)
D156 3288E8   	LD (CDRV_DIRWK),A
D159 E5       	PUSH HL
D15A 215C00   	LD HL,FCB
D15D 3600     	LD (HL),00
D15F 23       	INC HL
D160 3620     	LD (HL),20
D162 216C00   	LD HL,FCB2
D165 3600     	LD (HL),00
D167 23       	INC HL
D168 3620     	LD (HL),20
D16A 213CE9   	LD HL,SYSFCB
D16D 3600     	LD (HL),00
D16F 23       	INC HL
D170 1608     	LD D,08
D172 3620     USRCMD2:LD (HL),20
D174 23       	INC HL
D175 15       	DEC D
D176 C272D1   	JP NZ,USRCMD2
D179 3643     	LD (HL),43;'C'
D17B 23       	INC HL
D17C 364F     	LD (HL),4F;'O'
D17E 23       	INC HL
D17F 364D     	LD (HL),4D;'M'
D181 E1       	POP HL
D182 2235CC   	LD (INPOINT),HL;for error message
D185 113CE9   	LD DE,SYSFCB
D188 78       	LD A,B
D189 322FE9   	LD (INBYTE),A
D18C FE01     	CP 01
D18E CAA1D1   	JP Z,USRCMD3
D191 23       	INC HL
D192 7E       	LD A,(HL)
D193 2B       	DEC HL
D194 FE3A     	CP 3A;':'
D196 C2A1D1   	JP NZ,USRCMD3
D199 7E       	LD A,(HL)
D19A D640     	SUB 40;'A' to 01
D19C 12       	LD (DE),A
D19D 23       	INC HL
D19E 23       	INC HL
D19F 05       	DEC B
D1A0 05       	DEC B
D1A1 13       USRCMD3:INC DE
D1A2 0E08     	LD C,08
D1A4 7E       USRCMD4:LD A,(HL)
D1A5 FE20     	CP 20
D1A7 CABBD1   	JP Z,USRCMD6
D1AA 12       	LD (DE),A
D1AB 23       	INC HL
D1AC 13       	INC DE
D1AD 05       	DEC B
D1AE CABBD1   	JP Z,USRCMD6;no PARAM
D1B1 0D       	DEC C
D1B2 C2A4D1   	JP NZ,USRCMD4
D1B5 7E       	LD A,(HL)
D1B6 FE20     	CP 20
D1B8 C259D2   	JP NZ,USRCMDERR12
              ;
D1BB E5       USRCMD6:PUSH HL
D1BC C5       	PUSH BC
D1BD 213CE9   	LD HL,SYSFCB
D1C0 7E       	LD A,(HL)
D1C1 B7       	OR A
D1C2 CAD8D1   	JP Z,USRCMD70
D1C5 320400   	LD (CURDRV),A
D1C8 3D       	DEC A
D1C9 5F       	LD E,A
D1CA CD33D4   	CALL DRVNOSET
D1CD CAD8D1   	JP Z,USRCMD70
D1D0 CD2DD3   	CALL BADDRVDP;err
D1D3 C1       	POP BC
D1D4 E1       	POP HL
D1D5 C347D2   	JP USRCMD73;end
              ;
D1D8 113CE9   USRCMD70:LD DE,SYSFCB
D1DB CD36D4   	CALL OPEN
D1DE 3C       	INC A
D1DF CA57D2   	JP Z,USRCMDERR

N様から送っていただいたログを見ますとD1DFでブレークした結果は、Zフラグが立っていますから確かにファイルオープンに失敗しています。
ということは、SYSFCBで指定したファイル名がみつからなかったことを意味しています。

そこでバッチファイルでSYSFCBのメモリダンプを設定しておいたことが役に立ちました。
ちょっと見にはちゃんとファイル名が設定されているようですけれど…。
これを見て、エラーの原因がわかりました。

説明が長くなって、時間がなくなってしまいましたので、この続きは次回にいたします。

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

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