SDカードドライバの設計(1)

拙作ののSDカードアダプタは、ジョイスティックポート経由で接続し、データのやり取りをすることができます。これから少しづつその説明をしようと思います。

AY-3-8910

PC-6001のジョイスティックポートはPSGであるAY-3-8910が持つ、2つの汎用8ビットパラレルI/Oポートに接続されていて、I/Oポート0xa0~0xa2でアクセスすることができます。この仕組みはI/Oポートの番号も含めてMSXと同じです。

0xa0: レジスタラッチ
0xa1: レジスタへの書き込み
0xa2: レジスタからの読み出し

I/Oポートアクセスのために利用するAY-3-8910のレジスタは以下のとおりです。

0x07: I/O選択
0x0e: ポートA
0x0f: ポートB

PC-6001の回路

ここまではAY-3-8910の仕様なのですが、PC-6001の回路では、0x0e、0x0fの2つのレジスタが直接2つのジョイスティックポートにマッピングされているわけではないので、話は少し面倒です。

基本的に、レジスタ0x0eは読み出し専用、レジスタ0x0fは書き込み専用です。そして、実際のジョイスティックポートへの出力は各ポートあたり3本のみです。SDカードのSPIモードでは、出力3本、入力1本を使うため、ぎりぎり間に合います。

レジスタ0x0fのビットは以下のようになっています。

*OE SEL J1-8 J2-8 J1-7 J1-6 J2-7 J2-6
  • OE: 出力イネーブル(0で出力可能)
  • SEL: 入力するジョイスティックの選択(1=ジョイスティック1, 0=ジョイスティック2)
  • Jx-y: ジョイスティックポートxのyピンに出力するデータ

SDカードアダプタ

前述のように、SDカードをSPIモードで使う場合、出力3本、入力1本が必要なので、SDカードアダプタはジョイスティックポートのピンを以下のように割り当てています。

  • ピン1: 入力データ(MISOまたはDO)
  • ピン6: クロック(CLK)
  • ピン7: セレクト(CS)
  • ピン8: 出力データ(MOSIまたはDI)

データの読み書き

AY- 3-8910を使う場合、レジスタのラッチを行ってからそのレジスタに対する読み書きをする必要があるので、通常のバイト指向のI/Oポートよりも入出力 が面倒です。また、SPIモードの仕様として、1ビットのデータ入出力にクロックをPC側から入れてやる必要があるので、さらに手順が煩雑になります。 まぁ、これのおかげでスピードをPC側の都合で速くも遅くもできます。

実際の入出力は以下のような感じになります。

準備

  1. (ポート0xa0)<-0x07 レジスタ0x07をラッチ
  2. A<-(ポート0xa2) レジスタ0x07の値を読み込む
  3. A = A | 0x80
  4. (ポート0xa0)<-A レジスタ0x0eを入力、レジスタ0x0fを出力に設定

出力

  1. (ポート0xa0)<-0x0f レジスタ0x0fをラッチ
  2. (ポート0xa1)<-0x10または0x00 ビットを書き込み
  3. (ポート0xa1)<-0x11または0x01 クロックを反転

入力

  1. (ポート0xa0)<-0x0f レジスタ0x0fをラッチ
  2. (ポート0xa1)<-0x10 DIを書き込み
  3. (ポート0xa1)<-0x11 クロックを反転
  4. (ポート0xa0)<-0x0e レジスタ0x0eをラッチ
  5. A<-(ポート0xa2) データ読みこみ、ビット0にデータが入る

ふぅ。これで1ビットの入出力です。8回繰り返してようやく1バイトの入出力となります。

なお、データはMSB→LSBの順で転送します。

こちらもよく読まれています