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

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

[第148回]


●ファンクションコール23H(ファイルサイズの計算)

ファンクションコール23Hについては[第109回]で説明をしています。
ファイルサイズを取得して、FCBエリアの末尾3バイトに入れます。
CP/Mの場合FCB(File Control Block)という名称は2つの異なった対象に対して使われます。
1つはディレクトリの中で、ファイル名ごとに作成される32バイトのエリアです。
もう1つはシステム内部でワークとして使われるエリアで、こちらは36バイトあります。

システムはファイルオープンによってディレクトリエリアから対象になるファイルのFCBを、システム内部のワークエリアにコピーした後は、そのコピーされたワークエリアをもっぱらFCBであるとして使います。
従って、CP/Mのシステム内部で使われる”FCB”の多くは後者を示しています。

●まずはFCBの33バイト目について

ワークエリアとしてのFCBの33バイト目にはシーケンシャルファイルアクセスの場合に、次にアクセスするレコードbェ置かれます。
1バイトですから0〜255までのbオか置けません。
ちょっと難しい話になってしまいますが、ここに置かれるレコードbヘ、実は「同一エクステント内で」という言葉が冠されているのです。

CP/Mのディレクトリに置かれるFCBは32バイトで、その後半の16バイトがブロックb置くためのマップとして使われます。
そのファイルがディスク上のどのブロックにどのような順で書き込まれているかを示しているマップです。
1ブロックは標準では8セクタです。
すると、1つのFCBには8×16=128セクタ分の情報しか置くことができません。
CP/Mでは1セクタ=1レコードですから、1つのFCBにはレコードbO〜127までしか入れられないことになります。
では、それを越えるレコードは、どのようにしてマッピングされるのか、といいますと、そこで使われるのがエクステント(Extent)なのです。

FCBの第1バイトにはドライブbェ入ります。
第2〜第9バイトはファイル名のエリアです。
第10〜第12バイトはエクステンション(Extention)のエリアです。
エクステンションは拡張子などと言います。COM、EXE、TXTなどというファイルの属性を示す部分です。
そしてその次の第13バイトにエクステントが置かれます。

最初に作成されるファイルのエクステントbヘ00です。
ファイルのサイズが128レコードを越えると、ディレクトリ内に同じファイル名のFCBが新たに作成され、そのエクステントは01になります。
そのようにしてブロック、レコードを管理していますから、さきほどのワークとしてのFCBの33バイト目に置かれる次のレコードbヘ通常は0から127の範囲で、ここが128になったときに、新たなFCBが作成され、そのエクステントが+1されるとともに、FCBの33バイト目がクリアされます。

●そしてFCBの34バイト目から36バイト目

さて。
説明がちょいと横道に外れてしまいましたから、元に戻ります。
ワークとしてのFCBの、34バイト目から36バイト目(つまり最後の3バイト)は、ランダムアクセスのときのレコードb竅A今回のファンクションコール23Hでのファイルサイズの格納場所として使われます。

3バイト(24ビット)ありますから、16777216までの数を入れることができます。
単位はセクタ(128バイト)ですから、16777216/8=2097152(KB)という巨大なサイズまで表すことができます。
2097152KB≒2097MBです。
CP/Mで扱うことのできるドライブの最大サイズは8MBですから、ファイルサイズを示すには、3バイトあれば十分ということになります。

あれ?
2バイトでは65536/8=8192(KB)≒8MBなので、それなら2バイトあれば十分なはずなのですがねえ。
CP/M2.2のソースリストをあらためてよく読み直してみましたら、3バイトあるうちの最上位の1バイトは ’overflow’ とコメントしてありました。
どうやらオーバーフロー用のワークエリアのようです。
やはり、実際に使われるのは2バイトのエリアで、表すことのできる最大のファイルサイズは8192KB(8MB)のようです。

●ファンクションコール23Hのテスト

またまた横道に外れてしまいました。
本題に戻ります。

ファンクションコール23Hのテストです。
[第109回]ではテストプログラムFTST22を作り、それを使ってテストを行ないました。
今回もそれに習って、同じことをしてみます。

logfile nd80zlog\06020950.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst22.bin,8100
loading FTST22.BIN ...00ce(206)bytes loaded,from 8100 to 81CD
>jp d233

