예제 #1
0
파일: gettime.c 프로젝트: jetlive/xynth
int usleep(useconds_t usec)
{
	unsigned long delay;
	delay = MIN(usec, 0xffffffffUL);
	sceKernelDelayThreadCB(delay);
	return 0;
}
예제 #2
0
void SDL_Delay(Uint32 ms)
{
    const Uint32 max_delay = 0xffffffffUL / 1000;
    if(ms > max_delay)
        ms = max_delay;
    sceKernelDelayThreadCB(ms * 1000);
}
예제 #3
0
	virtual int hit(int arg1, int arg2) {
		checkpoint("  Callback hit %08x, %08x, returning %08x", arg1, arg2, ret_);
		if (!done_) {
			done_ = true;
			checkpoint("  Notifying self within callback: %08x", sceKernelNotifyCallback(cb_, 0xABCD));
			checkpoint("  sceKernelDelayThreadCB within callback: %08x", sceKernelDelayThreadCB(1000));
		}
		return ret_;
	}
예제 #4
0
void System::msleep(int msecs)
{
	if (msecs < 0)
		return;
#ifdef __PSP__
	sceKernelDelayThreadCB(msecs*1000);
#elif defined(__AROS__)
	// usleep is not implemented on AROS
	sleep(msecs < 1000 ? 1 : msecs/1000);
#else
	usleep(msecs*1000);
#endif
}
예제 #5
0
파일: main.c 프로젝트: joshdekock/jim-psp
int main_thread(SceSize args, void *argp)
{
    FILE *fp;
    int argc = 1;
    char *argv[] = {save_argv0};

#ifdef WITH_PSP2D
    sceGuInit();
#endif

    Py_Initialize();

    PySys_SetPath("ms0:/python");
    PySys_SetArgv(argc, argv);

    fp = fopen("script.py", "r");
    if (fp)
    {
       PyRun_SimpleFile(fp, "script.py");
       fclose(fp);
    }
    else
    {
#ifndef DEBUG
       pspDebugScreenInit();
#endif

       pspDebugScreenPrintf("Error - could not open script.py\n");
    }

#ifdef DEBUG
    sceKernelDelayThreadCB(1e7);
#endif

    Py_Finalize();

#ifdef WITH_PSP2D
    sceGuTerm();
#endif

    sceKernelExitGame();

    return 0;
}
예제 #6
0
/* psp_timer_thread:
 *  This PSP thread measures the elapsed time.
 */
