Nanashi-soft○プログラマ専用○PSPでプログラミング○
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ボタンが使えるようにはなりません。