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

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

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

[第29回]


●FAT32システム(1)BPB

パーティションの先頭にあるセクタをBPB(Bios Parameter Block)といいます。
BPBにはそのパーティションの基本情報が書かれています。
スタンダードのSDカードのBPBについては[第13回]で説明をしました。
前回読んだMBRの情報から第1パーティションブロックのBPBはセクタbQ000Hに置かれているらしいことがわかりました。
そこでセクタbQ000Hを読んでみます。
セクタの読み込みは前回までのプログラムをそのまま使います。
先頭に初期化の部分が表示されますが、その部分は冗長なのでログのその部分はカットして示します。

logfile nd80zlog\12071121.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld sdcdif5v.bin,8100
loading SDCDIF5V.BIN ...0235(565)bytes loaded,from 8100 to 8334
>cm 8103
8103 00-
8104 00-
8105 00-20
8106 00-
>jp 8100

[00002000]
8800  EB 58 90 4D 53 44 4F 53-35 2E 30 00 02 40 2E 11  .X.MSDOS5.0..@..
8810  02 00 00 00 00 F8 00 00-3F 00 FF 00 00 20 00 00  ........?.... ..
8820  00 30 ED 00 69 07 00 00-00 00 00 00 02 00 00 00  .0..i...........
8830  01 00 06 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8840  80 00 29 C1 50 73 6E 4E-4F 20 4E 41 4D 45 20 20  ..)チPsnNO NAME  
8850  20 20 46 41 54 33 32 20-20 20 33 C9 8E D1 BC F4    FAT32   3ノ.ムシ.
8860  7B 8E C1 8E D9 BD 00 7C-88 4E 02 8A 56 40 B4 41  {.チ.ルス.|.N..V@エA
8870  BB AA 55 CD 13 72 10 81-FB 55 AA 75 0A F6 C1 01  サェUヘ.r...Uェu..チ.
8880  74 05 FE 46 02 EB 2D 8A-56 40 B4 08 CD 13 73 05  t..F..-.V@エ.ヘ.s.
8890  B9 FF FF 8A F1 66 0F B6-C6 40 66 0F B6 D1 80 E2  ケ....f.カニ@f.カム..
88A0  3F F7 E2 86 CD C0 ED 06-41 66 0F B7 C9 66 F7 E1  ?...ヘタ..Af.キノf..
88B0  66 89 46 F8 83 7E 16 00-75 38 83 7E 2A 00 77 32  f.F..~..u8.~*.w2
88C0  66 8B 46 1C 66 83 C0 0C-BB 00 80 B9 01 00 E8 2B  f.F.f.タ.サ..ケ...+
88D0  00 E9 2C 03 A0 FA 7D B4-7D 8B F0 AC 84 C0 74 17  ..,..}エ}..ャ.タt.
88E0  3C FF 74 09 B4 0E BB 07-00 CD 10 EB EE A0 FB 7D  <.t.エ.サ..ヘ....}
88F0  EB E5 A0 F9 7D EB E0 98-CD 16 CD 19 66 60 80 7E  ...}...ヘ.ヘ.f`.~
8900  02 00 0F 84 20 00 66 6A-00 66 50 06 53 66 68 10  .... .fj.fP.Sfh.
8910  00 01 00 B4 42 8A 56 40-8B F4 CD 13 66 58 66 58  ...エB.V@..ヘ.fXfX
8920  66 58 66 58 EB 33 66 3B-46 F8 72 03 F9 EB 2A 66  fXfX.3f;F.r...*f
8930  33 D2 66 0F B7 4E 18 66-F7 F1 FE C2 8A CA 66 8B  3メf.キN.f...ツ.ハf.
8940  D0 66 C1 EA 10 F7 76 1A-86 D6 8A 56 40 8A E8 C0  ミfチ...v..ヨ.V@..タ
8950  E4 06 0A CC B8 01 02 CD-13 66 61 0F 82 75 FF 81  ...フク..ヘ.fa..u..
8960  C3 00 02 66 40 49 75 94-C3 42 4F 4F 54 4D 47 52  テ..f@Iu.テBOOTMGR
8970  20 20 20 20 00 00 00 00-00 00 00 00 00 00 00 00      ............
8980  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8990  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89A0  00 00 00 00 00 00 00 00-00 00 00 00 0D 0A 52 65  ..............Re
89B0  6D 6F 76 65 20 64 69 73-6B 73 20 6F 72 20 6F 74  move disks or ot
89C0  68 65 72 20 6D 65 64 69-61 2E FF 0D 0A 44 69 73  her media....Dis
89D0  6B 20 65 72 72 6F 72 FF-0D 0A 50 72 65 73 73 20  k error...Press 
89E0  61 6E 79 20 6B 65 79 20-74 6F 20 72 65 73 74 61  any key to resta
89F0  72 74 0D 0A 00 00 00 00-00 AC CB D8 00 00 55 AA  rt.......ャヒリ..Uェ

>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Wed Dec 07 11:23:11 2016

MBRに書かれている情報はFAT16とほとんど同じですが、異なっているところもあります。
FAT16のMBRについては[第13回]で説明をしていますので、そちらも参照してください。
今回のFAT32のMBRのデータ内容とその意味です。
前回と同じく、ND80Z3.5の8800〜89FFに読み込みました。

000〜002 3バイト
EB 58 90

先頭の3バイトはブートのためのジャンプ命令でブート可能かどうかに関わらず、必ずEBで始まる3バイトが書かれていなければならないようです。
EB 58 は相対ジャンプ命令で、90はNOPです。
この命令の次のアドレス(002)+58Hがジャンプ先です。
上記ダンプリストでは885A(05A)がジャンプ先になります。

003〜00A 8バイト
4D 53 44 4F 53 35 2E 30

システム名のエリアでMSDOS5.0と書かれています。

00B〜00C 2バイト
00 02

セクタのバイト数です。
0200H(512)バイトです。

00D 1バイト
40

クラスタのセクタ数です。
40H(64)です。
ディスクの管理はセクタ単位ではなくて、クラスタという単位で行なわれます。通常は1クラスタの大きさは64セクタです。

00E〜00F 2バイト
2E 11

このBPBを含む予約セクタの数です。
それが112Eセクタで、このBPBのセクタbェ2000Hですから、2000H+112EH=312EH、つまりセクタbR12EHからのセクタにFAT1が置かれていることになります。

010 1バイト
02

FATの数です。
通常は同じFATが2個あります。

011〜012 2バイト
00 00

FAT16ではディレクトリに記述できる最大ファイル数ですがFAT32では記載がありません。

013〜014 2バイト
00 00

サイズの大きいディスクでは使われません。

015 1バイト
F8

ディスク種別です。
F8:固定 F0:リムーバル。
SDカードはリムーバルのように思えますが、固定ディスクとして扱われています。

016〜017 2バイト
00 00

FAT16では1個のFATのサイズ(セクタ数)ですがFAT32では記載がありません。

018〜019 2バイト
3F 00

古い情報エリアです。
今は使われません。

01A〜01B 2バイト
FF 00

古い情報エリアです。
今は使われません。

01C〜01F 4バイト
00 20 00 00

MBRからBPBまでのセクタ数です。

020〜023 4バイト
00 30 ED 00

このパーティションブロックの総セクタ数です。
00ED3000Hは10進数では15544320です。
1セクタは512バイトですから512を掛ければカードサイズ(バイト単位)が求まりますが、そうする代わりに2で割ればKB単位の値が求まります。
15544320/2≒7772160(KB)≒7.8(GB)になります。

024〜027 4バイト
69 07 00 00

FAT16ではここは別の情報エリアですが、FAT32ではFATエリアのセクタ数が入ります。
0769Hは10進数では1897になります。
16進数でも10進数でもなんとも半端な値ですが、どうしてこんな半端な値になっているのでしょう。
そういえば上のほうにあった予約セクタの数の112EH(4398)も半端です。
ところがこの数にはカラクリがありました。
上で計算したFAT#1の開始セクタbヘ312EHになるはずです。
それにここに記載されたFATのセクタ数0769Hを加算すると、FAT#2の開始セクタアドレスになります。
312EH+769H=3897Hです。
そしてそれにさらに769Hを加算すると、DIRエリアの開始セクタアドレスになります。
3897H+769H=4000Hです。
おお。
ちょうどキリの良い値になりました。
そういうシカケのようです。

028〜02B 4バイト
00 00 00 00

ここはちょっと特殊なエリアです。
とりあえず省略いたします。

02C〜02F 4バイト
02 00 00 00

ディレクトリの最初のクラスタ番号です。
通常は2になります。

030〜031 2バイト
01 00
ファイルシステム情報セクタの番号ということになっていて、通常は1のようです。
セクタbPのことかと思ったのですが、実際に読み出して確認してみると、セクタbQ001にありました。
パーティションブロックの先頭に置かれたBPBセクタを0番としたときのセクタ番号のようです。

032〜034 2バイト
06 00
BPBのバックアップセクタのセクタ番号です。
通常は6のようです。
これもセクタbUではなくて、上と同様に、パーティションブロックの先頭に置かれたBPBセクタを0番としたときのセクタ番号のようです。
実際に読み出して確認してみたところ、セクタbQ006にありました。

035〜03F 12バイト
予約エリアです。
00になっています。

040 1バイト
80

ドライブ番号です。
80:固定ディスク 00:リムーバルディスク。

041 1バイト
00

予約エリアです。

042 1バイト
29

拡張識別子です。
29のときは、次の3つのエリアが存在することを示します。

043〜046 4バイト
C1 50 73 6E
ランダムなボリュームシリアル番号です。

047〜051 11バイト
4E 4F 20 4E 41 4D 45 20 20 20 20 
(NO NAME    )
ボリューム名です。
無いときはNO NAMEにします。

052〜059 8バイト
46 41 54 33 32 20 20 20 (FAT32   )
FATの種別を示す文字列が入ります。

05A〜1FD 420バイト
ブートプログラムが入ります。

1FE〜1FF 2バイト
55 AA
識別情報です。
ここに 55 AA が書かれていないと正しいカードとして認識されません。

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

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