2016.11.12
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
SDカードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
そして作戦その3は、SDカードインターフェースです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第14回]


●FAT16ファイルシステム

今までに読み解いたMBR(Master Boot Record、セクタbO)と、BPB(Bios Parameter Block、セクタbWB)の情報から、FAT16ファイルシステムの基本構造が見えてきました。
下の図はテストに使った2GBのSDカードの内部構造を図にまとめたものです。



実はFAT16の場合、通常2つあるFATエリアとディレクトリエリアの位置(セクタajについては、BPBにははっきりとは書かれていません。
ただ最初のFATエリアについては前回の5)で、BPBの次のセクタにあるらしいということがわかります。
おそらく2番目のFATエリアとディレクトリエリアは最初のFATエリアのすぐ次に配置されているのだろう、とあてずっぽうで読み出してみて、その通りであることが確認できました。
上の図で最初のFATエリアの先頭セクタはBPBの次ということですから、セクタbWCになります。
FATエリアのサイズは前回の10)でEAH(234)セクタですから、もし2番目のFATエリアが最初のFATエリアに続いて配置されていると仮定すれば、その先頭セクタは8C+EA=176Hになります。
そしてその後ろに続いてディレクトリエリアが配置されていると仮定すれば、その先頭セクタは176+EA=260Hになります。
DIRエリアに書き込むことのできるファイルエントリ数は前回の7)から512個です。
後で解析することで確認ができますか、1個のファイルエントリ情報は32バイトです。
するとディレクトリエリアの大きさは32×512=16384バイトで、1セクタは512バイトですから32セクタ(20H)ということになります。
その後ろからがデータ領域になります。
データ領域はクラスタbQから始まります。
前回の4)から1クラスタは64セクタ(40H)です。
FAT16ファイルシステムでは、たとえ1バイトしかない小さなファイルでも64セクタを占有します。

以上の情報をもとに、まずは最初のFATの先頭セクタ(bWC)を読んでみました。

logfile nd80zlog\11121044.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld sdcdif2r.bin,8100
loading SDCDIF2R.BIN ...0110(272)bytes loaded,from 8100 to 820F
>cm 8103
8103 00-
8104 00-
8105 00-8c
8106 3E-
>jp 8100
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF00FF00FFFFFFFFFE
F8FFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
96DA
>dm 8800,881f
8800  F8 FF FF FF FF FF FF FF-FF FF FF FF 00 00 00 00  ................
8810  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

前回と同じようにFATエリアの先頭のデータがある部分を取り出して、そこにクラスタb付記しました。


クラスタbOからbTまでが使用済みになっています。
FFF8〜FFFFは、そのクラスタでデータチェーンが終っていることを示します。
いくつかのクラスタを使うような大きなファイルでは、その次に続くクラスタbェ書かれます。
さて、それでは2番目のFATエリアを読んでみましょう。

>cm 8103
8103 00-
8104 00-01
8105 8C-76
8106 3E-
>jp 8100
FF01FF01FF00FF00FFFFFE
F8FFFF7FFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
336A
>dm 8800,881f
8800  F8 FF FF 7F FF FF FF FF-FF FF FF FF 00 00 00 00  ................
8810  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

ここでおかしなことに気が付きました。
おそらく2つのFATエリアは同じ内容と思われるのですが、よく見るとクラスタbPが最初のFATエリアと異なっています。
最初のFATエリアのクラスタbPはFFFFでしたが、2つめのFATエリアのクラスタbPはFF7F(データの普通の表記に直すと7FFF)になっています。
ちょっとおかしいです。
読み出したときのミスかと思って、再度実行してみたのですが、やっぱり同じでした。
クラスタbPは通常のデータクラスタではありませんから、これが何かトラブルになるとは思いませんけれど、ちょっと気持ちが悪いです。
ここまで来るまでに色々あれこれ試してみましたから、その過程でここが書き換わるようなことがおきたのかも知れません。
FATを読み出しているテストをもっと以前にやっていたかも、と思ってログを調べてみましたら、2番目のFATの読み出しをしたログがみつかりました。
10月15日ですから、はじめてセクタの読み出しに成功したころのログです。

logfile nd80zlog\10152045.txt open
zb3dos3n 2014.4.6 by Chunichidenko

ND80Z3に接続しました
0001 0000 - z
1000 00C3 - *** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld sdcdif1q.bin,8100
loading SDCDIF1Q.BIN ...011b(283)bytes loaded,from 8100 to 821A
>cm 8100
8100 C3-
8101 06-
8102 81-
8103 00-
8104 00-01
8105 00-76
8106 3E-
>jp 8100
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF00FF00FFFFFFFFFE
F8FFFF7FFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
336A
>

やっぱりFF7Fになっていますね。
再フォーマットしてどうなるか確認してみてもよいのですけれど、念のためこのSDカードはこのままにしておいて、もう1枚入手して調べてみることにします。

説明の途中ですが、本日は時間がなくなってしまいましたので、この続きは次回にすることにいたします。

SDカードインターフェースの製作[第14回]
2016.11.12upload

前へ
次へ
ホームページトップへ戻る