SDの読み出しの続き。
10)ファイルの先頭クラスタから読み出す。
10−1)ファイルの先頭クラスタの位置から物理アドレスを計算する。
→クラスタの先頭は、ルートディレクトリのすぐ後にあります。また、クラスタの先頭番号は#2です。
(#0は未使用、#1は予約)
クラスタの論理先頭セクタ番号は、以下の通りです。
クラスタ論理先頭セクタ番号 = ルートディレクトリの論理セクタ開始番号 + ルートディレクトリのエントリ数×32/1セクタのバイト数
ルートディレクトリのエントリ数は、BPB の 0x11、0x12、1セクタのバイト数は、BPB の 0x0B、0x0C です。
結局、ファイルの先頭クラスタの番号から、論理セクタ番号への変換は以下のようになります。
論理セクタ番号 = (ファイルの先頭クラスタ番号 - 2 )× 1クラスタのセクタ数 + クラスタ論理先頭セクタ番号
1クラスタのセクタ数は、BPB の 0x0D です。
これを、物理アドレスに変換して、やっとデータにアクセス出来ます。
先ほどの「BASICROM.60」を例にすると、ファイルの先頭クラスタ番号は、0x0004 なので、
論理セクタ番号 = (0x0004 - 2)× 0x20 + (0x1ED + 0x0200 × 32 / 0x0200 ) = 0x24D
物理セクタ番号 = (0x024D + 0x00F3)× 512 = 0x68000
となります。ふぅ。
11)ファイルの次のクラスタを読み出す。
11−1)FAT の位置を調べる。
→1ファイルが1クラスタ以下のサイズの場合は、1クラスタ分を読んで終わりですが、それ以上の場合は、次のクラスタ番号を知る必要があります。
クラスタ番号が連続していないことがあるので、FAT にアクセスして次のクラスタ番号を調べます。
FAT の先頭位置は、BPB の 0x0E、0x0F から、先頭論理セクタ番号を読み出し、物理アドレスに変換します。FAT16 なので、16ビット毎に1クラスタのデータが書いています。
ですので、FAT の先頭2バイトは、クラスタ#0、その次の2バイトはクラスタ#1、・・・、となります。
2011年10月05日
この記事へのコメント
コメントを書く