static int psp_timer_thread()
{
   uint64_t old_tick, new_tick;
   int interval;
   long delay;

   sceRtcGetCurrentTick(&old_tick);

   while (psp_timer_on) {
      /* Calculate actual time elapsed. */
      sceRtcGetCurrentTick(&new_tick);
      interval = PSPTIMER_TO_TIMER(new_tick - old_tick);
      old_tick = new_tick;

      /* Handle a tick and rest. */
      delay = _handle_timer_tick(interval);
      sceKernelDelayThreadCB(TIMER_TO_USEC(delay));
   }
   
   sceKernelExitThread(0);

   return 0;
}
예제 #7
0
void myexit() {
	printf("Returning to XMB...");
	sceKernelDelayThreadCB(3000000);
	sceKernelExitGame();
}
예제 #8
0
파일: main.c 프로젝트: DeadRoolz/jpcsp
int main(int argc, char *argv[])
{
    SceCtrlData pad;
    int result;
    int oldButtons = 0;
    int cbid = -1;
    int waitStatThid = -1;

    pspDebugScreenInit();
    if (argc > 0) {
        printf("Bootpath: %s\n", argv[0]);
    }

    printf("Triangle - Exit\n");
    printf("Left - sceUmdActivate\n");
    printf("Right - sceUmdDeactivate\n");
    printf("Cross - Delay CB\n");
    printf("Circle - Display umd info\n");
    printf("Square - Refer umd callback\n");
    printf("L-Trigger - IO test\n");
    printf("R-Trigger - Start/Stop wait stat test\n");

    SetupCallbacks();

    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);

    {
        printUmdInfo();

        // result:
        // callback events are generated if we launch from iso or immediately after psplink has reset
        cbid = sceKernelCreateCallback("UMD Callback (not active)", umd_callback, (void*)0x34343434);
        result = sceUmdRegisterUMDCallBack(cbid);
        printf("sceUmdRegisterUMDCallBack result %08X\n", result);

		// Register a second UMD callback: it will overwrite the first one.
		cbid = sceKernelCreateCallback("UMD Callback", umd_callback, (void*)0x11111111);
		result = sceUmdRegisterUMDCallBack(cbid);
        printf("sceUmdRegisterUMDCallBack result %08X\n", result);
    }

    while (!done)
    {
        sceCtrlReadBufferPositive(&pad, 1); // context switch in here
        //sceCtrlPeekBufferPositive(&pad, 1); // no context switch version
        int buttonDown = (oldButtons ^ pad.Buttons) & pad.Buttons;

        if (buttonDown & PSP_CTRL_LEFT)
        {
            result = sceUmdActivate(1, "disc0:");
            printf("sceUmdActivate result %08x\n", result);
        }

        if (buttonDown & PSP_CTRL_RIGHT)
        {
            result = sceUmdDeactivate(1, "disc0:");
            printf("sceUmdDeactivate result %08x\n", result);
        }

        if (buttonDown & PSP_CTRL_CROSS)
        {
            printf("sceKernelDelayThreadCB ...\n");
            sceKernelDelayThreadCB(10000);
        }

        if (buttonDown & PSP_CTRL_CIRCLE)
        {
            printUmdInfo();
        }

        if (buttonDown & PSP_CTRL_SQUARE)
        {
            SceKernelCallbackInfo info;
            memset(&info, 0xee, sizeof(info));
            info.size = sizeof(info);
            result = sceKernelReferCallbackStatus(cbid, &info);
            printf("sceKernelReferCallbackStatus result %08x\n", result);
            printf("  size %d (%d)\n", info.size, sizeof(info));
            printf("  name '%s'\n", info.name);
            printf("  threadId %08x (%08x)\n", info.threadId, sceKernelGetThreadId());
            printf("  callback %p common %p\n", info.callback, info.common);
            printf("  notifyCount %08x\n", info.notifyCount);
            printf("  notifyArg %08x\n", info.notifyArg);
        }

        if (buttonDown & PSP_CTRL_LTRIGGER)
        {
            test_io();
        }

        if (buttonDown & PSP_CTRL_RTRIGGER)
        {
            if (waitStatThid >= 0)
            {
                printf("Cleaning up wait stat test ...\n");

                referThread(waitStatThid);

                result = sceUmdCancelWaitDriveStat();
                printf("sceUmdCancelWaitDriveStat result %08x\n", result);

                referThread(waitStatThid);

                result = sceKernelDeleteThread(waitStatThid);
                printf("sceKernelDeleteThread result %08x\n", result);

                //result = sceKernelTerminateDeleteThread(waitStatThid);
                //printf("sceKernelTerminateDeleteThread result %08x\n", result);

                waitStatThid = -1;
            }
            else
            {
                printf("Starting wait stat test ...\n");

                // test timeout:
                // Press Right (deactivate UMD)
                // Press R-Trigger:
                // - Press R-Trigger again before 3 seconds:
                //   0x800201a9 wait cancelled
                // - Or wait 3 seconds:
                //   0x800201a8 wait timeout
                struct WaitStatParams params = { 0x20, 3000000 };

                // test internal workings:
                // - (wantStat & curStat) == wantStat
                // - (wantStat & curStat) != 0 <-- looks like this is the correct one
                //struct WaitStatParams params = { 0xFF, 3000000 };

                waitStatThid = sceKernelCreateThread("WaitUMDStat", waitstat_thread, 0x20, 0x4000, 0, 0);
                printf("sceKernelCreateThread result %08x\n", waitStatThid);
                if (waitStatThid >= 0)
                {
                    result = sceKernelStartThread(waitStatThid, sizeof(params), &params);
                    printf("sceKernelStartThread result %08x\n", result);
                }
            }
        }

        if (buttonDown & PSP_CTRL_TRIANGLE)
            done = 1;

        oldButtons = pad.Buttons;
        sceDisplayWaitVblank(); // only catch callback when we press Cross (sceKernelDelayThreadCB)
        //sceDisplayWaitVblankCB(); // catch all callback events
    }

    sceKernelExitGame();
    return 0;
}
예제 #9
0
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;
}
예제 #10
0
extern "C" int main(int argc, char *argv[]) {
	Callback cb("notify", &cbFunc, NULL);

	checkpointNext("Objects:");
	testNotify("  Normal", cb, 0x1337);
	testNotify("  NULL", 0, 0x1337);
	testNotify("  Invalid", 0xDEADBEEF, 0x1337);
	cb.Delete();
	testNotify("  Deleted", cb, 0x1337);

	cb.Create("notify", &cbFunc, NULL);
	checkpointNext("Values:");
	testNotify("  Zero", cb, 0);
	testNotify("  DEADBEEF", cb, 0xDEADBEEF);

	checkpointNext("Notifies:");
	int result = 0;
	for (int i = 0; i < 10000; ++i) {
		result = sceKernelNotifyCallback(cb, 1);
		if (result != 0) {
			checkpoint("  Failed at %d: %08x", i, result);
			break;
		}
	}
	if (result == 0) {
		checkpoint("  10000 notifies: OK");
	}

	checkpoint("sceKernelDelayThreadCB: %08x", sceKernelDelayThreadCB(1000));

	checkpointNext("Different thread:");
	{
		CallbackSleeper waiter1("better priority sleeping thread", 0x10);
		CallbackSleeper waiter2("worse priority sleeping thread", 0x30);
		sceKernelDelayThread(1000);
		sceKernelNotifyCallback(waiter1.callbackID(), 0x1337);
		sceKernelNotifyCallback(waiter2.callbackID(), 0x1337);
		sceKernelDelayThread(1000);
	}

	checkpointNext("Return value:");
	{
		CallbackSleeper waiter("sleeping thread");
		waiter.setReturn(0x1337);
		sceKernelDelayThread(1000);
		testNotify("  Notify #1", waiter.callbackID(), 0x1337);
		sceKernelDelayThread(1000);
		testNotify("  Notify #2", waiter.callbackID(), 0x1337);
		sceKernelDelayThread(1000);
	}

	checkpointNext("Recursion:");
	{
		SelfNotifier waiter("sleeping thread");
		sceKernelDelayThread(1000);
		testNotify("  Notify #1", waiter.callbackID(), 0x1337);
		sceKernelDelayThread(1000);
	}

	checkpointNext("Mixing types:");
	checkpoint("  scePowerRegisterCallback (causes notify): %08x", scePowerRegisterCallback(0, cb));
	testNotify("  Manual notify", cb, 0x1337);
	checkpoint("  sceKernelDelayThreadCB: %08x", sceKernelDelayThreadCB(1000));

	checkpointNext("Order:");
	Callback cb1("notify1", &cbFunc, (void *)0xABC00001);
	Callback cb2("notify2", &cbFunc, (void *)0xABC00002);
	Callback cb3("notify3", &cbFunc, (void *)0xABC00003);
	testNotify("  Notify cb #2", cb2, 0xDEF00001);
	testNotify("  Notify cb #1", cb1, 0xDEF00002);
	testNotify("  Notify cb #3", cb3, 0xDEF00003);
	checkpoint("  sceKernelCheckCallback: %08x", sceKernelCheckCallback());

	return 0;
}