internal void ExecuteSubroutine(CpuThread thread, long position) { if (Interlocked.Increment(ref _threadCount) == 1) { _backgroundTranslator = new Thread(TranslateQueuedSubs); _backgroundTranslator.Start(); } ExecuteSubroutine(thread.ThreadState, position); if (Interlocked.Decrement(ref _threadCount) == 0) { _queue.ForceSignal(); } }
public void Execute(ARMeilleure.State.IExecutionContext ctx, ulong address) { CpuThreadState state = (CpuThreadState)ctx; long position = (long)address; if (Interlocked.Increment(ref _threadCount) == 1) { _backgroundTranslator = new Thread(TranslateQueuedSubs); _backgroundTranslator.Start(); } state.CurrentTranslator = this; do { if (EnableCpuTrace) { CpuTrace?.Invoke(this, new CpuTraceEventArgs(position)); } if (!_cache.TryGetSubroutine(position, out TranslatedSub sub)) { sub = TranslateLowCq(position, state.GetExecutionMode()); } position = sub.Execute(state, _memory); }while (position != 0 && state.Running); state.CurrentTranslator = null; if (Interlocked.Decrement(ref _threadCount) == 0) { _queue.ForceSignal(); } }