PC-98x1/disk/ジオメトリ

PC-98x1/disk/ジオメトリ

要するにハードディスクの容量(総セクタ数)とCHS(シリンダー数、ヘッド数、1トラック当たりのセクタ数)の関係。

古い時期のIBM PC(/AT)用ディスクBIOSと異なり、PC-98は最初期からSASIインターフェースを経由しており、ディスクの物理構造に依存しないLBA形式のアドレッシングでセクタ位置が指定できた…はずなのに拡張フォーマットでは各領域の境界がCHS形式のみで格納されている(区画情報参照)。 どうして…。

BIOSから見たハードディスクのジオメトリはほぼディスクBIOS側の都合によって決定されており、一般的なPCのATAやSCSI(Adaptec)とは変換式が異なる。

ジオメトリ情報の取得(ハードディスクBIOS)

基本的には DISK BIOS の新SENSE(int 1Bh, AH=84h)を使う、ってことでいいんでしょうか。

int 1Bh, ah=84h 新SENSE

入力

レジスタ 内容
AH 84h
AL DA/UA
8xh (SASI/ESDI/IDE)
Axh (SCSI)

※LBAアドレッシング(AH=0xh/2xh)のDA/UAで利用可能かどうかはBIOS依存と思われる
(ダメなBIOSに出会ったことがないのですが、存在するんですかね?)

出力

レジスタ 内容
CF 0 正常終了、ディスク未接続、もしくは新SENSE コマンドが未サポート
1 エラー
AH bit7-4 ステータス
bit3-0 デバイス容量 (legacy SASI)
0000 5MB
0001 10MB
0011 20MB
0100 40MB
BX セクタ長(バイト単位)
CX シリンダ数 -1 (undoc1)
DH ヘッド数
DL シリンダ当たりのセクタ数

ディスクが実際にアクセス可能でない場合でもエラー(CF=1)を返さないことが多い。 たとえばSCSI BIOSが有効な状態でディスクが接続されていないSCSIのDA/UAを指定しても特にエラーは返さない(システム共通域の内容を返しているだけ)。 この場合、返されたパラメータは当然有効なものではない。 ディスクの存在は通常のSENSE(AH=04h)で判定する必要がある。

undoc1 によると、SENSE および新SENSE で AH に返される容量値は、テクニカルリファレンスの記載値とは異なるらしい。

AH bit3-0 SENSE
(テクニカルリファレンス)
SENSE
(undoc1)
新SENSE
(undoc1)
SASI ISR DTx2-x0
(参考)
0000 5M
0001 10M
0010 15M
0011 20M
0100 40M 25M 20M
0101 40M 25M
0110 40M
0111 40M 未接続
1001 100M
(ESDI)
1111 80M以上
(IDE)

古めの SASI BIOS では新SENSE コマンドがサポートされていない場合がある。 (ちなみに PC-9800 シリーズのテクニカルデータブックには「コマンドに該当しないコードが指定された場合は正常終了(CF=0)する」という記述がある。つまり未サポートコマンドは完全スルー) このときは SENSE コマンド(AH=04h)を使い、AH の bit3-0 で返された容量に対応するジオメトリを自前で用意する必要がある。

ディスク容量 シリンダ ヘッド セクタ数
(1セクタ 256byte)
セクタ数
(1セクタ 512byte)
5MB 153 4 33 17
10MB 310 4 33 17
20MB
(ハーフハイト)
615 4 33 17
40MB 615 8 33 17

セクタサイズが 256bytes か 512bytes かはシステムメモリ 0000:0481h の bit1-0(undoc2:memsys.txt)で知ることができるようだ。→ 一概に決め付けないほうがいい、かな…

SASI BIOS が新SENSE コマンドに対応している場合、システムメモリ 0000:0480h の bit7 がセットされる――と undoc2:memsys.txt には書いてあった。 でも説明をよく読むと、「セットされていなくても実はサポートされている」というケースが多々報告されている。

