3つのパーティション形式を並べて比較できるようにまとめたもの。いずれも実機ダンプ解析に基づく。フォーマッタの再実装に必要な情報を網羅している。
1. 共通の前提知識
3方式とも、Sector0(またはパーティション自身の先頭)の0x1BE以降に、以下の16byte構造(標準MBRパーティションエントリと同一レイアウト)を1〜2個持つ。
+0-3 : status/CHS開始(3方式とも未使用、常に0) +4 : パーティション種別(type) +5-7 : CHS終了(3方式とも未使用、常に0) +8-11 : 開始LBA(4byte, リトルエンディアン) +12-15: サイズ(4byte, リトルエンディアン、セクタ数)
エントリ配置は 0x1BE(エントリ1)、0x1CE(エントリ2)。標準MBRは最大4エントリ(0x1BE〜0x1FD)だが、3方式とも実際に使うのは先頭2つまで。
代表的なtype値(Nextorの公式ドキュメントに準拠):
0x00 : 無し(空エントリ) 0x01 : FAT12 0x05 : Extended(CHS、拡張パーティション/EBRチェーンへのリンク) 0x06 : FAT16(CHS) 0x0E : FAT16(LBA)
2. V0.09a 似非ASPI形式
作者による命名。Adaptec系のSCSI I/F(ASPI)との互換性、PC-AT機からの認識を目的とした形式。
2.1 全体構成
Sector 0-19 : 隠しFAT12ミニファイルシステム(MBR兼用) Sector 20- : 基本パーティション(FAT16) 基本パーティションの後ろ : 拡張パーティションチェーン(FAT16、可変個数)
隠し領域(Sector0-19)自身も「パーティション0」として扱われる(基本パーティションが「パーティション1」、以降が「パーティション2,3...」)。
2.2 隠しFAT12ミニファイルシステム(Sector 0-19)
パラメータ
| 項目 | 値 |
|---|---|
| 総セクタ数 | 20 |
| bytes/sector | 512 |
| sectors/cluster | 8 |
| reserved sectors | 1 |
| FATs | 2 |
| root entries | 16 |
| sectors/FAT | 1 |
| media ID | 0xF0 |
セクタ配置:
Sector 0 : ブートセクタ(MBR兼用) Sector 1-2 : FAT ×2 Sector 3 : エントリーテーブル(ルートディレクトリ、1セクタ) Sector 4-11 : クラスタ2 = MEGASCSI.TBL の実データ(8セクタ) Sector 12-19 : クラスタ3 = MEGASCSI.PNT の実データ(8セクタ)
Sector0(ブートセクタ兼MBR)のフィールド
| offset | 内容 |
|---|---|
| 0x00-0x02 | ジャンプ命令 00 FE 90(★通常のFAT16パーティションと異なる) |
| 0x03-0x0A | OEM名 "MEGASCSI"(8byte) |
| 0x0B-0x0C | bytes/sector = 512 (LE) |
| 0x0D | sectors/cluster = 8 |
| 0x0E-0x0F | reserved sectors = 1 |
| 0x10 | FATs = 2 |
| 0x11-0x12 | root entries = 16 |
| 0x13-0x14 | total sectors(16bit) = 20(非ゼロ。拡張BPB不要) |
| 0x15 | media ID = 0xF0 |
| 0x16-0x17 | sectors/FAT = 1 |
| 0x18-0x19 | sectors/track = 0 |
| 0x1A-0x1B | heads = 0 |
| 0x1C-0x1D | hidden sectors(2byte) = 0 |
| 0x1E-0x1F | 18 16(JR命令、+22 → 0x36へジャンプ) |
| 0x20-0x25 | 文字列 "VOL_ID" |
| 0x26 | 0x00 |
| 0x27-0x2A | ボリュームID(4byte、任意値) |
| 0x2B-0x35 | "NO NAME "(11byte) |
| 0x36- | ブートプログラム(138byte、§付録参照) |
| 0x1B8-0x1BB | ディスクシグネチャ(4byte、任意値) |
| 0x1BE-0x1CD | エントリ1: 基本パーティション。type=0x06、開始LBA=20(絶対)、サイズ=基本パーティションのセクタ数 |
| 0x1CE-0x1DD | エントリ2: 拡張パーティション。type=0x05、開始LBA=最初の拡張パーティションの絶対LBA、サイズ=0(拡張パーティションが無ければ全ゼロ) |
| 0x1FE-0x1FF | 55 AA |
MEGASCSI.TBL(実データ、512byte、16byteレコード×32個)
+0 : ドライブ種別(実パーティションは0) +1 : フラグ。bit6=書込禁止。パーティション0(隠し領域自身)のみ0x40 +2-4 : 開始LBA(3byte, ビッグエンディアン, 絶対値) +5-7 : サイズ(3byte, ビッグエンディアン) +8-9 : ブロック長(2byte, ビッグエンディアン) = 512 +10-15: 予約(0)
実パーティション数をNとすると、レコードNは終端マーカー(開始=総容量,サイズ=0xFFFFFF, ブロック長=0, 予約=00 00 FF FF FF FF)を1つだけ置き、以降は00 00 00 00 FF FF FF FFを8byte単位で末尾まで繰り返す。この実データは隠し領域自身に加え、基本・全拡張パーティションのクラスタ2にも複製する。
MEGASCSI.PNT(実データ、512byte)
16byteレコード×最大32個。ASCII 2桁の番号 + スペース14byte。隠し領域自身も含めて連番。隠し領域にのみ存在し、基本・拡張パーティションには置かない。
2.3 基本パーティション・拡張パーティション(FAT16)
パラメータ(実装値の一例。用途に応じて変更可)
| 項目 | 値 |
|---|---|
| sectors/cluster | 16 (8KB/cluster) |
| reserved sectors | 1 |
| FATs | 2 |
| root entries | 512 |
| max clusters | 用途により変更(例: 4078=約32MB、65501=約512MB、131005=約1GB) |
| sectors/FAT | ceil(max_clusters×2/512) |
ブートセクタのフィールド(基本・拡張とも共通)
| offset | 内容 |
|---|---|
| 0x00-0x02 | EB FE 90 |
| 0x03-0x0A | OEM名(8byte、任意) |
| 0x0B-0x0C | 512 |
| 0x0D | sectors/cluster |
| 0x0E-0x0F | reserved = 1 |
| 0x10 | FATs = 2 |
| 0x11-0x12 | root entries |
| 0x13-0x14 | 0(拡張BPB使用) |
| 0x15 | media ID = 0xF0 |
| 0x16-0x17 | sectors/FAT |
| 0x18-0x19 | 0 |
| 0x1A-0x1B | 0 |
| 0x1C-0x1D | hidden sectors(2byte) = 常に0 |
| 0x1E-0x1F | 18 1E(JR命令、+30 → 0x3Eへジャンプ) |
| 0x20-0x23 | 総セクタ数(32bit拡張、LE) |
| 0x24 | 0 |
| 0x25 | 0 |
| 0x26 | 0x29 |
| 0x27-0x2A | ボリュームシリアル(4byte、任意) |
| 0x2B-0x35 | "NO NAME " |
| 0x36-0x3D | "FAT16 " |
| 0x3E- | ブートプログラム(138byte) |
| 0x1BE-0x1CD | エントリ1(自分自身): type=0x06、開始LBA=常に0(自己相対)、サイズ=自分のセクタ数 |
| 0x1CE-0x1DD | エントリ2(次のパーティション): §2.4参照 |
| 0x1FE-0x1FF | 55 AA |
2.4 エントリ2(次のパーティション)の規則
- 基本パーティション: 拡張パーティションが1つ以上あれば
type=0x05, 開始LBA=最初の拡張パーティションの絶対LBA, サイズ=0。無ければ全ゼロ。 - 拡張パーティション(最後以外):
type=0x05, 開始LBA=(次の拡張パーティションの絶対LBA − 最初の拡張パーティションの絶対LBA), サイズ=0(最初の拡張パーティションを基準にした相対LBA)。 - 拡張パーティション(最後): 全ゼロ。
2.5 FAT・ルートディレクトリ・MEGASCSI.TBL
各パーティション(基本・拡張とも)は、ブートセクタ→FAT×2(先頭4byteはF0 FF FF FF、残りゼロ)→ルートディレクトリ(先頭32byteにMEGASCSI.TBLのディレクトリエントリ、クラスタ2、サイズ=パーティション総数×16byte、残りゼロ)→クラスタ2(MEGASCSI.TBLの実データ、§2.2と同一内容を複製)、という構成。MEGASCSI.PNTは置かない。
3. V0.09a MEGA-SCSIネイティブ形式
隠しFAT12領域を持たない、よりシンプルな構成。Sector0自身がそのまま使える実パーティション(パーティション0)である。
3.1 全体構成
Sector 0 : パーティション0(FAT16)。同時にMBRを兼ねる。 Sector xxx : パーティション1(FAT16)。チェーンの基準点。 Sector xxx : パーティション2以降(FAT16)。拡張チェーン本体。
3.2 ブートセクタのフィールド(全パーティション共通)
§2.3の表と同一(media ID=0xF0、0x1C-1Dは常に0、0x1E-1Fは18 1Eで0x3Eへジャンプ、拡張BPB使用、等)。ただし以下2点が異なる:
0x1B8-0x1BB(ディスクシグネチャ)は Sector0のみに存在、他のパーティションは全ゼロ。- MBRエントリの規則が§3.3の通り(0.09a似非ASPI形式とは基準点が異なる)。
3.3 MBRエントリの規則
エントリ1(自分自身、0x1BE-0x1CD)
全パーティション例外無く: type=0x06, 開始LBA=0(常に自己相対),サイズ=自分のセクタ数。Sector0(パーティション0)も例外ではない。
エントリ2(次のパーティション、0x1CE-0x1DD)
基準点は常にパーティション1の絶対LBA(chain_start)。
- パーティション0: 次(パーティション1)が存在すれば
type=0x05, 開始LBA=chain_start(絶対値), サイズ=0。 - パーティション1以降(最後以外):
type=0x05,開始LBA=(次パーティションの絶対LBA − chain_start), サイズ=0(パーティション1からの相対LBA)。 - 最後のパーティション: 全ゼロ。
3.4 FAT・ルートディレクトリ・MEGASCSI.TBL
§2.5と同一構成。全パーティション(パーティション0含む)がMEGASCSI.TBLを持つ(隠し領域が無いため、レコード0=パーティション0自身から始まる)。MEGASCSI.PNTは存在しない。
4. Nextor形式
Nextor(MSX-DOS2の後継OS)が使う、標準的なPC-AT MBR/EBR方式。実機ダンプ解析(8MB/64MB/4GB、複数パーティション構成)により確認。
4.1 全体構成
未パーティション時: Sector0が直接そのままFAT12ボリューム(MBRエントリ無し)
パーティション時 : Sector0がMBR(基本パーティション1個+拡張パーティション
1個の、最大2エントリ)
拡張パーティション内は、論理パーティションごとに
専用のEBR(拡張ブートレコード)セクタ+実データ
セクタの組で構成されるSFORM-2系(§2,3)と異なり、パーティション自身のブートセクタにはチェーン情報を一切持たない(MBR/EBRのエントリは全て独立した専用セクタに分離されている)。
4.2 Sector0(MBR)
| offset | 内容 |
|---|---|
| 0x00-0x02 | EB FE 90(未パーティション時も同じ) |
| 0x03-0x0A | OEM名 "NEXTOR20"(8byte) |
| その他BPBフィールド | §4.4参照(内包する1パーティション目と同じ規則) |
| 0x1B8-0x1BB | ディスクシグネチャ |
| 0x1BE-0x1CD | エントリ1: 基本パーティション。type=0x01(FAT12)/0x0E(FAT16,LBA)、開始LBA=1(絶対、Sector0直後から)、サイズ=基本パーティションのセクタ数 |
| 0x1CE-0x1DD | エントリ2: 拡張パーティション。type=0x05、開始LBA=拡張パーティション全体の絶対開始位置、サイズ=拡張パーティション全体のセクタ数(基本パーティション+拡張領域の合計ではなく、拡張領域自体の合計サイズ) |
| 0x1FE-0x1FF | 55 AA |
未パーティション時はエントリ1・2とも全ゼロ(単一ボリュームがSector0直後から直接始まる)。
4.3 EBR(拡張ブートレコード)セクタ
各論理パーティション(基本パーティションの次、パーティション2以降)の実データ直前の1セクタに、独立したEBRを配置する。EBR自身は非実行セクタで、ジャンプ命令・OEM名等のBPBフィールドは全てゼロ。パーティションテーブル部分のみ意味を持つ。
| offset | 内容 |
|---|---|
| 0x00-0x1BD | 全ゼロ |
| 0x1BE-0x1CD | エントリ0: このEBRが指す論理パーティション。type=0x01(FAT12)/0x0E(FAT16,LBA)、開始LBA=常に1(このEBR自身からの相対位置。直後のセクタが実データ)、サイズ=そのパーティションのセクタ数 |
| 0x1CE-0x1DD | エントリ1: 次のEBR。type=0x05(次があれば)、開始LBA=拡張パーティション全体の開始位置(Sector0のエントリ2の絶対値)からの相対LBA、サイズ=0。最後の論理パーティションの場合は全ゼロ |
| 0x1FE-0x1FF | 55 AA |
実データ検証例(8パーティション構成、拡張パーティション開始=絶対LBA 262145):
EBR@Sector262145: entry0=(type01,LBA=1,size=61440) → 実データ@262146
entry1=(type05,LBA=61441) → 次EBR@262145+61441=323586
EBR@Sector323586: entry0=(type0E,LBA=1,size=1935360) → 実データ@323587
entry1=(type05,LBA=1996802) → 次EBR@262145+1996802=22589474.4 各パーティション自身のブートセクタ(実データ)
標準的なMSX-DOS2 BPB。FAT12/FAT16問わず、独特のハイブリッド構成をとる(VOL_ID文字列とファイルシステム種別文字列が両方存在する)。
| offset | 内容 |
|---|---|
| 0x00-0x02 | EB FE 90 |
| 0x03-0x0A | "NEXTOR20" |
| 0x0B-0x0C | 512 |
| 0x0D | sectors/cluster(パーティションサイズに応じて可変) |
| 0x0E-0x0F | reserved sectors = 1 |
| 0x10 | FATs = 2 |
| 0x11-0x12 | root entries |
| 0x13-0x14 | total sectors(16bit)。FAT12の場合は非ゼロ(実値)、FAT16の場合は0(拡張BPB使用) |
| 0x15 | media ID = 0xF0 |
| 0x16-0x17 | sectors/FAT |
| 0x18-0x19 | 0 |
| 0x1A-0x1B | 0 |
| 0x1C-0x1D(or 1F) | hidden sectors。常に0(実際の位置情報はMBR/EBR側で管理) |
| 0x1E-0x1F | 18 1E(JR命令、+30 → 0x3Eへジャンプ) |
| 0x20-0x25 | 文字列 "VOL_ID"(FAT12・FAT16問わず常に存在) |
| 0x26 | FAT12: 0x00 / FAT16: 0x29(拡張ブートシグネチャ) |
| 0x27-0x2A | ボリュームシリアル(4byte) |
| 0x2B-0x35 | "NEXTOR 2.0 "(11byte、ボリュームラベル) |
| 0x36-0x3D | "FAT12 " または "FAT16 "(8byte) |
| 0x3E- | ブートプログラム |
| 0x1BE-0x1DD | 全パーティション、全ゼロ(MBR/EBRエントリを一切持たない) |
| 0x1FE-0x1FF | 55 AA |
★注目点: FAT16の場合でも0x20-0x25に"VOL_ID"という文字列が残っている(総セクタ数の数値ではない)。これはSFORM-2系(§2,3)が0x20-0x23を32bit総セクタ数として使うのと対照的で、Nextorはbase仕様のVOL_ID文字列と、拡張的なファイルシステム種別文字列を両方保持するハイブリッド構成を取っていることが分かる。総セクタ数はFAT12なら0x13-14(16bit)、FAT16ならMBR/EBRのエントリのサイズ値から得る設計と考えられる。
4.5 パーティションタイプの自動判定基準(実機確認)
| パーティションサイズ | type値 |
|---|---|
| 〜約32MB | 0x01 (FAT12) |
| 約32MB〜 | 0x0E (FAT16, LBA) |
5. FAT12パーティション時の仕様
§2〜4は主にFAT16パーティションの実機ダンプに基づく。本章はFAT12時の仕様をまとめる。出典は FAT12フォーマット調査.txt(8MB/64MB/256MB SDでの実機ダンプ、2026/09)。
記号の意味:
- 確認済 実機ダンプで確認済み
- FAT規格 FATファイルシステム一般の規則
- 推定 ダンプから導いた規則。観測範囲内では全て一致するが、範囲外は未検証
- 要確認 未確認
5.1 FAT12共通の規則 FAT規格
| 項目 | FAT12 | FAT16(参考) |
|---|---|---|
| FAT種別の判定 | データクラスタ数 ≤ 4084 | 4085 ≤ データクラスタ数 ≤ 65524 |
| FATエントリ長 | 12bit(2エントリを3byteにpacking) | 16bit |
| sectors/FAT | ceil((クラスタ数+2)×1.5 / 512) | ceil((クラスタ数+2)×2 / 512) |
| EOC値 | 0xFF8〜0xFFF | 0xFFF8〜0xFFFF |
| 総セクタ数の格納 | 0x13-14(16bit、最大65535) | 通常は32bit拡張フィールド |
12bit packingの規則(クラスタnのエントリ):
offset = n + n/2 (切り捨て) n が偶数: 値 = word[offset] & 0x0FFF n が奇数: 値 = word[offset] >> 4
5.2 SFORM-2(V0.09a)のFAT12フォーマット
★SFORM-2はFAT12専用のフォーマッタであり、1パーティションの最大セクタ数は65288 確認済。以下は似非ASPI形式・ネイティブ形式の両方に共通する。
5.2.1 パーティションのブートセクタ(BPB)確認済
| offset | 値 |
|---|---|
| 0x00-0x02 | EB FE 90 |
| 0x03-0x0A | "MEGASCSI" |
| 0x0B-0x0C | 512 |
| 0x0D | sectors/cluster(§5.2.3) |
| 0x0E-0x0F | 1 |
| 0x10 | 2 |
| 0x11-0x12 | root entries(§5.2.3。可変) |
| 0x13-0x14 | 総セクタ数(16bit、実値) |
| 0x15 | media ID。似非ASPI形式=0xF8、ネイティブ形式=0xF0 |
| 0x16-0x17 | sectors/FAT |
| 0x18-0x1D | 0 |
| 0x1E-0x1F | 18 16(JR +22 → 0x36へジャンプ) |
| 0x20-0x25 | "VOL_ID" |
| 0x26 | 0x00 |
| 0x27-0x2A | ボリュームシリアル(4byte、任意) |
| 0x2B-0x35 | "NO NAME " |
| 0x36- | ブートプログラム(付録と同一の138byte)。"FAT12 "文字列は無い |
| 0x1B8-0x1BB | ディスクシグネチャ。ネイティブ形式のパーティション0のみ非ゼロ。似非ASPI形式はSector0もゼロ |
| 0x1BE-0x1CD | エントリ1。type=0x01 |
| 0x1CE-0x1DD | エントリ2。type=0x05。§5.2.4 |
| 0x1FE-0x1FF | 55 AA |
隠し領域(似非ASPI形式のSector0)は§2.2の表と同じ構成だが、FAT12ダンプでは以下が異なる:media ID=0xF8(FATも F8 FF FF FF FF FF)、0x1B8-0x1BB=ゼロ、エントリ1のtype=0x01。
5.2.2 FAT先頭 確認済
似非ASPI形式: F8 FF FF FF 0F 00 ... (entry0=0xFF8, entry1=0xFFF, entry2=0xFFF) ネイティブ形式: F0 FF FF FF 0F 00 ... (entry0=0xFF0, entry1=0xFFF, entry2=0xFFF)
クラスタ2(MEGASCSI.TBL用)はFAT上で使用中(EOC)になっている。パーティションが1個だけ(ネイティブ形式8MB)でも同じ。MSX-DOS2でファイルを書き込むと、クラスタ3から使われる(書込後 F8 FF FF FF FF FF)。
5.2.3 ジオメトリの決定規則 推定
観測値(ts=総セクタ数、spc=sectors/cluster、spf=sectors/FAT、rd=ルートディレクトリのセクタ数):
| ts | spc | spf | root entries (rd) | データ開始 | クラスタ数 |
|---|---|---|---|---|---|
| 11499 | 4 | 9 | 128 (8) | 27 | 2868 |
| 11519 | 4 | 9 | 128 (8) | 27 | 2873 |
| 13259 | 4 | 10 | 160 (10) | 31 | 3307 |
| 13279 | 4 | 10 | 160 (10) | 31 | 3312 |
| 16384 | 4 | 12 | 752 (47) | 72 | 4078 |
| 32768 | 8 | 12 | 1904 (119) | 144 | 4078 |
| 63488 | 16 | 12 | 112 (7) | 32 | 3966 |
全観測値と一致する規則:
spc = ts/spc ≤ 4096 となる最小の2のべき(観測範囲は4〜16) clusters = min(4078, floor((ts − 1 − 2×spf − 7) / spc)) spf = ceil((clusters+2)×1.5 / 512) rd = ts − 1 − 2×spf − clusters×spc (最小7セクタ=112エントリ)
つまり、ルートディレクトリを伸ばして端数セクタを吸収し、データ領域をクラスタサイズでちょうど割り切れるようにする。クラスタ数の上限は4078 (FAT12上限4084より少し小さい)。§2.3のFAT16用例「max clusters 4078」は、この値に由来すると考えられる。
最大セクタ数65288の場合は spc=16、クラスタ4078、rd=15(240エントリ)になる計算だが、未検証 要確認。
5.2.4 MBRエントリ(チェーン)の規則 確認済
似非ASPI形式(64MB例: 隠し0-19, P1@20(16384), P2@16404(32768), P3@49172(63488), P4@112660(11499)):
| セクタ | エントリ1 | エントリ2 |
|---|---|---|
| Sector0(隠し) | (01, 20, 16384) = P1絶対 | (05, 16404, 0) = P2絶対 |
| P1@20 | (01, 0, 16384) 自己 | (05, 0, 0) |
| P2@16404 | (01, 0, 32768) 自己 | (05, 32768, 0) = P3−P2 |
| P3@49172 | (01, 0, 63488) 自己 | (05, 96256, 0) = P4−P2 |
| P4@112660 | (01, 0, 11499) 自己 | 全ゼロ |
チェーンの相対基準はP2(最初の拡張パーティション)で、§2.4と同じ。ただしP1のエントリ2は (05, 0, 0)(最初の拡張パーティションの相対LBA=0)で、§2.4(FAT16)の「最初の拡張パーティションの絶対LBA」とは異なる。
ネイティブ形式(64MB例: P0@0(16384), P1@16384(32768), P2@49152(63488), P3@112640(11519)):
| セクタ | エントリ1 | エントリ2 |
|---|---|---|
| Sector0(P0) | (01, 20, 32768) ★ | (05, 49152, 0) = P2絶対 |
| P1@16384 | (01, 0, 32768) 自己 | (05, 0, 0) |
| P2@49152 | (01, 0, 63488) 自己 | (05, 63488, 0) = P3−P2 |
| P3@112640 | (01, 0, 11519) 自己 | 全ゼロ |
ネイティブ形式は似非ASPI形式の隠し領域をP0に置き換えた構造になっている(P0↔隠し領域、P1↔基本パーティション、P2以降↔拡張パーティション)。Sector0のエントリ1は、自分自身ではなくP1を指す(サイズ=P1のサイズ)。チェーンの相対基準はP2。これは§3.3(FAT16、基準=P1)とは異なる。
5.2.5 SFORM-2の不具合と思われる点
- ★ネイティブ形式 Sector0 の 0x1C6-0x1C9(エントリ1の開始LBA)=20(0x14)似非ASPI形式の値(隠し領域20セクタの直後=P1の開始位置)がそのまま書かれていると考えられる。上記の対応関係から、正しくはP1の絶対LBA(64MB例では16384=
00 40 00 00)であるべき。サイズ(0x1CA)は正しくP1のサイズになっているため、開始LBAだけが似非ASPI形式の固定値で上書きされている可能性が高い。 - ネイティブ形式でパーティションが1個だけの場合(8MB)、Sector0のエントリ1が
(01, 20, 3883322)。P1が存在しないにもかかわらずエントリがあり、サイズ(3A 41 3B 00)はメディア容量を超える無意味な値(未初期化の変数と思われる)。本来は全ゼロであるべき。 - 似非ASPI形式でパーティションがP1だけの場合(8MB)、Sector0のエントリ2が
(05, 13279, 0)。拡張パーティションが無いのに、P1の末尾(=デバイス末尾)を指している。 - MEGASCSI.TBLのファイルサイズ以降(レコードN以降)の内容が不定。空白埋め、SFORM-2のメッセージ文字列の断片、FFパターンなどケースによって異なる(§5.2.6)。未初期化バッファの内容がそのまま書かれていると思われる。ファイルサイズ(N×16byte)の外なので、実害は無い可能性が高い。
これらがMEGA-SCSIの動作に影響するかどうかは 要確認。
5.2.6 MEGASCSI.TBL / MEGASCSI.PNT 確認済
N = パーティション総数(似非ASPI形式は隠し領域を含む)。
意味のある部分(全ケース共通)
rec0 〜 rec(N-1): 各パーティション (種別00, フラグ, 開始3byte BE, サイズ3byte BE, 0200, 予約0×6) rec N の +2〜+4 : 最終パーティションの末尾LBA(=最終パーティションの開始+サイズ)
- フラグ0x40(書込禁止)は似非ASPI形式の隠し領域(rec0)のみ。ネイティブ形式のrec0(P0)は0x00。
- ルートディレクトリにはMEGASCSI.TBLのエントリのみ(属性0x27、クラスタ2、サイズ=N×16)。PNTのエントリは隠し領域のみ。
- 全パーティションのクラスタ2に、rec0〜rec(N-1)が同一内容で複製される (似非ASPI形式・ネイティブ形式とも)。
- パーティションが1個だけでもTBLを作成する(ネイティブ形式8MB: N=1、ファイルサイズ16)。
64MB似非ASPI形式(N=5):
rec0: 00 40 000000 000014 0200 隠し領域(書込禁止) rec1: 00 00 000014 004000 0200 P1 rec2: 00 00 004014 008000 0200 P2 rec3: 00 00 00C014 00F800 0200 P3 rec4: 00 00 01B814 002CEB 0200 P4 rec5: ?? ?? 01E4FF ... 最終パーティション末尾=124159
64MBネイティブ形式(N=4):
rec0: 00 00 000000 004000 0200 P0 rec1: 00 00 004000 008000 0200 P1 rec2: 00 00 00C000 00F800 0200 P2 rec3: 00 00 01B800 002CFF 0200 P3 rec4: ?? ?? 01E4FF ... 最終パーティション末尾=124159
8MBネイティブ形式(N=1):
rec0: 00 00 000000 0033DF 0200 P0 rec1: ?? ?? 0033DF ... 最終パーティション末尾=13279
レコードN以降(ファイルサイズ外)の実際の内容
| ケース | rec N の残り | rec N+1以降 |
|---|---|---|
| 64MB似非ASPI 隠し領域 | 00 00 / 000009 / 0200 / 0×6(残り9セクタ) | 00 00 00 00 FF FF FF FF の繰り返し |
| 64MB似非ASPI P1〜P4 | 空白(0x20) | 空白+SFORM-2のメッセージ文字列("(for MSX-DOS2)" "Copyright (c) by K.Tsujikawa." "Something error happened !" 等) |
| 8MB似非ASPI 隠し領域 | 空白 | 空白 |
| 8MB似非ASPI P1 | 空白 | 0x29以降にメッセージ文字列("SCSI device logical formatter ver 0.09a" 等) |
| 64MBネイティブ 全P | 空白 | 空白 |
| 8MBネイティブ P0 | 空白 | 0x29以降にメッセージ文字列 |
- 64MB似非ASPIの隠し領域だけが「未使用領域レコード+FFパターン」という整った形になっている。§2.2(FAT16)の終端マーカー(開始=総容量、サイズ=0xFFFFFF、ブロック長=0)とはどのケースも異なる。
- メッセージ文字列の断片は、SFORM-2の画面表示用バッファ等の残骸と思われる。
- 再実装する場合は、rec Nの開始フィールドに最終パーティション末尾を書き、それ以外(rec Nの残りとrec N+1以降)は §2.2 の形式、またはゼロ埋めにするのが無難 推定。
MEGASCSI.PNT(似非ASPI形式の隠し領域のみ)
各レコードの先頭を "NN"+空白14byteに置き換えたもの。レコードN以降は同じ隠し領域のTBLと同じ内容になっている(TBLのバッファを再利用していると思われる)。
5.3 Nextor形式のFAT12パーティション
5.3.1 ブートセクタ(BPB)確認済
§4.4のとおり。FAT12時の値:
| offset | 値 |
|---|---|
| 0x0D | sectors/cluster(§5.3.3) |
| 0x11-0x12 | root entries = 112(常に) |
| 0x13-0x14 | 総セクタ数(16bit、実値) |
| 0x15 | 0xF0 |
| 0x1E-0x1F | 18 1E(→0x3E) |
| 0x20-0x25 | "VOL_ID" |
| 0x26 | 0x00 |
| 0x2B-0x35 | "NEXTOR 2.0 " |
| 0x36-0x3D | "FAT12 " |
| 0x3E- | Nextor独自のブートプログラム(SFORM-2とは異なる) |
| 0x1B8-0x1DD | 全ゼロ |
FAT先頭は F0 FF FF(クラスタ2は未使用)。
5.3.2 MBR・EBR 確認済
64MB例(4MB/8MB/16MB/31MB):
Sector0 (MBR): entry1=(status 0x80, type01, LBA=1, size=8192)
entry2=(type05, LBA=8193, size=112643)
EBR@8193 : entry0=(01, 1, 16384) entry1=(05, 16385) → 次EBR@8193+16385=24578
EBR@24578: entry0=(01, 1, 32768) entry1=(05, 49154) → 次EBR@8193+49154=57347
EBR@57347: entry0=(01, 1, 63488) entry1=全ゼロ- MBRエントリ1のstatus(+0)は0x80(アクティブ)。§1の「+0は常に0」はNextorには当てはまらない。
- パーティションありのSector0は
EB FE 90+"NEXTOR20"以外のBPBフィールドが全てゼロ。ディスクシグネチャ(0x1B8)もゼロ。 - パーティション無し(8MB)の場合、Sector0がそのままFAT12ボリュームのブートセクタになる(0x1B8-0x1DDは全ゼロ)。
5.3.3 ジオメトリ [確認済/一部要確認]
| パーティション | ts16 | spc | spf | クラスタ数 |
|---|---|---|---|---|
| パーティション無し(8MB SD, 13279セクタ) | 13278 | 16 | 3 | 829 |
| 4MB(8192) | 8182 | 8 | 3 | 1021 |
| 8MB(16384) | 16350 | 16 | 3 | 1021 |
| 16MB(32768) | 32686 | 32 | 3 | 1021 |
| 31MB(63488) | 63488 | 16 | 12 | 3966 |
- BPBの総セクタ数 = データ開始 + クラスタ数×spc。パーティションの端数セクタはBPB上は切り捨てられる(ts16 < パーティションサイズ)。
- 16MBまではFATを3セクタ(最大1021クラスタ)に収めるようにspcを選んでいるように見える 推定。
- 31MBではspc=16、sectors/FAT=12(3966クラスタ)。端数は無くts16=パーティションサイズ。16MB以下の「FAT3セクタ」の規則からどう切り替わるかの境界は 要確認。
5.3.4 FAT12/FAT16の境界 確認済
256MB SDで確認:
- 31MB、32MB、32767KB → FAT12(type=0x01)
- 33MB → FAT16
- 32768KB → FDISKで指定不可
6. 3方式の比較表
| 項目 | V0.09a 似非ASPI形式 | V0.09a MEGA-SCSIネイティブ形式 | Nextor形式 |
|---|---|---|---|
| 準拠する外部規格 | Adaptec ASPI系を意識(独自拡張) | 無し(MEGA-SCSI独自) | PC-AT標準MBR/EBR(実質そのもの) |
| 隠し領域 | あり(Sector0-19、FAT12) | 無し | 無し |
| Sector0の役割 | 隠し領域自身のブートセクタ兼MBR | パーティション0自身のブートセクタ兼MBR | 純粋なMBR(それ自体はどのパーティションのデータも含まない) |
| チェーン情報の置き場所 | 各パーティション自身のブートセクタ内(0x1BE-0x1DD) | 各パーティション自身のブートセクタ内(0x1BE-0x1DD) | 各論理パーティションの直前にある専用EBRセクタ(パーティション自身のブートセクタは無関係) |
| エントリ1(自分自身)の開始LBA | 常に0(自己相対) | 常に0(自己相対) | (該当無し。EBRのエントリ0が"直後"を指す形で代替) |
| 拡張チェーンの相対基準 | 最初の拡張パーティション | パーティション1 | 拡張パーティション全体の絶対開始位置(Sector0のエントリ2) |
| media ID | 0xF0 | 0xF0 | 0xF0 |
| FAT12/FAT16判定 | FAT16(§2)。SFORM-2本体はFAT12専用(§5.2) | FAT16(§3)。SFORM-2本体はFAT12専用(§5.2) | サイズで自動判定(32MBまでFAT12、33MBからFAT16。§5.3.4) |
| FAT12時のチェーン相対基準 | P2(最初の拡張) | P2(§3.3のFAT16はP1) | 拡張パーティション全体の開始位置 |
| VOL_ID文字列の有無 | 隠し領域のみ(0x20-25) | 無し(0x20-23は総セクタ数) | 全パーティションに存在(0x20-25) |
| ボリュームラベル | "NO NAME " | "NO NAME " | "NEXTOR 2.0 " |
| MEGASCSI.TBL相当 | あり(独自) | あり(独自) | 無し(標準ファイルシステムのみ) |
付録: ブートプログラム(138byte、V0.09a系で共通使用)
d0 ed 53 70 c0 32 7a c0 36 6d 23 36 c0 31 1f f5 11 b4 c0 0e 0f cd 7d f3 b7 20 28 11 00 01 0e 1a cd 7d f3 21 01 00 22 c2 c0 21 00 3f 11 b4 c0 0e 27 cd 7d f3 c3 00 01 6f c0 cd 00 00 79 e6 fe fe 02 20 06 3e 00 b7 ca 22 40 11 8e c0 0e 09 cd 7d f3 0e 07 cd 7d f3 18 b5 42 6f 6f 74 20 65 72 72 6f 72 0d 0a 50 72 65 73 73 20 61 6e 79 20 6b 65 79 20 66 6f 72 20 72 65 74 72 79 0d 0a 24 00 4d 53 58 44 4f 53 20 20 53 59 53
(SFORM-2オリジナルのIPLを流用。MSXDOS.SYSをロードする処理。Nextorは独自のブートプログラムを使用しており、上記とは異なる)
既知の注意点(V0.09a系共通)
- CP-004.COM(CP.COMへのパッチ版)には、パーティション番号→ファームウェアレコードの対応にオフバイワンのバグが複数箇所確認されている(少なくとも5つの異なるコードパスが存在し、うち3つはオリジナルCP.COMには無い、パッチによる追加)。
CP.COM(パッチ無し版)は、MEGASCSI.TBLに正しいサイズ情報がある限り問題なく動作することを確認済み。 - 合計パーティション容量は約2GB(SD規格のStandard Capacityクラス上限、2^31byte)以内に収めることを推奨。これを超える領域は、MEGA-SCSI+ SCSI2SDの組み合わせでは正常動作しないことを実機確認済み。