PC-98x1/disk/ブートセクタ

PC-98x1/disk/ブートセクタ

ここでいうブートセクタは、ハードディスク内の各パーティション(領域)の先頭にある、パーティション内のディスク情報やブートローダーやらが入ってるセクタのこと。 ふつうの PC では PBR とか VBR とか呼ばれることもある。

ブートセクタの読み込みと処理の実行に関しては bootstrap の項を参照。

参考:マイクロソフトによるブートセクタの解説(IBM PC)

PC-98x1 ハードディスク FAT12/16 領域のブートセクタ

確認手順

  1. とりあえずエミュレータ上で 80M バイトの SASI ハードディスクイメージ(17sector/track, 8heads, 1230cylinders, 512bytes/sector)を作成
  2. DOS の format /H でだいたい半分くらいの容量で領域をふたつ作成
    ひとつめ:シリンダ 1〜600 (40M)
    ふたつめ:シリンダ 601〜終わり (約40M)
  3. DOS の int 25h で領域(ドライブ)の先頭レコードを取得、内容を確認する。めんどくさいのでふたつめ(後半)のほうだけ…

なお、大人の事情により、ブートローダの実コードと思われる部分は見ないようにします(先頭3バイトの jmp コードはコード外部分の判定のためのみに使う)。

NEC DOS 3.3D

0000 EB 1F 90 00 00 00 00 00 00 00 00 00 04 02 01 00
0010 02 00 0C 8E 9E F8 28 00 48 3F 01 00 62 01 00 02
0020 00

NEC DOS 6.2

0000 EB 45 90 4E 45 43 20 20 36 2E 32 00 04 02 01 00
0010 02 00 0C 8E 9E F8 28 00 11 00 08 00 48 3F 01 00
0020 00 00 00 00 80 00 29 DF 14 18 08 4E 4F 20 4E 41
0030 4D 45 20 20 20 20 46 41 54 31 36 20 20 20 48 3F
0040 01 00 62 01 00 02 00

Microsoft Windows98 SE (PC-9821)(参考)

0000 EB 3C 90 4D 53 57 49 4E 34 2E 31 00 02 04 01 00
0010 02 00 02 00 00 F8 54 00 11 00 08 00 48 3F 01 00
0020 28 4E 01 00 80 00 29 E7 14 18 23 4E 4F 20 4E 41
0030 4D 45 20 20 20 20 46 41 54 31 36 20 20 20 

ちなみに BPB のおおまかな内容:

オフセット サイズ 内容 備考
00h 3bytes ブートローダ実コードへの jmp
(EB xx 90 もしくは E9 xx xx)
先頭が EBh の場合、3バイト目が 90h でないと(少なくとも IBM 版の)DOS は正規の FAT ディスクと認識してくれないようである
03h 8bytes OEM名
0Bh word セクタ当りのバイト数 PC-98x1 の場合、ハードウェアやBIOS と別の値が使われることがある
0Dh byte クラスタ当りのセクタ数
0Eh word 予約セクタ数
10h byte FAT の数 だいたい 2 つ
11h word ルートディレクトリエントリ数 1エントリあたり 32 バイト
13h word 総セクタ数 65536 以上のときは 20h を参照
15h byte メディアディスクリプタ
16h word 1 FAT 当りのセクタ数
(ここから下は、NEC DOS 3.3 では期待通りに設定されていない場合がある)
18h word トラック当りのセクタ数
1Ah word ヘッド数
1Ch dword 隠しセクタ数
拡張ブートレコードでない場合は word だと思う。
PC-98x1 (DOS5+) の場合、BIOS から見た場合の領域先頭セクタアドレス(LBA)のようである
なお、IBM PC 用 DOS 3.31 で 32M バイト以上の区画をフォーマットした場合、ここに期待通りの値が入ることはないと思われる
(ここから下は DOS 3.31 以上…拡張ブートレコードの場合)
20h dword 総セクタ数(65536 以上の場合)
24h byte ブート時の物理ドライブ番号
(たぶん IBM のみ)
ハードディスクだと80h、フロッピーだと00h。
25h byte ブート時のヘッド番号
(たぶん IBM のみ)
Windows では chkdsk の検査フラグも格納してるらしい(→"Current Head" の説明参照)
26h byte 拡張ブートレコードシグネチャ 29h
(Windows は 28h も認識するらしい…)
27h dword ボリュームシリアル番号 番号生成アルゴリズムは DISKTUT 参照
2Bh 11bytes ボリュームラベル "NO NAME " の場合ラベルなしとみなされる。
ルートディレクトリ上にボリュームラベルがある場合、DOS コマンドはそちらを優先する。
36h 8bytes システム ID ファイルシステム "FAT12 " か "FAT16 " が入るらしい
(XDF のディスクは "FAT " だったなあ…)

…で、実行コード非依存のデータ部分から類推できるのは

  • NEC DOS 3.3D の場合、オフセット 18h からの部分はいわゆるふつうの BPB とは非互換
  • NEC DOS 3.3D ではオフセット 18h、6.2 では 3Eh からの 4 バイトは領域先頭への LBA アドレスのようである(FD BIOS 経由でこの LBA セクタを読み出すとブートセクタが読み出せる。また DOS 6.2 の隠しセクタの値とも一致する)。
  • NEC DOS 3.3 のオフセット 1Ch、6.2 のオフセット 42h は領域先頭から数えたデータ先頭セクタのオフセットを表す word 値のようである(両方を加算した位置から BIOS でセクタを読み込むとデータ先頭領域のセクタの内容が読み出せる)。
  • NEC DOS 3.3 のオフセット 1Eh、6.2 のオフセット 44h は、たぶん物理セクタサイズの word 値なんじゃないかな…(256 バイト/セクタの HDD イメージで領域作成するとこの部分が 0100h になる)。
  • NEC DOS 3.3 のオフセット 21h、6.2 のオフセット 46h は不明。ブートセクタの1バイトは貴重なので何か意味がありそうな気はするんだけどね…
  • Windows 98 SE の fdisk, format で作成した領域は余計な拡張のない BPB みたい(ちなみに DOS 3.3 からは別OS 扱いとなり読めなかった)。

PC-98x1 フロッピーディスクのブートセクタ

まあ、一応。
とりあえず 2HD だけ。

NEC DOS 3.3D

0000 EB 1C 90 4E 45 43 20 32 2E 30 30 00 04 01 01 00
0010 02 C0 00 D0 04 FE 02 00 08 00 02 00 00 00

NEC DOS 6.2

0000 EB 3C 90 4E 45 43 20 20 35 2E 30 00 04 01 01 00
0010 02 C0 00 D0 04 FE 02 00 08 00 02 00 00 00 00 00
0020 00 00 00 00 80 00 29 07 13 18 09 4E 4F 20 4E 41
0030 4D 45 20 20 20 20 46 41 54 31 32 20 20 20

Microsoft Windows98 SE (PC-9821)

0000 EB 3C 90 4D 53 57 49 4E 34 2E 31 00 04 01 01 00
0010 02 C0 00 D0 04 FE 02 00 08 00 02 00 00 00 00 00
0020 00 00 00 00 00 00 29 D6 0B 20 21 4E 4F 20 4E 41
0030 4D 45 20 20 20 20 46 41 54 31 32 20 20 20

フロッピーの場合は、NEC DOS 3.3 もひととおり BPB を設定すると考えてよいのだろうか。 ただ、NEC の DOS 自身はオフセット 18h 以降の情報を見ていない感じなんだよね…。