復活!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
前へ
次へ
ホームページトップへ戻る