PC-98 HDD
PC-98 の HDD を読む
パーティションテーブルの構造
パーティションテーブルの構造は、FreeBSD のカーネルソースに構造体の定義があるので参考にする。(FreeBSD は PC-98 対応版が 2008 年頃までリリースされていたため、PC-98 用のコードが残っている。)
/sys/sys/diskpc98.h より:
struct pc98_partition {
unsigned char dp_mid;
unsigned char dp_sid;
unsigned char dp_dum1;
unsigned char dp_dum2;
unsigned char dp_ipl_sct;
unsigned char dp_ipl_head;
unsigned short dp_ipl_cyl;
unsigned char dp_ssect; /* starting sector */
unsigned char dp_shd; /* starting head */
unsigned short dp_scyl; /* starting cylinder */
unsigned char dp_esect; /* end sector */
unsigned char dp_ehd; /* end head */
unsigned short dp_ecyl; /* end cylinder */
unsigned char dp_name[16];
};
HDD イメージをダンプすると、以下のように 512 バイト目からパーティションテーブルが始まっていることが確認できる。
00000200 a0 a1 00 00 00 00 01 00 00 00 01 00 00 00 a2 03 |................|
00000210 57 69 6e 64 6f 77 73 20 33 2e 31 20 20 20 20 20 |Windows 3.1 |
00000220 a1 a1 00 00 00 00 a3 03 00 00 a3 03 00 00 7b 06 |..............{.|
00000230 4d 53 2d 44 4f 53 20 36 2e 32 30 20 20 20 20 20 |MS-DOS 6.20 |
00000240 a0 a1 00 00 00 00 7c 06 00 00 7c 06 00 00 34 1a |......|...|...4.|
00000250 57 69 6e 64 6f 77 73 20 39 35 20 20 20 20 20 20 |Windows 95 |
00000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
この場合パーティションは以下の 3 つある:
"Windows 3.1" : 開始 C:H:S = 0x0001:0x00:0x00 終了 C:H:S = 0x03a2:0x00:0x00
"MS-DOS 6.20" : 開始 C:H:S = 0x03a3:0x00:0x00 終了 C:H:S = 0x067b:0x00:0x00
"Windows 95" : 開始 C:H:S = 0x067c:0x00:0x00 終了 C:H:S = 0x1a34:0x00:0x00
ヘッド数とセクタ数の推定
この HDD のパーティションはすべて FAT16 フォーマットであることが事前に分かっていたため、HDD イメージをダンプしていくと、FAT16 パーティションらしきものが見つかる。
0004ec00 eb 4c 90 49 43 4d 20 35 2e 30 30 00 02 10 01 00 |.L.ICM 5.00.....|
0004ec10 02 00 0c 00 00 f8 90 00 7e 00 05 00 76 02 00 00 |........~...v...|
0004ec20 ac f0 08 00 80 00 29 9b 25 3b 51 4d 53 2d 57 69 |......).%;QMS-Wi|
0004ec30 6e 64 6f 77 73 00 46 41 54 31 36 20 20 20 76 02 |ndows.FAT16 v.|
ヘッド数とセクタ数の積は 0x4ec00/512=630 となる。これによりヘッド数 63、セクタ数 10 と推定できるが、この HDD のパーティションはすべてヘッド番号 0、セクタ番号 0 から始まっているため、データ位置を見つけるだけであれば、ヘッド数とセクタ数の積が分かれば良い。
パーティションのマウント (FreeBSD)
FreeBSD は PC-98 のパーティションを解釈することができるため、HDD イメージファイルを以下のような方法によりマウントすることができる。
kldload geom_part_pc98
mdconfig -a -t vnode -f filename.img -x 10 -y 63
mount -t msdosfs /dev/md0 /mnt
HDD を直接接続しても、ジオメトリがあっていれば、geom_part_pc98 によりパーティションの認識に成功するはずである。
パーティションのマウント (Linux)
Linux は PC-98 のパーティションを認識しないため、オフセットを自分で計算して指定することによりマウントできる。例えば、上の例で 2 番目のパーティションをマウントする場合:
2 番目のパーティションの開始位置を求める。 0x03a3 * 0x4ec00 = 300303360
mount -o loop,offset=300303360,codepage=932,iocharset=euc-jp,nocase -r filename.img /mnt