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 イメージファイルを以下のような方法によりマウントすることができる。

  1. kldload geom_part_pc98
  2. mdconfig -a -t vnode -f filename.img -x 10 -y 63
  3. mount -t msdosfs /dev/md0 /mnt

HDD を直接接続しても、ジオメトリがあっていれば、geom_part_pc98 によりパーティションの認識に成功するはずである。

パーティションのマウント (Linux)

Linux は PC-98 のパーティションを認識しないため、オフセットを自分で計算して指定することによりマウントできる。例えば、上の例で 2 番目のパーティションをマウントする場合:

  1. 2 番目のパーティションの開始位置を求める。 0x03a3 * 0x4ec00 = 300303360
  2. mount -o loop,offset=300303360,codepage=932,iocharset=euc-jp,nocase -r filename.img /mnt