コントローラ

FF00 - P1/JOYP - ジョイパッド (読み込み/書き込み可能)


ボタンと方向キーは合計で 8 個あり、 2x4 の行列形式になっています。
このレジスタに書き込むことで、ボタンと方向キーの選択ができ、それぞれビット 0 から 3 で読み込むことができます。

 Bit 7 - 未使用
 Bit 6 - 未使用
 Bit 5 - P15 ボタンの選択                 (0 = 選択)
 Bit 4 - P14 方向キーの選択               (0 = 選択)
 Bit 3 - P13 下キー または スタートボタン (0 = 押下状態) (読み込み専用)
 Bit 2 - P12 上キー または セレクトボタン (0 = 押下状態) (読み込み専用)
 Bit 1 - P11 左キー または B ボタン       (0 = 押下状態) (読み込み専用)
 Bit 0 - P10 右キー または A ボタン       (0 = 押下状態) (読み込み専用)

多くのゲームで、この値は何度か連続で読み込まれます。
(最初の読み込みで入力を安定させ、後で読み込んだ方の値が実際に使われます。)

通常、 P1 レジスタに 30h を書きこんでおき、 P15、 P14 の出力を High にしておきます。
ボタン (スタート、セレクト、 B、 A) の走査をするときは、 P15 の出力を Low にして、
P13 ~ P10 の High、 Low を読み取ります。

また、方向キー (上下左右) の走査をするときは、 P14 の出力を Low にして、
P13 ~ P10 の High、 Low を読み取ります。

押されていなければ High で、押されていれば Low になります。

機種判定

P1 レジスタに 03h を書きこんだ後、このレジスタの値を読み込むと機種の判定ができます。
Fxh ならゲームボーイ、 3xh ならスーパーゲームボーイです。

スーパーゲームボーイでの使用


スーパーゲームボーイのゲームでは、 FF00 のレジスタを別の用途で使用します。

  • スーパーファミコンへ、コマンドパケットを送信する
  • 最大 4 つまでのコントローラに対応する

INT 60 - ジョイパッド割り込み


上に書いた入力ラインが High から Low へ切り替わる時に、ジョイパッド割り込みが要求されます。
通常、キーが押された時に割り込みが発生します (ボタン、方向キーはビット 4 ・ 5 で有効になります)。
しかし通常、 1 回ボタンを押す・離す度に、 1 回以上の High から Low へのバウンスが発生します。

ジョイパッド割り込みの使用


ジョイパッド割り込みは、通常、使い道がありません。
ボタンと方向キーを同時に選択している時でも、すべてのキー入力を認識することができないし、
ボタンがすでに押されている時に、関連する方向キーが押されたとしても区別することができません。

キー入力割り込みは、 スタンバイ状態 (STOP 命令を実行した後の、低消費電力状態) を停止させる時にのみ、意味のある使い方ができます。
また、ジョイパッド割り込みはゲームボーイカラー本体と、ゲームボーイアドバンス本体では発生しません。
(ジョイパッドのキー入力で、 STOP 状態を停止させること自体はできます。)


ジョイパッド・スキャン例


次にジョイパッド・スキャン例を示す。これは、C言語で記述してあり、GBDKでコンパイルすることができる。走査結果が、16進値で表示され、ジョイパッドを押すことによってその値が変化することを確かめられる。


#include <stdio.h>

/* p1 レジスタ */
#define P1_REG          (*(UBYTE *)0xFF00)

void main()
{
 UBYTE padA;
 UBYTE padB;
 UBYTE padC;
 
 while(TRUE){
   
   // ボタンの走査
   P1_REG = 0x10;  // 出力端子p15をLowに設定
   padA = P1_REG;  // ちょっと待つ
   padA = P1_REG & 0x0F;  // 読み取り(下位4ビットのみ有効)
   
   // 十字キーの走査
   P1_REG = 0x20;  // 出力端子p14をLowに設定
   padB = P1_REG;  // ちょっと待つ
   padB = P1_REG & 0x0F;  // 読み取り(下位4ビットのみ有効)
   
   // ボタン、十字キーのごちゃ混ぜ走査
   P1_REG = 0x00;  // 出力端子P15,p14をLowに設定
   padC = P1_REG;  // ちょっと待つ
   padC = P1_REG & 0x0F;  // 読み取り(下位4ビットのみ有効)
   
   // 走査結果を表示
   printf("p15:%x-p14:%x  [%x]\n", keyA, keyB, keyC);
   
   P1_REG = 0x30; 
 }
}


ジョイパッド関数


▼ジョイパッド走査

構文

#include <gb.h>
UBYTE joypad(void);

戻り値

ジョイパッドの走査値。以下の値の論理和が返される。

■ジョイパッドの定義

 J_START : Start ボタン
 J_SELECT: Select ボタン
 J_B : B ボタン
 J_A : A ボタン
 J_DOWN : 下方向キー
 J_UP : 上方向キー
 J_LEFT : 左方向キー
 J_RIGHT : 右方向キー

説明

押されているジョイパッドの走査結果を戻す。

関連項目

waitpad, waitpadup

▼ジョイパッド入力待ち

構文

#include <gb.h>
UBYTE waitpad(UBYTE mask);

戻り値

ジョイパッドの走査値。joypad関数参照。

説明

maskで指定したジョイパッドのキー・ボタンが押下されるまで待つ。

関連項目

joypad, waitpadup

▼ジョイパッド リリース待ち

構文

#include <gb.h>
UBYTE waitpadup(void);

戻り値

なし。

説明

ジョイパッドのキー・ボタンが離されるまで待つ。関数呼び出し前に押されていなければ、すぐに戻る。

関連項目
joypad, waitpad

■使用例:


#include <stdio.h>
#include <gb.h>

void main()
{
 int i;
 char s[8];
 
 printf("Push Start button!\n");
 
 // Startボタンの入力待ち
 waitpad(J_START);
 
 while(TRUE){
   // ジョイパッド入力
   i = joypad();
   
   // 入力判断
   if (i & J_UP   ) { s[0] = 'U'; } else { s[0] = '-'; }
   if (i & J_DOWN ) { s[1] = 'D'; } else { s[1] = '-'; }
   if (i & J_LEFT ) { s[2] = 'L'; } else { s[2] = '-'; }
   if (i & J_RIGHT) { s[3] = 'R'; } else { s[3] = '-'; }
   s[4] = '/';
   if (i & J_A    ) { s[5] = 'A'; } else { s[5] = '-'; }
   if (i & J_B    ) { s[6] = 'B'; } else { s[6] = '-'; }
   s[7] = NULL;
   
   // 判定結果を表示
   printf("%s\n", s);
   
   // Selectボタンが押されていれば、離されるまで待機
   if (i & J_SELECT) waitpadup();   
 } 
}
最終更新:2017年08月28日 17:42