Exemple #1
0
        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));
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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());
        }
Exemple #4
0
        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());
        }
Exemple #5
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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");
            }
        }
Exemple #12
0
        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());
        }