Exemplo n.º 1
0
 private static Dictionary<string, IFXCmd> GetFXCommands(XmlNode attributeNode)
 {
     Dictionary<string, IFXCmd> cmdList = new Dictionary<string, IFXCmd>();
     XmlNodeList basicCmdNodeList = attributeNode.SelectSingleNode("BasicCmdList").ChildNodes;                       //获得基本指令集
     foreach (XmlNode basicCmdNode in basicCmdNodeList)
     {
         if (basicCmdNode.NodeType == XmlNodeType.Element)
         {
             FXBasicCmd basicCmd = new FXBasicCmd();
             basicCmd.Name = basicCmdNode.Attributes["name"].Value;
             basicCmd.Comment = basicCmdNode.Attributes["comment"].Value;
             XmlNodeList characterNodeList = basicCmdNode.ChildNodes;
             foreach (XmlNode characterNode in characterNodeList)
             {
                 if (characterNode.NodeType == XmlNodeType.Element)
                 {
                     FXBasicCmdCharacter character = new FXBasicCmdCharacter();
                     character.BasicCmdType = (FXBasicCmdType)Convert.ToInt32(characterNode.Attributes["type"].Value);
                     character.Value = characterNode.Attributes["value"].Value;
                     character.Cmd = basicCmd.Name;
                     if (characterNode.Attributes["adapterType"] != null)
                         character.AdapterType = (FXBasicCmdAdapterType)Convert.ToInt32(characterNode.Attributes["adapterType"].Value);
                     else
                         character.AdapterType = FXBasicCmdAdapterType.NULL;
                     if (characterNode.Attributes["adapter"] != null)
                         character.Adapter = characterNode.Attributes["adapter"].Value;
                     if (characterNode.Attributes["min"] != null)
                         character.Min = Convert.ToInt32(characterNode.Attributes["min"].Value);
                     if (characterNode.Attributes["max"] != null)
                         character.Max = Convert.ToInt32(characterNode.Attributes["max"].Value);
                     basicCmd.Characters.Add(character);
                 }
             }
             cmdList.Add(basicCmd.Name, basicCmd);
         }
     }
     XmlNodeList appCmdNodeList = attributeNode.SelectSingleNode("AppCmdList").ChildNodes;       //获得应用指令集
     foreach (XmlNode appCmdNode in appCmdNodeList)
     {
         if (appCmdNode.NodeType == XmlNodeType.Element)
         {
             FXAppCmd appCmd = new FXAppCmd();
             appCmd.AppCmdType = FXAppCmdType.Normal;
             appCmd.Comment = appCmdNode.Attributes["comment"].Value;
             appCmd.FuncNO = Convert.ToInt32(appCmdNode.Attributes["funcNO"].Value);
             appCmd.Name = appCmdNode.Attributes["name"].Value;
             appCmd.Group = appCmdNode.Attributes["group"].Value;
             cmdList.Add(appCmd.Name, appCmd);
         }
     }
     return cmdList;
 }
