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

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

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

[第16回]


●注文していた2GBSDカードが届きました

[第14回]でFAT2に1箇所FAT1と異なるところがあるのがちょっと気になりましたので、別のSDカードで試してみたいと思って、同じ2GBのSDカードを注文していたものが届きました。
それで今回はそのSDカードを使って、今までと同じテストをしてみました。
最初はセクタbOです。

logfile nd80zlog\11162139.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
>r.

>jp 8100
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF00FF00FFFFFFFE
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000020160329620000000000000000000004
0400062CECCCFF00000001D73B00000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000055AA
AF35
>dm 8900,89ff
8900  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8910  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8920  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8930  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8940  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8950  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8960  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8970  00 00 00 00 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 00 00 00 00  ................
89B0  20 16 03 29 62 00 00 00-00 00 00 00 00 00 00 04   ..)b...........
89C0  04 00 06 2C EC CC FF 00-00 00 01 D7 3B 00 00 00  ...,.フ.....ラ;...
89D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA  ..............Uェ

セクタbOは[第11回]で読み出しました。
そのときも終わりに近いあたりに201511256Bという数値らしきものがありますしたが今回も2016032962という数値があります。
やっぱり日付のようです。
製造日とロットbナしょうか。

さてパーティションブロックの16バイトの解析です。
最初のパーティションブロックの情報は下の四角で囲った部分にあります。



[第11回]のときとは少し数値が異なっているようです。
同じように区分して整理しました。

1バイト 00       ブート情報 80:ブート可 00:ブート不可
3バイト 040400   開始ヘッド、セクタ、シリンダ情報(古い表示方法です。現在は利用されません)
1バイト 06       FAT種別 06:FAT16
3バイト 2CECCC   終了ヘッド、セクタ、シリンダ情報(古い表示方法です。現在は利用されません)
4バイト FF000000 パーティションの開始セクタ番号
4バイト 01D73B00 パーティションのセクタ数

パーティションの開始セクタbヘ先回は8Bでしたが今回はFFです。
同じ製品でも、全く同じというわけではないようです。
今回のSDカードはBPBがセクタbeFにあるようですのでセクタbニして0000FFを指定して読んでみました。

>cm 8103
8103 00-
8104 00-
8105 00-ff
8106 3E-
>jp 8100
FF01FF01FF00FF00FFFFFE
EB0090202020202020202000024001000200020000F8F0003F004000FF000000
01D73B00800029F84E16904E4F204E414D452020202046415431362020200000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000055AA
BB1D
>dm 8800,88ff
8800  EB 00 90 20 20 20 20 20-20 20 20 00 02 40 01 00  ...        ..@..
8810  02 00 02 00 00 F8 F0 00-3F 00 40 00 FF 00 00 00  ........?.@.....
8820  01 D7 3B 00 80 00 29 F8-4E 16 90 4E 4F 20 4E 41  .ラ;...).N..NO NA
8830  4D 45 20 20 20 20 46 41-54 31 36 20 20 20 00 00  ME    FAT16   ..
8840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8880  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8890  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

やっぱりそのようです。
ここで私は痛恨のミスをしてしまいました。
BPBの内容の解析は[第13回]で行ないました。
そのときと同じように丁寧にデータを区切って整理して確認すべきだったのです。
面倒だからとつい手抜きをして、このダンプリストのところから必要なデータをちょいちょいと読み取りました。
ええ。
そこで、ミスをして間違った値を読み取ってしまいました。
そのことはあとで書くことにしまして、ここではあらためて丁寧に整理することにします。

1)3バイト EB 00 90
先頭の3バイトはブートのためのジャンプ命令でブート可能かどうかに関わらず、必ずEBで始まる3バイトが書かれていなければならないようです。
2)8バイト 20 20 20 20 20 20 20 20
システム名のエリアでMSDOS5.0と書かれていることが多いようですが、このSDカードには何も書かれていません(Windowsでフォーマットすると、MSDOS5.0と書かれるようです)。
3)2バイト 00 02
セクタのバイト数。0200H(512)バイト。
4)1バイト 40
クラスタのセクタ数。40H(64)。ディスクの管理はセクタ単位ではなくて、クラスタという単位で行なわれます。通常は1クラスタの大きさは64セクタです。
5)2バイト 01 00
このBPBを含む予約セクタの数。ここが1の時は次のセクタにFATがあります。
6)1バイト 02
FATの数。通常は同じFATが2個あります(1個は予備?)。
7)2バイト 00 02
ディレクトリに記述できる最大ファイル数。通常は0200H(512)。
8)2バイト 00 00
サイズの大きいディスクでは使われません。
9)1バイト F8
ディスク種別 F8:固定 F0:リムーバル。SDカードはリムーバルのように思えますが、固定ディスクとして扱われています。
10)2バイト F0 00
1個のFATのサイズ(セクタ数)。ここが先回はEAでしたが今回はF0になっています。
ここを読み間違えてしまいました。
11)2バイト 3F 00
古い情報。今は使われません。
12)2バイト 40 00
古い情報。今は使われません。
13)4バイト FF 00 00 00
MBRからBPBまでのセクタ数。
14)4バイト 01 D7 3B 00
このディスクの総セクタ数。
15)1バイト 80
ドライブ番号。80:固定ディスク 00:リムーバルディスク。
16)1バイト 00
予約。
17)1バイト 29
拡張識別子。29:次の3つのエリアが存在することを示します。
18)4バイト F8 4E 16 90
ランダムなボリュームシリアル番号。
ここは先回と同じ番号になっています。
19)11バイト
ボリューム名。無いときはNO NAMEにします。
20)8バイト
FATの種別を示す文字列が入ります。

今回も最初のFATはBPBの次のセクタのようですから、FF+1=100ということで、セクタbニして000100を指定して読んでみました。

>cm 8103
8103 00-
8104 00-01
8105 FF-00
8106 3E-
>jp 8100
FF01FF01FF00FF00FFFFFE
F8FFFFFF00000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
D780

最初のFATが読み出されました。
まだ何も書き込んでいませんから、データ領域(クラスタbQ以降はすべて0000になっています。
さていよいよ問題のFAT2の読み出しです。
ところが先ほど書きましたように、ここで痛恨のミスをしてしまいました。
上でFATのサイズはF0となっていますが、そこをFFと読み間違えてしまいました。
どうやら10)ではなくて13)を読んでしまったようです。
そのためFAT2がセクタbPFFにあると思って、そのように読み出してみたのですが。

>cm 8103
8103 00-
8104 01-
8105 00-ff
8106 3E-
>jp 8100
FF01FF01FF00FF00FFFFFE
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000

何も書かれていない空っぽのセクタでした。
今思えば当たり前のことだったのですが、この時点では自分のミスにまだ気が付いていませんから、ここで悩んでしまいました。

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

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

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