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

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

[第211回]


●VFTST15の実行(その2)

前回はVFTST15を実行してALV(Allocation Vector)の中味を表示しました。
VFTST15はファンクションコール1BHを実行してALVの先頭アドレスを取得し、そのアドレス以降の128バイトの内容を16進数表示します。
下は前回お見せしましたそのときの実行画面です。
[第143回]を開いて、それをバックにしてVFTST15を実行しました。



最初にカレントドライブがAドライブのときにVFTST15を実行し、次にカレントドライブをBドライブにして、同じようにVFTST15を実行しました。

ALVについては前回説明しましたが、そこのところをもう一度再掲します。
仮想フロッピーディスクドライブは各ドライブともサイズは2MBです。
CP/Mはドライブをブロックという単位で管理しています。
仮想フロッピーディスクドライブは16セクタを1ブロックにしています。
CP/Mの1セクタは128バイトです。
ですから1ブロックは2048バイトになります。
2MB(2048KB)はちょうど1K(1024)ブロックになります。
ALV(アローケーションベクトル)は1ブロックを1ビットに割り当てます。
そのことからALVのバイト数は1024/8=128バイトになります。

VFTST15を実行した結果、AドライブのALVは先頭から14バイトがFFになっています。
15バイト目は80ですから、1ブロックだけ消費されています。
全体では14×8+1=113ブロックが使われていることになります。
このうち最初の2ブロック(bO、bP)はディレクトリ用にリザーブされています。
するとファイルとして使われているブロックはbQ〜bP12になります。

で。
前回はこのあとAドライブのディレクトリセクタの内容を表示して、セーブされているファイルのFCBエリアに書かれているブロックb確認することで、ブロックの使用状況がALVに反映されているということを説明しました。

実際にファイルデータをセーブするときはセクタ(128バイト)単位で行なうのですが、FCBでの管理をセクタ単位で行なおうとしますと、FCBエリアとALVが巨大なものになってしまいます。
ちなみにCP/Mでは1セクタ128バイトなので、2MB(2048KB)の仮想FDDの場合、セクタ数は2048×8=16384(1KB=1024=128×8)になります。
この全てを管理するにはディスクディレクトリのFCBエリアは少なくとも32KB必要です。
そのほかにファイルネームのためのエリアなどが必要ですから、ディレクトリエリアは少なくとも64KBは必要です。
セクタに換算すると64×8=512セクタです。
またALVは16384/8=2048バイトも必要になります。

ということで。
CP/Mではざっくりとブロックで管理することになっています。
CP/Mは私が作ったシステムではありませんから、そのようになっている理由は本当のところはわかりません。
でも多分そういうことではないかと思います。

もちろんファイルのセーブ/ロードはセクタ単位できっちり行なわれます。
ただたとえ1セクタしか使わなくても、そのセクタが含まれるブロックは使用済みになってしまいます。
それがFCBとALVがブロック単位で管理される、ということの意味です。

さて。
それではもう少し具体的に、その管理の実際を見てみることにします。
前回のVFTST15の実行によって、Aドライブは先頭から113ブロックが使用済みであることがわかりました。
ALVは1ブロックを1ビットで示し、使用済みブロックはそのビットを1で示しますから、上でお見せした画像では、ALVの内容を16進数で表示した結果、FFFF…FF80と表示されています。

この状態は先頭のブロックから順に隙間無く消費されている状態に見えます。
それではその途中にあるファイルを削除してみたら、その結果はどのようになるのでしょうか。
それを試してみたいと思います。

最初にDIRコマンドを実行して、Aドライブのディレクトリを表示させました。



その中で、 TESTDATとTESTDAT2.TXTの2ファイルをERAコマンドで消去しました。
 TESTDATはシステム作成途中のバグで先頭にスペースが入れられてしまいました。
ERAコマンドのファイル名指定で’?’を置いているのはそのスペースを無視するためです(’?’は1文字を置き換えるためのワイルドカードです)。

消去した結果を確認するために、もう一度DIRコマンドを実行しました。



 TESTDATとTESTDAT2.TXTは表示されなくなりました。

そのあと、VFTST15を実行してみました。
その結果は?



おお。
ファイルを消去する前はずっとFFが並んでいたのですが、今回は途中にD7が見えます。
D7=11010111です。
間を1つ置いて2つのブロックが使用済みから未使用に変わったようです。
その部分をディレクトリのFCBで確認してみましょう。

前回も実行したVFDUMPです。



ファイル名の TESTDATとTESTDATA.TXTの先頭にE5が書き込まれています。
FCBエリアの先頭にE5が書かれると、そのファイルが消去済みで、このFCBエリアそのものも上書き使用してもよいことを示します。
 TESTDATのブロックアローケーションエリアを見るとブロックbO05EHがあります。
TESTDATA.TXTは0060Hです。
5EH=94、60H=96です。
94/8=11余り6
96/8=12
ですから先頭のbOからビットに当てはめて16進数で示すと、bX4とbX6のみを0、そのほかのビットを1とすれば11個FFが続いてそのあと1のビットが6個あって、その次が0になります。

FF FF FF FF FF FF FF FF FF FF FF FD 7F
                               ↑ここのところは
                                11111101 01111111

という感じです。

このようにSAVEやERAコマンド、ユーザープログラムによるファイルのセーブ、削除のたびにドライブ内のブロックの使用状況を常に最新のものとして記録し管理しています。
この働きこそがDOS(Disk Operation System)のコアなるところなのです。

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

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