// ------------------------------------------------------------------------------------------------- // 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); } }
/// ------------------------------------------------------------------------------------------------- /// <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); }
/// ------------------------------------------------------------------------------------------------- /// <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); }
/// ------------------------------------------------------------------------------------------------- /// <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); } } } }
// ------------------------------------------------------------------------------------------------- // 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); } }
// ------------------------------------------------------------------------------------------------- // 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); }
/// ------------------------------------------------------------------------------------------------- /// <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()); } } } }
/// ------------------------------------------------------------------------------------------------- /// <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"); }
// ------------------------------------------------------------------------------------------------- // 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); }
/// ------------------------------------------------------------------------------------------------- /// <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); }
// ------------------------------------------------------------------------------------------------- // 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); } } }
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); } } }
/// ------------------------------------------------------------------------------------------------- /// <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); } } } }
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); } } }
/// ------------------------------------------------------------------------------------------------- /// <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); }
/// ------------------------------------------------------------------------------------------------- /// <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; } } }
/// ------------------------------------------------------------------------------------------------- /// <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); } } } }
/// ------------------------------------------------------------------------------------------------- /// <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"); * * } * * } * * * * }*/ }
/// ------------------------------------------------------------------------------------------------- /// <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; * } * }*/ }