Пример #1
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Sets break point marker. </summary>
        ///
        /// <remarks> 08/09/2018. </remarks>
        ///
        /// <param name="active">   True to active. </param>
        /// <param name="filename"> Filename of the file. </param>
        /// <param name="linenum">  The linenum. </param>
        ///
        /// <returns> True if it succeeds, false if it fails. </returns>
        /// -------------------------------------------------------------------------------------------------
        public static bool SetBreakPointMarker(bool active, string filename, int linenum)
        {
            TraceFile  tf   = TraceFile.FindTraceFile(filename);
            const uint mask = (1 << BREAKPOINT_MARKER);

            if (tf.IsLineLegal(linenum))
            {
                var line = tf.codefile.codewindow.Lines[linenum];

                if (active)
                {
                    if ((line.MarkerGet() & mask) == 0)
                    {
                        line.MarkerAdd(BREAKPOINT_MARKER);
                        return(true);
                    }
                }
                else
                {
                    if ((line.MarkerGet() & mask) != 0)
                    {
                        line.MarkerDelete(BREAKPOINT_MARKER);
                        return(true);
                    }
                }
            }



            return(false);
        }
Пример #2
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Parse trace data. </summary>
        ///
        /// <remarks> 06/09/2018. </remarks>
        ///
        /// <param name="filename"> Filename of the file. </param>
        /// -------------------------------------------------------------------------------------------------
        public static void ParseTraceData(string filename)
        {
            //z80.asm|25|5|32828
            traceFiles = new List <TraceFile>();


            Regex registersregex = new Regex(@"^(?<filename>[_a-zA-Z0-9\\.]*)\|(?<line>[0-9]*)\|(?<bank>[0-9]*)\|(?<addr>[0-9]*)\|(?<type>[LFT])");

            string[] lines = File.ReadAllLines(filename);

            foreach (string s in lines)
            {
                if (!string.IsNullOrEmpty(s))
                {
                    var match = registersregex.Match(s);
                    //Console.WriteLine(match.Groups["label"] + " " + match.Groups["address"] + " " + match.Groups["type"] + " " + match.Groups["section"]);

                    string fn   = match.Groups["filename"].ToString();
                    int    bank = 0;
                    int.TryParse(match.Groups["bank"].ToString(), NumberStyles.Integer, null, out bank);
                    int line = 0;
                    int.TryParse(match.Groups["line"].ToString(), NumberStyles.Integer, null, out line);
                    int addr = 0;
                    int.TryParse(match.Groups["addr"].ToString(), NumberStyles.Integer, null, out addr);

                    if (match.Groups["type"].ToString() == "T")
                    {
                        TraceFile tracefile = TraceFile.FindTraceFile(fn);
                        if (tracefile == null)
                        {
                            Console.WriteLine("Adding file " + fn);
                            tracefile = new TraceFile(fn);
                            traceFiles.Add(tracefile);
                        }



                        //found source level debug symbol
                        LineData ld = new LineData();

                        ld.address    = addr;
                        ld.bank       = bank;
                        ld.lineNumber = line - 1;


                        tracefile.lines.Add(ld);
                    }
                    else if (match.Groups["type"].ToString() == "L")
                    {
                        Labels.AddLabel(fn, addr, bank, false);
                    }
                    else if (match.Groups["type"].ToString() == "F")
                    {
                        Labels.AddLabel(fn, addr, bank, true);
                    }
                }
            }
        }
