//Subroutine sceUmd_18E225C8 - Address 0x00000E38 - Aliases: sceUmdUser_6AF9B50A s32 sceUmdCancelWaitDriveStat(void) { s32 oldK1; SceUID eventId; s32 driveState; s32 status; eventId = sceUmdGetUserEventFlagId(); oldK1 = pspShiftK1(); driveState = sceUmdGetDriveStatus(); status = sceKernelCancelEventFlag(eventId, driveState, NULL); pspSetK1(oldK1); return status; }
int main(int argc, char *argv[]) { SceCtrlData pad; int result; int oldButtons = 0; pspDebugScreenInit(); if (argc > 0) { printf("Bootpath: %s\n", argv[0]); } printf("Triangle - Exit\n"); printf("Square - Set lower 16-bits\n"); printf("Circle - Clear lower 16-bits\n"); printf("Cross - Delay + refer status\n"); printf("R-Trigger - Cancel event flag\n\n"); printf("L-Trigger - Delete event flag\n\n"); SetupCallbacks(); sceCtrlSetSamplingCycle(0); sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); evid = sceKernelCreateEventFlag("test_ef", PSP_EVENT_WAITMULTIPLE, INITIAL_PATTERN, 0); //evid = sceKernelCreateEventFlag("test_ef", 0, INITIAL_PATTERN, 0); printf("EVID: %08x pattern %08x\n", evid, INITIAL_PATTERN); if (evid >= 0) { createStartThread("and", and_thread); createStartThread("or", or_thread); createStartThread("clear", clear_thread); #if 0 // testing context switch timing sceKernelSetEventFlag(evid, 0x0000FFFF); //int buf[64]; for(;;) sceCtrlReadLatch(buf); // sceCtrlReadLatch does not context switch for(;;) sceKernelDelayThread(0); // does not wait forever #else while(!done) { sceCtrlReadBufferPositive(&pad, 1); // context switch in here int buttonDown = (oldButtons ^ pad.Buttons) & pad.Buttons; if (buttonDown & PSP_CTRL_SQUARE) { result = sceKernelSetEventFlag(evid, 0x0000FFFF); printf("\nsceKernelSetEventFlag result %08x\n", result); printSceKernelEventFlagInfo(evid); } if (buttonDown & PSP_CTRL_CIRCLE) { //result = sceKernelClearEventFlag(evid, 0x0000FFFF); // bits to clear - bad result = sceKernelClearEventFlag(evid, 0xFFFF0000); // bits to keep - ok printf("\nsceKernelClearEventFlag result %08x\n", result); printSceKernelEventFlagInfo(evid); } if (buttonDown & PSP_CTRL_CROSS) { printf("\nsceKernelDelayThreadCB ...\n"); sceKernelDelayThreadCB(1000); printSceKernelEventFlagInfo(evid); } if (buttonDown & PSP_CTRL_RTRIGGER) { //result = sceKernelCancelEventFlag(evid, newPattern, addr); result = sceKernelCancelEventFlag(evid, INITIAL_PATTERN, 0); printf("sceKernelCancelEventFlag result %08x\n", result); printSceKernelEventFlagInfo(evid); } if (buttonDown & PSP_CTRL_LTRIGGER) { //result = sceKernelCancelEventFlag(evid, newPattern, addr); result = sceKernelDeleteEventFlag(evid); printf("sceKernelDeleteEventFlag result %08x\n", result); evid = 0; } if (buttonDown & PSP_CTRL_TRIANGLE) done = 1; oldButtons = pad.Buttons; //sceKernelDelayThread(0); // ok, not infinite :) } #endif } else { printf("sceKernelCreateEventFlag failed %08x\n", evid); sceKernelSleepThreadCB(); } sceKernelExitGame(); return 0; }