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

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

[第420回]


●/BATで遠隔デバッグ!(2)

前回からの続きです。
N様にお送りして実行していただいたバッチプログラムには、ZCCPプログラムのファイルOPENのところにブレークポイントを設定してありました。
またシステムのFCBエリアのメモリダンプも設定してありました。
ZCCPプログラムのユーザープログラムを実行するプログラム部分では、キーボードから入力したプログラム名をシステムFCBエリアにセットしたうえで、ディスクディレクトリからそのファイル名を探してそのファイルをOPENします。
N様から/BATを実行した結果を記録したログファイルを送っていただいて、その内容を見ましたところ、ファイルOPENでこけていることがわかりました。
でもなぜ?

これには説明が必要です。
プログラムを修正するまでは、ずっとまともにOPENできていたのです。
新たに修正をおこなったプログラムをお送りしたら、ファイルがOPENできなくなってしまいました。
プログラムを修正したことが原因であることは明らかです。
どこを修正したのかといいますと。
N様と同じように、大分県のH様からもいろいろなアプリケーションの実行結果のレポートを送っていただいています。
ところがH様からいただいたバグ報告をもとにプログラムを修正しましたところ、複数のエクステントにまたがる大きなプログラムをコピーさせると、そのエクステントの数だけ繰り返しコピーが行なわれてしまう、という新たなバグの報告をいただきました。

うう。
なんともややこしい説明です。
実際このところ実にややこしくてため息がでてしまうバグ修正をしてきましたのです。
こちらを直すとあちらがだめになり、あちらを直すと今度は別のところがだめになってしまうということの繰り返しです。

CP/Mファイルのエクステントにつきましては[第148回]で説明をしています。
ディスクディレクトリのFCBエリア(ファイル名とデータブロックbネどがかかれているエリア)は32バイトで構成されています。
その32バイトは前半16バイトと後半16バイトに分かれています。
後半16バイトには2バイトずつ8個のデータブロックbェ書き込まれます。
1ブロックは16レコード2KBですから、そこに記録できるのは16KB分のデータブロックbワでです。
それでは16KB以上の大きなファイルはどうやって管理するのかといいますと、そこでエクステントbェ使われるのです。
16KBを越えるファイルの場合には同じファイル名のFCBが複数登録されます。
16KBまでのファイルの場合にはFCBは1個だけで、そのときはエクステントのbヘ00です。
エクステントbヘFCBの先頭から13バイト目に置かれています。

そのことは勿論わかっていましたから、ファイル名をサーチするときにもエクステントb確認して、それが最初の(つまりエクステントbェ00の)FCBなのかそうでないのかということもチェックするようにプログラムは組んでありました。
なので、実際にファイル名をサーチするところでは、ファイル名部分のみ(8バイト+3バイト)だけを比較するようにしてありました。
ところがH様、N様からのバグ報告を受けてその原因を追究していきましたところ、どうもファイル名サーチはファイル名部分の8+3バイトだけではなくて、その次のエクステントb煌ワめて比較しなければならないらしいということがわかってきました。
そこでそのようにプログラムを修正したのですが。

それはZBDOSのファンクションコールの部分だけで、ZCCPのプログラムは外からコールされるものではありませんから、もとのままの8+3バイトだけの比較をしていました。
つまりファイルOPENするためにシステムFCBにセットされるのはファイル名の8+3バイトだけだったのです。
それはZCCP側のプログラムでの設定です。
しかしZCCPがコールするファイルOPENルーチンはエクステントも含めて比較するように修正してしまいました。
そこで今回の問題が発生しました。

下は前回お見せしました、N様から送っていただいたログファイルの一部です。

>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  ................

E93C〜はシステムFCBエリアです。
ファイルOPENはこの部分をディスクディレクトリのFCBと比較することで目的のファイルを抽出しOPENします。
上で説明しましたように、そのとき比較されるのは当初は2バイト目から12バイト目のファイル名部分だけだったのですが、その後のプログラム修正によってその後ろのエクステント(13バイト目)も含めて比較するようになりました。
で、上のメモリダンプの13バイト目を見ますと01になっています。
これも上で説明しましたようにZCCPのユーザープログラムを実行するためのプログラム部分はまだファイル名部分だけを比較することを前提にしていますから、システムFCBには前から12バイトしかセットされない仕組みになっていました。
本当はこのとき13バイト目には00をセットしておかなければならなかったのでした。

ここが01になっていたのはたまたまその前の状態がそうなっていて、それがそのまま残っていたのだと思います。
私のところで同じことがおきなかったのは、たまたま私のところではそこに00が入っていたからでした。
DIRコマンドを実行すると、それ以後はファイルがOPENできるようになったのは、DIR処理のときにはシステムFCBの13バイト目から16バイト目までに00を入れるようになっていたからでした。

しかし。
上のメモリダンプのようにたまたまシステムFCBの13バイト目に01が入っていたとしても、16KBを越えるファイルならば当然エクステントbェ01のFCBがディスクディレクトリに存在するはずなので、それは検出されてしかるべきはずです。
もっともたまたま今回のPI.COMは16KB以下のファイルだったので、その場合にはやはり検出されないことになりますけれど。

実はZBDOSのファイルOPENのプログラムでは、エクステントを含めて比較する以前の部分がまだ生きていたために、エクステントbェ00であるかどうかをチェックしていて、00でなければファイルOPENしないようにプログラムされていたのです。

うーん。
なんともややこしいお話で、こうやって説明を書いておりましても、いまひとつうまく説明できないもどかしさを感じてしまいます。

ともあれ原因はわかりました。
ファイルOPENの前にシステムFCBの13バイト目を00にしておけばよいはずということがわかりましたので、そのようにプログラムを修正してN様にお送りしましたところ、N様からはエラーが発生しなくなりました、というご返事が届きました。

これにて一件落着です。
説明はなんともややこしいものになってしまって申し訳ありませんが、しかし、バッチプログラムの機能を利用することで、遠隔地のユーザーのもとで発生したバグの解析もできるという、私自身が思ってもみなかったバッチ処理の意外な効能につきましてはご理解していただけたことと思います。

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

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