Пример #3
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Event handler. Called by TextArea for margin click events. </summary>
        ///
        /// <remarks> 19/09/2018. </remarks>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">	  Margin click event information. </param>
        /// -------------------------------------------------------------------------------------------------
        private void TextArea_MarginClick(object sender, MarginClickEventArgs e)
        {
            if (!Program.InStepMode)
            {
                return;
            }

            MarginClicked = true;

            //Console.WriteLine("TextArea_MarginClick");



            Scintilla s = (Scintilla)sender;

            if (e.Margin == CODE_MARGIN || e.Margin == BREAKPOINT_MARGIN)
            {
                const uint mask    = (1 << BREAKPOINT_MARKER);
                int        linenum = s.LineFromPosition(e.Position);
                var        line    = s.Lines[linenum];

                TraceFile tf = TraceFile.FindTraceFile((string)s.Tag);

                if ((string)s.Tag == "Dissassembly")
                {
                    tf = DisasmCodeFile;
                }

                //Section sec = FindSection((string)s.Tag);

                if (tf != null && tf.IsLineLegal(linenum))
                {
                    //Console.WriteLine("Line Ok");
                    LineData ld = tf.GetLine(linenum);

                    if ((line.MarkerGet() & mask) > 0)
                    {
                        // Remove existing breakpoint

                        Program.serialport.RemoveBreakpoint(null, ld.nextAddress.GetAddr(), ld.nextAddress.GetBank());
                        MainForm.myBreakpoints.RequestUpdate();
                    }
                    else
                    {
                        // Add breakpoint
                        Program.serialport.SetBreakpoint(null, ld.nextAddress.GetAddr(), ld.nextAddress.GetBank());
                        MainForm.myBreakpoints.RequestUpdate();

                        Console.WriteLine("Add breakpoint " + ld.nextAddress.GetAddr().ToString("X4") + " " + ld.nextAddress.GetBank());
                    }
                }
            }
        }
Пример #4
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Event handler. Called by Codewindow for mouse down events. </summary>
        ///
        /// <remarks> 18/09/2018. </remarks>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">	  Mouse event information. </param>
        /// -------------------------------------------------------------------------------------------------
        private void Codewindow_MouseDown(object sender,
                                          System.Windows.Forms.MouseEventArgs e)
        {
            Scintilla s = (Scintilla)sender;

            if (e.Button == MouseButtons.Right)
            {
                ContextMenu cm = new ContextMenu();

                int position = s.CharPositionFromPoint(e.X, e.Y);


                int linenum = s.LineFromPosition(position);
                var line    = s.Lines[linenum];

                TraceFile tf = TraceFile.FindTraceFile((string)s.Tag);
                if (tf != null)
                {
                    LineData ld   = tf.GetLine(linenum);
                    string   word = s.GetWordFromPosition(position);

                    //step mode and on valid line add a set pc option
                    if (tf.IsLineLegal(linenum) && Program.InStepMode)
                    {
                        cm.MenuItems.Add(new CustomMenuItem("Set PC to $" + ld.address.ToString("X4"), new EventHandler(ContextSetPC), (object)ld.address));
                    }

                    if (!string.IsNullOrEmpty(word))
                    {
                        Labels.Label l = Labels.FindLabel(word);
                        if (l != null)
                        {
                            if (!l.function)
                            {
                                cm.MenuItems.Add(new CustomMenuItem("Add Variable " + l.label + " to Watch", new EventHandler(ContextAddToWatch), (object)l));
                            }
                        }
                    }


                    cm.MenuItems.Add("item2");
                    //ContextMenu cm = new ContextMenu();
                    //{
                    //	MenuItem mi = new MenuItem("coming soon2 "+word);//  ,   (s, ea) => this.UndoRedo.Undo());
                    //	cm.MenuItems.Add(mi);
                    //}
                    tf.codefile.codewindow.ContextMenu = cm;
                }
            }

            Console.WriteLine("hello");
        }
Пример #5
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Event handler. Called by Codewindow for dwell events. </summary>
        ///
        /// <remarks> 10/09/2018. </remarks>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">	  Dwell event information. </param>
        /// -------------------------------------------------------------------------------------------------
        private void Codewindow_Dwell(object sender, DwellEventArgs e)
        {
            Scintilla s = (Scintilla)sender;

            if (s.CallTipActive)
            {
                return;
            }

            TraceFile tf = TraceFile.FindTraceFile((string)s.Tag);

            if (tf != null)
            {
                //tf.codefile.codewindow.sh
                string word = s.GetWordFromPosition(e.Position);

                DoHoverTip(s, e.Position, word);
            }
        }
