Tutorial.6 キー入力とデバッグ †キー入力 †ボタンの入力はI/Oレジスタの0x4000130、0x4000131の値で判定します。 下位のビットから順番に、Aボタン、Bボタン、セレクトボタン、スタートボタン、
ビットが立っている時は押されていない状態、ビットが立っていない時は押されている状態です。 取得方法 †キー入力を取得するには、メインループ中で毎回状態をチェックするか、 今回は簡単な前者の方法を使ってみましょう。以下のマクロを用意します。 #define REG_KEYINPUT *(vu16*)(REG_BASE + 0x130) // Key Input typedef enum KEYPAD_BITS { KEY_A = (1<<0), /*!< keypad A button */ KEY_B = (1<<1), /*!< keypad B button */ KEY_SELECT = (1<<2), /*!< keypad SELECT button */ KEY_START = (1<<3), /*!< keypad START button */ KEY_RIGHT = (1<<4), /*!< dpad RIGHT */ KEY_LEFT = (1<<5), /*!< dpad LEFT */ KEY_UP = (1<<6), /*!< dpad UP */ KEY_DOWN = (1<<7), /*!< dpad DOWN */ KEY_R = (1<<8), /*!< Right shoulder button */ KEY_L = (1<<9), /*!< Left shoulder button */ KEYIRQ_ENABLE = (1<<14), /*!< Enable keypad interrupt */ KEYIRQ_OR = (0<<15), /*!< interrupt logical OR mode */ KEYIRQ_AND = (1<<15), /*!< interrupt logical AND mode */ DPAD = (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT) /*!< mask all dpad buttons */ } KEYPAD_BITS; デバッグ小話 †入力の説明が簡単すぎたので別の話をさせてもらいます。 GBAは、REG_DISPCNTなどのメモリに設定を行い、 もう少し短めにいうと、決められた設定を行い、決められたデータを配置する、というのが ここではプログラマーの意図した結果になっているか?という確認方法を Tools -> Memory viewer †エミュレータのMemory viewerです。Toolsからぶら下がっているものは gritの出力結果 †gritのオプションを間違うことはよくあることです。 printfデバッグ †使い方は以下のとおりです。 u32 x = 1234; TRACEOUT("%d %x\n", x, x); 出力結果はエミュレータのTools->Loggingで確認できます。 ところで、そろそろ標準ライブラリは使えないのかと疑問に思う方も出てくると思います。 #include <stdio.h> というように山括弧を使えばできますが、入出力関係の関数は全滅です。 OSないってなんて不便なんや、と文句いいたくなりますね。 #include <math.h> ただ標準ライブラリは全部カードリッジ領域固定なのでスピードが出ません。 キー入力の例 †今回のまとめです。 #include "lib/gba.h" //--------------------------------------------------------------------------- void WaitForVsync(void) { while(*(vu16*)0x4000006 >= 160) {}; while(*(vu16*)0x4000006 < 160) {}; } //--------------------------------------------------------------------------- int main(void) { // モード設定なし u32 x = 1234; for(;;) { WaitForVsync(); if( !(REG_KEYINPUT & KEY_UP) ) TRACEOUT("上 ボタン\n"); if( !(REG_KEYINPUT & KEY_DOWN)) TRACEOUT("下 ボタン\n"); if( !(REG_KEYINPUT & KEY_A) ) TRACEOUT("10進=%d 16進4桁=0x%04x \n", x, x, x); if( !(REG_KEYINPUT & KEY_B) ) x++; } } デバッグ画面 †![]() 動作画面は省略しました。 履歴 †
|