復活!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 |
>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 ................ |
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 ................ > |
>/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 |