Пример #6
0
            // -------------------------------------------------------------------------------------------------
            // Query if 'line' is line legal
            //
            // \param   line
            // The line.
            //
            // \return  True if line legal, false if not.
            // -------------------------------------------------------------------------------------------------
            public bool IsLineLegal(int line)
            {
                TraceFile s = TraceFile.FindTraceFile(TraceFileName);

                return(s.IsLineLegal(line));
            }
Пример #7
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Event handler. Called by Codewindow for mouse down events. </summary>
        ///
        /// <remarks> 18/09/2018. </remarks>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">	  Mouse event information. </param>
        /// -------------------------------------------------------------------------------------------------
        private void Codewindow_MouseDown(object sender,
                                          System.Windows.Forms.MouseEventArgs e)
        {
            Scintilla s = (Scintilla)sender;

            if (e.Button == MouseButtons.Right)
            {
                ContextMenu cm = new ContextMenu();

                int position = s.CharPositionFromPoint(e.X, e.Y);


                int linenum = s.LineFromPosition(position);
                var line    = s.Lines[linenum];

                TraceFile tf = TraceFile.FindTraceFile((string)s.Tag);
                if (tf != null)
                {
                    LineData ld   = tf.GetLine(linenum);
                    string   word = s.GetWordFromPosition(position);

                    //step mode and on valid line add a set pc option
                    if (tf.IsLineLegal(linenum) && Program.InStepMode)
                    {
                        //cm.MenuItems.Add(new CustomMenuItem( "Set PC to $"+ld.address.ToString("X4"),new EventHandler(ContextSetPC),(object)ld.address ) );

                        const uint mask = (1 << BREAKPOINT_MARKER);
                        if ((line.MarkerGet() & mask) > 0)
                        {
                            cm.MenuItems.Add(new CustomMenuItem("Clear breakpoint", new EventHandler(ContextClearBreakpoint), (object)ld.nextAddress.GetLongAddress()));
                        }
                        else
                        {
                            cm.MenuItems.Add(new CustomMenuItem("Set breakpoint", new EventHandler(ContextSetBreakpoint), (object)ld.nextAddress.GetLongAddress()));
                        }
                    }

                    if (!string.IsNullOrEmpty(word))
                    {
                        Labels.Label l = Labels.FindLabel(word);
                        if (l != null)
                        {
                            //if (!l.function)
                            //{
                            cm.MenuItems.Add(new CustomMenuItem("ADD TO WATCH: " + l.label + " " + l.nextAddress.ToString("b") + "", new EventHandler(ContextAddToWatch), (object)l));
                            cm.MenuItems.Add(new CustomMenuItem("JUMP TO: " + l.label + " " + l.nextAddress.ToString("b"), new EventHandler(ContextGotoAddress), (object)l));
                            //}
                        }
                    }


                    //cm.MenuItems.Add("item3");
                    //ContextMenu cm = new ContextMenu();
                    //{
                    //	MenuItem mi = new MenuItem("coming soon2 "+word);//  ,   (s, ea) => this.UndoRedo.Undo());
                    //	cm.MenuItems.Add(mi);
                    //}
                    tf.codefile.codewindow.ContextMenu = cm;
                }
            }
        }
Пример #8
0
            // -------------------------------------------------------------------------------------------------
            // Gets a line
            //
            // \param   line
            // The line.
            //
            // \return  The line.
            // -------------------------------------------------------------------------------------------------
            public LineData GetLine(int line)
            {
                TraceFile s = TraceFile.FindTraceFile(TraceFileName);

                return(s.GetLine(line));
            }
