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

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

[第13回]

●BIOSのディスクパラメータ(2)

前回に引き続いて、ディスクパラメータについて説明をします。
                
  
                        ;
                        ;   Parameter block returned from the bios.
                        ;
  D1CA  1000            SECTORS:DEFW    16              ;sectors per track from bios.
  D1CC  02              BLKSHFT:DEFB    2               ;block shift.sector in a block 128*2^n
  D1CD  03              BLKMASK:DEFB    3               ;block mask.sector no. in a block - 1
  D1CE  00              EXTMASK:DEFB    0               ;extent mask.
  D1CF  1700            DSKSIZE:DEFW    23              ;disk size from bios (number of blocks-1).
  D1D1  1F00            DIRSIZE:DEFW    31              ;directory size.(max file name no.-1)
  D1D3  C000            ALLOC0: DEFW    0C0H            ;storage for first bytes of bit map (dir space used).
  D1D5  0000            ALLOC1: DEFW    0
  D1D7  0000            OFFSET: DEFW    0               ;first usable track number.
                        ;

前回はDSKSIZEまで説明をしました。
次はDIRSIZEです。
ディレクトリエリアとして、仮想フロッピーディスクの先頭部分の8セクタ(トラック0のセクタ0〜セクタ7)を割り当てることにします。
前回説明しましたように、ディレクトリエリアはファイル名ごとに32バイトが割り当てられます。
1セクタは128バイトですから、ディレクトリの1セクタには128/32=4個のファイル名スペースが割り当てられることになります。
したがって8セクタでは4×8=32個のファイル名が登録できることになります。
DIRSIZEの説明を見ますと、max file name no. −1 と書いてあります。
ですから、ここには32−1=31(=1FH)を書きます。

ALLOC0は、ディレクトリがディスクのどの位置にあるかを示すためのマップとして使われます。
2バイト16ビットを使って、ディスクの先頭から1ブロックを1ビットで示します。
ディレクトリブロックは1、そうではないブロックは0で示します。
今回はディスクの先頭の2ブロック(8セクタ)をディレクトリに割り当てました(そうすることが一般的です)。
そうしたときのマップは下のようになります。

11000000 00000000

左から下位バイト、上位バイトの順であることに注意。ただし各バイトのビット並びは左がビット7で右がビット0です。
ですからALLOC0は00C0Hになります。

ところで、ND80ZVのRAM上に仮設する仮想フロッピーディスクのサイズは96セクタ(24ブロック)ですから、ALLOC0の16ビットでは全てのブロックは表現できません。
現実のフロッピーディスクはもっとサイズが大きいので、当然のことながらディスクの全領域はALLOC0の16ビットでは表現できません。
おそらくCP/Mでは暗黙の了解として、ディスクの先頭の16ブロックのみがディレクトリエリアを置くことができる領域とみなされていると思われます。

なお、ダウンロードしたCP/M2.2ソースプログラムリストでは、ALLOC0、ALLOC1はそれぞれDEFWと記述されていますから、各2バイトです。
しかし、Y様に送っていただいた「応用CP/M」に記載されているサンプルリストでは、ALLOC0、ALLOC1は各1バイト8ビットとして説明されています。

どうやらもともとのCP/MではALLOC0が前の8ビット、ALLOC1が後の8ビットを示す変数として使われているようです。
すると、このソースプログラムリストは、この部分については名前の付け方を誤っているようです。
BDOSプログラムの中味を調べてみますと、ALLOC0のみがディレクトリマップの位置確認のために使われており、ALLOC1はディスクを入れ換えたことを確認するため(?)のチェックのために使われているようです。

どうもおかしいと思ってさらに追求して調べてみましたら、やっとわかりました。
このCP/M2.2ソースプログラムリストのALLOC1はCKVS(Check Vector Size)の誤記のようです。

最後のOFFSETは、first usable track number と説明されている通り、ディスクの有効なデータ領域が始まる最初のトラックナンバーを指定します。
通常はトラック0から使用されますから、OFFSETは0ですが、CP/Mシステムディスクのようにトラック0とトラック1をシステムプログラムの格納用に使っているディスクでは、OFFSETは2になります。

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

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