SENSEで存在チェックをした後、(あらかじめ BX あたりに 0 とか叩き込んでおいて)とりあえず新SENSE コマンドを発行してみて、レジスタに妥当とおもわれる値が返ってこなかった場合だけ「超ふるい SASI」とみなすのが無難ですかねえ…。

関連情報

システムメモリ 0000:0460〜047Fh
SCSI 機器のパラメータテーブル (undoc2:memsys.txt、"PC-98 in FreeBSD source" など)

IDE/SCSI BIOSのジオメトリ算出

大まかに言うと、インターフェース(IDEかSCSIか)とディスク容量(総セクタ数)によって設定が変化。

EXIDE55xEXIDE486の説明にある表が見やすくてありがたい…、

(パラメータ変化点の正確なところ…たとえばIDEの場合、総セクタ数が65536(シリンダ)×8×17以上なら16ヘッド63セクタになるのかなと予想できるのですが、ほんとに正確な「分岐点」がこの数なのかはわからない。ROMを見ないで調べる方法はないものか…)

PC-9801-92互換SCSIインターフェースのジオメトリ設定・算出

OPEN DESIGN No.1 SCSI完璧リファレンス』の4章に92ボードのディスク認識シーケンスの解析記事が載っている。 どうやらオンラインで読めないこともないようだ…

おおざっぱに要約すると、

  1. InquiryでベンダID(の先頭3文字)がNECならMode Senseで得たFormat DeviceページとRigid Disk Device Geometryページの情報からCHS情報を取得(いわゆる「55互換」)
  2. NECでない場合はRead Capacityの論理ブロックサイズ(≒総セクタ数)から算出

逆にいうと、ベンダIDがNECのハードディスクは一般的な92互換SCSIの標準的な8x32や8x128とは異なるジオメトリになる。

以下、個人的な調査結果メモ:

  • Format Deviceページの情報が設定されていればRigid Disk Device Geometryページはなくてもいいっぽい(RaSCSIはRigid Disk Device Geometryを返さないが、PC-9801-55L、AHA-1030P、IF-2769では元ディスクイメージ通りのCHSが設定された)
  • 手持ちのAHA-1030PはベンダIDがNECでなくても、Format Deviceページが返されればその値をCHSに設定した。純正PC-9801-92を所持していないため、これが92互換の挙動なのか不明
  • 手持ちのAHA-1030PはFormat Deviceページを返すディスクの場合、シリンダ数が4096以上になると不正なパラメータが設定され、事実上BIOSによる正常なアクセスができなくなった。Format Deviceページを返さないディスクの場合は4096以上のシリンダでも正常動作。これも純正92互換動作かどうか不明

DISK BIOS(新SENSE)におけるシリンダ数(最終シリンダ)の扱いに関する考慮点

SASI,SCSIとIDEの違い(要調査)

テクニカルリファレンスの新SENSEの説明によるとCXレジスタに「シリンダ数」が返されることになっているが、undoc1のハードディスクBIOSでは「シリンダ数-1」が返されるという記述がある。 手持ちのCバス用SCSIボードのいくつかでRaSCSIのディスクイメージを利用して確認したところ、確かにイメージファイル中で指定されたシリンダ数より1少ない値が返された。 またLHA-12(おそらくPC-9801-27上位互換)は20Mのディスクに対して614を返すため、これも総シリンダ数-1だと思われる。

しかし、IDE BIOSの場合、手持ちのPC-9821Xc13S5のBIOSイメージをnp21w上で利用したときは、ディスクイメージ内で指定されたシリンダ数がそのまま(-1されずに)返された。

いまのところの個人的な意見としては、新SENSEで得られるジオメトリ情報に基づいてハードディスクの領域設定を行う場合、容量ギリギリの設定は危険なので最終シリンダは捨てる(有効領域として設定しない)のが無難だと思います…。

(ディスクがIDEか、SASIも含めた非IDEかを判定して微調整するという案もなくはないですが、すべてのIDE BIOSでシリンダ数が-1されないのかどうか調査しきれない)