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; }
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; }
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; }
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; }
/// <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; }
/// <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; }
/// <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; }