public void ConvertToTokens_1a_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_01a")); // Act AssemblerClass.ConvertToTokens(asmSource); // Assert Assert.AreEqual(3, asmSource.Lines.Count); Assert.AreEqual("LD A, 0b00000101 // binary literal", asmSource.Lines[0].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[0].Tokens.Count); Assert.AreEqual("LD", asmSource.Lines[0].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[0], typeof(CommandToken)); Assert.AreEqual("A", asmSource.Lines[0].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[1], typeof(RegisterToken)); Assert.AreEqual(",", asmSource.Lines[0].Tokens[2].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[2], typeof(CommaToken)); Assert.AreEqual("0b00000101", asmSource.Lines[0].Tokens[3].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[3], typeof(LiteralToken)); Assert.AreEqual(5, ((LiteralToken)asmSource.Lines[0].Tokens[3]).NumericValue); Assert.AreEqual("label_01:", asmSource.Lines[1].Text.Trim()); Assert.AreEqual(1, asmSource.Lines[1].Tokens.Count); Assert.AreEqual("label_01", asmSource.Lines[1].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[1].Tokens[0], typeof(LabelToken)); Assert.AreEqual("INC A", asmSource.Lines[2].Text.Trim()); Assert.AreEqual(2, asmSource.Lines[2].Tokens.Count); Assert.AreEqual("INC", asmSource.Lines[2].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[2].Tokens[0], typeof(CommandToken)); Assert.AreEqual("A", asmSource.Lines[2].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[2].Tokens[1], typeof(RegisterToken)); }
public void ResolveLabelsAndDirectives_7_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_07")); AssemblerClass.ConvertToTokens(asmSource); // Act AssemblerClass.ResolveLabelsAndDirectives(asmSource); // Assert Assert.AreEqual(1, asmSource.Labels.Count); Assert.AreEqual(0x00a, asmSource.Labels["print_number_1digit"]); Assert.AreEqual(7, asmSource.Lines.Count); Assert.AreEqual(0x000, asmSource.Lines[0].Address); Assert.AreEqual(0x003, asmSource.Lines[1].Address); Assert.AreEqual(0x006, asmSource.Lines[2].Address); Assert.AreEqual(0x00a, asmSource.Lines[3].Address); Assert.AreEqual(0x00d, asmSource.Lines[4].Address); Assert.AreEqual(0x010, asmSource.Lines[5].Address); Assert.AreEqual(0x013, asmSource.Lines[6].Address); Assert.AreEqual(0, asmSource.Variables.Count); }
public void ConvertToTokens_6_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_06")); // Act AssemblerClass.ConvertToTokens(asmSource); // Assert Assert.AreEqual(7, asmSource.Lines.Count); Assert.AreEqual("delay:", asmSource.Lines[0].Text.Trim()); Assert.AreEqual("DNW A", asmSource.Lines[1].Text.Trim()); Assert.AreEqual("JP Z, :delay_end", asmSource.Lines[2].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[2].Tokens.Count); Assert.AreEqual("DEC A", asmSource.Lines[3].Text.Trim()); Assert.AreEqual("JP :delay", asmSource.Lines[4].Text.Trim()); Assert.AreEqual(2, asmSource.Lines[4].Tokens.Count); Assert.AreEqual("delay_end:", asmSource.Lines[5].Text.Trim()); Assert.AreEqual("RET", asmSource.Lines[6].Text.Trim()); }
public void ConvertToTokens_2_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_02")); // Act AssemblerClass.ConvertToTokens(asmSource); // Assert Assert.AreEqual(9, asmSource.Lines.Count); Assert.AreEqual("LD A, 0x0", asmSource.Lines[0].Text.Trim()); //Assert.AreEqual(4, asmSource.Lines[0].Tokens.Count); //Assert.AreEqual("LD", asmSource.Lines[0].Tokens[0].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[0], typeof(CommandToken)); //Assert.AreEqual("A", asmSource.Lines[0].Tokens[1].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[1], typeof(RegisterToken)); //Assert.AreEqual(",", asmSource.Lines[0].Tokens[2].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[2], typeof(CommaToken)); //Assert.AreEqual("0x5", asmSource.Lines[0].Tokens[3].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[3], typeof(LiteralToken)); Assert.AreEqual("LD B, 0xFF", asmSource.Lines[1].Text.Trim()); Assert.AreEqual("loop:", asmSource.Lines[2].Text.Trim()); Assert.AreEqual("DEC B", asmSource.Lines[3].Text.Trim()); Assert.AreEqual("JP Z, :end_loop", asmSource.Lines[4].Text.Trim()); Assert.AreEqual("JP :loop", asmSource.Lines[5].Text.Trim()); Assert.AreEqual("end_loop:", asmSource.Lines[6].Text.Trim()); Assert.AreEqual("INC A", asmSource.Lines[7].Text.Trim()); Assert.AreEqual("jp :loop", asmSource.Lines[8].Text.Trim()); }
public void ConvertToTokens_1b_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_01b")); // Act AssemblerClass.ConvertToTokens(asmSource); // Assert Assert.AreEqual(3, asmSource.Lines.Count); Assert.AreEqual("LD A, 'a' // ASCII character", asmSource.Lines[0].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[0].Tokens.Count); Assert.AreEqual("LD", asmSource.Lines[0].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[0], typeof(CommandToken)); Assert.AreEqual("A", asmSource.Lines[0].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[1], typeof(RegisterToken)); Assert.AreEqual(",", asmSource.Lines[0].Tokens[2].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[2], typeof(CommaToken)); Assert.AreEqual("'a'", asmSource.Lines[0].Tokens[3].Text); Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[3], typeof(AscCharToken)); Assert.AreEqual(97, ((AscCharToken)asmSource.Lines[0].Tokens[3]).NumericValue); Assert.AreEqual("label_01:", asmSource.Lines[1].Text.Trim()); Assert.AreEqual(1, asmSource.Lines[1].Tokens.Count); Assert.AreEqual("label_01", asmSource.Lines[1].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[1].Tokens[0], typeof(LabelToken)); Assert.AreEqual("INC A", asmSource.Lines[2].Text.Trim()); Assert.AreEqual(2, asmSource.Lines[2].Tokens.Count); Assert.AreEqual("INC", asmSource.Lines[2].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[2].Tokens[0], typeof(CommandToken)); Assert.AreEqual("A", asmSource.Lines[2].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[2].Tokens[1], typeof(RegisterToken)); }
private byte[] ArrangeAndAct(string lineSrc) { var asmSource = new AsmSource(lineSrc); AssemblerClass.ConvertToTokens(asmSource); AssemblerClass.ConvertTokensToMachineCode(asmSource); var line = asmSource.Lines[0]; // Act return(AssemblerClass.ConvertLineTokensToMachineCode(line)); }
private AsmSource ArrangeAndAct(string filename) { var source = Utilities.GetFromFile(filename); var asmSource = new AsmSource(source); AssemblerClass.ResolveIncludes(asmSource); AssemblerClass.ConvertToTokens(asmSource); AssemblerClass.ResolveLabelsAndDirectives(asmSource); AssemblerClass.ConvertTokensToMachineCode(asmSource); // Act return(asmSource); }
public void ConvertLineTokensToMachineCodeCommentedLine_Test() { // Arrange var line = "// Commented line"; // Act var asmSource = new AsmSource(line); AssemblerClass.ConvertToTokens(asmSource); AssemblerClass.ConvertTokensToMachineCode(asmSource); // Assert Assert.AreEqual(0, asmSource.Lines.Count); }
public void ResolveLabelsAndDirectives_1_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_01")); AssemblerClass.ConvertToTokens(asmSource); // Act AssemblerClass.ResolveLabelsAndDirectives(asmSource); // Assert Assert.AreEqual(1, asmSource.Labels.Count); Assert.AreEqual(0x0003, asmSource.Labels["label_01"]); Assert.AreEqual(0, asmSource.Variables.Count); }
public void ResolveLabelsAndDirectives_5_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_05")); AssemblerClass.ConvertToTokens(asmSource); // Act AssemblerClass.ResolveLabelsAndDirectives(asmSource); // Assert Assert.AreEqual(2, asmSource.Labels.Count); Assert.AreEqual(12, asmSource.Labels["loop"]); Assert.AreEqual(27, asmSource.Labels["end_loop"]); Assert.AreEqual(2, asmSource.Variables.Count); Assert.AreEqual(0xc00, asmSource.Variables["var_A"]); Assert.AreEqual(0xc01, asmSource.Variables["var_B"]); }
public void SendAssembly(bool noDisplay = false) { AD7Util.Log("SendAssembly"); ASMWindow_CurrentLineUpdated.Reset(); ASMWindow_NextAddress1Updated.Reset(); ASMWindow_NextLine1Updated.Reset(); uint xAddress = mCurrentAddress.Value; var xSourceInfos = mDebugInfoDb.GetSourceInfos(xAddress); AD7Util.Log("SendAssembly - SourceInfos retrieved for address 0x{0}", xAddress.ToString("X8")); if (xSourceInfos.Count > 0) { //We should be able to display the asesembler source for any address regardless of whether a C# //line is associated with it. //However, we do not store all labels in the debug database because that would make the compile //time insane. //So: // - We take the current address amd find the method it is part of // - We use the method header label as a start point and find all asm labels till the method footer label // - We then find all the asm for these labels and display it. Label[] xLabels = mDebugInfoDb.GetMethodLabels(xAddress); AD7Util.Log("SendAssembly - MethodLabels retrieved"); // get the label of our current position, or the closest one before var curPosLabel = xLabels.Where(i => i.Address <= xAddress).OrderByDescending(i => i.Address).FirstOrDefault(); // if curPosLabel is null, grab the first one. if (curPosLabel == null) { curPosLabel = xLabels[0]; } var curPosIndex = Array.IndexOf(xLabels, curPosLabel); // we want 50 items before and after the current item, so 100 in total. var itemsBefore = 10; var itemsAfter = 10; if (curPosIndex < itemsBefore) { // there are no 50 items before the current one, so adjust itemsBefore = curPosIndex; } if ((curPosIndex + itemsAfter) >= xLabels.Length) { // there are no 50 items after the current one, so adjust itemsAfter = xLabels.Length - curPosIndex; } var newArr = new Label[itemsBefore + itemsAfter]; for (int i = 0; i < newArr.Length; i++) { newArr[i] = xLabels[(curPosIndex - itemsBefore) + i]; } xLabels = newArr; //The ":" has to be added in because labels in asm code have it on the end - it's easier to add it here than //strip them out of the read asm var xLabelNames = xLabels.Select(x => x.Name + ":").ToList(); // Get assembly source var xCode = AsmSource.GetSourceForLabels(Path.ChangeExtension(mISO, ".asm"), xLabelNames); AD7Util.Log("SendAssembly - SourceForLabels retrieved"); // Get label for current address. // A single address can have multiple labels (IL, Asm). Because of this we search // for the one with the Asm tag. We dont have the tags in this debug info though, // so instead if there is more than one label we use the longest one which is the Asm tag. string xCurrentLabel = ""; var xCurrentLabels = mDebugInfoDb.GetLabels(xAddress); if (xCurrentLabels.Length > 0) { xCurrentLabel = xCurrentLabels.OrderBy(q => q.Length).Last(); } if (string.IsNullOrEmpty(xCurrentLabel)) { xCurrentLabel = "NO_METHOD_LABEL_FOUND"; } // Insert filter labels list as THIRD(!) line of our data stream string filterLabelsList = ""; foreach (var addressInfo in INT3sSet) { //"We have to add the ".00:" because of how the ASM window works... filterLabelsList += "|" + addressInfo.Value + ".00"; } if (filterLabelsList.Length > 0) { filterLabelsList = filterLabelsList.Substring(1); } xCode.Insert(0, filterLabelsList + "\r\n"); // Insert parameters as SECOND(!) line of our data stream xCode.Insert(0, (noDisplay ? "NoDisplay" : "") + "|" + (ASMSteppingMode ? "AsmStepMode" : "") + "\r\n"); // Insert current line's label as FIRST(!) line of our data stream xCode.Insert(0, xCurrentLabel + "\r\n"); //THINK ABOUT THE ORDER that he above lines occur in and where they insert data into the stream - don't switch it! AD7Util.Log("SendAssembly - Sending through pipe now"); mDebugDownPipe.SendCommand(Debugger2Windows.AssemblySource, Encoding.UTF8.GetBytes(xCode.ToString())); AD7Util.Log("SendAssembly - Done"); } }
public void ConvertToTokens_5_Test() { // Arrange var asmSource = new AsmSource(Utilities.GetFromFile("Test_05")); // Act AssemblerClass.ConvertToTokens(asmSource); // Assert Assert.AreEqual(17, asmSource.Lines.Count); Assert.AreEqual("#defbyte var_A", asmSource.Lines[0].Text.Trim()); Assert.AreEqual("#defbyte var_B", asmSource.Lines[1].Text.Trim()); Assert.AreEqual("LD A, 0x0", asmSource.Lines[2].Text.Trim()); //Assert.AreEqual(4, asmSource.Lines[0].Tokens.Count); //Assert.AreEqual("LD", asmSource.Lines[0].Tokens[0].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[0], typeof(CommandToken)); //Assert.AreEqual("A", asmSource.Lines[0].Tokens[1].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[1], typeof(RegisterToken)); //Assert.AreEqual(",", asmSource.Lines[0].Tokens[2].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[2], typeof(CommaToken)); //Assert.AreEqual("0x5", asmSource.Lines[0].Tokens[3].Text); //Assert.IsInstanceOfType(asmSource.Lines[0].Tokens[3], typeof(LiteralToken)); Assert.AreEqual("LD B, 0xFF", asmSource.Lines[3].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[3].Tokens.Count); Assert.AreEqual("LD", asmSource.Lines[3].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[3].Tokens[0], typeof(CommandToken)); Assert.AreEqual("B", asmSource.Lines[3].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[3].Tokens[1], typeof(RegisterToken)); Assert.AreEqual(",", asmSource.Lines[3].Tokens[2].Text); Assert.IsInstanceOfType(asmSource.Lines[3].Tokens[2], typeof(CommaToken)); Assert.AreEqual("0xFF", asmSource.Lines[3].Tokens[3].Text); Assert.IsInstanceOfType(asmSource.Lines[3].Tokens[3], typeof(LiteralToken)); Assert.AreEqual("ST #var_A, A", asmSource.Lines[4].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[4].Tokens.Count); Assert.AreEqual("ST", asmSource.Lines[4].Tokens[0].Text); Assert.IsInstanceOfType(asmSource.Lines[4].Tokens[0], typeof(CommandToken)); Assert.AreEqual("var_A", asmSource.Lines[4].Tokens[1].Text); Assert.IsInstanceOfType(asmSource.Lines[4].Tokens[1], typeof(DirectiveToken)); Assert.AreEqual(",", asmSource.Lines[4].Tokens[2].Text); Assert.IsInstanceOfType(asmSource.Lines[4].Tokens[2], typeof(CommaToken)); Assert.AreEqual("A", asmSource.Lines[4].Tokens[3].Text); Assert.IsInstanceOfType(asmSource.Lines[4].Tokens[3], typeof(RegisterToken)); Assert.AreEqual("ST #var_B, B", asmSource.Lines[5].Text.Trim()); Assert.AreEqual("loop:", asmSource.Lines[6].Text.Trim()); Assert.AreEqual("LD B, #var_B", asmSource.Lines[7].Text.Trim()); Assert.AreEqual(4, asmSource.Lines[7].Tokens.Count); Assert.AreEqual("DEC B", asmSource.Lines[8].Text.Trim()); Assert.AreEqual("ST #var_B, B", asmSource.Lines[9].Text.Trim()); Assert.AreEqual("JP Z, :end_loop", asmSource.Lines[10].Text.Trim()); Assert.AreEqual("JP :loop", asmSource.Lines[11].Text.Trim()); Assert.AreEqual("end_loop:", asmSource.Lines[12].Text.Trim()); Assert.AreEqual("LD A, #var_A", asmSource.Lines[13].Text.Trim()); Assert.AreEqual("INC A", asmSource.Lines[14].Text.Trim()); Assert.AreEqual("ST #var_A, A", asmSource.Lines[15].Text.Trim()); Assert.AreEqual("jp :loop", asmSource.Lines[16].Text.Trim()); }