There is, as far as i know, only one way. You have to use sceCtrlPeekBufferPositive to wait for some key to "activate" your program. if it activates you start using sceCtrlReadBufferPositive. The only problem with this is that while your progam is active, your xmb stops redrawing
this is my (simplified) code:
void show(){
while (1){
SceCtrlData pad;
sceCtrlReadBufferPositive(&pad, 1);
if(pad.Buttons & PSP_CTRL_CIRCLE) break;
}
}
int main(void){
SceCtrlData pad;
while(1){
sceCtrlPeekBufferPositive(&pad, 1);
if (pad.Buttons & PSP_CTRL_SQUARE){
show();
}
sceKernelDelayThread(2);
}
}