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


◇PSPでプログラミング-HOMEボタンでメニューに戻る-

HOMEボタンが解析されましたが、Cプログラミングだけでは出来ないようです。
サンプルのHello Worldの startup.sの _startから書き替える必要があり、素人ではどうにもなりません(;_;)
exit_pspsrc.ziptと言うサンプルがあるので、探してみて下さい。

●どういう仕組みなのか?
ソフト起動時に HOMEボタンを監視する用のスレッドを生成します。
システム的に 終了しますか? ダイアログが表示され、終了を選ぶと自動的にソフトが終了します。
無限ループ中でも関係なく終了できるので、こういう方式は便利ですね(セーブどうなるのか気になるが……)

●startupにスレッド記述を追記する
記述して下さい(ぉ
statup.sのソース内容は私には分らないので説明のしようが無いです。
ここでsceKernelCreateThread,sceKernelStartThread両APIを定義するみたいです。

●関数定義
もちろん定義の追加が必要です。
以下の2つを追加して下さい。

	STUB_START	"ThreadManForUser",0x40010000,0x50005
	STUB_FUNC	0x446D8DE6,sceKernelCreateThread
	STUB_FUNC	0xF475845D,sceKernelStartThread
	STUB_FUNC	0x9ACE131E,sceKernelSleepThread
	STUB_FUNC	0x82826F70,sceKernelPollCallbacks
	STUB_FUNC	0xE81CAF8F,sceKernelCreateCallback
	STUB_END

	STUB_START	"LoadExecForUser",0x40010000,0x20005
	STUB_FUNC	0x5572A5F,sceKernelExitGame
	STUB_FUNC	0x4AC57943,sceKernelRegisterExitCallback
	STUB_END

●終了画面呼出し関数
HOMEボタンが押された時に呼び出すシステムです。

int exit_callback(void)
{
	sceKernelExitGame();
	return 0;
}

●コールバック関数
HOMEボタンが押されたら〜と言うコールバックを生成する関数です。

int CallbackThread(void *arg)
{
	int cbid;
	cbid = sceKernelCreateCallback("Exit Callback", exit_callback);
	sceKernelRegisterExitCallback(cbid);
	sceKernelPollCallbacks();
	return 0;
}

●スレッドの生成
PSPのコールバックは常に監視し続けて他の事は行わない状態になります。
そこで、スレッドを生成して、コールバック用の子供を作成します。

int xmain(void)
{
	int thid = 0;

	thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
	if (thid >= 0)
	{
		sceKernelStartThread(thid, 0, 0);
	}
	else{
		sceKernelSleepThread();
		return 0;
	}

〜プログラム〜

スレッド呼出しを行うとプログラムが2つに分離するので、コールバックを待ち受ける側はすぐに眠らせておく必要があります。



PSPプログラムの動作をいまいち理解していませんので、説明が間違っている可能性があります。
とにかく、ここに書いた情報を元にサンプルを探し当てるのが早道でしょう。

念の為書いて置きますが、サンプルのHellow World付属の startup.sのままで上記ソースを追加しても HOMEボタンが使えるようにはなりません。



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