Nanashi-soft○プログラマ専用○PSPでプログラミング○
現時点ではPS2パッドにあるボタンしか判明していない様子です。
●関数定義
関数そのものを定義する所から始めなければなりません。
サンプルのHello Worldの startup.sに定義を追記します。
ディスプレイモード用関数が定義されている STUB_START "sceDisplay"の次に追加。
と言っても、sceDisplayの中では無く、次の節にします。
こんな感じです。
STUB_START "sceDisplay",0x40010000,0x00030005 STUB_FUNC 0x0E20F177,pspDisplaySetMode STUB_FUNC 0x289D82FE,pspDisplaySetFrameBuf STUB_FUNC 0x984C27E7,pspDisplayWaitVblankStart STUB_END STUB_START "sceCtrl",0x40010000,0x00030005 STUB_FUNC 0x6a2774f3,CtrlInit STUB_FUNC 0x1f4011e6,CtrlSetAnalogMode STUB_FUNC 0x1f803938,CtrlRead STUB_END
●初期化方法
ボタン入力が必要になった時点で、
CtrlInit(0);
をして下さい。
●キー取得方法
CtrlRead(paddata, 1);
とする事で、paddataにキー値が入って来ます。
paddataは以下の構造体です。
typedef struct _ctrl_data
{
unsigned long frame;
unsigned long buttons;
unsigned char analog[4];
unsigned long unused;
} ctrl_data_t;
paddata.buttonsにボタンの状態が入ってきます。
ビットマスクになっており、以下の通りです。
先頭8bit
□,×,○,△
次の8bit
無し,無し,右トリガー,左トリガー
次の8bit
左,下,右,上
最後の8bit
START,無し,無し,SELECT
※現時点ではHOMEボタンを取得する方法が分かりません。
この関数を呼出しながらHOMEボタンを押しても、何も帰ってきませんでした。
●ソース ○ボタンを押したら画面を赤くする
//display
char *pg_vramtop=(char *)0x04000000;
#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 272
#define PIXELSIZE 1
#define LINESIZE 512
#define FRAMESIZE 0x44000
//botton
#define CTRL_SQUARE 0x8000
#define CTRL_CROSS 0x4000
#define CTRL_CIRCLE 0x2000
#define CTRL_TRIANGLE 0x1000
#define CTRL_RTRIGGER 0x0200
#define CTRL_LTRIGGER 0x0100
#define CTRL_LEFT 0x0080
#define CTRL_DOWN 0x0040
#define CTRL_RIGHT 0x0020
#define CTRL_UP 0x0010
#define CTRL_START 0x0008
#define CTRL_SELECT 0x0001
typedef struct _ctrl_data
{
unsigned long frame;
unsigned long buttons;
unsigned char analog[4];
unsigned long unused;
} ctrl_data_t;
int xmain(void)
{
ctrl_data_t paddata;
int col;
pspDisplaySetMode(0, SCREEN_WIDTH, SCREEN_HEIGHT);
pspDisplaySetFrameBuf(pg_vramtop, LINESIZE, PIXELSIZE, 1);
unsigned char *vptr0;
unsigned long i;
CtrlInit(0);
while (1) {
CtrlRead(paddata, 1);
if (paddata.buttons & CTRL_CIRCLE){
col = 0x001F;
}
else{
col = 0x7C00;
}
*(unsigned short *)(pg_vramtop) = 0xffff;
vptr0 = pg_vramtop + 0x40000000;
for (i=0; i<FRAMESIZE/2; i++) {
*(unsigned short *)vptr0 = col;
vptr0 += PIXELSIZE * 2;
}
}
}