
        ディスクイメージファイルのフォーマット

-------------------------------------------------------------------------------

  QUASI88 で使用するディスクイメージファイルのフォーマットは、
P88SR.EXE (PC8801mk-2SR emulator) で使用される、ディスクイメージファイルの
フォーマットに準拠しています。
このフォーマットは、通称 「D88形式」とか、「D88フォーマット」とか呼ばれる
もので、拡張子に .D88 や、.d88 をつけるのが一般となっています。

  例 → N88BASIC.D88、 n88demo.d88
  

  以下に、そのフォーマットを解説をします。



※注意
    このフォーマットは、作者が個人的に調べたものです。
    間違っても、P88SR.EXE (PC8801mk-2SR emulator) の作者に質問のメールなど
    を送ったりしないで下さい。



ディスクイメージは、ヘッダ部とトラック部分からなります。

    +---------------------+
    |      ヘッダ部       | サイズ 0x2b0 バイト
    +---------------------+
    |トラック部 (0 Track) |    サイズ 不定
    +---------------------+
    |トラック部 (1 Track) | サイズ 不定
    +---------------------+
    |         ・          | ・
    |         ・          | ・
    |         ・          | ・
    +---------------------+     トラック部の数は不定


○ヘッダ部分の詳細

  offset  サイズ
   0x00     17        ディスクの名前(ASCII + '\0')
   0x11      9        リザーブ ( 0x00 )
   0x1a      1        ライトプロテクト  0x00 なし、0x10 あり
   0x1b      1        ディスクの種類    0x00 2D、 0x10 2DD、 0x20 2HD
   0x1c      4        ディスクのサイズ
   0x20    4*164      トラック部のオフセットテーブル 0 Track 〜 163 Track

    ヘッダ部のサイズは、0x2b0 バイトです。
    C 言語の構造体で書くと、
        struct{
          char   name[17];
          char   reserve[9];
          char   write_protect;
          char   disk_type;
          long   disk_size;
          long   track_table[164];
        };
    こんな感じですね。

    ディスクのサイズとは、ヘッダ部とすべてのトラック部の合計の
    サイズです。
    
    トラック部のオフセットテーブルとは、各トラックのトラック部の先頭
    位置が、ヘッダの先頭から数えて、何バイト目にあるかという情報です。
    ヘッダ部は 0x2b0 バイトあるので、0 Track のオフセット値は、0x2b0 に
    なります。
    なお、2D の場合、84〜163 Track は存在しないので、オフセット値には
    0 を入れておきます。

    注意：   ディスクのサイズ、トラック部のオフセットテーブルは、4バイト
        ですが、リトルエンディアンで格納します。

○トラック部の詳細

    トラック部は、セクタ部を必要数連結したものです。

○セクタ部の詳細

  offset  サイズ
   0x00      1        ID の C
   0x01      1        ID の H
   0x02      1        ID の R
   0x03      1        ID の N
   0x04      2        このトラック内に存在するセクタの数
   0x06      1        記録密度         0x00 倍密度、   0x40 単密度
   0x07      1        DELETED MARK     0x00 ノーマル、 0x10 DELETED
   0x08      1        ステータス
   0x09      5        リザーブ
   0x0e      2        このセクタ部のデータサイズ
   0x10     不定      データ (サイズは、0x0e に格納しているバイト数)

    セクタ部のサイズは、不定です。
    C 言語の構造体で書くと、
        struct{
          char   c;
          char   h;
          char   r;
          char   n;
          short  number_of_sector;
          char   deleted_mark;
          char   status;
          char   reserve[5]
          short  size_of_data;
          char   data[ ? ];
        };
    こんな感じですね。

    ステータスは、PC-98x1 のBIOS が返してくるステータスで、
        0x00 正常
        0x10 正常(DELETED DATA)
        0xa0 ID CRC エラー
        0xb0 データ CRC エラー
        0xe0 アドレスマークなし
        0xf0 データマークなし
    となります。

    注意：   セクタの数、データサイズは、2バイトですが、
        リトルエンディアンで格納します。



●ディスクイメージの連結について

  このディスクイメージは、複数連結して使用することも可能です。
  この場合、一つのファイルに複数のディスクイメージが存在することになります。
