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


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第89回]



●SDカードIF(9)ND80Z3.5に接続(2)FAT16

前回からの続きです。
前回はrs1 0000に続いてm 1を実行してセクタbOの前半256バイトを表示したところで終わりました。
下にその画面を再掲します。

FAT16でフォーマット済みのSDカードを購入するとセクタbOはMBR(Master Boot Record)になっています。
しかしそのSDカードをWindowsでフォーマットし直すとMBRは消滅してそこにはBPB(Bios Parameter Block)が置かれます。
MBRについては「SDカードインターフェースの製作[第11回]」で説明しています。
またBPBについては同[第13回]で説明しています。
BPBにはセクタリード、セクタライトのために必要な情報が書かれています。
上の画面に表示されたデータを見ながら必要な情報を抜き出して下に整理して示します。
下に示す数値の先頭の数値はバイト位置を示す数(上の表示の左端の数から始まる数。複数バイトの場合は03−0Aのように示す)。
その右側はその位置にあるデータです。

00−02  EB 3C 90
先頭の3バイトはブートのためのジャンプ命令でブート可能かどうかに関わらず、必ずEBで始まる3バイトが書かれていなければならないようです。
03−0A  4D 53 44 4F 53 35 2E 30
システム名のエリア。Windows7でフォーマットするとMSDOS5.0と書かれます。
0B−0C  00 02
セクタのバイト数。0200H(512)バイト。
0D  40
クラスタのセクタ数。40H(64)。ディスクの管理はセクタ単位ではなくて、クラスタという単位で行なわれます。1クラスタの大きさは64セクタです。
0E−0F  08 00
BPBを含む予約セクタの数。予約セクタの次のセクタにFATがあります。セクタbO〜7が予約セクタなのでFAT1はセクタbWになります。
10  02
FATの数。同じFATが2個あります。
11−12  00 02
ディレクトリに記述できる最大ファイル数。0200H(512)。
13−14  00 00
使われていません。
15  F8
ディスク種別 F8:固定 F0:リムーバル。SDカードはリムーバルのように思えますが、固定ディスクとして扱われています。
16−17  F0 00
1個のFATのサイズ(セクタ数)。00F0H(240)セクタ。FATは2個あるので、FATは合計で01E0H(480)セクタになります。
18−19  3F 00
古い情報。今は使われません。
1A−1B  FF 00
古い情報。今は使われません。
1C−1F  00 00 00 00
MBRからBPBまでのセクタ数。MBRがなくてセクタbOがBPBなのでここは0000Hになっています。
20−23  00 D8 3B 00
このディスクの総セクタ数。003BD800H(3921920)セクタ。
24  80
ドライブ番号。80:固定ディスク 00:リムーバルディスク。
25  00
予約。
26  29
拡張識別子。29:次の3つのエリアが存在することを示します。
27−2A  3D 68 05 8E
ランダムなボリュームシリアル番号。
2B−35  4E 4F 20 4E 41 4D 45 20 20 20 20
ボリューム名。無いときはNO NAMEにします。
36−3D  46 41 54 31 36 20 20 20
FATの種別を示す文字列が入ります。このSDカードはFAT16でフォーマットされています。
ここから後ろはブートプログラムのエリアです。

上記の情報を活用することによってセクタアクセスプログラムのデバッグが楽に行なえるようになります。
下は上記の情報をもとにしてSDカード内にFATやDIRなどのエリアがどのように配置されているかを図にして示したものです。
セクタのアクセスはSDカードの先頭のセクタを0000とするセクタbナ行なわれます。
図中()の中は各領域の開始セクタbニ終了セクタb示します。
ファイルセーブによってファイル名をつけてセーブされるファイルのファイル名とそのファイルのデータが書き込まれる領域やバイト数などの情報はDIRエリアにファイル名ごとに書き込まれます。
ファイルデータはセクタ単位で書き込まれますから、そのデータを読み出すためにはそのデータが書き込まれたセクタナンバーを指定してセクタリードを行ないます。
しかしDIRにはそのデータが書かれたセクタナンバーではなくてそのセクタがあるクラスタ番号がかかれます。
このためクラスタ番号からセクタナンバーに換算する必要があります。
下の図ではクラスタ#2〜#5に含まれるセクタのナンバーを()内に示しました。
ユーザー用のデータ領域はクラスタ#2から始まります。
FATやDIRについてはのちほど詳しく説明します。
この図のセクタナンバーは今回テストとして使用したSDカードのもので個々のSDカードによって変わる可能性があります。

FATのサイズは00F0H(24)セクタなのでFAT1はセクタbW〜F7になります。
FAT2はセクタbe8〜1E7になります。
DIRエリアはその後ろですからその先頭セクタはセクタbPE8になります。
前記の情報にはありませんがDIRに記述するファイルの情報は1ファイルあたり32バイトです。
1セクタは512バイトなのでDIRの1セクタには512/32=16ファイル分の情報が書かれることになります。
DIRに記述できる最大ファイル数は512ですから512/16=32セクタになります。
以上の計算からDIRのサイズは20H(32)セクタです。
ですからDIRエリアはセクタbPE8〜207になります。
その次のセクタbQ08からがユーザーのファイルエリアです。
FAT16ではファイルエリアはクラスタという単位でまとめられていて1つのクラスタは40H(64)セクタです。
ユーザーエリアはクラスタbQ(クラスタ#2と表記します)から始まります。
計算通りにはなりませんが先頭のセクタbO000〜DIRエリアの終わりまでがクラスタ#0とクラスタ#1ということになっています。
以上をrsコマンドとmコマンドで確かめてみます。

rs1 0008とm 1を実行しました。

セクタbO008はFAT1の最初のセクタです。
FATは2バイトで1クラスタを示します。
未使用のクラスタは0000です。
1つのクラスタは1つのファイルが占有します。
ファイルのサイズが40H(64)セクタ以内のときは対応するクラスタ位置はFFFFになり使用済みであることを示します。
もしファイルのサイズが40H(64)セクタを越えるときは次の空いているクラスタが使われ現在のクラスタ位置には次の空いているクラスタ番号が書き込まれます。
これによってクラスタのチェインが構成されます。
セクタbWを読み出したところ上の画像のように先頭の4バイトだけがF8FFになっています。
先頭がそのようになっていればそれがFAT1の先頭セクタです。
この4バイトがクラスタbO、クラスタbPを示しています(そういうことになっています)。
なぜか最初のバイトはFFではなくてF8になっていますがこれもそういうことになっているということのようです。

rs1 00f8とm 1を実行しました。

セクタbO0F8はFAT2の最初のセクタです。
上で読み出したFAT1と同じ内容であることからそのことが確認できます。

rs1 01e8とm 1を実行しました。

セクタbO1E8はDIRの最初のセクタです。
DIRにはまだ何も書かれていませんから値はすべて00です。
ここがDIRエリアであることを確認するためにはさらにテストを進める必要があります。

今回はここまでです。

PICBASICコンパイラ[第89回]
2023.10.15upload

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