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(); }
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(); } }
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"); }
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 } }
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 } }