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

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

[第411回]


●F80でのまさかのエラーの顛末(その2)

前回からの続きです。
F80(FORTRAN80)にブレークポイントをしかけながら、少しずつトレースをしていきましたら、 ?File not foundのエラー表示ルーチンにぶつかりました。
その直前にはファンクション0F(ファイルオープン)コールがあります。
そして、そこでファイルオープンに失敗していました。

1年ほど前にはエラーにならなかったものが、今なぜエラーになってしまったのか。
その理由がやっとわかりました。
ZB3DOSを開発した当初は、とにかくざっくり動けばいいということで、細かいところにはこだわらないで作成してきました。
しかしいよいよ開発も大詰めということで、プログラムの細部にわたって検討をしていく過程で、ファイルオープンの仕組みについても再検討をいたしました。
結果として、それが裏目に出てしまいました。
どういうことかといいますと。

もとは新規ファイルOPEN(ファンクション16H)のときに、ディスクディレクトリも作成してしまっていました。
そのやり方が一番簡単だからです
しかし、本当はそのやり方はおかしいのです。
本当は新規ファイルをOPENしても、まだ実際にディスクディレクトリは作成せず、最後にCLOSEしたときにはじめでディレクトリを書き換えるべきなのです。
確かに途中のデータセーブの過程では、実際にデータがディスクに書き込まれますが、それは最後のCLOSEのときにその使用ブロック(トラック、セクタ)のナンバーがディレクトリに登録されて、はじめて有効とされるべきものです。
ディレクトリに登録されなければ、いくらデータを書き込んでも読み出し可能なデータとはなりません。

うーん。
ちょっと説明がしにくいですねえ。
参考までに「応用CP/M」(村瀬康治著、アスキー出版局)から、ファンクション10H(ファイルクローズ)の説明の一部を引用いたします。

「ファイルのオープン(ファンクション:15)、あるいはファイルの作成(ファンクション:22)のファンクションがすでに実行されており、FCBで示されるファイルに何らかの書き込みが行なわれた場合、データは、そのつど、1レコードずつディスクに書き込まれて行くが、ディスク上のディレクトリ部分に関しては、何も更新されていない。そこで書き込み操作を全部終了した最後の時点で、クローズファンクションを実行し、現在のメモリ上のFCBの内容をディスク上の該当ディレクトリに書き込み、ディレクトリを更新して、新しいファイルとして完成させなければならない。(同書85ページ。以下省略)」

そういうことなのですけれど。
私はそのことを厳格に解釈して、ファイル名をディレクトリに最初に登録することも、クローズのときに行なうというように考えました。
今上記の文を読んでみますと、どうやら名前だけは最初に登録する、というようにも読めます。
事実もそうだったようです。

後に直したZB3DOSの場合、ディレクトリへの新しいファイル名の登録は、最後にクローズしなければ行なわれません。
すると前回のFORTRAN80の逆アセンブルリストにありましたように、新規ファイルオープンした直後に重ねて同じファイルをオープンしようとしても、その時点ではファイル名の情報はRAM上のFCBエリアにしかありませんから、FILE NOT FOUNDになってしまったのです。
でも、そもそもなぜそのような、無駄作業としか思えないことをやっているのでしょうか?
本当のところはわかりませんが、フロッピーディスクの書き込み禁止に関係しているのかもしれません。
昔のフロッピーディスク装置では書き込み禁止の状態がホストにはセンスできないものがあったのかもしれません。
その場合、ホスト側は正しく書き込みが行なわれたと思っていても、実際には書き込まれていない、ということが起こり得ます。
そこで新規ファイルオープンした直後に、実際にそのファイル名がディレクトリに書き込まれたかどうかを確認するために、重ねてファイルオープンを実行しているということなのかもしれません。

理由はともかく、そのような操作を可能にするためには、新規ファイルオープンによって、ファイル名情報だけはFCBの形でディレクトリに書き込まれる必要があります。
しかし。
そのようにした場合、なんらかの理由でファイルクローズが実行されずにプログラムの実行が打ち切られてしまったとしますと、ファイル名だけはディレクトリに登録されたままになってしまいます。
それは、システムとしては、みっともない話です。

私としては、不本意でもありましたし、本当にそうなのか、半信半疑でもありました。
そこで、本家本元のCP/Mでも確認をしてみました。



これはZB3DOSではありません。
昨年5月ごろの、仮RAMディスク用にアレンジしたCP/Mです。
[第51回]で使ったファイルCOPYプログラムの最後のクローズ部分を削除したFTST5T.COMを作って実行しました。
いわば欠陥プログラムです。
FTST5T2.TXTを読み込んで新規ファイルFTST5T3.TXTを作成しますが、最後のクローズは行なわれません。
その実行の結果、ディレクトリを確認してみますと、空のFTST5T3.TXTディレクトリが作成されていました。

せっかくまともなプログラムに改良したつもりだったのですけれど。
まるで時計の針を戻すような作業で、実に面白くありませんねえ。
しかし本家がこういう仕様ということが分かりました以上、これはまあそのように、元の仕様に戻すしかありませんでしょう。

そのように直しましたところ、以前のように、無事FORTRAN80が動くようになりました。



これにてめでたく、一件落着といきたいところなのですが。
別のお客様からメールが届きました。

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

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