};// TODO handle that in Instruc... public static Action ret(CPU cpu, FlagCondition o) => () => { if (o.Target) { cpu.Return(); cpu.pc -= 1; } };
public FlagConditionEditor() { if (Available) { condition = new FlagCondition(Controller.Instance.VarFlagSummary.getFlags()[0]); } }
public void draw(Condition c) { condition = c as FlagCondition; using (new EditorGUILayout.HorizontalScope()) { if (Available) { var flags = Controller.Instance.VarFlagSummary.getFlags(); var index = Mathf.Max(0, Array.IndexOf(flags, c.getId())); c.setId(flags[EditorGUILayout.Popup(index >= 0 ? index : 0, flags)]); } else { using (new GUILayout.HorizontalScope(GUILayout.Height(15))) { EditorGUILayout.HelpBox(TC.get("Condition.Flag.Warning"), MessageType.Error); } } if (GUILayout.Button("New", collapseStyle, GUILayout.Width(35), GUILayout.Height(15))) { Controller.Instance.ShowInputDialog(TC.get("Flags.AddFlag"), TC.get("Flags.AddFlagMessage"), DEFAULT_FLAG_ID, condition, this); } if (Available) { c.setState(EditorGUILayout.Popup(c.getState(), types)); } } }
public void ConditionsSetup() { flagCondition = new FlagCondition(FlagId, 1); varCondition = new VarCondition(VarId, 1, 2); globalStateCondition = new GlobalStateCondition(GlobalStateId); conditions = new Conditions(); conditions.Add(flagCondition); conditions.Add(varCondition); conditions.Add(varCondition); }
protected virtual string GenerateCpl(ICondition p_cndCondition) { StringBuilder stbCPL = new StringBuilder(); if (p_cndCondition is CompositeCondition) { CompositeCondition cpcCondition = (CompositeCondition)p_cndCondition; string strOperator = null; string strPrefix = null; string strSuffix = null; switch (cpcCondition.Operator) { case ConditionOperator.And: strOperator = "AND"; break; case ConditionOperator.Or: strOperator = "OR"; strPrefix = "("; strSuffix = ")"; break; } stbCPL.Append(strPrefix); for (Int32 i = 0; i < cpcCondition.Conditions.Count; i++) { stbCPL.Append(GenerateCpl(cpcCondition.Conditions[i])); if (i < cpcCondition.Conditions.Count - 1) { stbCPL.AppendFormat(" {0} ", strOperator); } } stbCPL.Append(strSuffix); } else if (p_cndCondition is FlagCondition) { FlagCondition flcCondition = (FlagCondition)p_cndCondition; stbCPL.AppendFormat("${0}$ = \"{1}\"", flcCondition.FlagName, flcCondition.Value); } else if (p_cndCondition is PluginCondition) { PluginCondition pncCondition = (PluginCondition)p_cndCondition; stbCPL.AppendFormat("\"{0}\" is {1}", pncCondition.PluginPath, pncCondition.State.ToString()); } else if (p_cndCondition is GameVersionCondition) { GameVersionCondition gvcCondition = (GameVersionCondition)p_cndCondition; stbCPL.AppendFormat("gameVersion >= {0}", gvcCondition.MinimumVersion.ToString()); } else if (p_cndCondition is ModManagerCondition) { ModManagerCondition mmcCondition = (ModManagerCondition)p_cndCondition; stbCPL.AppendFormat("managerVersion >= {0}", mmcCondition.MinimumVersion.ToString()); } return(stbCPL.ToString()); }
protected virtual ICondition BuildCompositeCondition(ITree p_astCPL) { switch (p_astCPL.Type) { case CPLParser.AND: CompositeCondition cpcAndCondition = new CompositeCondition(ConditionOperator.And); for (Int32 i = 0; i < p_astCPL.ChildCount; i++) { cpcAndCondition.Conditions.Add(BuildCompositeCondition(p_astCPL.GetChild(i))); } return(cpcAndCondition); case CPLParser.OR: CompositeCondition cpcOrCondition = new CompositeCondition(ConditionOperator.Or); for (Int32 i = 0; i < p_astCPL.ChildCount; i++) { cpcOrCondition.Conditions.Add(BuildCompositeCondition(p_astCPL.GetChild(i))); } return(cpcOrCondition); case CPLParser.EQUALS: string strFlagName = p_astCPL.GetChild(0).Text.Trim('$'); string strFlagValue = p_astCPL.GetChild(1).Text.Trim('"'); FlagCondition flcCondition = new FlagCondition(strFlagName, strFlagValue); return(flcCondition); case CPLParser.IS: string strPluginPath = p_astCPL.GetChild(0).Text.Trim('"'); string strState = p_astCPL.GetChild(1).Text.ToUpperInvariant(); strState = strState[0] + strState.Remove(0, 1).ToLowerInvariant(); PluginState pnsState = (PluginState)Enum.Parse(typeof(PluginState), strState); PluginCondition pncCondition = new PluginCondition(strPluginPath, pnsState); return(pncCondition); case CPLParser.ATLEAST: string strVersion = p_astCPL.GetChild(1).Text; if (!strVersion.Contains(".")) { strVersion += ".0"; } Version verVersion = new Version(strVersion); switch (p_astCPL.GetChild(0).Type) { case CPLParser.GAME_VERSION: return(new GameVersionCondition(verVersion)); case CPLParser.MANAGER_VERSION: return(new ModManagerCondition(verVersion)); } throw new Exception("Unknown: " + p_astCPL.Text); default: throw new Exception("Unknown: " + p_astCPL.Text); } }
private void SelectAlternateExecutionTimings_IfFlagIsNotSet(FlagCondition flagCondition) { if (!CheckFlagCondition(flagCondition)) { currentInstruction.SelectAlternateExecutionTimings(); } if (TraceMicroInstructions) { TraceMicroInstruction(new MicroInstruction(Z80MicroInstructionTypes.CPUControlSelectAltExecTimingsIfFlagIsNotSet, flagCondition)); } }
private void SendOperandToPC_IfFlagIsSet(FlagCondition flagCondition) { if (CheckFlagCondition(flagCondition)) { InternalAddressBus_SampleFrom(InternalAddressBusConnection.WZ); InternalAddressBus_SendTo(InternalAddressBusConnection.PC); } if (TraceMicroInstructions) { TraceMicroInstruction(new MicroInstruction(Z80MicroInstructionTypes.SendOperandToPCIfFlagIsSet, flagCondition)); } }
public FlagConditionEditor() { flags = Controller.getInstance().getVarFlagSummary().getFlags(); if (flags == null || flags.Length == 0) { Avaiable = false; } else { Avaiable = true; condition = new FlagCondition(flags[0]); } }
public void OnDialogOk(string message, object workingObject = null, object workingObjectSecond = null) { if (string.IsNullOrEmpty(message)) { return; } Controller.Instance.VarFlagSummary.addFlag(message); if (condition == null) { condition = new FlagCondition(message); } else { condition.setId(message); } }
public void draw(Condition c) { condition = c as FlagCondition; using (new EditorGUILayout.HorizontalScope()) { if (Available) { var flags = Controller.Instance.VarFlagSummary.getFlags(); var index = Mathf.Max(0, Array.IndexOf(flags, c.getId())); c.setId(flags[EditorGUILayout.Popup(index >= 0 ? index : 0, flags)]); c.setState(EditorGUILayout.Popup(c.getState(), types)); } else { EditorGUILayout.HelpBox(TC.get("Condition.Flag.Warning"), MessageType.Error); } } }
public FlagConditionEditor() { if (Available) { condition = new FlagCondition(Controller.Instance.VarFlagSummary.getFlags()[0]); } if (collapseStyle == null) { collapseStyle = new GUIStyle(GUI.skin.button); collapseStyle.padding = new RectOffset(0, 0, 0, 0); collapseStyle.margin = new RectOffset(0, 5, 2, 0); collapseStyle.normal.textColor = Color.blue; collapseStyle.focused.textColor = Color.blue; collapseStyle.active.textColor = Color.blue; collapseStyle.hover.textColor = Color.blue; } }
protected virtual ICondition BuildCompositeCondition(ITree p_astCPL) { switch (p_astCPL.Type) { case CPLParser.AND: CompositeCondition cpcAndCondition = new CompositeCondition(ConditionOperator.And); for (Int32 i = 0; i < p_astCPL.ChildCount; i++) cpcAndCondition.Conditions.Add(BuildCompositeCondition(p_astCPL.GetChild(i))); return cpcAndCondition; case CPLParser.OR: CompositeCondition cpcOrCondition = new CompositeCondition(ConditionOperator.Or); for (Int32 i = 0; i < p_astCPL.ChildCount; i++) cpcOrCondition.Conditions.Add(BuildCompositeCondition(p_astCPL.GetChild(i))); return cpcOrCondition; case CPLParser.EQUALS: string strFlagName = p_astCPL.GetChild(0).Text.Trim('$'); string strFlagValue = p_astCPL.GetChild(1).Text.Trim('"'); FlagCondition flcCondition = new FlagCondition(strFlagName, strFlagValue); return flcCondition; case CPLParser.IS: string strPluginPath = p_astCPL.GetChild(0).Text.Trim('"'); string strState = p_astCPL.GetChild(1).Text.ToUpperInvariant(); strState = strState[0] + strState.Remove(0, 1).ToLowerInvariant(); PluginState pnsState = (PluginState)Enum.Parse(typeof(PluginState), strState); PluginCondition pncCondition = new PluginCondition(strPluginPath, pnsState); return pncCondition; case CPLParser.ATLEAST: string strVersion = p_astCPL.GetChild(1).Text; if (!strVersion.Contains(".")) strVersion += ".0"; Version verVersion = new Version(strVersion); switch (p_astCPL.GetChild(0).Type) { case CPLParser.GAME_VERSION: return new GameVersionCondition(verVersion); case CPLParser.MANAGER_VERSION: return new ModManagerCondition(verVersion); } throw new Exception("Unknown: " + p_astCPL.Text); default: throw new Exception("Unknown: " + p_astCPL.Text); } }
public void draw(Condition c) { condition = c as FlagCondition; EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(TC.get("Condition.FlagID")); if (Avaiable) { int index = Array.IndexOf(flags, c.getId()); c.setId(flags[EditorGUILayout.Popup(index >= 0 ? index:0, flags)]); c.setState(EditorGUILayout.Popup(c.getState(), types)); } else { EditorGUILayout.HelpBox(TC.get("Condition.Flag.Warning"), MessageType.Error); } EditorGUILayout.EndHorizontal(); }
private bool CheckFlagCondition(FlagCondition flagCondition) { switch (flagCondition) { // NZ non zero Z case FlagCondition.NZ: return(!ZF); // Z zero Z case FlagCondition.Z: return(ZF); // NC no carry C case FlagCondition.NC: return(!CF); // C carry C case FlagCondition.C: return(CF); // PO parity odd P/V case FlagCondition.PO: return(!PF); // PE parity even P/V case FlagCondition.PE: return(PF); // P sign positive S case FlagCondition.P: return(!SF); // M sign negative S //case FlagCondition.M: default: return(SF); } }
public void OnDialogOk(string message, object workingObject = null, object workingObjectSecond = null) { if (string.IsNullOrEmpty(message)) { return; } Controller.Instance.VarFlagSummary.addFlag(message); if (condition == null) { condition = new FlagCondition(message); } else { if (!string.IsNullOrEmpty(condition.getId())) { Controller.Instance.VarFlagSummary.deleteFlagReference(condition.getId()); } condition.setId(message); } Controller.Instance.VarFlagSummary.addFlagReference(message); Controller.Instance.DataModified(); }
public override bool doTool() { Condition newCondition = null; int type = ConditionsController.getTypeFromstring(conditionType); if (type == ConditionsController.FLAG_CONDITION) { newCondition = new FlagCondition(conditionId, ConditionsController.getStateFromstring(conditionState)); } else if (type == ConditionsController.VAR_CONDITION) { newCondition = new VarCondition(conditionId, ConditionsController.getStateFromstring(conditionState), int.Parse(value)); } else if (type == ConditionsController.GLOBAL_STATE_CONDITION) { newCondition = new GlobalStateCondition(conditionId, ConditionsController.getStateFromstring(conditionState)); } if (newCondition != null) { if (index1 < conditions.size()) { if (index2 == ConditionsController.INDEX_NOT_USED) { // Add new block List <Condition> newBlock = new List <Condition>(); newBlock.Add(newCondition); conditions.add(index1, newBlock); indexAdded = index1; blockAdded = newBlock; } else { List <Condition> block = conditions.get(index1); if (index2 < 0 || index2 > block.Count) { return(false); } if (index2 == conditions.size()) { block.Add(newCondition); indexAdded = block.IndexOf(newCondition); conditionAdded = newCondition; } else { indexAdded = index2; conditionAdded = newCondition; block.Insert(index2, newCondition); } } } else { // Add new block List <Condition> newBlock = new List <Condition>(); newBlock.Add(newCondition); conditions.add(newBlock); indexAdded = conditions.size() - 1; blockAdded = newBlock; } Controller.getInstance().updateVarFlagSummary(); Controller.getInstance().updatePanel(); return(true); } return(false); }
private bool CheckFlagCondition(FlagCondition flagCondition) { switch (flagCondition) { // NZ non zero Z case FlagCondition.NZ: return !ZF; // Z zero Z case FlagCondition.Z: return ZF; // NC no carry C case FlagCondition.NC: return !CF; // C carry C case FlagCondition.C: return CF; // PO parity odd P/V case FlagCondition.PO: return !PF; // PE parity even P/V case FlagCondition.PE: return PF; // P sign positive S case FlagCondition.P: return !SF; // M sign negative S //case FlagCondition.M: default: return SF; } }
public static Action call(CPU cpu, FlagCondition o1, Immediate<ushort> o2) => () => { if (o1.Target) cpu.Call(o2.Target, 3); };
() => cpu.pc = (ushort) (o.Target - 3); // TODO handle adjustment in Instr public static Action jp(CPU cpu, FlagCondition o1, Operand<ushort> o2) => () => { if (o1.Target) cpu.pc = (ushort) (o2.Target - 3); };
public override object Clone() { FlagCondition gsr = (FlagCondition)base.Clone(); return(gsr); }
public static Action jr(CPU cpu, FlagCondition o1, Operand<byte> o2) => () => { if (o1.Target) cpu.pc = (ushort) (cpu.pc + Utils.Signed(o2.Target)); };
public void CanCheckOriginalValue(bool flag, bool check, bool output) { cpu.Carry = flag; var f = new FlagCondition(cpu, "carry", check); Assert.Equal(output, f.Target); }