int sceKernelSysEventDispatch(int ev_type_mask, int ev_id, char* ev_name, void* param, int* result, int break_nonzero, SceSysEventHandler **break_handler) { int oldGp = pspGetGp(); int ret = 0; int oldIntr = suspendIntr(); SceSysEventHandler *cur = g_sysEvHandlers; // C928 while (cur != NULL) { if ((cur->type_mask & ev_type_mask) != 0) { // C984 cur->busy = 1; resumeIntr(oldIntr); pspSetGp(cur->gp); ret = cur->handler(ev_id, ev_name, param, result); oldIntr = suspendIntr(); cur->busy = 0; if (ret < 0 && break_nonzero != 0) { // C9D8 if (break_handler != NULL) *break_handler = cur; break; } ret = 0; } // C934 cur = cur->next; } // C940 resumeIntr(oldIntr); pspSetGp(oldGp); return ret; }
//67b4 int sceKernelSysEventDispatch(int ev_type_mask, int ev_id, char *ev_name, void *param, int *result, int break_nonzero, PspSysEventHandler *break_handler) { int ret; SceSysEventHandler *handler; // fp = gp; int intr = sceKernelCpuSuspendIntr(); for(handler = sys_event_handlers; handler; handler = handler->next) { if(handler->typemask & unk_a0) { //687c handler->busy = 1; sceKernelCpuResumeIntr(intr); // v0 = gp; // gp = s0->r28; ret = handler->handler(unk_a1, unk_a2, unk_a3, unk_t0); intr = sceKernelCpuSuspendIntr(); handler->busy = 0; if((ret >> 31) & (0 < unk_t1)) { //68d0 if(unk_t2 != 0) { unk_t2->unk_0 = s0; } break; } ret = 0; } }