SDの読み出しの続き。
ちなみにこの辺りの情報は、以下を参考にしています。
http://www.geocities.co.jp/SiliconValley-PaloAlto/2038/fat.htmlhttp://www.mars.dti.ne.jp/~m7030/yellow_hos/fat.html8)論理セクタ#0の読み出す。
8−1)論理セクタの位置を計算する。
→ (セクタ番号+オフセット値)×512 が物理アドレスらしい。
オフセット値は、7)で読み出した値で、以降のセクタの読み出しは、常に上の式が適用される。
ちなみに、今回使用したSDカードのオフセット値は、0x000000F3 でした。
8−2)論理セクタ#0を読み出す。
→読み出しアドレスには、上記の計算式を使います。今回使用したSDカードでは、
(0 + 0x00F3)×512 = 0x1E600
になります。この値をそのまま読み出しアドレスに指定して、CMD17 で読み出します。
論理セクタ#0には、BPB と呼ばれる、さまざまなデータが格納されています。
ちなみに読み出した結果は、こんな感じ。
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
000 eb 00 90 20 20 20 20 20 20 20 20 00 02 20 01 00
010 02 00 02 00 00 f8 f6 00 3f 00 20 00 f3 00 00 00
020 0d b3 1e 00 80 00 29 31 8f ce 3d 4e 4f 20 4e 41
030 4d 45 20 20 20 20 46 41 54 31 36 20 20 20 00 00
重要な(というか使用する)パラメータは、次の通り。
+0x0B,0x0C:1セクタのバイト数
+0x0D :1クラスタのセクタ数
+0x0E,0x0F:FATの開始セクタ番号
+0x10 :FATの数
+0x11,0x12:ルートディレクトリのエントリ数
+0x16,0x17:FATが使用しているセクタ数
+0x3A :0x36 なら FAT16。0x32 なら FAT12。
通常のファイルにアクセスする時は、クラスタで指定します。
今回使っているSDカードは、1セクタ数 = 0x0200、1クラスタのセクタ数 = 0x20 なので、
クラスタのサイズは、0x0200 × 0x20 = 0x4000 (16Kバイト)です。
1つのファイルがクラスタのサイズより大きい場合は、FAT を辿っていく必要があります。
9)ルートディレクトリを読み出す。
9−1)ルートディレクトリの位置を計算する。
ここでは、8)で読み出した値を使います。
ルートディレクトリは、FAT の次に格納されています。
ルートディレクトリの論理セクタ開始番号 = FATの開始セクタ番号 + FATの数 × FATが使用しているセクタ数
= 0x0001 + 0x02 × 0x00F6 = 0x1ED
となります。
ルートディレクトリ物理セクタ開始番号は
(ルートディレクトリの論理セクタ開始番号 + オフセット値)×512 = (0x1ED + 0x00F3)× 512 = 0x5C000
になります。
今回は、FAT16 のみ対応する事にします。
また、PC-6001のROMファイルはルートディレクトリに置いているものとします。
手抜きですが、凝る所ではないと思いますので。
9−2)ルートディレクトリを読み出す。
→読み出しアドレスは、上記で算出したアドレス(今回は、0x5C000)を使います。
読み出した結果がこちら。
+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
000 e5 4d 00 50 00 00 00 ff ff ff ff 0f 00 2a ff ff
010 ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff
020 e5 30 00 35 00 5f 00 31 00 30 00 0f 00 2a 32 00
030 34 00 5f 00 37 00 36 00 38 00 00 00 2e 00 42 00
040 e5 35 5f 31 30 32 7e 31 42 4d 50 20 00 7e 52 ba
050 99 35 43 3f 00 00 f5 b3 34 31 02 00 36 04 0c 00
060 41 70 00 72 00 69 00 76 00 61 00 0f 00 67 74 00
070 65 00 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff
080 50 52 49 56 41 54 45 20 20 20 20 10 00 68 33 9d
090 9a 39 9a 39 00 00 33 9d 9a 39 33 00 00 00 00 00
0A0 e5 41 53 49 43 52 4f 4d 36 30 20 20 00 bb a9 71
0B0 43 3f 44 3f 00 00 00 00 21 2a 02 00 00 40 00 00
0C0 43 47 52 4f 4d 36 30 20 36 30 20 20 00 70 c3 71
0D0 43 3f 43 3f 00 00 00 00 21 2a 03 00 00 10 00 00
0E0 52 41 4d 44 4d 59 34 20 42 49 4e 20 18 b8 a1 6c
0F0 44 3f 44 3f 00 00 66 86 42 3f 02 00 00 20 00 00
100 42 41 53 49 43 52 4f 4d 36 30 20 20 00 70 a5 6c
110 44 3f 44 3f 00 00 00 00 21 2a 04 00 00 40 00 00
120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1つのファイルに付き、32バイト単位で情報があります。
必要な情報は次の通り。
+0x00 :0x05、0xE5 なら、ファイルが削除されている。0x00 なら、ディレクトリのファイルは終了。
+0x00-0x0A:ファイル名(8文字+3文字)。短い場合は0x20 で埋める。
+0x0B :ファイル属性。0x0F の場合は、ロングファイル名。0x20 が通常ファイル。0x10 がディレクトリ。
下位4ビットは、read only などの属性があるが、省略。
+0x1A-0x0B:ファイルの先頭クラスタ番号。
+0x1C-0x1F:ファイル長。
例えば、0x100〜0x11F に書かれているのは、「BASICROM.60」というファイルで、ファイル長は、0x4000(16Kバイト)。
先頭クラスタ番号は、0x0004 です。