};// TODO handle that in Instruc...

    public static Action ret(CPU cpu, FlagCondition o) =>
      () => {
        if (o.Target) {
          cpu.Return();
          cpu.pc -= 1;
        }
      };
Beispiel #2
0
 public FlagConditionEditor()
 {
     if (Available)
     {
         condition = new FlagCondition(Controller.Instance.VarFlagSummary.getFlags()[0]);
     }
 }
Beispiel #3
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));
                }
            }
        }
Beispiel #4
0
 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]);
     }
 }
Beispiel #10
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);
            }
        }
Beispiel #11
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)]);
             c.setState(EditorGUILayout.Popup(c.getState(), types));
         }
         else
         {
             EditorGUILayout.HelpBox(TC.get("Condition.Flag.Warning"), MessageType.Error);
         }
     }
 }
Beispiel #12
0
        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);
            }
        }
Beispiel #16
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
            {
                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;
     }
 }
        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));
            }
        }
        private void SelectAlternateExecutionTimings_IfFlagIsNotSet(FlagCondition flagCondition)
        {
            if (!CheckFlagCondition(flagCondition))
            {
                currentInstruction.SelectAlternateExecutionTimings();
            }

            if (TraceMicroInstructions)
            {
                TraceMicroInstruction(new MicroInstruction(Z80MicroInstructionTypes.CPUControlSelectAltExecTimingsIfFlagIsNotSet, flagCondition));
            }
        }
 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));
   };
Beispiel #25
0
 public void CanCheckOriginalValue(bool flag, bool check, bool output) {
   cpu.Carry = flag;
   var f = new FlagCondition(cpu, "carry", check);
   Assert.Equal(output, f.Target);
 }