プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

GBAのキー割り込み


GBAは様々な割り込みを簡単に扱うことができる。
キーパッド入力も通常はレジスタを読むだけで状態を調べることができるが、これを割り込みに変えることもできる。


*(u32 *)0x03007ffc = IntHdr; // Set interrupt handler address
*(u16 *)0x04000132 = 0x43ff; // Key interrupt control
*(u16 *)0x04000200 = 0x1000; // Interrupt enable
*(u16 *)0x04000208 = 0x0001; // Master interrupt enable

こうするとキーを押した時、Inthdr() が呼ばれるようになる。
割り込みを発生させる条件には AND/OR 条件も使える。例えば A あるいは B が押された時、A と B が同時に押された時、という条件を加えることもできるなど、なかなかよく考えられている。


しかし、現実的にはこのキー割り込みはあまり使われず、直接キーパターンをレジスタから読みとる手法を取る場合が多いと思われる。
なせならば、このキー割り込みは以下のような制限があるからだ。

  • チャタリングが考慮されていない。一回のキー押下で複数の割り込みが上がってくる
  • キーを離した時の割り込みはない。

チャタリングがあるので、キーの状態は割り込みだけで判定することはできず、タイマーなどを併用しなければならない。
また、キーを離した時の割り込みがないので、キーを離した状態もやはりタイマー等で監視する必要がある。
FM-7でインベーダーの砲台移動を停止させるのに5キーを押す必要があるのと同じ、と言えば古い人は分かってくれるだろうか。(笑)
なので、この割り込みはスリープモードからの復帰ぐらいにしか使っていないのではないかと思われる。


とはいえ、きっとゲームではキーの割り込みはあまり必要ないのだろうなあ。
そういう要求があれば、長い歴史を持つゲームボーイシリーズなのだから、もっと使いやすくなってるはずだし。
ちなみにデジタルインベーダーではキー割り込みは必要ないので、ご安心を。:)