Example #1
0
        public int ExecuteQueued(CpuThreadState cpuThreadState, bool mustReschedule)
        {
            var executedCount = 0;

            //Console.WriteLine("ExecuteQueued");
            if (!HasScheduledCallbacks)
            {
                return(executedCount);
            }
            //Console.WriteLine("ExecuteQueued.HasScheduledCallbacks!");
            //Console.Error.WriteLine("STARTED CALLBACKS");
            while (HasScheduledCallbacks)
            {
                var hleCallback = DequeueScheduledCallback();

                /*
                 *  var FakeCpuThreadState = new CpuThreadState(CpuProcessor);
                 *  FakeCpuThreadState.CopyRegistersFrom(CpuThreadState);
                 *  HleCallback.SetArgumentsToCpuThreadState(FakeCpuThreadState);
                 *
                 *  if (FakeCpuThreadState.PC == 0x88040E0) FakeCpuThreadState.PC = 0x880416C;
                 */
                //Console.WriteLine("ExecuteCallback: PC=0x{0:X}", FakeCpuThreadState.PC);
                //Console.WriteLine("               : A0=0x{0:X}", FakeCpuThreadState.GPR[4]);
                //Console.WriteLine("               : A1=0x{0:X}", FakeCpuThreadState.GPR[5]);
                try
                {
                    _hleInterop.ExecuteFunctionNow(hleCallback.Function, hleCallback.Arguments);
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine(e);
                }
                finally
                {
                    //Console.WriteLine("               : PC=0x{0:X}", FakeCpuThreadState.PC);
                    executedCount++;
                }

                //Console.Error.WriteLine("  CALLBACK ENDED : " + HleCallback);
                if (mustReschedule)
                {
                    //Console.Error.WriteLine("    RESCHEDULE");
                    break;
                }
            }

            executedCount += _hleInterop.ExecuteAllQueuedFunctionsNow();
            //Console.Error.WriteLine("ENDED CALLBACKS");

            return(executedCount);
        }
Example #2
0
        private void ExecuteQueuedCallbacks()
        {
#if !DISABLE_CALLBACKS
            bool HasScheduledCallbacks = HleCallbackManager.HasScheduledCallbacks;
            bool HasQueuedFunctions    = HleInterop.HasQueuedFunctions;

            if (HasScheduledCallbacks || HasQueuedFunctions)
            {
                var Thread = FindCallbackHandlerWithHighestPriority();
                if (Thread != null)
                {
                    if (HasScheduledCallbacks)
                    {
                        HleCallbackManager.ExecuteQueued(Thread.CpuThreadState, true);
                    }
                    if (HasQueuedFunctions)
                    {
                        HleInterop.ExecuteAllQueuedFunctionsNow();
                    }
                }
            }
#endif
        }