Exemplo n.º 2
0
 private static Dictionary<string, FXBasicCmdCharacter> GetFXReverseBasicCommands(XmlNode attributeNode)
 {
     Dictionary<string, FXBasicCmdCharacter> reverseCmdList = new Dictionary<string, FXBasicCmdCharacter>();
     XmlNodeList basicCmdNodeList = attributeNode.SelectSingleNode("BasicCmdList").ChildNodes;                       //获得基本指令集
     foreach (XmlNode basicCmdNode in basicCmdNodeList)
     {
         if (basicCmdNode.NodeType == XmlNodeType.Element)
         {
             string cmdName = basicCmdNode.Attributes["name"].Value;
             XmlNodeList characterNodeList = basicCmdNode.ChildNodes;
             foreach (XmlNode characterNode in characterNodeList)
             {
                 if (characterNode.NodeType == XmlNodeType.Element)
                 {
                     FXBasicCmdCharacter character = new FXBasicCmdCharacter();
                     character.BasicCmdType = (FXBasicCmdType)Convert.ToInt32(characterNode.Attributes["type"].Value);
                     character.Value = characterNode.Attributes["value"].Value;
                     character.Cmd = cmdName;
                     if (characterNode.Attributes["adapterType"] != null)
                         character.AdapterType = (FXBasicCmdAdapterType)Convert.ToInt32(characterNode.Attributes["adapterType"].Value);
                     else
                         character.AdapterType = FXBasicCmdAdapterType.NULL;
                     if (characterNode.Attributes["adapter"] != null)
                         character.Adapter = characterNode.Attributes["adapter"].Value;
                     if (characterNode.Attributes["min"] != null)
                         character.Min = Convert.ToInt32(characterNode.Attributes["min"].Value);
                     if (characterNode.Attributes["max"] != null)
                         character.Max = Convert.ToInt32(characterNode.Attributes["max"].Value);
                     string characterKey = "";
                     switch(character.BasicCmdType)
                     {
                         case FXBasicCmdType.PureSingle:
                             characterKey = character.Value;
                             break;
                         case FXBasicCmdType.Single:
                             characterKey = character.Value.Substring(0, 1);
                             break;
                         case FXBasicCmdType.Double:
                             characterKey = character.Value.Substring(0, 6);
                             break;
                         case FXBasicCmdType.Triple:
                             characterKey = character.Value.Substring(0, 1) + " " + character.Value.Substring(9, 2) + " " + character.Value.Substring(21, 2);
                             break;
                         case FXBasicCmdType.Five:
                             characterKey = character.Value.Substring(0, 1) + " " + character.Value.Substring(9, 2) + " " + character.Value.Substring(21, 2) + " " + character.Value.Substring(33, 2) + " " + character.Value.Substring(45, 2);
                             break;
                     }
                     if(!reverseCmdList.ContainsKey(characterKey))           //如果已经存在,那么就不往里存了,只有在3字指令的时候才会出现已经存在的情况
                         reverseCmdList.Add(characterKey, character);
                 }
             }
         }
     }
     return reverseCmdList;
 }
Exemplo n.º 3
0
 private static bool IsParamFitAdapter(FXBasicCmdCharacter character, string[] paramNameArray)
 {
     string[] adapterArray = character.Adapter.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
     if (character.AdapterType == FXBasicCmdAdapterType.Exclude)
         return !Utils.IsArrayItemInAnotherArray(adapterArray, paramNameArray);
     if (character.AdapterType == FXBasicCmdAdapterType.Only)
         return Utils.IsArrayItemInAnotherArray(adapterArray, paramNameArray);
     if (character.AdapterType == FXBasicCmdAdapterType.NULL)
         return true;
     if (character.AdapterType == FXBasicCmdAdapterType.N)
         return true;
     if (character.AdapterType == FXBasicCmdAdapterType.With)
     {
         if (paramNameArray.Length == adapterArray.Length)
         {
             for (int i = 0; i < paramNameArray.Length; i++)
             {
                 if (!paramNameArray[i].Equals(adapterArray[i]))
                     return false;
             }
             return true;
         }
         else
             return false;
     }
     return false;
 }
