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

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

[第177回]


●EOF(End of File)コードについてもう少し

EOFコード(1AH)についてはもう何回も書いております。
EOFコードはファイルの終わりを示すコードですが、現在では使われなくなってしまいました。
CP/Mはファイルをフロッピーディスクなどに記録するときに、ファイルサイズをセクタ単位(128バイト)でしか記録しません。
ファイルの最後が端数で終わったとしても、どうせ半端に使われた最後のセクタの未使用領域は、ほかのファイルに利用されることはありませんから、当時としてはある意味合理的であったともいえます。

CP/Mではファイルはセクタ単位で保存されるのですが、実はディスクの未使用領域の管理はセクタではなくて、ブロック単位で行われていました。
記録容量の小さなメディアが対象であったわりには勿体ない使い方ですが、きめ細かい管理をするには、CPU速度やフロッピーディスクのアクセス速度がネックになって、難しかったからではないかと思われます。

余談になってしまいました。
お話を元に戻します。
ファイルサイズをセクタ単位で管理するときに、ファイルの最後のセクタ単位(128バイト)に満たない端数をFCBに保存するようにすれば、正確なファイルサイズで管理することができたはずです。
端数の管理には1バイトを充てれば済みますから、なんとかできたはずです。
CP/M2.2について調べはじめた当初は、てっきりそういう管理をしているものだと思って、いろいろ確認してみたのですが、どうやらセクタ単位以上の細かいファイルサイズでは管理していなかったらしいことがはっきりしました。

そういうことになると、テキストファイルの場合には困った問題が発生します。
ファイルの終わりがわからないことから起きる問題につきましては、つい先日[第173回]で説明をいたしましたし、ずっと以前に[第15回]でも書いております。

そのあたりにも書きましたように、その困った問題をクリアするために、CP/Mではテキストファイルの終わりにEOFコード(1AH)をつける、という約束事になっていました(これはCP/Mに限ったことではなくて、おそらく当時の一般的なルールだったと思います)。

しかしMSDOSがファイルサイズをバイト単位で管理するようにしたために、MSDOSの普及に伴ってEOFコードはその存在意義を失ってしまいました。
そのために近年のテキストエディタではファイルの最後にEOFコードをつけないものがほとんどになってしまいました。

そこで[第175回]に書きましたように、新たに作ったCOPYコマンドでは、ZB3.EXEの存在するフォルダ(これをZドライブとします)から仮想FDDにBIN、COM以外のファイルをコピーするときには、ただ単にコピーするのではなくて、最後にEOFコード(1AH)を付加するようにしたのです。

そのように書きますと、あれえ、TeraPadはファイルの最後にEOFがついていますよー、と言われる方もいらっしゃるかと思います。
でも。
TeraPadの[EOF]は、あれはウソ、ただの飾りで実体はありません。

これですよね。

いかにも最後にEOFがあるように見えますが。

DEBUGコマンドで確認してみれば一目瞭然です。

ご覧の通り、ファイルの終わりには1AHはありません。
念の為にその下のところで、DIRコマンドでEOFTEST.TXTのファイルサイズを確認しています。
EOFTEST.TXTのファイルサイズは10バイトです。

41 42 43 0D 0A 58 59 5A 0D 0A
で10バイトですから、これで終わりです。

TeraPadで最後に見えている[EOF]がただの飾りだということを納得していただけましたでしょうか?
もちろんWindowsのNotepadでも1AHは付加されません。

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

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