コード例 #1
0
        // -------------------------------------------------------------------------------------------------
        // Sets dism PC
        //
        // \param   pc
        // The PC.
        // \param   bank
        // The bank.
        // -------------------------------------------------------------------------------------------------
        public void SetDismPC(int nextpc, int pc, int bank)
        {
            LineData ld = DisasmCodeFile.DoesFileHaveAddress(pc, bank);

            if (ld != null)
            {
                //CurrentExecuteFile = t;
                //CurrentExecuteLine = ld.lineNumber;
                Line line = DisasmCodeFile.codefile.codewindow.Lines[ld.lineNumber];
                line.MarkerAdd(SourceCodeView.EXECUTE_MARKER);


                //if (focus)
                //    MainForm.mySourceWindow.FocusLine(DisasmCodeFile.codefile, ld.lineNumber);
            }

            ld = DisasmCodeFile.DoesFileHaveAddress(nextpc, bank);
            if (ld != null)
            {
                //CurrentExecuteFile = t;
                //CurrentExecuteLine = ld.lineNumber;
                Line line = DisasmCodeFile.codefile.codewindow.Lines[ld.lineNumber];
                line.MarkerAdd(SourceCodeView.NEXT_PC_MARKER);


                //if (focus)
                //    MainForm.mySourceWindow.FocusLine(DisasmCodeFile.codefile, ld.lineNumber);
            }
        }
コード例 #2
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Gets cloest valid code address. </summary>
        ///
        /// <remarks> 18/09/2018. </remarks>
        ///
        /// <param name="addr"> The address. </param>
        /// <param name="bank"> The bank. </param>
        ///
        /// <returns> The cloest valid code address. </returns>
        /// -------------------------------------------------------------------------------------------------
        private LineData _GetCloestValidCodeAddress(int addr, int bank)
        {
            LineData best     = null;
            int      bestdiff = int.MaxValue;


            if (lines.Count <= 0)
            {
                return(null);
            }


            for (int i = 0; i < lines.Count - 1; i++)
            {
                if (lines[i].bank == bank)
                {
                    int diff = Math.Abs(lines[i].address - addr);
                    //found exact
                    if (diff == 0)
                    {
                        return(lines[i]);
                    }

                    if (diff < bestdiff && diff < 4)
                    {
                        bestdiff = diff;
                        best     = lines[i];
                    }
                }
            }


            return(best);
        }
コード例 #3
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Gets closest valid code address. </summary>
        ///
        /// <remarks> 18/09/2018. </remarks>
        ///
        /// <param name="addr"> The address. </param>
        /// <param name="bank"> The bank. </param>
        ///
        /// <returns> The closest valid code address. </returns>
        /// -------------------------------------------------------------------------------------------------
        private LineData _GetCloestValidCodeAddress(int addr, int bank)
        {
            int longaddr = NextAddress.MakeLongAddress(bank, addr);


            LineData best     = null;
            int      bestdiff = int.MaxValue;


            if (lines.Count <= 0)
            {
                return(null);
            }


            for (int i = 0; i < lines.Count - 1; i++)
            {
                int diff = Math.Abs(lines[i].nextAddress.GetLongAddress() - longaddr);
                //found exact
                if (diff == 0)
                {
                    return(lines[i]);
                }

                if (diff < bestdiff && diff < 4)
                {
                    bestdiff = diff;
                    best     = lines[i];
                }
            }


            return(best);
        }
コード例 #4
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);
                    }
                }
            }
        }
コード例 #5
0
        // -------------------------------------------------------------------------------------------------
        // Updates the dism window
        // -------------------------------------------------------------------------------------------------
        public void UpdateDismWindow()
        {
            int maxlines = DisasmCodeFile.codefile.codewindow.LinesOnScreen;

            Console.WriteLine("vis" + maxlines);

            int currentline = DisasmCodeFile.codefile.codewindow.FirstVisibleLine;

            //stop scroll off top
            int fl = (MainForm.myDisassembly.DissasemblyLinesPC - (maxlines / 2) + DisOffset);

            if (fl < 0)
            {
                DisOffset -= fl;
                fl         = 0;
            }

            if ((fl + maxlines) >= MainForm.myDisassembly.DissasemblyLines.Count)
            {
                DisOffset -= ((fl + maxlines) - MainForm.myDisassembly.DissasemblyLines.Count);
            }


            int FirstLine = Math.Max(0, MainForm.myDisassembly.DissasemblyLinesPC - (maxlines / 2) + DisOffset);

            string codetext = MainForm.myDisassembly.GetDissasemblySource(ref DisasmCodeFile, maxlines, FirstLine);

            if (DisasmCodeFile.codefile.codewindow.Text == codetext)
            {
                return;
            }

            DisasmCodeFile.codefile.codewindow.ReadOnly = false;
            DisasmCodeFile.codefile.codewindow.Text     = codetext;
            DisasmCodeFile.codefile.codewindow.ReadOnly = true;

            UpdateMarginAddress(DisasmCodeFile);

            //update disassembly
            int pc     = MainForm.myNewRegisters.GetRegisterValueint(Registers.Z80Register.pc);
            int nextpc = MainForm.myDisassembly.GetStepAddress();
            int bank   = MainForm.banks[TraceFile.GetBankIndex(pc)];

            SetDismPC(nextpc, pc, bank);
            DisasmCodeFile.codefile.codewindow.FirstVisibleLine = currentline;


            //Update Breakpoints
            foreach (BreakpointDisplay bp in BreakpointDisplayList)
            {
                LineData ld = DisasmCodeFile.DoesFileHaveAddress(bp.nextAddress.GetAddr(), bp.nextAddress.GetBank());

                DisasmCodeFile.codefile.codewindow.Lines[ld.lineNumber].MarkerAdd(BREAKPOINT_MARKER);
            }
        }