Exemplo n.º 4
0
 private static string ComplieBasicCmdStr(FXBasicCmdCharacter character, OperandDetails[] detailsArray, Dictionary<string, FXRegister> registerList)
 {
     if (character.BasicCmdType == FXBasicCmdType.PureSingle)        //如果是纯单字指令,那么需要判断是否有ppp占位符
     {
         return character.Value;
     }
     if (character.BasicCmdType == FXBasicCmdType.Single || character.BasicCmdType == FXBasicCmdType.Double)
     {
         int absAddr = GetBasicCmdOperandAbsAddr(detailsArray[0], registerList).Value;
         int indexOfLastBlank = character.Value.LastIndexOf(FXConfigReader.BLANKSTR);
         int indexOfPPP = character.Value.IndexOf(FXConfigReader.PPPSTR);
         //int indexOfN = character.Value.IndexOf(FXComplier.NSTR);
         if (indexOfPPP > 0)                                     //如果是ppp表达式,那么从最后一个空格到+ppp之间的就是需要相加的数
         {
             int index = indexOfPPP;// > 0 ? indexOfPPP : indexOfN;
             string toBeAddStr = character.Value.Substring(indexOfLastBlank + 1, index - indexOfLastBlank - 1);
             int resultInt = Convert.ToInt32(toBeAddStr, 16) + absAddr;
             string resultStr = resultInt.ToString("X");
             resultStr = Utils.FillStringWithChar(resultStr, FXConfigReader.ZEROCHAR, 4, true);
             //return indexOfPPP > 0 ? character.Value.Replace(toBeAddStr + FXComplier.PPPSTR, resultStr) : character.Value.Replace(toBeAddStr + FXComplier.NSTR, resultStr);
             return character.Value.Replace(toBeAddStr + FXConfigReader.PPPSTR, resultStr);
         }
     }
     if (character.BasicCmdType == FXBasicCmdType.Triple || character.BasicCmdType == FXBasicCmdType.Five)
     {
         int[] absAddrArray = new int[detailsArray.Length];
         for (int i = 0; i < detailsArray.Length; i++)
         {
             absAddrArray[i] = GetBasicCmdOperandAbsAddr(detailsArray[i], registerList).Value;
         }
         string cmdReplaced = ReplacePlaceHolder(character.Value, absAddrArray);
         cmdReplaced = ReplaceDigitIndecaterAndDoAddition(cmdReplaced);
         return cmdReplaced;
     }
     return null;
 }
Exemplo n.º 5
0
 /// <summary>获得三字指令的操作数信息
 /// 
 /// </summary>
 /// <param name="codes">机器码(至少3个长)</param>
 /// <param name="character"></param>
 /// <param name="registerDict"></param>
 /// <returns></returns>
 private static FXRegisterBasicInfo[] GetRegisterByCharacterTriple(string[] codeArray, ref int index, FXBasicCmdCharacter character, Dictionary<string, FXRegister> registerDict)
 {
     FXRegisterBasicInfo[] infos = null;
     int addr0 = Convert.ToInt32(codeArray[index].Substring(1, 3), 16);              //获取第一个操作数地址
     int addr1 = Convert.ToInt32(codeArray[index + 2].Substring(2, 2) + codeArray[index + 1].Substring(2, 2), 16);       //获取第二个操作数地址
     FXRegisterBasicInfo info0 = GetRegisterInfo(addr0, character.Adapter, 0, FXBasicCmdAdapterType.With, registerDict);
     if (info0 != null)
     {
         FXRegisterBasicInfo info1 = GetRegisterInfo(addr1, character.Adapter, 1, FXBasicCmdAdapterType.With, registerDict);
         if (info1 != null)
         {
             infos = new FXRegisterBasicInfo[] { info0, info1 };
             index = index + 3;
         }
     }
     return infos;
 }
Exemplo n.º 6
0
 /// <summary>获得单字或多字指令的操作数信息
 /// 
 /// </summary>
 /// <param name="code">如果是Single的,那么就是4位的机器码;如果是Double的,那么就是8位机器码中的后四位</param>
 /// <param name="character"></param>
 /// <param name="registerDict"></param>
 /// <returns></returns>
 private static FXRegisterBasicInfo[] GetRegisterByCharacterSingleAndDouble(string[] codeArray, ref int index, FXBasicCmdCharacter character, Dictionary<string, FXRegister> registerDict)
 {
     FXRegisterBasicInfo[] infos = null;
     if (character.BasicCmdType == FXBasicCmdType.Double)
         index++;
     int specifiedAddr = Convert.ToInt32(codeArray[index].Substring(1, 3), 16);      //单字和双字命令的操作数地址为给定4位机器码的后三位
     index++;
     FXRegisterBasicInfo info = GetRegisterInfo(specifiedAddr, character.Adapter, -1, character.AdapterType, registerDict);
     infos = new FXRegisterBasicInfo[] { info };
     return infos;
 }
