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

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

[第143回]


●ファンクションコール1BH(アローケーションベクトルアドレスの取得)

ファンクションコール1BHはカレントドライブのアローケーションベクトルの先頭アドレスを取得します。
アローケーションベクトル(ALV)はディスクドライブ毎に、RAM上に用意されていて、そのディスクの使用状況を示しています。
デイスク上の1ブロックを1ビットに置き換えて示し、使用済みブロックを1で、未使用ブロックを0で示します。

MSDOSではALVに相当するものをFAT(File Allocation Table)と呼びます。
CP/M2.2のALVはRAM上に置かれていますが、MSDOSのFATは個々のディスク上に置かれます。
私は後者の方法が当たり前だと思っていたのですが、CP/Mではなぜディスク上に置かずにRAM上に置いていたのでしょう。
RAM上に置くということになりますと、リブートの度にデレクトリをサーチして現時点のディスクの使用マップを作成し直さなければなりません。

むむ。
ディスク上に置いた場合でも、セーブやデリートの度にFAT(ALV)を読み書きしなければならないから、同じことか。

理由はよくわかりませんが、とにかくCP/M2.2ではALVをディスクに置かずにRAMに置いています。
ファンクションコール1BHは、そのようにRAMに置かれたALVの先頭アドレスを取得します。

ファンクションコール1BHは[第95回]でテストしました。
作成したテストプログラムはFTST15です。

[第95回]と同じように、FTST15を実行してみました。

logfile nd80zlog\05312014.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>jp d233

A>dir
A: FTST15   COM : FTST11   COM : FTST9    COM : FTST7    COM
A: FTST8    COM : FTST12   COM : FTST10-5 COM : FTST13   COM
A: FTST18   COM : FTST19   COM
A>ftst15
B884
DFF0
A>b:
B>dir
B: FNC0BT2  COM : FNC0BT1  COM : FNC0BT   COM : FNC06T2  COM
B: FNC0304T COM
B>a:ftst15
B88A
FC00
B>end of ZBDOS
>dm 8800,89ff
8800  00 46 54 53 54 31 35 20-20 43 4F 4D 00 00 00 02  .FTST15  COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  E5 53 45 41 52 43 48 20-20 43 4F 4D 00 00 00 02  .SEARCH  COM....
8830  02 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8840  00 46 54 53 54 31 31 20-20 43 4F 4D 00 00 00 02  .FTST11  COM....
8850  03 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 46 54 53 54 39 20 20-20 43 4F 4D 00 00 00 02  .FTST9   COM....
8870  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8880  00 46 54 53 54 37 20 20-20 43 4F 4D 00 00 00 02  .FTST7   COM....
8890  07 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88A0  00 46 54 53 54 38 20 20-20 43 4F 4D 00 00 00 02  .FTST8   COM....
88B0  0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88C0  00 46 54 53 54 31 32 20-20 43 4F 4D 00 00 00 02  .FTST12  COM....
88D0  04 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88E0  00 46 54 53 54 31 30 2D-35 43 4F 4D 00 00 00 04  .FTST10-5COM....
88F0  08 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8900  00 46 54 53 54 31 33 20-20 43 4F 4D 00 00 00 02  .FTST13  COM....
8910  06 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8920  00 46 54 53 54 31 38 20-20 43 4F 4D 00 00 00 02  .FTST18  COM....
8930  09 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8940  E5 46 4E 43 30 42 54 32-20 43 4F 4D 00 00 00 00  .FNC0BT2 COM....
8950  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8960  00 46 54 53 54 31 39 20-20 43 4F 4D 00 00 00 02  .FTST19  COM....
8970  0A 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8980  E5 46 54 53 54 31 35 20-20 43 4F 4D 00 00 00 00  .FTST15  COM....
8990  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89A0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
89B0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
89C0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
89D0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
89E0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
89F0  E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5  ................
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Thu May 31 20:15:52 2012

最初にカレントドライブがAドライブのときにFTST15を実行しました。
アローケーションベクトルの先頭アドレスがB884、アローケーションベクトルの値がDFF0と表示されました。
次にカレントドライブをBドライブにして、同じようにFTST15を実行しました。
アローケーションベクトルの先頭アドレスがB88A、アローケーションベクトルの値がFC00と表示されました。

