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

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

[第33回]

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

前回のCP/Mソースプログラムの変更とBIOS部分の追加作業によって、このままアセンブラにかけて、実行できるCP/Mソースプログラムができあがりました。

ところで。
今回は、前回お見せしましたディスクパラメータとBIOSプログラムについての説明をしようと思いましたら、もうすでに全部説明してしまっておりました。
過去記事を調べましたら、[第12回]あたりでしっかり説明をしてしまっておりました。

私の場合、忘却するのには1週間もあれば十分でありますから、およそ3週間も前のことともなれば、痕跡もとどめていないのが当然であります。
「忘れじと誓いつつも忘れてしまう心の悲しさよ」であります。
あ。あれは私よりももっと前の世代のお話で、話だけは聞いておりますが、いくらなんでも私はそんなトシではありませぬ。

え?
聞いたことがありません?
引用元のセリフは確か、「忘却とは忘れ去ることなり。忘れえずして忘却を誓う心の悲しさよ」だったと思います。
うらやましい限りでありますなあ。

冗談はそのくらいにしておきまして。
実は[第12回]でパラメータを書き入れました領域は、実はデータバッファエリアでありまして、実データを記入しておくところではありませんでした。
その後にだんだんと理解が進んでいってそのようにわかりました。
で。
本当は、前回お見せしましたパラメータ設定のところ(その部分を下に再掲いたします)に設定しておきます。
CP/M本体が実行の過程でこのエリアから必要に応じて、[第12回]でお見せしたCP/M内のバッファ領域にコピーして使います。

ま、しかし、個々のパラメータの説明につきましては、[第12回][第13回]で説明をしております通りでありますから、そちらを参照していただければ、と思います。

;*************** BIOS DATA AREA ******************************
;
DIRBF EQU 0B800H;128bytes
;
CSV00 EQU 0B880H;8bytes 
ALV00 EQU 0B888H;3bytes
;
;   DISK PARAMETER BASE
;
DPBASE: 
;
;drive No.0 (a drive)
        DEFW    0               ;XLATE
        DEFW    0               ;scratch1
        DEFW    0               ;scratch2
        DEFW    0               ;scratch3
        DEFW    DIRBF           ;address of dirbf.
        DEFW    DPTOP           ;address of disk parameter block.
        DEFW    CSV00           ;address of check vector.
        DEFW    ALV00           ;address of allocation vector (bit map).
;
;
DPTOP:DEFW      16              ;sectors per track from bios.
        DEFB    2               ;block shift.sector in a block 128*2^n
        DEFB    3               ;block mask.sector no. in a block - 1
        DEFB    0               ;extent mask.
        DEFW    23              ;disk size (number of blocks-1).
        DEFW    31              ;directory size.(max file name no.-1)
        DEFW    0C0H            ;storage for first bytes of bit map (dir space used).
        DEFW    8               ;check sum vector size
        DEFW    0               ;offset. first usable track number.
;

ただ、補足しておきますと、CSVとALVはディスク毎に確保しておく必要がある領域で、CSV(Check Sum Vector)は、ディレクトリのチェックサム値を計算するのに使われます。
フロッピーディスクが差換えられたかどうかを検出するために使われたようです。
ディレクトリの1セクタにつき1バイトが必要です。
今回の仮RAMディスクでは、ディレクトリには8セクタを割り当てましたから、CSVには8バイトが必要になります。

ところで、前回お見せしたリストには一個所落ちがありました。
上のリストで下から2番目はDEFW 0 になっていましたが、ここは上のリストのようにDEFW 8 にします。
ここはCSVに割り当てたバイト数を記入します。
このことは[第13回]で説明をしておりましたのに、それを完全に忘れておりました。
そのように訂正をお願いいたします。

ALV(ALlocation Vector)はディスク上の1ブロックを1ビットに置き換えて示したもので、使用済みのブロックを1で、未使用ブロックを0で示します。
ファイルを保存するときに、未使用エリアを捜すのに、このマップが使われます。
今回の仮RAMディスクは24ブロックしかありませんから、24/8=3バイトしか使いません。

そういえば[第12回]では、CP/Mではなぜブロックというものを使うのか、という説明のなかで、ディレクトリエリアのファイル毎の使用ブロックを示すナンバーが8ビットなので、ディスク中のブロックを示すのに、0〜255までしか使えない、というように書きました。
これもあとからわかったことなのですが、ブロック数が256以下の場合にはその通りなのですが、それ以上の場合には、2バイトを使ってブロック番号を示すようになっておりました。
このことにつきましても、謹んで訂正をしてお詫び申し上げます。

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

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