Пример #9
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Event handler. Called by TextArea for margin click events. </summary>
        ///
        /// <remarks> 19/09/2018. </remarks>
        ///
        /// <param name="sender"> Source of the event. </param>
        /// <param name="e">	  Margin click event information. </param>
        /// -------------------------------------------------------------------------------------------------
        private void TextArea_MarginClick(object sender, MarginClickEventArgs e)
        {
            if (!Program.InStepMode)
            {
                return;
            }

            MarginClicked = true;

            //Console.WriteLine("TextArea_MarginClick");



            Scintilla s = (Scintilla)sender;

            if (e.Margin == CODE_MARGIN || e.Margin == BREAKPOINT_MARGIN)
            {
                const uint mask    = (1 << BREAKPOINT_MARKER);
                int        linenum = s.LineFromPosition(e.Position);
                var        line    = s.Lines[linenum];

                TraceFile tf = TraceFile.FindTraceFile((string)s.Tag);
                //Section sec = FindSection((string)s.Tag);

                if (tf != null && tf.IsLineLegal(linenum))
                {
                    //Console.WriteLine("Line Ok");
                    LineData ld = tf.GetLine(linenum);

                    //Form1.commsthread.AddCommand(Command.disassmblememory, 50, " " + ld.Addess.ToString("X4") + "H 256");


                    //now request memory and display is asm window


                    if ((line.MarkerGet() & mask) > 0)
                    {
                        // Remove existing breakpoint
                        //line.MarkerDelete(BOOKMARK_MARKER);
                        //line.MarkerDelete(BREAKPOINT_MARKER);
                        if (Breakpoint.RemoveBreakPointAtAddress(ld.address))
                        {
                        }


                        //Form1.commsthread.AddCommand(Command.direct, 76, "disable-breakpoint 1");
                    }
                    else
                    {
                        // Add breakpoint
                        if (Breakpoint.SetBreakPoint(ld.address, Breakpoint.BreakpointType.PC,
                                                     "PC=" + ld.address.ToString("X4") + "H", tf.filename, linenum))
                        {
                        }
                        //
                        //
                        //
                        //if (Program.AddBreakpoint(ld.address))
                        //{
                        //	line.MarkerAdd(BREAKPOINT_MARKER);

                        //}
                        //
                        //line.MarkerAdd(BOOKMARK_MARKER);

                        //LineData ld = cf.GetLine(linenum);

                        //Form1.commsthread.AddCommand(Command.setbreakpointaction, 76, " 1 break");
                        //Form1.commsthread.AddCommand(Command.setbreakpoint, 75, " 1 PC="+ld.Addess.ToString("x4")+"H");
                        //Form1.commsthread.AddCommand(Command.direct, 74, "enable-breakpoint 1");
                    }
                }
            }


/*			if (e.Margin == BOOKMARK_MARGIN)
 *                      {
 *
 *                              CodeFile cf = GetCodeFileFromSection((string)s.Tag);
 *
 *
 *
 *                              // Do we have a marker for this line?
 *                              const uint mask = (1 << BOOKMARK_MARKER);
 *                              int linenum = s.LineFromPosition(e.Position);
 *                              var line = s.Lines[linenum];
 *
 *
 *                              if (cf.IsLineLegal(linenum))
 *                              {
 *                                      if ((line.MarkerGet() & mask) > 0)
 *                                      {
 *                                              // Remove existing breakpoint
 *                                              line.MarkerDelete(BOOKMARK_MARKER);
 *                                              line.MarkerDelete(BREAKPOINT_MARKER);
 *
 *
 *                                              //Form1.commsthread.AddCommand(Command.direct, 76, "disable-breakpoint 1");
 *
 *
 *                                      }
 *                                      else
 *                                      {
 *                                              // Add breakpoint
 *                                              line.MarkerAdd(BOOKMARK_MARKER);
 *                                              line.MarkerAdd(BREAKPOINT_MARKER);
 *
 *                                              LineData ld = cf.GetLine(linenum);
 *
 *                                              //Form1.commsthread.AddCommand(Command.setbreakpointaction, 76, " 1 break");
 *                                              Form1.commsthread.AddCommand(Command.setbreakpoint, 75, " 1 PC="+ld.Addess.ToString("x4")+"H");
 *                                              //Form1.commsthread.AddCommand(Command.direct, 74, "enable-breakpoint 1");
 *
 *                                      }
 *
 *                              }
 *
 *
 *
 *                      }*/
        }
Пример #10
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Parse trace data. </summary>
        ///
        /// <remarks> 06/09/2018. </remarks>
        ///
        /// <param name="filename"> Filename of the file. </param>
        /// -------------------------------------------------------------------------------------------------
        public static void ParseTraceData(string filename)
        {
            //z80.asm|25|5|32828
            traceFiles = new List <TraceFile>();

            string filenameregexchars = @"[_a-zA-Z0-9\\., :/@#$%^(){}\[\]!+=~-]";
            Regex  registersregex     = new Regex(
                @"^(?<filename>" + filenameregexchars + @"*)\|"
                + @"(?<line>[0-9:]+)\|"
                + @"(?<macrofile>" + filenameregexchars + @"*)\|"
                + @"(?<macroline>[0-9:]+)\|"
                + @"(?<bank>-?[0-9]+)\|"
                + @"(?<value>-?[0-9]+)\|"
                + @"(?<type>[LFTDZ])\|"
                + @"(?<label>.*)"
                );



            int index = 0;

            string[] lines = File.ReadAllLines(filename);

            foreach (string s in lines)
            {
                index++;
                if (!string.IsNullOrEmpty(s))
                {
                    if (s.StartsWith("||"))
                    {
                        Console.WriteLine("# comment: " + s.Substring(2));
                        continue;
                    }
                    if (s.StartsWith("|SLD.data.version|"))
                    {
                        var sldversion = s.Substring(18);
                        if (!"0".Equals(sldversion))
                        {
                            Console.WriteLine("# Unknown SLD version: " + sldversion);
                            //TODO some warning about unsupported SLD version
                        }
                        continue;
                    }
                    var match = registersregex.Match(s);
                    if (!match.Success)
                    {
                        Console.WriteLine("! matching failed for line: " + s);
                        continue;
                    }
                    Console.WriteLine(s);
                    //Console.WriteLine(match.Groups["label"] + " " + match.Groups["address"] + " " + match.Groups["type"] + " " + match.Groups["section"]);

                    string mfn   = match.Groups["macrofile"].ToString();
                    var    mline = ParseLineNumber(match.Groups["macroline"].ToString());

                    string fn    = match.Groups["filename"].ToString();
                    string label = match.Groups["label"].ToString();

                    int bank = 0;
                    int.TryParse(match.Groups["bank"].ToString(), NumberStyles.Integer, null, out bank);
                    var line  = ParseLineNumber(match.Groups["line"].ToString());
                    int value = 0;
                    int.TryParse(match.Groups["value"].ToString(), NumberStyles.Integer, null, out value);



                    if (match.Groups["type"].ToString() == "T")                         //Trace Data
                    {
                        fn = Path.GetFileName(fn);

                        TraceFile tracefile = TraceFile.FindTraceFile(fn);
                        if (tracefile == null)
                        {
                            Console.WriteLine("Adding file " + fn);
                            tracefile = new TraceFile(fn);
                            traceFiles.Add(tracefile);
                        }



                        //found source level debug symbol
                        LineData ld = new LineData();

                        //ld.address = addr;
                        //ld.bank = bank;
                        ld.lineNumber  = line.Item1 - 1;
                        ld.nextAddress = new NextAddress(value, bank);
                        ld.tf          = tracefile;

                        tracefile.lines.Add(ld);
                    }
                    else if (match.Groups["type"].ToString() == "L")                            //Label
                    {
                        Labels.AddLabel(label, value, bank, false, false);
                    }
                    else if (match.Groups["type"].ToString() == "D")        //Define
                    {
                        Labels.AddLabel(label, value, bank, false, true);
                    }
                    else if (match.Groups["type"].ToString() == "F")                            //Function
                    {
                        Labels.AddLabel(label, value, bank, true, false);
                    }
                }
            }
        }