その後、[Ctrl]+[D]を入力してCP/M互換DOSを終了して、ZB3BASICに戻りました。
DMコマンドでAドライブのディレクトリエリアを表示させました。
各FCBのブロックアローケーションエリアに書かれているブロック番号をチェックしてみます。
01、02、03、05、07、0B、04、08、06、09、0A
ディレクトリはブロック00に置かれていますから、00は常に使用済みです。

すると。あれ?
00〜0Bまで、全て使用済み?
ブロック番号00から順にALVのビットに当てはめていって、使用済みのビットを1にすると、
FFF0になりますねえ…。
1111 1111 1111です(Aドライブは12ブロックしかありませんから、これより下位のビットは使われません)。

しかし。
上のAドライブでのFTST15の実行結果では、ALVの値はDFF0でした。
1101 1111 1111 です。

この結果からすると、02ブロックは未使用のはずなんですけれど…。

さきほどのディレクトリエリアのダンプリストをもう一度良く見直してみました。
ブロック02は上から2番目、SEARCH.COMのところに書かれておりますが。
おお。
そのFCBの先頭は’E5’になっています。
ここが’E5’になっているファイルは削除済みであることを示しています。
ですから、SEARCH.COMに使われていたブロック02は、現在は未使用になっていたのでした。

あの。
一口にDOS(Disk Operation System)といいますけれど、こういうあたりがうまく働くようにできてこそ、はじめてSystemといえるのでありますね。
ファイルを削除するということは、ディレクトリからそのファイル名を削除すればそれでよいというものではなくて、そのファイルが使っていた資源をちゃんと解放するところまでやらないと、Systemにはなりません。
互換DOSという以前にそのあたりの基本的なところもちゃんと押さえておかなくてはならないのです。
ですから、DOSを作るなどというのは、実はなかなかに大変なことなのです。
でも。
ちゃんと、うまく機能していますでしょう。
ちょいと自慢なのですけれど、こういうものを作り上げるには、それなりの知識と経験と根性が要るのでありますよ。
あ。
実はほとんど根性ばっかりだったりして。
ま。
それは言えておりますでしょう。
星一徹。男の道を一直線、でありますね。

●ファンクションコール1FH(ディスクパラメータアドレスの取得)

ファンクションコール1FHについては[第96回]で説明しました。
ディスクパラメータの先頭アドレスを取得して、HLレジスタに入れます。
これもアドレスを取得するだけですから、とくに何というほどのルーチンでもありません。
テストプログラムはFTST16です。

下はFTST16を実行したときのログファイルです。

A>ftst16
D259
10 00 02 03 00 0B 00 0F 00 80 00 00 00 00 00 
A>end of ZBDOS
>dm d259,d269
D259  10 00 02 03 00 0B 00 0F-00 80 00 00 00 00 00 21  ...............!
D269  00 80 3E C3 77 23 11 75-D2 73 23 72 21 03 80 AF  ..>テw#.uメs#r!..ッ
>

ディスクパラメータは15バイトのサイズです。
FTST16を実行すると、最初にディスクパラメータの先頭アドレスを表示し、その次にディスクパラーメータの15バイトの内容を表示します。
ディスクパラメータの先頭アドレスとしてD259が表示されました。
続いてその内容が表示されています。
念の為に、CP/M互換DOSを終了して、DMコマンドでD259からの内容を表示させました。
確かに、FTST16の実行によって表示された通りの内容です。
って、そこを読んでそのまま表示しているだけですから、当たり前ですけれど。

ディスクパラメータはBIOSプログラムの中で設定をしています。
下はZBIOSのその部分のリストです。

              ;
D259 1000     DPTOP:DW $0010;sectors per track from bios.
D25B 02       	DB 02; 03;block shift.sector in a block 128*2^n
D25C 03       	DB 03; 07;block mask.sector no. in a block - 1
D25D 00       	DB 00;extent mask.
D25E 0B00     	DW $000B; $0005;disk size (number of blocks-1).
D260 0F00     	DW $000F; $001F;directory size.(max file name no.-1)
D262 8000     	DW $0080;storage for first bytes of bit map (dir space used).
D264 0000     	DW $0000
D266 0000     	DW $0000;offset. first usable track number.
              ;
              ;BIOS ROUTINE
              ;

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

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