コード例 #6
0
        // -------------------------------------------------------------------------------------------------
        // Removes the break point display described by bd
        //
        // \param   bd  The bd.
        // -------------------------------------------------------------------------------------------------
        private void RemoveBreakPointDisplay(BreakpointDisplay bd)
        {
            LineData lineData = TraceFile.GetLineDatafromAddr(bd.nextAddress);

            if (lineData != null)
            {
                lineData.tf.codefile.codewindow.Lines[lineData.lineNumber].MarkerDelete(BREAKPOINT_MARKER);
            }

            BreakpointDisplayList.Remove(bd);
        }
コード例 #7
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());
                    }
                }
            }
        }
コード例 #8
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");
        }
コード例 #9
0
        // -------------------------------------------------------------------------------------------------
        // Gets line datafrom address
        //
        // \param   na  The na.
        //
        // \return  The line datafrom address.
        // -------------------------------------------------------------------------------------------------
        public static LineData GetLineDatafromAddr(NextAddress na)
        {
            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(na.GetAddr(), na.GetBank());
                if (ld != null)
                {
                    return(ld);
                }
            }

            return(null);
        }
コード例 #10
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Gets cloest valid code address. </summary>
        ///
        /// <remarks> 18/09/2018. </remarks>
        ///
        /// <param name="addr"> The address. </param>
        /// <param name="bank"> The bank. </param>
        ///
        /// <returns> The cloest valid code address. </returns>
        /// -------------------------------------------------------------------------------------------------
        public static int GetCloestValidCodeAddress(int address)
        {
            int bank = MainForm.banks[GetBankIndex(address)];

            foreach (TraceFile t in traceFiles)
            {
                LineData l = t._GetCloestValidCodeAddress(address, bank);
                if (l != null)
                {
                    return(l.address);
                }
            }

            return(-1);
        }
コード例 #11
0
        // -------------------------------------------------------------------------------------------------
        // Focus address
        //
        // \param   addr    The address.
        // \param   bank    The bank.
        // -------------------------------------------------------------------------------------------------
        public static void FocusAddr(int addr, int bank)
        {
            if (traceFiles == null)
            {
                return;
            }

            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(addr, bank);
                if (ld != null)
                {
                    MainForm.sourceCodeView.UpdateMarginAddress(t);
                    MainForm.mySourceWindow.FocusLine(t.codefile, ld.lineNumber);
                }
            }
        }
コード例 #12
0
        public static void GotoLabel(Labels.Label l)
        {
            if (traceFiles == null)
            {
                return;
            }


            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(l.address, l.bank);
                if (ld != null)
                {
                    var line = t.codefile.codewindow.Lines[CurrentExecuteLine];

                    MainForm.mySourceWindow.FocusLine(t.codefile, ld.lineNumber);
                }
            }
        }
コード例 #13
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Sets a PC. </summary>
        ///
        /// <remarks> 06/09/2018. </remarks>
        ///
        /// <param name="pc"> The PC. </param>
        /// -------------------------------------------------------------------------------------------------
        public static void SetPC(int pc, int bank, bool focus = false)
        {
            if (CurrentExecuteFile != null)
            {
                if (CurrentExecuteFile.codefile != null && CurrentExecuteFile.codefile.codewindow != null)
                {
                    Line line = CurrentExecuteFile.codefile.codewindow.Lines[CurrentExecuteLine];
                    if (line != null)
                    {
                        line.MarkerDelete(SourceCodeView.EXECUTE_MARKER);
                    }
                }
                CurrentExecuteFile = null;
                CurrentExecuteLine = 0;
            }

            if (traceFiles == null)
            {
                return;
            }



            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(pc, bank);
                if (ld != null)
                {
                    MainForm.sourceCodeView.UpdateMarginAddress(t);

                    CurrentExecuteFile = t;
                    CurrentExecuteLine = ld.lineNumber;
                    Line line = t.codefile.codewindow.Lines[CurrentExecuteLine];
                    line.MarkerAdd(SourceCodeView.EXECUTE_MARKER);


                    if (focus)
                    {
                        MainForm.mySourceWindow.FocusLine(t.codefile, ld.lineNumber);
                    }
                }
            }
        }
