2011年10月05日

SDカード読み出し部の設計(7)

 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、・・・、となります。



posted by えすび at 19:47| Comment(0) | FPGA化:SDカード | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。