Nanashi-softプログラマ専用PSPでプログラミング


◇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;
		}
	}
}



TOPプログラマ専用PSPでプログラミング