Future Driver

ジョイパッド

3ボタンパッドの読み取り方 (コード例)

※ここではジョイパッドの具体的な読み取り例を解説します。 I/Oポートの詳細について知りたい場合は別項を参照して下さい。

まず起動時にI/Oポート1と2を初期化しておきます。

  1. I/Oポート1と2のCTRL (アドレス 0xA10009 と 0xA1000B) に0x40を書き込む (つまりD6ピンだけ出力に設定する)

以下がその初期化例です。

void initPad(){
	register uchar *port;

	port = (uchar *) 0xA10009;
	*port = 0x40;	/* I/Oポート1のCTRL (アドレス 0xA10009) に0x40を書き込む */
	port += 2;
	*port = 0x40;	/* I/Oポート2のCTRL (アドレス 0xA1000B) に0x40を書き込む */
}

1Pジョイパッドのみ使用する場合に限って説明すると、 各ボタンの状態を読み取りたい時に下記手順でI/Oポート1から値を読み取ります。

  1. I/Oポート1のDATA (アドレス 0xA10003) に0x40を書き込む (つまりD6ピンに1を出力する)
  2. 数クロック待つ
  3. I/Oポート1のDATA (アドレス 0xA10003) を読み込む = 第1データ
  4. I/Oポート1のDATA (アドレス 0xA10003) に0x00を書き込む (つまりD6ピンに0を出力する)
  5. 数クロック待つ
  6. I/Oポート1のDATA (アドレス 0xA10003) を読み込む = 第2データ

以下が上記のコード例になります。

void readPad(){
	register uchar *port;
	register uint inputA, inputB;

	/* I/Oポートからの読み込み */
	port = (uchar *) 0xA10003;
	*port = 0x40;			/* D6ピンに1を出力する */
	asm("nop");			/* 数クロック待つ */
	asm("nop");
	inputA = *port;			/* 第1データ */
	*port = 0x00;			/* D6ピンに0を出力する */
	asm("nop");			/* 数クロック待つ */
	asm("nop");
	inputB = *port;			/* 第2データ */

	/* ボタンの状態を表す各グローバル変数へ代入 */
	padLeft = inputA >> 3 & 0x01;
	padRight = inputA >> 2 & 0x01;
	padUp = ~inputA & 0x01;
	padDown = ~inputA >> 1 & 0x01;
	padA = ~inputB >> 4 & 0x01;
	padB = ~inputA >> 4 & 0x01;
	padC = ~inputA >> 5 & 0x01;
	padStart = ~inputB >> 5 & 0x01;
}

上記の読み取りコードを基本的に1/60秒以上間をあけて行います。 言い換えると、早くてもVSYNC毎に1回だけ行う様にします。
もし間を空けずに行った場合、 6ボタンパッド接続時に正しい値が読み込まれません。

3ボタンパッドの読み取り方 (ハードウェア)

3ボタンパッドはボタンの数が全部で8個なので、バンク切り替えで2回読み込む必要があります。
バンク切り替えはD6ピン(THピン) で行います。

THピンに 1 を出力している時

ピン番号 ピン名 別名 I/O 入力値又は出力値
9. D5 TR I Cボタンの状態
8. GND
7. D6 TH O 1
6. D4 TL I Bボタンの状態
5. +5V
4. D3 D3 I 右ボタンの状態
3. D2 D2 I 左ボタンの状態
2. D1 D1 I 下ボタンの状態
1. D0 D0 I 上ボタンの状態

THピンに 0 を出力している時

ピン番号 ピン名 別名 I/O 入力値又は出力値
9. D5 TR I STARTボタンの状態
8. GND
7. D6 TH O 0
6. D4 TL I Aボタンの状態
5. +5V
4. D3 D3 I 常に0
3. D2 D2 I 常に0
2. D1 D1 I 下ボタンの状態
1. D0 D0 I 上ボタンの状態

各ボタンの状態は、1がボタンを離している状態、 0がボタンを押している状態です。



inserted by FC2 system