トップ小ネタPrince of Persia > ファイル位置


ファイル位置

※このページの内容はディスクダンプ、および同内容のディスクイメージ
 (TFD,XDFなどのいわゆる「ベタ形式」のもの)の場合です。
 (ヘッダ付きイメージではアドレスがずれます)
 その他のディスクイメージ形式には適用できません。


ファイル一覧(と思われる)情報を見つけたので、これを元にファイル単位でデータを取り出すことにしました。
データを取り出すためにはファイルの格納位置を特定する必要があるのですが、結論からいえば
・$1000〜にあるファイル名および開始ブロック位置の情報
・$400〜にあるブロックの接続情報
この2つを参照すればファイルの格納位置を特定でき、データを取り出すことができます。

※なお、ここでいう「ブロック」とは、「(ディスクを)$400(1,024)byteごとに区切った領域」
 のことを指します。
 ブロック番号0は$0〜$3FF、
 ブロック番号1は$400〜$7FF、
 ブロック番号2は$800〜$CFF、
 ブロック番号3は$C00〜$FFF、
 ...となります。
(論理セクタといっていいのかもしれませんが、ファイルシステムには詳しくないので…)

まず、ディスクの$1000以降には、各ファイルの情報を示すデータがあります。
(以降、ファイル一覧と呼ぶことにします)
1つのファイルにつき16バイト単位で構成されていて、
・最初の11バイト($0〜$A)がファイル名
・その後の3バイト($B〜$D)は不明
・残りの2バイト($E〜$F)が開始ブロック番号 (1ブロック=$400(1,024)byte)
を表しています。
ファイル名はいわゆる8.3形式で、拡張子部分は9バイト目以降($8〜$A)になります。
ファイル名の頭の部分(拡張子で無い部分)が8文字未満の場合はスペース($20)で埋められています。
なお、データには拡張子部分のピリオド(.)は含まれません。
(このサイトではファイル名を「MUSIC.SYS」「PALET.DAT」のようにピリオド付きで表記しています)

上記のファイル一覧ではデータの開始位置しかわかりませんが、
データ(ブロック)のつながりやファイルの終端を知りたいときは$400以降を参照します。
ここのデータは2byte単位で格納されており、
「$400+(ブロック番号*2)」のアドレスに、次に続くブロック番号が書かれています。
次のブロックに続かない場合(そのファイルの終端である場合)は、
(符号無しとみなしたときに)$FC00以上の値になっています。
この時、$FC00を引いた値がそのブロックのデータサイズになります。
ただし、$FC00の場合は0バイトではなくそのブロック全体がデータ部分になります。


例:END2.MUSの場合
ディスクの$11D0〜DAの内容は「45 4E 44 32 20 20 20 20 4D 55 53」となっていますが、
これを文字列に直すと「END2 MUS」となります。(「END2」と「MUS」の間にはスペース4個)
$11DE〜DFの値は「41 00」(=$0041)となっていることから、
END2.MUSのデータはブロック番号$41から始まっていることがわかります。
次に、$400+($41*2)=$482を参照すると「$8E」となっているので、
ブロック$0041→$008Eと続いていることがわかります。
同様にみていくと、
$400+($8E*2)=$51Cの値→$8F
$400+($8F*2)=$51Eの値→$90
より、ブロック$8E→$8F→$90とつながっていることがわかりますが、
$520(ブロック$90に対応)の値は「B7 FE」(=$FEB7)と$FC00より大きな値になっているので、
ここ(ブロック$90)がEND2.MUSの最終ブロックになります。
最終ブロックのサイズは$FEB7-$FC00=$2B7(695)byteになります。

よって、
・ブロック$41($10400〜$107FF)
・ブロック$8E($23800〜$23BFF)
・ブロック$8F($23C00〜$23FFF)
・ブロック$90の頭から$2B7(695)byte分($24000〜$242B6)
以上をつなげたものがEND2.MUSのデータになります。


上の例でもわかりますが、データの配置が連続しているとは限らないので注意してください。

戻る