コード例 #14
0
        public static void GotoLine(int pc)
        {
            if (traceFiles == null)
            {
                return;
            }


            int bank = MainForm.banks[GetBankIndex(pc)];



            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(pc, bank);
                if (ld != null)
                {
                    var line = t.codefile.codewindow.Lines[CurrentExecuteLine];

                    MainForm.mySourceWindow.FocusLine(t.codefile, ld.lineNumber);
                }
            }
        }
コード例 #15
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Does file have address. </summary>
        ///
        /// <remarks> 05/09/2018. </remarks>
        ///
        /// <param name="addr"> The address. </param>
        ///
        /// <returns> A LineData. </returns>
        /// -------------------------------------------------------------------------------------------------
        public LineData DoesFileHaveAddress(int addr, int bank)
        {
            LineData best = null;

            //uint diff = uint.MaxValue;

            if (lines.Count <= 0)
            {
                return(null);
            }


            for (int i = 0; i < lines.Count - 1; i++)
            {
                if (lines[i].address == addr && lines[i].bank == bank)                 // && lines[ i+1 ].address > addr)
                {
                    return(lines[i]);
                }
            }



            return(null);
        }
コード例 #16
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;
                }
            }
        }
コード例 #17
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);
                    }
                }
            }
        }
コード例 #18
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");
 *
 *                                      }
 *
 *                              }
 *
 *
 *
 *                      }*/
        }
コード例 #19
0
        /// -------------------------------------------------------------------------------------------------
        /// <summary> Sets a PC. </summary>
        ///
        /// <remarks> 06/09/2018. </remarks>
        ///
        /// <param name="pc"> The PC. </param>
        /// -------------------------------------------------------------------------------------------------
        public static void SetPC(int pc, bool focus = false)
        {
            if (CurrentExecuteFile != null)
            {
                if (CurrentExecuteFile.codefile != null && CurrentExecuteFile.codefile.codewindow != null)
                {
                    Line line = CurrentExecuteFile.codefile.codewindow.Lines[CurrentExecuteLine];
                    if (line != null)
                    {
                        line.MarkerDelete(SourceCodeView.EXECUTE_MARKER);
                    }
                }
                CurrentExecuteFile = null;
                CurrentExecuteLine = 0;
            }

            if (traceFiles == null)
            {
                return;
            }


            int bank = MainForm.banks[GetBankIndex(pc)];

            foreach (TraceFile t in traceFiles)
            {
                LineData ld = t.DoesFileHaveAddress(pc, bank);
                if (ld != null)
                {
                    CurrentExecuteFile = t;
                    CurrentExecuteLine = ld.lineNumber;
                    var line = t.codefile.codewindow.Lines[CurrentExecuteLine];
                    line.MarkerAdd(SourceCodeView.EXECUTE_MARKER);


                    if (focus)
                    {
                        MainForm.mySourceWindow.FocusLine(t.codefile, ld.lineNumber);
                    }
                }
            }



/*			if (CurrentExecuteLine>=0)
 *                      {
 *                              Section s = FindSection(CurrentExecuteSection);
 *                              CodeFile cf = GetCodeFileFromSection(CurrentExecuteSection);
 *
 *                              var line = cf.codewindow.Lines[CurrentExecuteLine];
 *                              line.MarkerDelete(EXECUTE_MARKER);
 *
 *                              CurrentExecuteLine = -1;
 *                      }
 *
 *
 *
 *                      foreach (Section s in Sections)
 *                      {
 *                              LineData ld = s.DoesSectionHaveAddress(address);
 *                              if (ld != null)
 *                              {
 *                                      CodeFile cf = GetCodeFileFromSection(s.section);
 *
 *                                      var line = cf.codewindow.Lines[(int)ld.lineNumber];
 *                                      line.MarkerAdd(EXECUTE_MARKER);
 *
 *                                      CurrentExecuteLine = (int)ld.lineNumber;
 *                                      CurrentExecuteSection = s.section;
 *
 *                                      Console.WriteLine("Focus Line!");
 *                                      Form1.Instance.SourceTab.SelectedTab = cf.tab;
 *                                      cf.codewindow.Lines[(int)ld.lineNumber].EnsureVisible();
 *
 *                                      int linesOnScreen = cf.codewindow.LinesOnScreen - 2; // Fudge factor
 *
 *                                      int linenum = (int)ld.lineNumber;
 *                                      var start = cf.codewindow.Lines[linenum - (linesOnScreen / 2)].Position;
 *                                      var end = cf.codewindow.Lines[linenum + (linesOnScreen / 2)].Position;
 *
 *                                      cf.codewindow.ScrollRange(start, end);
 *
 *                                      //Form1.Instance.FocusOnFile(s, ld.lineNumber);
 *
 *                                      return;
 *                              }
 *                      }*/
        }