Inheritance: IDisposable
Example #1
0
        public void CpuThreadStateTest()
        {
            var HlePspThread = new HleThread(PspEmulatorContext, new CpuThreadState(Processor));

            MipsAssembler.Assemble(@"
            .code 0x08000000
                li r31, 0x08000000
                jal end
                nop
            end:
                addi r1, r1, 1
                jr r31
                nop
            ");

            HlePspThread.CpuThreadState.PC = 0x08000000;
            HlePspThread.Step();
        }
Example #2
0
        public void Execute(CpuThreadState FakeCpuThreadState)
        {
            var CpuProcessor = FakeCpuThreadState.CpuProcessor;
            if (CurrentFake == null)
            {
                CurrentFake = new HleThread(new CpuThreadState(CpuProcessor));
            }

            CurrentFake.CpuThreadState.CopyRegistersFrom(FakeCpuThreadState);
            //HleCallback.SetArgumentsToCpuThreadState(CurrentFake.CpuThreadState);

            //CurrentFake.CpuThreadState.PC = HleCallback.Function;
            CurrentFake.CpuThreadState.RA = HleEmulatorSpecialAddresses.CODE_PTR_FINALIZE_CALLBACK;
            //Current.CpuThreadState.RA = 0;

            CpuProcessor.RunningCallback = true;
            while (CpuProcessor.RunningCallback)
            {
                //Console.WriteLine("AAAAAAA {0:X}", CurrentFake.CpuThreadState.PC);
                CurrentFake.Step();
            }
        }
Example #3
0
        public void CpuThreadStateBugTest()
        {
            var HlePspThread = new HleThread(new CpuThreadState(Processor));

            MipsAssembler.Assemble(@"
            .code 0x08000000
                li r31, 0x08000000
                jal end
                nop
            end:
                jr r31
                nop
            ");

            HlePspThread.CpuThreadState.PC = 0x08000000;

            Assert.Inconclusive();

            Console.WriteLine("1");
            HlePspThread.Step();
            Console.WriteLine("2");
        }
Example #4
0
        public void Execute(CpuThreadState FakeCpuThreadState)
        {
            var CpuProcessor = FakeCpuThreadState.CpuProcessor;

            if (CurrentFake == null)
            {
                CurrentFake = new HleThread(new CpuThreadState(CpuProcessor));
            }

            CurrentFake.CpuThreadState.CopyRegistersFrom(FakeCpuThreadState);
            //HleCallback.SetArgumentsToCpuThreadState(CurrentFake.CpuThreadState);

            //CurrentFake.CpuThreadState.PC = HleCallback.Function;
            CurrentFake.CpuThreadState.RA = HleEmulatorSpecialAddresses.CODE_PTR_FINALIZE_CALLBACK;
            //Current.CpuThreadState.RA = 0;

            CpuProcessor.RunningCallback = true;
            while (CpuProcessor.RunningCallback)
            {
                //Console.WriteLine("AAAAAAA {0:X}", CurrentFake.CpuThreadState.PC);
                CurrentFake.Step();
            }
        }
Example #5
0
        public void ChangeWakeUpCount(int Increment, HleThread WakeupThread, bool HandleCallbacks = false)
        {
            var PreviousWakeupCount = Info.WakeupCount;

            Info.WakeupCount += Increment;
            var CurrentWakeupCount = Info.WakeupCount;

            /*
             * Console.Error.WriteLine(
             *      "{0} : ChangeWakeUpCount : {1} -> {2}",
             *      this, PreviousWakeupCount, CurrentWakeupCount
             * );
             */

            var ThreadToSleep = this;

            // Sleep if sleeping decrement.
            if (Increment < 0 && CurrentWakeupCount < 0)
            {
                ThreadToSleep.SetWaitAndPrepareWakeUp(HleThread.WaitType.None, "sceKernelSleepThread", WakeUpCallback =>
                {
                    ThreadToSleep.WakeUpCallback = () =>
                    {
                        WakeUpCallback();
                        WakeUpCallback = null;
                    };
                }, HandleCallbacks: HandleCallbacks);
            }
            // Awake
            else if (Increment > 0 && PreviousWakeupCount < 0 && CurrentWakeupCount >= 0)
            {
                Action[] WakeUpListCopy;
                lock (WakeUpList)
                {
                    WakeUpListCopy = WakeUpList.ToArray();
                    WakeUpList.Clear();
                }

                if (WakeUpCallback != null)
                {
                    WakeUpCallback();
                }
                else
                {
                    Console.Error.WriteLine("Unexpected!");
                }

                foreach (var WakeUp in WakeUpListCopy)
                {
                    WakeUp();
                }
            }

            if (Increment > 0)
            {
                //return;
                Console.Error.WriteLine("Increment > 0 - Wakeup");

                WakeupThread.SetWaitAndPrepareWakeUp(WaitType.None, "sceKernelWakeupThread", WakeUpCallback =>
                {
                    lock (WakeUpList)
                    {
                        WakeUpList.Add(() =>
                        {
                            WakeUpCallback();
                        });
                    }
                }, HandleCallbacks: HandleCallbacks);
                //WakeUpList.Add
            }
        }
Example #6
0
        public void ChangeWakeUpCount(int Increment, HleThread WakeupThread, bool HandleCallbacks = false)
        {
            var PreviousWakeupCount = Info.WakeupCount;
            Info.WakeupCount += Increment;
            var CurrentWakeupCount = Info.WakeupCount;

            /*
            Console.Error.WriteLine(
                "{0} : ChangeWakeUpCount : {1} -> {2}",
                this, PreviousWakeupCount, CurrentWakeupCount
            );
            */

            var ThreadToSleep = this;

            // Sleep if sleeping decrement.
            if (Increment < 0 && CurrentWakeupCount < 0)
            {
                ThreadToSleep.SetWaitAndPrepareWakeUp(HleThread.WaitType.None, "sceKernelSleepThread", null, WakeUpCallback =>
                {
                    ThreadToSleep.WakeUpCallback = () =>
                    {
                        WakeUpCallback();
                        WakeUpCallback = null;
                    };
                }, HandleCallbacks: HandleCallbacks);
            }
            // Awake
            else if (Increment > 0 && PreviousWakeupCount < 0 && CurrentWakeupCount >= 0)
            {
                Action[] WakeUpListCopy;
                lock (WakeUpList)
                {
                    WakeUpListCopy = WakeUpList.ToArray();
                    WakeUpList.Clear();
                }

                if (WakeUpCallback != null)
                {
                    WakeUpCallback();
                }
                else
                {
                    Console.Error.WriteLine("Unexpected!");
                }

                foreach (var WakeUp in WakeUpListCopy)
                {
                    WakeUp();
                }
            }

            if (Increment > 0)
            {
                /*
                return;
                Console.Error.WriteLine("Increment > 0 - Wakeup");

                WakeupThread.SetWaitAndPrepareWakeUp(WaitType.None, "sceKernelWakeupThread", WakeUpCallback =>
                {
                    lock (WakeUpList)
                    {
                        WakeUpList.Add(() =>
                        {
                            WakeUpCallback();
                        };
                    }
                }, HandleCallbacks: HandleCallbacks);
                */
                //WakeUpList.Add
            }
        }