復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第105回]
●大きなランダムファイルの作られ方について(2)
前回は、ランダムファイルの作られ方をさらに詳しく調べてみました。
1つのセクタに1件のレコードを格納するとした場合に、シーケンシャルファイルではディスク容量を越えるレコードを記録することはできません。
もしもファイルの先頭のレコードから順に番号をつけていったとしますと、シーケンシャルファイルでは、最後のレコード番号はそのファイルの使用セクタ数に一致します。
ところがランダムファイルではそうは言いきれないということがわかりました。
ディスク容量を越えてレコードを記録することができない、ということについてはランダムファイルでも全く同じなのですが、レコード番号に注目してみると、ランダムファイルの特徴があきらかになってきます。
たとえばランダムファイルで、作成したレコードの最大のレコード番号が99だったとしますと、そのランダムファイルのサイズはシーケンシャルファイルの場合と同じで最大のレコード番号+1がそのファイルを構成するセクタ数になりますから、128×100=12800バイトになります(レコード番号は0からスタートします)。
しかしランダムファイルでは、そのファイルサイズは実際の使用済みセクタ数を意味するとは限りません。
1レコード番号は1セクタと1対1で対応していますが、実際にそのデータを書き込むために使用されるセクタはレコード番号の大きさには関係無く、つねにディスクの空きエリアの先頭のセクタになります。
前回はそのことを確認するために、レコードbディスクの空いている先頭のセクタから順にあてはめていったとすれば、ディスクの容量を越えてしまい範囲外のセクタに割り当てられることになるレコード番号を指定してテストをしてみました。
その結果は、レコード番号の大きさには関係無く、そのレコードは空いている最初のセクタに書き込まれることが確認できました。
それならば、前回まででお見せしてきましたレコード番号テーブル(キー配列表)の値0〜63よりも大きな値を指定することも可能ではないか、という考えに行きつきます。
しかし、そうするとその場合のレコード番号テーブル(キー配列表)は、どこに作られるのでしょうか。
これも試してみればわかるはずです(そのはずだったのですが…)。
前回と全く同じようにして、そのことを試してみることにしました。
前回までのレコード番号テーブル(キー配列表)の値よりも大きな値として、64(40H)を、レコード番号表データの最後に追加しました。
>dm 8300,830f 8300 26 0F 22 27 29 0E 11 12-16 03 0D 3F FF D2 CA FF &."')......?.メハ. >cm 830c 830C FF-40 830D D2-ff 830E CA- >dm 8300,830f 8300 26 0F 22 27 29 0E 11 12-16 03 0D 3F 40 FF CA FF S..')......?.メハ. > |
>/ld fille5.bin,8100 loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F >jp 8100 >/ld ftst20.bin,8100 loading FTST20.BIN ...00a5(165)bytes loaded,from 8100 to 81A4 >jp d233 a>dir No file a>save 1 ftst20.com |
>jp d233 a>dir A: FTST20 COM a>ftst20 test.raf done a>dir A: FTST20 COM : TEST RAF a>^D end of CP/M >dm 8800,887f 8800 00 46 54 53 54 32 30 20-20 43 4F 4D 00 00 00 02 .FTST20 COM.... 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 40 .TEST RAF...@ 8830 08 00 00 03 06 07 00 00-04 02 05 00 00 00 00 09 ................ 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 ................ |
0 1 2 3 |
4 5 6 7 |
8 9 10 11 |
12 13 14 15 |
16 17 18 19 |
20 21 22 23 |
24 25 26 27 |
28 29 30 31 |
32 33 34 35 |
36 37 38 39 |
40 41 42 43 |
44 45 46 47 |
48 49 50 51 |
52 53 54 55 |
56 57 58 59 |
60 61 62 63 |
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
64 65 66 67 |
68 69 70 71 |
72 73 74 75 |
76 77 78 79 |
80 81 82 83 |
84 85 86 87 |
88 89 90 91 |
92 93 94 95 |
96 97 98 99 |
100 101 102 103 |
104 105 106 107 |
108 109 110 111 |
112 113 114 115 |
116 117 118 119 |
120 121 122 123 |
124 125 126 127 |
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |