ジョイパッド
3ボタンパッドの読み取り方 (コード例)
※ここではジョイパッドの具体的な読み取り例を解説します。
I/Oポートの詳細について知りたい場合は別項を参照して下さい。
まず起動時にI/Oポート1と2を初期化しておきます。
- 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から値を読み取ります。
- I/Oポート1のDATA (アドレス 0xA10003) に0x40を書き込む (つまりD6ピンに1を出力する)
- 数クロック待つ
- I/Oポート1のDATA (アドレス 0xA10003) を読み込む = 第1データ
- I/Oポート1のDATA (アドレス 0xA10003) に0x00を書き込む (つまりD6ピンに0を出力する)
- 数クロック待つ
- 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がボタンを押している状態です。