Exemplo n.º 7
0
 /// <summary>根据给定的源代码数组查找其对应的基本命令特性(如果是基本命令的话)
 /// 
 /// </summary>
 /// <param name="codeArray">全部机器码数组</param>
 /// <param name="index">当前执行到的索引的引用</param>
 /// <param name="reverseBasicCmdDict">基本指令反向对照字典</param>
 /// <param name="cmdDict">命令字典</param>
 /// <returns></returns>
 private static FXBasicCmdCharacter[] GetBasicCmdCharacter(string[] codeArray, ref int index, Dictionary<string, FXBasicCmdCharacter> reverseBasicCmdDict, Dictionary<string, IFXCmd> cmdDict)
 {
     string key = codeArray[index];
     if (reverseBasicCmdDict.ContainsKey(key))           //如果直接和第1组相等,那么说明是纯单字命令,直接返回
     {
         index++;
         return new FXBasicCmdCharacter[] { reverseBasicCmdDict[key] };
     }
     key = codeArray[index][0].ToString();
     if (reverseBasicCmdDict.ContainsKey(key))     //如果和第1组的第1位相等,那么说明是单字命令,直接返回
     {
         return new FXBasicCmdCharacter[] { reverseBasicCmdDict[key] };
     }
     key = codeArray[index] + " " + codeArray[index + 1][0].ToString();
     if (reverseBasicCmdDict.ContainsKey(key))    //如果和第1组的第1~4位,第2组的第1位相同,那么说明是双字指令,直接返回
     {
         index = index++;
         return new FXBasicCmdCharacter[] { reverseBasicCmdDict[key] };
     }
     //还没返回,那么要么不是基本指令,要么是三字,要么是五字,先找五字指令,不过要先判断以下够不够长
     if (codeArray.Length - index >= 5)
     {
         key = codeArray[index][0].ToString() + FXConfigReader.BLANKSTR + codeArray[index + 1].Substring(0, 2) + FXConfigReader.BLANKSTR + codeArray[index + 2].Substring(0, 2) + FXConfigReader.BLANKSTR + codeArray[index + 3].Substring(0, 2) + FXConfigReader.BLANKSTR + codeArray[index + 4].Substring(0, 2);
         if (reverseBasicCmdDict.ContainsKey(key))    //如果第1组的第1个,第2组的第1~2个,第3组的第1~2个,第4组的第1~2个,第5组的第1~2个相同,那么是五字指令,直接返回
         {
             return new FXBasicCmdCharacter[] { reverseBasicCmdDict[key] };
         }
     }
     //还没返回,那么开始寻找是否是3字指令
     if (codeArray.Length - index >= 3)
     {
         key = codeArray[index][0].ToString() + FXConfigReader.BLANKSTR + codeArray[index + 1].Substring(0, 2) + FXConfigReader.BLANKSTR + codeArray[index + 2].Substring(0, 2);
         if (reverseBasicCmdDict.ContainsKey(key))     //如果第1组的第1个,第2组的第1~2个,第3组的第1~2个相同,那么是三字指令,从命令对字典中获得对应的命令后返回
         {
             FXBasicCmdCharacter character = reverseBasicCmdDict[key];
             FXBasicCmd cmd = (FXBasicCmd)cmdDict[character.Cmd];
             List<FXBasicCmdCharacter> tempList = new List<FXBasicCmdCharacter>();
             foreach (FXBasicCmdCharacter tempCharacter in cmd.Characters)
             {
                 if (tempCharacter.BasicCmdType == FXBasicCmdType.Triple)
                     tempList.Add(tempCharacter);
             }
             FXBasicCmdCharacter[] result = new FXBasicCmdCharacter[tempList.Count];
             tempList.CopyTo(result);
             return result;
         }
     }
     //到这都没返回,那么就不是基本指令了,直接返回null
     return null;
 }