From 55fd25d01a54da0c54644ae59053f6ebda308484 Mon Sep 17 00:00:00 2001 From: tudnai Date: Thu, 24 Nov 2022 08:22:45 -0800 Subject: [PATCH] BugFix: Disassembly Scrolling & Highlighting --- .../xcdebugger/Expressions.xcexplist | 21 +++++++- .../xcshareddata/xcschemes/Debug.xcscheme | 8 --- A2Mac/DebuggerViewController.swift | 52 ++++++++++++------- A2Mac/DebuggerWindowController.swift | 7 ++- A2Mac/ViewController.swift | 43 +++++++++++---- 5 files changed, 86 insertions(+), 45 deletions(-) diff --git a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist index 377229b..364901f 100644 --- a/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/A2Mac.xcodeproj/project.xcworkspace/xcuserdata/trudnai.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -490,6 +490,14 @@ + + + + + + @@ -994,13 +1002,16 @@ contextName = "DebuggerViewController.DisplayDisassembly(scrollY:):DebuggerViewController.swift"> + value = "disassLineRange"> + value = "m6502.PC"> + + @@ -1008,6 +1019,12 @@ + + + + - - - - 0 { if let lineRange = getLineRange(disassLineRange, forLine: highlighted_line_number) { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { - if let layoutManager = view.layoutManager { + if let layoutManager = view.layoutManager { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.03, execute: { layoutManager.removeTemporaryAttribute(NSAttributedString.Key.backgroundColor, forCharacterRange: lineRange) layoutManager.removeTemporaryAttribute(NSAttributedString.Key.foregroundColor, forCharacterRange: lineRange) - } - }) + }) + } } } + highlighted_line_number = 0 } @@ -518,11 +519,21 @@ N V - B D I Z C var disassLineRange = [LineRange_t]() + + func TrunDisassAddressPC(_ on: NSControl.StateValue = .on) { + if let disassAddressPC = DisassAddressPC { + disassAddressPC.state = on + } + } + + func DisplayDisassembly( scrollY : CGFloat = -1 ) { var disass = "" // String(repeating: "\n", count: 0x1800) var loc = 0 - remove_highlight(view: Disass_Display) + if cpuState == cpuState_running { + remove_highlight(view: Disass_Display) + } line_number = 0 @@ -575,6 +586,14 @@ N V - B D I Z C addr_line.updateValue(line_number, forKey: m6502.PC) let isCurrentLine = m6502.PC == m6502_saved.PC + if isCurrentLine { +// line = invertLine(line: line) + highlighted_line_number = line_number + } + + if m6502.PC == disass_addr_pc { + scroll_line_number = line_number + } m6502_Disass_1_Instr() @@ -585,14 +604,6 @@ N V - B D I Z C disassLineRange.append(lineRange) loc += len - if isCurrentLine { - // line = invertLine(line: line) - highlighted_line_number = line_number - } - if m6502.PC == disass_addr_pc { - scroll_line_number = line_number - } - disass += line + "\n" } @@ -604,6 +615,7 @@ N V - B D I Z C // let isEmpty = self.Disass_Display.string.isEmpty if need_disass { self.Disass_Display.string = disass // + String(repeating: "\n", count: 0x8000) + self.Disass_Display.scroll(CGPoint.zero) // self.testTextField(str: "") } @@ -635,10 +647,12 @@ N V - B D I Z C func UpdateImmediately() { - DisplayRegisters() - DisplayStack() - DisplayMemory() - DisplayDisassembly() + DispatchQueue.main.async { + self.DisplayRegisters() + self.DisplayStack() + self.DisplayMemory() + self.DisplayDisassembly() + } } @@ -646,9 +660,7 @@ N V - B D I Z C func Update() { if self.UpdateSemaphore.wait(timeout: .now()) == .success { if Disass_Display != nil { - DispatchQueue.global().async { - self.UpdateImmediately() - } + self.UpdateImmediately() } self.UpdateSemaphore.signal() } diff --git a/A2Mac/DebuggerWindowController.swift b/A2Mac/DebuggerWindowController.swift index 99b83e6..8fb810b 100644 --- a/A2Mac/DebuggerWindowController.swift +++ b/A2Mac/DebuggerWindowController.swift @@ -112,8 +112,6 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate { } - - func Continue() { PauseButtonUpdate() @@ -190,8 +188,9 @@ class DebuggerWindowController: NSWindowController, NSWindowDelegate { m6502_Step_dbg() // TODO: This should be in Debugger! - if let debugger = DebuggerViewController.shared { - debugger.Update() + if let debuggerViewController = DebuggerViewController.shared { + debuggerViewController.remove_highlight(view: debuggerViewController.Disass_Display, line: debuggerViewController.highlighted_line_number) + debuggerViewController.Update() } // TODO: Update Screen and speaker etc diff --git a/A2Mac/ViewController.swift b/A2Mac/ViewController.swift index 8dbb3be..c332d61 100644 --- a/A2Mac/ViewController.swift +++ b/A2Mac/ViewController.swift @@ -339,7 +339,34 @@ class ViewController: NSViewController { } + func debuggerShowWindow() { + if let debuggerWindowController = DebuggerWindowController.shared { + DispatchQueue.main.async { + debuggerWindowController.showWindow(self) + } + } + } + + + func debuggerRemoveHighlight() { + if let debuggerViewController = DebuggerViewController.shared { + debuggerViewController.remove_highlight(view: debuggerViewController.Disass_Display, line: debuggerViewController.highlighted_line_number) + } + } + + + func debuggerPauseUpdate() { + if let debuggerViewController = DebuggerViewController.shared { + debuggerViewController.TrunDisassAddressPC(.on) + debuggerViewController.remove_highlight(view: debuggerViewController.Disass_Display, line: debuggerViewController.highlighted_line_number) + debuggerViewController.Update() + } + } + + func Resume() { + debuggerRemoveHighlight() + #if SCHEDULER_CVDISPLAYLINK CVDisplayLinkStart(displayLink!) #else @@ -370,6 +397,8 @@ class ViewController: NSViewController { if let debugger = DebuggerWindowController.shared { debugger.PauseButtonUpdate() } + + debuggerPauseUpdate() } @@ -1265,20 +1294,12 @@ class ViewController: NSViewController { func debugBreak() { Pause() - - // TODO: This should be in Debugger! - if let debugger = DebuggerViewController.shared { - debugger.Update() - } - if let debugger = DebuggerWindowController.shared { - DispatchQueue.main.async { - debugger.showWindow(self) - } - } - spkr_play_disk_motor_time = 0 spkr_stopAll() + // TODO: This should be in Debugger! + debuggerPauseUpdate() + debuggerShowWindow() }