Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
fe32e2e1eThis file is pinned to the selected release. Download the original to open it in your design tool.
# CP/M DISK Parameters
## 用語
CP/MのDISK I/Oにはさまざまな用語が出てきてややこしいので整理しておく。
#### CP/Mの構成要素
|用語 |正式名称 | 役割 |
|------|---------------------------|-----------------------------------------------------------------------------|
| IPL | Initila Program Loader | CP/Mの管理外なので実装方法は規定されないが、必要な情報をメモリ上にロードしBIOSを起動する。|
| BIOS | Basic I/O System | 物理ハードウェアを制御するAPIライブラリ。IPLから起動され、CCPを呼び出すことでCP/Mを起動する。以後、BDOSから渡される、パラメータ(論理ディスク、トラック、セクタ)を[DPB](#DPB)の内容に応じて物理トラック、セクタに変換し、実際にディスクの読み書き、およびコンソールI/Oの処理を行う。|
| CCP | Console Command Processor | コンソール入力を解釈し、ビルトインコマンド、トランジェントコマンドを起動する。内部でBDOSを呼び出す。|
| BDOS | Basic Disk Operating System |CP/Mのコアライブラリ。CCPやトランジェントプログラムはBDOSをAPIとして呼び出す。<br>BDOSは論理ディスク番号、論理トラック番号、論理セクタ番号をパラメータとしてリード・ライト要求をBIOSに対して発行する。|
#### 物理ディスク
|用語 | |
|----------|-----------------------------------------------------------------|
|物理ディスク|実際の物理デバイス。特性は[DPB](#DPB)で定義される。 |
|物理トラック|物理ディスクのトラック。数は論理トラックと同じ。 |
|物理セクタ |物理ディスクのセクタ。サイズは論理セクタサイズ(128バイト)の整数倍であること。|
#### 論理ディスク
|用語 | | 番号 |
|----------|---------------------------------------------------|-------|
|論理ディスク|CP/Mで扱う仮想的なディスク単位。16台まで管理可能。ドライブレターは A:〜P: |0-15 |
|論理トラック|論理ディスクのトラック。<br>[DPB](#DPB)のOFFが加算されているが、OFF分はBDOSからはアクセスされない。|0-65535|
|論理セクタ |論理ディスクのセクタ。サイズは128バイト固定。 |0-65535|
|ブロック |論理ディスクに配置するデータを管理する最小単位。複数の論理セクタで構成される。1からシリーズに番号が振られる。サイズは1024/2048/4096/8192/16384バイトのいずれか。<br>小さなサイズのファイルは、ブロックサイズに切り上げて管理されるので無駄が多くなる。|1- |
#### ディレクトリ
CP/M-80には階層化ディレクトリ機能がなく、すべてのファイルはフラットに管理される。このためディレクトリという用語は、WindowsやLinuxなどとは異なり、全ファイルを管理する単一の領域を表す。
|用語 | | 値 |
|-------------------|-----|----|
|ディレクトリ |ファイルの管理領域全体のこと。複数のディレクトリエントリで構成される。||
|ファイル |いわゆるファイルのこと。||
|ディレクトリエントリ|1つのファイルの管理領域。ファイル名、タイプ、ブロック番号などで構成される。32バイト。||
|論理レコード |ファイルを構成するデータの格納単位。128バイト固定。先頭からシーケンシャルな番号が振られる。|0-65535|
#### DPHとDPB
|用語 |正式名称 | |
|-----|-----------------------|-----------------------------------------|
| DPH | DISK Parameter Header | BDOSのディスク管理領域。BDOSがBIOSのSELSDK (0x1b)で選択したディスクに対応したDPHの先頭アドレスを返す。論理ディスクごとに用意する必要がある。|
| DBP | DISK Parameter Block | 物理ディスクの特性を定義する。|
## DPH(DISK Parameter Header)
DPHは論理ディスク1台に対して、1つ必要になる。下記で定義されるテーブルおよびバッファをBIOSが用意する。BIOSコール(0x1b)で、指定された論理ディスクのテーブル(DPH)の先頭アドレスを返す。
### テーブル
|パラメータ|Bytes|正式名称 ||
|:----:|:---:|---------------------------------|---------------------------|
| XLT | 2 | Translation Table | スキューテーブルのアドレス。スキュー[^1]が不要な場合は0をセットする。|
| SPA | 6 | Scratch Pad Area | BDOSのワークエリア |
| DIRB | 2 | Directory Buffer | ディレクトリ、レコードの読み書きに使用するバッファのアドレス。 |
| DPB | 2 | DISK Parameter Block |対応するDPBのアドレス。同一タイプのディスクの場合はDPBを共有できる。|
| CSV | 2 | Check Vector | リムーバブルディスクの入れ替えを検知するための値を保持するためのバッファのアドレス。ディスクごとに必要。|
| ALV | 2 | Allocation Vector | ディスク領域の使用状況を管理するビットマップのアドレス。ディスクごとに必要。|
[^1]:フロッピーディスクのように物理的に回転する媒体を読み書きする場合、物理セクタと論理セクタの対応ずらすことで平均アクセス速度を改善するテクニックをスキューと呼ぶ。物理動作の不要な媒体では不要なテクニック。
### バッファ
|パラメータ|Bytes| |
|:----:|:---:|---------------------------------|
| XLT | SPT | トラックあたりの、論理セクタと物理セクタのマッピングテーブル。スキューテーブルともいう。|
| DIRB | 128 | 固定値 |
| CSV | CKS | [DPB](#DPB)のCKSを参照 |
| ALV | DSM / 8 + 1 | [DPB](#DPB)のDSMから算出する。|
## DPB (Disk Parameter Block)
このテーブルの先頭アドレスが、DPHのDPBにセットされる。
|パラメータ|Bytes| |意味|
|:---:|:---:|---------------------------------|---------------------------|
| SPT | 2 | Sector Per Track |論理トラックあたりの論理セクタ数。<br>物理セクタサイズが128でない場合は変換が必要。|
| BSH | 1 | Block SHift factor |ブロックサイズから決まる値。([BLS/BSH/BLM/EXMの関係](#BLS/BSH/BLM/EXMの関係)を参照)<br>BLS = 128 $\times$ $2^{BSH}$|
| BLM | 1 | BLock Mask |ブロックサイズから決まる値。([BLS/BSH/BLM/EXMの関係](#BLS/BSH/BLM/EXMの関係)を参照)<br>BLS = 128 $\times$ (BLM + 1)|
| EXM | 1 | EXtent Mask |ブロックサイズとDSMから決まる値。([BLS/BSH/BLM/EXMの関係](#BLS/BSH/BLM/EXMの関係)を参照)|
| DSM | 2 | Disk Size Max |総データブロック数 - 1|
| DRM | 2 | DiRectory entries Max |総ディレクトリエントリ数 - 1|
| AL0 | 1 | ALlocation vector for Directory |ディレクトリのアロケーションベクタ|
| AL1 | 1 | ALlocation vector for Directory |ディレクトリのアロケーションベクタ|
| CKS | 2 | ChecK vector Size |チェックベクタのサイズ|
| OFF | 2 | track OFFset |ディスクの先頭に配置される、CP/M管理外の予約トラック数。通常ここにはBDOS,CCP,BIOSなどが格納され、IPLで読み込まれてメモリに展開される。CP/Mが使用する論理ブロックはこのトラックの直後から始まる。|
### BLS/BSH/BLM/EXMの関係
| BLS | BSH | BLM | EXM | EXM |
|:-----:|:---:|:---:|:--------:|:-------:|
| | | | DSM $\le$ 255 | DSM $>$ 255 |
| 1024 | 3 | 7 | 0 | - |
| 2048 | 4 | 15 | 1 | 0 |
| 4096 | 5 | 31 | 3 | 1 |
| 8192 | 6 | 63 | 7 | 3 |
| 16384 | 7 | 127 | 15 | 7 |
### パラメータの算出方法
#### ユーザが決めるパラメータ
|パラメータ| | diskdef[^2] |
|:---:|-------------------------|------------|
| BLS | ブロックサイズ | blocksize |
| TTN | 総トラック数 | tracks |
| SPT | トラックあたりのセクタ数 | sectrk $\times$ seclen / 128 |
| DRM | 総ディレクトリエントリ数 - 1 | maxdir - 1 |
| OFF | 予約トラック数 | boottrk |
| PSZ | 物理セクタサイズ(128の倍数) | seclen |
[^2]:参考までに[cpmtools](http://www.moria.de/~michael/cpmtools/)のmkfs.cpmで使用するdiskdefのパラメータとの対応関係も記載した。
#### 既定値と関係式
|パラメータ| 関係式 | |
|:----:|------------------------------|----------------------|
| SSZ | 128 |論理セクタサイズ(固定値) |
| BLS | (BLM + 1) $\times$ SSZ |ブロックサイズ(バイト) |
| DSZ | TTN $\times$ SPT $\times$ SSZ |総ディスクサイズ(バイト) |
| DSM | DSZ / BLS - 1 |総ブロック数 - 1 |
| BLM | BLS / SSZ - 1 |ブロックあたりの論理セクタ数 - 1|
|AL0,1| (DRM + 1) $\times$ 32 / BLS |MSBからセットするビット数|
| CKS | (DRM + 1) / 4 |リムーバブルディスクの場合|
| | 0 |ハードディスクの場合 |
| ALV | DSM / 8 + 1 |ALVテーブルサイズ(バイト)|
## 計算手順
1. BLS(ブロックサイズ)を決める。
2. BSH = 表からBLSに対応する値を求める。
3. BLM = 表からBLSに対応する値を求める。
4. DSM = TTN $\times$ SPT $\times$ SSZ / BLS - 1
5. EXM = 表からBLS, DSMに対応する値を求める。
6. AL0,AL1 = AL0のMSBから (DRM + 1) $\times$ 32 / BLS 分ビットをセットする。
7. CKS = HDDなら0, リムーバブルディスクなら(DRM + 1) / 4
8. ALV = DSM / 8 + 1
### 計算例 (8GB SD Card)
|パラメータ| | |
|:---:|----------------------|:----:|
| BLS |ブロックサイズ | 8192 |
| TTN |総トラック数 | 256 |
| SPT |トラックあたりのセクタ数| 256 |
| DRM |総ファイル数 - 1 | 255 |
| OFF |予約トラック数 | 1 |
1. BLS = 8192
2. BSH = 6
3. BLM = 63
4. DSM = 256 $\times$ 256 $\times$ 128 / 8192 - 1 = 1023
5. EXM = 3
6. AL0, AL1 = 0x8000 <br>(255+1) $\times$ 32 / 8192 = 1 なのでAL0の最上位から1ビット分(0x8000)をセットする。
7. CKS = 0
8. ALV = 128