Ejemplo n.º 1
0
        public virtual void execute()
        {
            ThreadManForUser timerManager = Modules.ThreadManForUserModule;

            int vtimerInterruptResult = Emulator.Processor.cpu._v0;

            //if (log.DebugEnabled)
            {
                Console.WriteLine("VTimer returned value " + vtimerInterruptResult);
            }

            if (vtimerInterruptResult == 0)
            {
                // VTimer is canceled
                timerManager.cancelVTimer(sceKernelVTimerInfo);
            }
            else
            {
                timerManager.rescheduleVTimer(sceKernelVTimerInfo, vtimerInterruptResult);
            }
        }
Ejemplo n.º 2
0
        public virtual void execute()
        {
            ThreadManForUser timerManager = Modules.ThreadManForUserModule;

            int alarmInterruptResult = Emulator.Processor.cpu._v0;

            if (Modules.log.DebugEnabled)
            {
                Modules.Console.WriteLine("Alarm returned value " + alarmInterruptResult);
            }

            if (alarmInterruptResult == 0)
            {
                // Alarm is canceled
                timerManager.cancelAlarm(sceKernelAlarmInfo);
            }
            else
            {
                timerManager.rescheduleAlarm(sceKernelAlarmInfo, alarmInterruptResult);
            }
        }
Ejemplo n.º 3
0
        public override int ioDevctl(string deviceName, int command, TPointer inputPointer, int inputLength, TPointer outputPointer, int outputLength)
        {
            int result;

            switch (command)
            {
            // Check the MemoryStick's driver status (mscmhc0).
            case 0x02025801:
            {
                Console.WriteLine("ioDevctl check ms driver status");
                if (outputPointer.AddressGood)
                {
                    // 0 = Driver busy.
                    // 1 = Driver ready.
                    // 4 = ???
                    outputPointer.setValue32(4);
                    result = 0;
                }
                else
                {
                    result = IO_ERROR;
                }
                break;
            }

            // Register MemoryStick's insert/eject callback (mscmhc0).
            case 0x02015804:
            {
                Console.WriteLine("ioDevctl register memorystick insert/eject callback (mscmhc0)");
                ThreadManForUser threadMan = Modules.ThreadManForUserModule;
                if (inputPointer.AddressGood && inputLength == 4)
                {
                    int       cbid         = inputPointer.getValue32();
                    const int callbackType = SceKernelThreadInfo.THREAD_CALLBACK_MEMORYSTICK;
                    if (threadMan.hleKernelRegisterCallback(callbackType, cbid))
                    {
                        // Trigger the registered callback immediately.
                        threadMan.hleKernelNotifyCallback(callbackType, cbid, MemoryStick.StateMs);
                        result = 0;                                 // Success.
                    }
                    else
                    {
                        result = SceKernelErrors.ERROR_MEMSTICK_DEVCTL_TOO_MANY_CALLBACKS;
                    }
                }
                else
                {
                    result = ERROR_MEMSTICK_DEVCTL_BAD_PARAMS;
                }
                break;
            }

            // Unregister MemoryStick's insert/eject callback (mscmhc0).
            case 0x02015805:
            {
                Console.WriteLine("ioDevctl unregister memorystick insert/eject callback (mscmhc0)");
                ThreadManForUser threadMan = Modules.ThreadManForUserModule;
                if (inputPointer.AddressGood && inputLength == 4)
                {
                    int cbid = inputPointer.getValue32();
                    if (threadMan.hleKernelUnRegisterCallback(SceKernelThreadInfo.THREAD_CALLBACK_MEMORYSTICK, cbid))
                    {
                        result = 0;                                 // Success.
                    }
                    else
                    {
                        result = ERROR_MEMSTICK_DEVCTL_BAD_PARAMS;                                 // No such callback.
                    }
                }
                else
                {
                    result = ERROR_MEMSTICK_DEVCTL_BAD_PARAMS;
                }
                break;
            }

            // Check if the device is inserted (mscmhc0).
            case 0x02025806:
            {
                Console.WriteLine("ioDevctl check ms inserted (mscmhc0)");
                if (outputPointer.AddressGood && outputLength >= 4)
                {
                    // 0 = Not inserted.
                    // 1 = Inserted.
                    outputPointer.setValue32(1);
                    result = 0;
                }
                else
                {
                    result = ERROR_MEMSTICK_DEVCTL_BAD_PARAMS;
                }
                break;
            }

            default:
                result = base.ioDevctl(deviceName, command, inputPointer, inputLength, outputPointer, outputLength);
                break;
            }

            return(result);
        }