サンプルソース
#include <pspdebug.h>
PSP_MODULE_INFO("TEST",0,1,1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
int end_flag = 0;
int exit_callback(int arg1,int arg2,void *common)
{
end_flag = 1;
return 0;
}
int CallbackThread(SceSize args,void *argp)
{
int cbid = sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int setupCallbacks(void)
{
int thid = 0;
thid = sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid >= 0)
sceKernelStartThread(thid,0,0);
return thid;
}
int main(int argc,char *argv[])
{
setupCallbacks();
pspDebugScreenInit();
while(!end_flag)
{
pspDebugScreenSetXY(0,0);
pspDebugScreenPrintf("Hello world\n");
}
sceKernelExitGame();
return 0;
}
解説etc...
include
#include <pspkernel.h>
#include <pspdebug.h>
pspDebug〜系の関数を使うために必要なライブラリをインクルードしています。
マクロ
PSP_MODULE_INFO("TEST",0,1,1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_MODULE_INFOはこれを忘れるとエラい事になってしまう超重要マクロです。
第一引数はモジュールの名前です。好きなもので結構です。
第二引数は実行モードに関しての値です。
0はユーザーモード(文字表示やその他全般)で、
0x1000はカーネルモード(NANDやFlash領域にアクセス)でモジュールを実行させます。
第三、第四引数はモジュールのバージョンとかなのでそのままで結構です。
PSP_MAIN_THREAD_ATTRは、メインスレッド(main関数を実行するスレッド)の属性を設定し、THREAD_ATTR_USERはユーザーモードでの実行を指定しています。
HOMEボタン監視
int end_flag = 0;
int exit_callback(int arg1,int arg2,void *common)
{
end_flag = 1;
return 0;
}
int CallbackThread(SceSize args,void *argp)
{
int cbid = sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
sceKernelRegisterExitCallback(cbid);
sceKernelSleepThreadCB();
return 0;
}
int setupCallbacks(void)
{
int thid = 0;
thid = sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
if(thid >= 0)
sceKernelStartThread(thid,0,0);
return thid;
}
pspにはhomeボタンというのがあります。
このボタンは簡単な処理で割り込みを有効にできて
ソフトを終了できるようになっています。
終了ボタンを押して呼び出される関数を指定できます。
それで実際にsceKernelExitGame();が呼び出されると
xmbに戻ります。
実際にはメインスレッドで新しいスレッドを作って
そのスレッドをhomeボタン割り込み専用スレッドにして
割り込み待ちにしておきます。
main関数
setupCallbacks();
上記のHOMEボタン監視スレッドを呼び出す為の関数です。
pspDebugScreenInit();
デバッグ画面を初期化する関数です。デバック関係の処理をする前は必ず呼んだ方が良い関数です。
while(!end_flag)
これはHOMEボタンで表示したメニューでゲームを終了するまでずっとwhile構文内の命令を繰り返す命令です。
pspDebugScreenSetXY(0,0);
デバッグ表示位置を指定する関数です。第一引数はX座標を、第二引数はY座標を指定しています。
pspDebugScreenPrintf("Hello, world!");
画面に文字を表示する関数です。printf関数と使い方は基本同じです。ですが日本語のような2バイト文字は文字化けするので使えません。
sceKernelExitGame();
プログラムを終了しXMBに戻る関数です。
他のサンプルではコールバック関数で、sceKernelExitGame();呼んでるのが多いです。
最終更新:2009年04月25日 01:29