public bool CheckExitCondition(Z80CPU cpu, Z80CPU.InternalState internalState, Z80CPU.LifecycleEventType eventType) { if (eventType == Z80CPU.LifecycleEventType.InstructionStart) { if (internalState.InstructionOrigin.Address == instructionAddress) { return(true); } } return(false); }
public bool CheckExitCondition(Z80CPU cpu, Z80CPU.InternalState internalState, Z80CPU.LifecycleEventType eventType) { if (eventType == Z80CPU.LifecycleEventType.InstructionEnd) { if (internalInstructionCounterInitialValue < 0) { internalInstructionCounterInitialValue = internalState.InstructionCounter - 1; } if (internalState.InstructionCounter == internalInstructionCounterInitialValue + instructionCount) { return(true); } } return(false); }
private void LogCPUState(Z80CPU.InternalState internalState, Z80CPU.LifecycleEventType eventType) { // First column : event type switch (eventType) { case Z80CPU.LifecycleEventType.HalfTState: log.Append("HT"); break; case Z80CPU.LifecycleEventType.InstructionEnd: log.Append("IE"); break; case Z80CPU.LifecycleEventType.InstructionStart: log.Append("IS"); break; case Z80CPU.LifecycleEventType.MachineCycleEnd: log.Append("ME"); break; case Z80CPU.LifecycleEventType.MachineCycleStart: log.Append("MS"); break; } log.Append(';'); // Internal state : instruction, machine cycle, TStates if (stateElementsToLog.HasFlag(CPUStateElements.InternalState)) { log.Append(internalState.InstructionCounter); log.Append(';'); if (internalState.InstructionOrigin.Source == InstructionSource.Memory) { log.Append(internalState.InstructionOrigin.Address); log.Append(';'); log.Append(internalState.InstructionOrigin.OpCode != null ? internalState.InstructionOrigin.OpCode.InstructionText : "?"); log.Append(';'); } else if (internalState.InstructionOrigin.Source == InstructionSource.Internal) { log.Append(""); // No address - internal log.Append(';'); log.Append(internalState.Instruction.Type.OpCodeName); log.Append(';'); } else if (internalState.InstructionOrigin.Source == InstructionSource.InterruptingDevice) { log.Append(""); // No address - device log.Append(';'); log.Append(internalState.InstructionOrigin.OpCode != null ? internalState.InstructionOrigin.OpCode.InstructionText : "?"); log.Append(';'); } log.Append(internalState.MachineCycleIndex); log.Append(';'); log.Append(internalState.MachineCycle != null ? internalState.MachineCycle.Type.ToString() : "?"); log.Append(';'); log.Append(internalState.HalfTStateIndex); log.Append(';'); log.Append(internalState.TStateCounter); log.Append(';'); } // Micro instructions if (stateElementsToLog.HasFlag(CPUStateElements.MicroInstructions)) { for (int i = 0; i < cpu.MicroInstructions.Count; i++) { if (i > 0) { log.Append("|"); } Z80Simulator.Instructions.MicroInstruction mi = cpu.MicroInstructions[i]; log.Append(mi.Type.Name); if (mi.Parameter1 != null) { log.Append("(" + mi.Parameter1.ToString() + ")"); } } cpu.MicroInstructions.Clear(); log.Append(';'); } // CPU registers if (stateElementsToLog.HasFlag(CPUStateElements.Registers)) { log.Append(String.Format("{0:X}", cpu.A)); log.Append(';'); log.Append(Convert.ToString(cpu.F, 2).PadLeft(8, '0')); log.Append(';'); log.Append(String.Format("{0:X}", cpu.B)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.C)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.D)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.E)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.H)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.L)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.PC)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.SP)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.IX)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.IY)); log.Append(';'); log.Append(String.Format("{0}", cpu.IFF1 ? 1 : 0)); log.Append(';'); log.Append(String.Format("{0}", cpu.IFF2 ? 1 : 0)); log.Append(';'); log.Append(String.Format("{0}", cpu.IM)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.I)); log.Append(';'); log.Append(String.Format("{0:X}", cpu.R)); log.Append(';'); } // Address and Data bus if (stateElementsToLog.HasFlag(CPUStateElements.Buses)) { log.Append(String.Format("{0:X}", cpu.Address.SampleValue())); log.Append(';'); log.Append(String.Format("{0:X}", cpu.Data.SampleValue())); log.Append(';'); } // Control pins if (stateElementsToLog.HasFlag(CPUStateElements.ControlPins)) { log.Append(cpu.M1 == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.MREQ == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.IORQ == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.RD == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.WR == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.RFSH == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.HALT == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.WAIT == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.INT == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.NMI == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.RESET == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.BUSACK == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.BUSREQ == SignalState.LOW ? 0 : 1); log.Append(';'); log.Append(cpu.CLK == SignalState.LOW ? 0 : 1); log.Append(';'); } log.AppendLine(); }