A>save 1 ftst22.com

A>dir
A: FTST20-3 COM : TEST     RAF : FTST22   COM
A>ftst22 test.raf
00 00 00
end

A>ftst22 ftst20-3.com
00 00 02
end

A>ftst22 ftst22.com
00 00 02
end

A>end of ZBDOS
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Jun 02 10:51:01 2012

ファンクションコール23HのテストプログラムがFTST22つうのは、実にまぎらわしくて、かつそのテストの内容を全く表していないファイル名です。
行き当たりばったりでいいかげんなファイル名をつけていると、こういうことになります。
まあ。テストプログラムだから、いいことにいたしましょお。

さて。
FTST22を使って、ランダムファイルTEST.RAFのファイルサイズを表示させてみましたら。
あれ?
ファイルサイズが0?

それじゃ、シーケンシャルファイルは、ということで、FTST20−3.COMとFTST22.COMのファイルサイズも表示させてみましたら、どちらも2(セクタ)ですから、正解です。
SAVEコマンドでは、2セクタ(256バイト)単位でセーブが行なわれますから、SAVEコマンドで作成したファイルサイズの最小値は2になります。

おお。
ランダムファイルのサイズが0です!
シーケンシャルファイルはちゃんとまともに読めています。
まさか!

CP/M互換DOSを終了して、DMコマンドで、ディレクトリの中味を表示してみましたら。

>dm 8800,887f
8800  00 46 54 53 54 32 30 2D-33 43 4F 4D 00 00 00 02  .FTST20-3COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 00  .TEST    RAF....
8830  08 00 00 03 06 07 00 00-04 02 05 00 00 00 00 00  ................
8840  00 46 54 53 54 32 32 20-20 43 4F 4D 00 00 00 02  .FTST22  COM....
8850  09 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
8870  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................

なんと。
ファイルサイズのところに値がはいっていません。
FCBの16バイト目がそのエクステントのセクタ数(レコード数)が入る場所です。

ううう。
調べてみましたら。
ファンクションコール22H(ランダムライト)にバグがありました。

さっそく直しました。
もう一度ランダムファイルの作成からやり直しです。
前回([第147回])の作業をもう一度最初から行なって、TEST.RAFを作り直しました。

logfile nd80zlog\06021051.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld fille5.bin,8100
loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F
>jp 8100
>/ld ftst20-3.bin,8100
loading FTST20-3.BIN ...0097(151)bytes loaded,from 8100 to 8196
>/ld zbdos1w.bin,c406
loading ZBDOS1W.BIN ...08d2(2258)bytes loaded,from C406 to CCD7
>jp d233

A>save 1 ftst20-3.com

A>ftst20-3 test.raf
done

A>dir
A: FTST20-3 COM : TEST     RAF
A>end of ZBDOS
>dm 8800,887f
8800  00 46 54 53 54 32 30 2D-33 43 4F 4D 00 00 00 02  .FTST20-3COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 2A  .TEST    RAF...*
8830  08 00 00 03 06 07 00 00-04 02 05 00 00 00 00 00  ................
8840  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
8850  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
8860  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
8870  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
>

最初のところで、仮RAMディスクのクリアと、FTST20−3.BINのロードをするとともに、バグ修正済みのZBDOS1W.BINをロードしています。

CP/M互換DOSを起動して、FTST20−3.COMをAドライブにセーブしたあと、実行しました。
CP/M互換DOSを終了して、ZB3BASICに戻って、DMコマンドでディレクトリエリアを表示し、TEST.RAFのFCBエリア(アドレス8820H〜883FH)の第16バイト(アドレス882FH)に、このエクステントのレコード数(2AH)が入っていることを確認しました。

あらためてFTST22を実行しました。

>/ld ftst22.bin,8100
loading FTST22.BIN ...00ce(206)bytes loaded,from 8100 to 81CD
>jp d233

A>save 1 ftst22.com

A>dir
A: FTST20-3 COM : TEST     RAF : FTST22   COM
A>ftst22 test.raf
00 00 2A
end

A>end of ZBDOS
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Jun 02 11:04:13 2012

今度は、うまく行きました。
いやあ。
なかなかに。
骨の折れることです。

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

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