2015-07-01 23:17:14 -04:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.Data ;
using System.Drawing ;
using System.Drawing.Text ;
using System.IO ;
using System.Linq ;
using System.Text ;
using System.Threading.Tasks ;
using System.Windows.Forms ;
2016-06-04 14:43:13 -04:00
using Mesen.GUI.Config ;
2016-12-09 00:12:38 -05:00
using Mesen.GUI.Debugger.Controls ;
2016-01-10 19:56:40 -05:00
using Mesen.GUI.Forms ;
2016-12-18 12:43:20 -05:00
using Mesen.GUI.Controls ;
2015-07-01 23:17:14 -04:00
namespace Mesen.GUI.Debugger
{
2016-01-10 19:56:40 -05:00
public partial class frmDebugger : BaseForm
2015-07-01 23:17:14 -04:00
{
2015-08-08 22:36:39 -04:00
private List < Form > _childForms = new List < Form > ( ) ;
2016-11-27 19:43:17 -05:00
private bool _debuggerInitialized = false ;
2016-12-04 09:37:01 -05:00
private bool _firstBreak = true ;
2016-11-27 19:43:17 -05:00
2015-08-05 20:40:10 -04:00
private InteropEmu . NotificationListener _notifListener ;
private ctrlDebuggerCode _lastCodeWindow ;
2016-09-03 21:52:59 -04:00
private frmTraceLogger _traceLogger ;
2016-11-23 23:46:01 -05:00
private DebugWorkspace _workspace ;
2015-07-01 23:17:14 -04:00
public frmDebugger ( )
{
InitializeComponent ( ) ;
}
protected override void OnLoad ( EventArgs e )
{
base . OnLoad ( e ) ;
2017-03-24 15:11:38 -04:00
if ( Program . IsMono ) {
//This doesn't work in Mono (menu is blank) - hide it for now
mnuCode . Visible = false ;
}
2015-07-01 23:17:14 -04:00
2016-11-26 17:48:11 -05:00
ctrlConsoleStatus . OnStateChanged + = ctrlConsoleStatus_OnStateChanged ;
2016-11-23 23:46:01 -05:00
LabelManager . OnLabelUpdated + = LabelManager_OnLabelUpdated ;
BreakpointManager . BreakpointsChanged + = BreakpointManager_BreakpointsChanged ;
2016-12-09 00:12:38 -05:00
ctrlProfiler . OnFunctionSelected + = ctrlProfiler_OnFunctionSelected ;
2016-11-23 23:46:01 -05:00
this . UpdateWorkspace ( ) ;
2016-12-01 21:43:32 -05:00
this . AutoLoadDbgFile ( true ) ;
2016-11-23 23:46:01 -05:00
2016-06-25 22:06:22 -04:00
this . mnuSplitView . Checked = ConfigManager . Config . DebugInfo . SplitView ;
this . mnuPpuPartialDraw . Checked = ConfigManager . Config . DebugInfo . PpuPartialDraw ;
2016-11-19 19:21:28 -05:00
this . mnuShowEffectiveAddresses . Checked = ConfigManager . Config . DebugInfo . ShowEffectiveAddresses ;
2016-09-04 18:08:16 -04:00
this . mnuShowCpuMemoryMapping . Checked = ConfigManager . Config . DebugInfo . ShowCpuMemoryMapping ;
this . mnuShowPpuMemoryMapping . Checked = ConfigManager . Config . DebugInfo . ShowPpuMemoryMapping ;
2016-11-21 22:34:47 -05:00
this . mnuShowOnlyDisassembledCode . Checked = ConfigManager . Config . DebugInfo . ShowOnlyDisassembledCode ;
2016-11-27 19:43:17 -05:00
this . mnuHighlightUnexecutedCode . Checked = ConfigManager . Config . DebugInfo . HighlightUnexecutedCode ;
2016-12-01 21:43:32 -05:00
this . mnuAutoLoadDbgFiles . Checked = ConfigManager . Config . DebugInfo . AutoLoadDbgFiles ;
2016-12-08 19:34:43 -05:00
this . mnuBreakOnReset . Checked = ConfigManager . Config . DebugInfo . BreakOnReset ;
2016-12-04 09:37:01 -05:00
this . mnuBreakOnOpen . Checked = ConfigManager . Config . DebugInfo . BreakOnOpen ;
2017-03-04 16:18:28 -05:00
this . mnuBreakOnUnofficialOpcodes . Checked = ConfigManager . Config . DebugInfo . BreakOnUnofficialOpcodes ;
this . mnuBreakOnBrk . Checked = ConfigManager . Config . DebugInfo . BreakOnBrk ;
2016-12-04 11:16:44 -05:00
this . mnuDisplayOpCodesInLowerCase . Checked = ConfigManager . Config . DebugInfo . DisplayOpCodesInLowerCase ;
2016-12-05 23:35:07 -05:00
this . mnuDisassembleVerifiedCodeOnly . Checked = ConfigManager . Config . DebugInfo . DisassemblyType = = DisassemblyType . VerifiedCode ;
this . mnuDisassembleEverything . Checked = ConfigManager . Config . DebugInfo . DisassemblyType = = DisassemblyType . Everything ;
this . mnuDisassembleEverythingButData . Checked = ConfigManager . Config . DebugInfo . DisassemblyType = = DisassemblyType . EverythingButData ;
2017-06-29 13:47:49 -04:00
this . mnuRefreshWatchWhileRunning . Checked = ConfigManager . Config . DebugInfo . RefreshWatchWhileRunning ;
2016-11-21 22:34:47 -05:00
2016-12-06 22:50:27 -05:00
if ( ConfigManager . Config . DebugInfo . WindowWidth > - 1 ) {
this . Width = ConfigManager . Config . DebugInfo . WindowWidth ;
this . Height = ConfigManager . Config . DebugInfo . WindowHeight ;
}
2016-12-04 09:43:43 -05:00
ctrlCpuMemoryMapping . Visible = mnuShowCpuMemoryMapping . Checked ;
ctrlPpuMemoryMapping . Visible = mnuShowPpuMemoryMapping . Checked ;
2016-12-06 22:50:27 -05:00
if ( ConfigManager . Config . DebugInfo . LeftPanelWidth > 0 ) {
this . ctrlSplitContainerTop . SplitterDistance = ConfigManager . Config . DebugInfo . LeftPanelWidth ;
}
if ( ConfigManager . Config . DebugInfo . TopPanelHeight > 0 ) {
this . splitContainer . SplitterDistance = ConfigManager . Config . DebugInfo . TopPanelHeight ;
}
if ( ! ConfigManager . Config . DebugInfo . ShowRightPanel ) {
ctrlSplitContainerTop . CollapsePanel ( ) ;
2016-12-06 23:22:33 -05:00
} else {
mnuShowFunctionLabelLists . Checked = true ;
2016-12-06 22:50:27 -05:00
}
if ( ! ConfigManager . Config . DebugInfo . ShowBottomPanel ) {
splitContainer . CollapsePanel ( ) ;
2016-12-06 23:22:33 -05:00
} else {
mnuShowBottomPanel . Checked = true ;
2016-11-26 20:58:27 -05:00
}
2016-06-25 22:06:22 -04:00
_lastCodeWindow = ctrlDebuggerCode ;
this . ctrlDebuggerCode . SetConfig ( ConfigManager . Config . DebugInfo . LeftView ) ;
this . ctrlDebuggerCodeSplit . SetConfig ( ConfigManager . Config . DebugInfo . RightView ) ;
this . toolTip . SetToolTip ( this . picWatchHelp ,
"Most expressions/operators are accepted (C++ syntax)." + Environment . NewLine +
2016-11-22 18:28:59 -05:00
"Note: Use the $ prefix to denote hexadecimal values." + Environment . NewLine +
"Note 2: Labels assigned to the code can be used (their value will match the label's address in CPU memory)." + Environment . NewLine + Environment . NewLine +
2016-06-25 22:06:22 -04:00
"A/X/Y/PS/SP: Value of registers" + Environment . NewLine +
2017-04-30 20:40:09 -04:00
"PC: Program Counter" + Environment . NewLine +
"OpPC: Address of the current instruction's first byte" + Environment . NewLine +
2016-06-25 22:06:22 -04:00
"Irq/Nmi: True if the Irq/Nmi flags are set" + Environment . NewLine +
"Cycle/Scanline: Current cycle (0-340)/scanline(-1 to 260) of the PPU" + Environment . NewLine +
2017-04-30 20:40:09 -04:00
"Frame: PPU frame number (since power on/reset)" + Environment . NewLine +
2016-06-25 22:06:22 -04:00
"Value: Current value being read/written from/to memory" + Environment . NewLine +
2016-11-22 16:56:23 -05:00
"[<address>]: (Byte) Memory value at <address> (CPU)" + Environment . NewLine +
"{<address>}: (Word) Memory value at <address> (CPU)" + Environment . NewLine + Environment . NewLine +
2016-06-25 22:06:22 -04:00
"Examples:" + Environment . NewLine +
"a == 10 || x == $23" + Environment . NewLine +
"scanline == 10 && (cycle >= 55 && cycle <= 100)" + Environment . NewLine +
"x == [$150] || y == [10]" + Environment . NewLine +
2016-12-04 10:29:36 -05:00
"[[$15] + y] -> Reads the value at address $15, adds Y to it and reads the value at the resulting address." + Environment . NewLine +
2016-11-22 16:56:23 -05:00
"{$FFFA} -> Returns the NMI handler's address."
2016-06-25 22:06:22 -04:00
) ;
2015-07-01 23:17:14 -04:00
_notifListener = new InteropEmu . NotificationListener ( ) ;
_notifListener . OnNotification + = _notifListener_OnNotification ;
InteropEmu . DebugInitialize ( ) ;
2016-11-27 19:43:17 -05:00
_debuggerInitialized = true ;
2016-12-04 09:37:01 -05:00
//Pause a few frames later to give the debugger a chance to disassemble some code
_firstBreak = true ;
2016-01-26 16:47:21 -05:00
InteropEmu . DebugStep ( 30000 ) ;
2015-08-17 19:32:10 -04:00
UpdateCdlRatios ( ) ;
tmrCdlRatios . Start ( ) ;
2017-03-04 22:24:41 -05:00
mnuSaveRom . Enabled = InteropEmu . GetRomInfo ( ) . Format = = RomFormat . iNes ;
2015-08-17 19:32:10 -04:00
}
2017-06-29 13:55:12 -04:00
protected override void OnActivated ( EventArgs e )
{
base . OnActivated ( e ) ;
if ( ConfigManager . Config . DebugInfo . BreakOnDebuggerFocus ) {
InteropEmu . DebugStep ( 1 ) ;
}
}
2016-12-09 00:12:38 -05:00
private void ctrlProfiler_OnFunctionSelected ( object sender , EventArgs e )
{
int relativeAddress = InteropEmu . DebugGetRelativeAddress ( ( UInt32 ) sender , AddressType . PrgRom ) ;
if ( relativeAddress > = 0 ) {
BringToFront ( ) ;
_lastCodeWindow . ScrollToLineNumber ( relativeAddress ) ;
}
}
2016-12-01 21:43:32 -05:00
private void AutoLoadDbgFile ( bool silent )
{
if ( ConfigManager . Config . DebugInfo . AutoLoadDbgFiles ) {
2017-07-30 09:03:54 -04:00
string dbgPath = Path . Combine ( ConfigManager . Config . RecentFiles [ 0 ] . RomFile . Folder , Path . GetFileNameWithoutExtension ( ConfigManager . Config . RecentFiles [ 0 ] . RomFile . FileName ) + ".dbg" ) ;
2016-12-01 21:43:32 -05:00
if ( File . Exists ( dbgPath ) ) {
Ld65DbgImporter dbgImporter = new Ld65DbgImporter ( ) ;
dbgImporter . Import ( dbgPath , silent ) ;
}
}
}
2016-11-24 00:18:07 -05:00
private void SaveWorkspace ( )
2016-11-23 23:46:01 -05:00
{
if ( _workspace ! = null ) {
2017-03-02 20:33:25 -05:00
_workspace . WatchValues = WatchManager . WatchEntries ;
2016-11-23 23:46:01 -05:00
_workspace . Labels = LabelManager . GetLabels ( ) ;
_workspace . Breakpoints = BreakpointManager . Breakpoints ;
_workspace . Save ( ) ;
}
2016-11-24 00:18:07 -05:00
}
2016-11-23 23:46:01 -05:00
2016-11-24 00:18:07 -05:00
private void UpdateWorkspace ( )
{
SaveWorkspace ( ) ;
2016-11-23 23:46:01 -05:00
_workspace = DebugWorkspace . GetWorkspace ( ) ;
LabelManager . OnLabelUpdated - = LabelManager_OnLabelUpdated ;
if ( _workspace . Labels . Count = = 0 ) {
LabelManager . ResetLabels ( ) ;
2016-12-04 09:43:43 -05:00
if ( ! ConfigManager . Config . DebugInfo . DisableDefaultLabels ) {
LabelManager . SetDefaultLabels ( InteropEmu . FdsGetSideCount ( ) > 0 ) ;
}
2016-11-23 23:46:01 -05:00
} else {
2016-11-25 21:05:07 -05:00
LabelManager . ResetLabels ( ) ;
2016-11-23 23:46:01 -05:00
LabelManager . SetLabels ( _workspace . Labels ) ;
}
LabelManager . OnLabelUpdated + = LabelManager_OnLabelUpdated ;
2016-11-26 14:15:50 -05:00
ctrlLabelList . UpdateLabelList ( ) ;
ctrlFunctionList . UpdateFunctionList ( true ) ;
2017-03-02 20:33:25 -05:00
WatchManager . WatchEntries = _workspace . WatchValues ;
2016-11-23 23:46:01 -05:00
BreakpointManager . Breakpoints . Clear ( ) ;
BreakpointManager . Breakpoints . AddRange ( _workspace . Breakpoints ) ;
ctrlBreakpoints . RefreshList ( ) ;
}
2015-08-17 19:32:10 -04:00
private void UpdateCdlRatios ( )
{
CdlRatios ratios = new CdlRatios ( ) ;
InteropEmu . DebugGetCdlRatios ( ref ratios ) ;
lblPrgAnalysisResult . Text = string . Format ( "{0:0.00}% (Code: {1:0.00}%, Data: {2:0.00}%, Unknown: {3:0.00}%)" , ratios . PrgRatio * 100 , ratios . CodeRatio * 100 , ratios . DataRatio * 100 , ( 1 - ratios . PrgRatio ) * 100 ) ;
if ( ratios . ChrRatio > = 0 ) {
lblChrAnalysisResult . Text = string . Format ( "{0:0.00}% (Drawn: {1:0.00}%, Read: {2:0.00}%, Unknown: {3:0.00}%)" , ratios . ChrRatio * 100 , ratios . ChrDrawnRatio * 100 , ratios . ChrReadRatio * 100 , ( 1 - ratios . ChrRatio ) * 100 ) ;
} else {
lblChrAnalysisResult . Text = "N/A (CHR RAM)" ;
}
2015-07-01 23:17:14 -04:00
}
2016-11-19 19:21:28 -05:00
private void UpdateDebuggerFlags ( )
{
DebuggerFlags flags = mnuPpuPartialDraw . Checked ? DebuggerFlags . PpuPartialDraw : DebuggerFlags . None ;
if ( mnuShowEffectiveAddresses . Checked ) {
flags | = DebuggerFlags . ShowEffectiveAddresses ;
}
2016-11-21 22:34:47 -05:00
if ( mnuShowOnlyDisassembledCode . Checked ) {
flags | = DebuggerFlags . ShowOnlyDisassembledCode ;
}
2016-12-04 11:16:44 -05:00
if ( mnuDisplayOpCodesInLowerCase . Checked ) {
flags | = DebuggerFlags . DisplayOpCodesInLowerCase ;
}
2016-12-05 23:35:07 -05:00
if ( mnuDisassembleEverything . Checked ) {
flags | = DebuggerFlags . DisassembleEverything ;
} else if ( mnuDisassembleEverythingButData . Checked ) {
flags | = DebuggerFlags . DisassembleEverythingButData ;
}
2017-03-04 16:18:28 -05:00
if ( mnuBreakOnUnofficialOpcodes . Checked ) {
flags | = DebuggerFlags . BreakOnUnofficialOpCode ;
}
if ( mnuBreakOnBrk . Checked ) {
flags | = DebuggerFlags . BreakOnBrk ;
}
2016-11-19 19:21:28 -05:00
InteropEmu . DebugSetFlags ( flags ) ;
}
2015-08-08 22:36:39 -04:00
private void _notifListener_OnNotification ( InteropEmu . NotificationEventArgs e )
2015-07-01 23:17:14 -04:00
{
2016-06-04 08:55:52 -04:00
switch ( e . NotificationType ) {
2017-06-29 13:47:49 -04:00
case InteropEmu . ConsoleNotificationType . PpuFrameDone :
if ( ConfigManager . Config . DebugInfo . RefreshWatchWhileRunning ) {
this . BeginInvoke ( ( MethodInvoker ) ( ( ) = > ctrlWatch . UpdateWatch ( ) ) ) ;
}
break ;
2016-06-04 08:55:52 -04:00
case InteropEmu . ConsoleNotificationType . CodeBreak :
this . BeginInvoke ( ( MethodInvoker ) ( ( ) = > UpdateDebugger ( ) ) ) ;
BreakpointManager . SetBreakpoints ( ) ;
break ;
case InteropEmu . ConsoleNotificationType . GameReset :
case InteropEmu . ConsoleNotificationType . GameLoaded :
2016-11-23 23:46:01 -05:00
this . BeginInvoke ( ( MethodInvoker ) ( ( ) = > {
2017-03-04 22:24:41 -05:00
mnuSaveRom . Enabled = InteropEmu . GetRomInfo ( ) . Format = = RomFormat . iNes ;
2016-11-23 23:46:01 -05:00
this . UpdateWorkspace ( ) ;
2016-12-01 21:43:32 -05:00
this . AutoLoadDbgFile ( true ) ;
2016-11-23 23:46:01 -05:00
UpdateDebugger ( ) ;
BreakpointManager . SetBreakpoints ( ) ;
2016-12-04 09:53:25 -05:00
if ( ! ConfigManager . Config . DebugInfo . BreakOnReset ) {
ClearActiveStatement ( ) ;
}
} ) ) ;
if ( ConfigManager . Config . DebugInfo . BreakOnReset ) {
InteropEmu . DebugStep ( 1 ) ;
}
2016-06-04 08:55:52 -04:00
break ;
2015-07-01 23:17:14 -04:00
}
}
private bool UpdateSplitView ( )
{
if ( mnuSplitView . Checked ) {
tlpTop . ColumnStyles [ 1 ] . SizeType = SizeType . Percent ;
2015-08-04 19:50:57 -04:00
tlpTop . ColumnStyles [ 0 ] . Width = 50f ;
2015-07-01 23:17:14 -04:00
tlpTop . ColumnStyles [ 1 ] . Width = 50f ;
2016-12-04 09:16:09 -05:00
this . MinimumSize = new Size ( 1250 , 725 ) ;
2015-07-01 23:17:14 -04:00
} else {
tlpTop . ColumnStyles [ 1 ] . SizeType = SizeType . Absolute ;
tlpTop . ColumnStyles [ 1 ] . Width = 0f ;
2016-12-04 09:16:09 -05:00
this . MinimumSize = new Size ( 1000 , 725 ) ;
2015-07-01 23:17:14 -04:00
}
2015-08-03 21:53:46 -04:00
ctrlDebuggerCodeSplit . Visible = mnuSplitView . Checked ;
2015-07-01 23:17:14 -04:00
return mnuSplitView . Checked ;
}
2016-11-21 22:43:59 -05:00
private void UpdateVectorAddresses ( )
{
2017-03-04 21:50:19 -05:00
int nmiHandler = InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFA ) | ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFB ) < < 8 ) ;
int resetHandler = InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFC ) | ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFD ) < < 8 ) ;
int irqHandler = InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFE ) | ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFF ) < < 8 ) ;
2016-11-21 22:43:59 -05:00
mnuGoToNmiHandler . Text = "NMI Handler ($" + nmiHandler . ToString ( "X4" ) + ")" ;
mnuGoToResetHandler . Text = "Reset Handler ($" + resetHandler . ToString ( "X4" ) + ")" ;
mnuGoToIrqHandler . Text = "IRQ Handler ($" + irqHandler . ToString ( "X4" ) + ")" ;
}
2016-11-21 22:34:47 -05:00
private void UpdateDebugger ( bool updateActiveAddress = true )
2015-07-01 23:17:14 -04:00
{
2016-11-27 19:43:17 -05:00
if ( ! _debuggerInitialized ) {
return ;
}
2016-11-26 14:15:50 -05:00
ctrlLabelList . UpdateLabelListAddresses ( ) ;
ctrlFunctionList . UpdateFunctionList ( false ) ;
2016-11-19 19:21:28 -05:00
UpdateDebuggerFlags ( ) ;
2016-11-21 22:43:59 -05:00
UpdateVectorAddresses ( ) ;
2016-11-19 19:21:28 -05:00
2017-03-10 18:35:01 -05:00
string newCode = InteropEmu . DebugGetCode ( ) ;
if ( newCode ! = null ) {
ctrlDebuggerCode . Code = newCode ;
}
2015-07-01 23:17:14 -04:00
DebugState state = new DebugState ( ) ;
InteropEmu . DebugGetState ( ref state ) ;
if ( UpdateSplitView ( ) ) {
2017-03-10 18:35:01 -05:00
if ( newCode ! = null | | ctrlDebuggerCodeSplit . Code = = null ) {
ctrlDebuggerCodeSplit . Code = ctrlDebuggerCode . Code ;
}
2015-07-01 23:17:14 -04:00
ctrlDebuggerCodeSplit . UpdateCode ( true ) ;
2015-08-02 19:27:02 -04:00
} else {
_lastCodeWindow = ctrlDebuggerCode ;
2015-07-01 23:17:14 -04:00
}
2016-11-26 14:15:50 -05:00
ctrlDebuggerCode . SetActiveAddress ( state . CPU . DebugPC ) ;
ctrlDebuggerCodeSplit . SetActiveAddress ( state . CPU . DebugPC ) ;
2016-11-21 22:34:47 -05:00
if ( updateActiveAddress ) {
2016-11-26 14:15:50 -05:00
_lastCodeWindow . SelectActiveAddress ( state . CPU . DebugPC ) ;
2016-11-21 22:34:47 -05:00
}
2016-11-26 14:15:50 -05:00
2016-11-27 19:43:17 -05:00
UpdateLineColors ( ) ;
2015-08-02 19:27:02 -04:00
2015-07-01 23:17:14 -04:00
ctrlConsoleStatus . UpdateStatus ( ref state ) ;
ctrlWatch . UpdateWatch ( ) ;
2015-08-09 14:47:27 -04:00
ctrlCallstack . UpdateCallstack ( ) ;
2015-08-21 22:42:44 -04:00
2016-09-04 18:08:16 -04:00
ctrlCpuMemoryMapping . UpdateCpuRegions ( state . Cartridge ) ;
ctrlPpuMemoryMapping . UpdatePpuRegions ( state . Cartridge ) ;
2015-08-21 22:42:44 -04:00
this . BringToFront ( ) ;
2015-07-01 23:17:14 -04:00
2016-12-04 09:37:01 -05:00
if ( _firstBreak & & ! ConfigManager . Config . DebugInfo . BreakOnOpen ) {
ResumeExecution ( ) ;
}
_firstBreak = false ;
}
2015-08-02 19:27:02 -04:00
private void ClearActiveStatement ( )
{
ctrlDebuggerCode . ClearActiveAddress ( ) ;
2015-08-09 20:47:50 -04:00
ctrlDebuggerCodeSplit . ClearActiveAddress ( ) ;
2016-11-27 19:43:17 -05:00
UpdateLineColors ( ) ;
2015-08-02 19:27:02 -04:00
}
2016-01-09 13:15:43 -05:00
private void ToggleBreakpoint ( bool toggleEnabled )
2015-07-01 23:17:14 -04:00
{
2016-01-10 00:33:33 -05:00
BreakpointManager . ToggleBreakpoint ( _lastCodeWindow . GetCurrentLine ( ) , toggleEnabled ) ;
2015-08-02 19:27:02 -04:00
}
2016-11-27 19:43:17 -05:00
private void UpdateLineColors ( )
2015-08-02 19:27:02 -04:00
{
2016-11-27 19:43:17 -05:00
ctrlDebuggerCodeSplit . UpdateLineColors ( ) ;
ctrlDebuggerCode . UpdateLineColors ( ) ;
2015-07-01 23:17:14 -04:00
}
2015-08-08 22:36:39 -04:00
private void OpenChildForm ( Form frm )
{
this . _childForms . Add ( frm ) ;
frm . FormClosed + = ( obj , args ) = > {
this . _childForms . Remove ( ( Form ) obj ) ;
} ;
2017-03-07 17:51:14 -05:00
frm . StartPosition = FormStartPosition . Manual ;
frm . Left = this . Left + this . Width / 2 - frm . Width / 2 ;
frm . Top = this . Top + this . Height / 2 - frm . Height / 2 ;
2015-08-08 22:36:39 -04:00
frm . Show ( ) ;
}
2016-12-04 09:37:01 -05:00
private void ResumeExecution ( )
2015-07-01 23:17:14 -04:00
{
2015-08-02 19:27:02 -04:00
ClearActiveStatement ( ) ;
2017-03-04 16:18:28 -05:00
UpdateDebuggerFlags ( ) ;
2015-07-01 23:17:14 -04:00
InteropEmu . DebugRun ( ) ;
}
2016-12-04 09:37:01 -05:00
private void mnuContinue_Click ( object sender , EventArgs e )
{
ResumeExecution ( ) ;
}
2015-07-01 23:17:14 -04:00
private void mnuToggleBreakpoint_Click ( object sender , EventArgs e )
{
2016-01-09 13:15:43 -05:00
ToggleBreakpoint ( false ) ;
}
private void mnuDisableEnableBreakpoint_Click ( object sender , EventArgs e )
{
ToggleBreakpoint ( true ) ;
2015-07-01 23:17:14 -04:00
}
private void mnuBreak_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2015-07-01 23:17:14 -04:00
InteropEmu . DebugStep ( 1 ) ;
}
private void mnuStepInto_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2015-07-01 23:17:14 -04:00
InteropEmu . DebugStep ( 1 ) ;
}
private void mnuStepOut_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2015-07-01 23:17:14 -04:00
InteropEmu . DebugStepOut ( ) ;
}
private void mnuStepOver_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2015-07-01 23:17:14 -04:00
InteropEmu . DebugStepOver ( ) ;
}
2017-08-01 22:49:50 -04:00
private void mnuStepBack_Click ( object sender , EventArgs e )
{
ctrlConsoleStatus . ApplyChanges ( ) ;
InteropEmu . DebugStepBack ( ) ;
}
2016-06-05 10:29:54 -04:00
private void mnuRunPpuCycle_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2016-06-05 10:29:54 -04:00
InteropEmu . DebugPpuStep ( 1 ) ;
}
private void mnuRunScanline_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2016-06-05 10:29:54 -04:00
InteropEmu . DebugPpuStep ( 341 ) ;
}
2015-07-01 23:17:14 -04:00
private void mnuRunOneFrame_Click ( object sender , EventArgs e )
{
2016-12-06 19:03:29 -05:00
ctrlConsoleStatus . ApplyChanges ( ) ;
2016-06-05 10:29:54 -04:00
InteropEmu . DebugPpuStep ( 89341 ) ;
2015-07-01 23:17:14 -04:00
}
2015-08-17 21:59:22 -04:00
private void ctrlDebuggerCode_OnSetNextStatement ( AddressEventArgs args )
{
UInt16 addr = ( UInt16 ) args . Address ;
InteropEmu . DebugSetNextStatement ( addr ) ;
this . UpdateDebugger ( ) ;
}
2015-07-01 23:17:14 -04:00
private void mnuFind_Click ( object sender , EventArgs e )
{
2015-08-03 21:53:46 -04:00
_lastCodeWindow . OpenSearchBox ( ) ;
}
private void mnuFindNext_Click ( object sender , EventArgs e )
{
_lastCodeWindow . FindNext ( ) ;
}
2015-07-01 23:17:14 -04:00
2015-08-03 21:53:46 -04:00
private void mnuFindPrev_Click ( object sender , EventArgs e )
{
_lastCodeWindow . FindPrevious ( ) ;
2015-07-01 23:17:14 -04:00
}
private void mnuSplitView_Click ( object sender , EventArgs e )
{
2016-06-04 14:43:13 -04:00
ConfigManager . Config . DebugInfo . SplitView = this . mnuSplitView . Checked ;
ConfigManager . ApplyChanges ( ) ;
2016-11-21 22:34:47 -05:00
UpdateDebugger ( false ) ;
2015-07-01 23:17:14 -04:00
}
2015-08-02 19:27:02 -04:00
private void mnuMemoryViewer_Click ( object sender , EventArgs e )
{
2017-02-26 19:18:01 -05:00
OpenChildForm ( new frmMemoryViewer ( ( ) = > { return _workspace ; } ) ) ;
2015-08-02 19:27:02 -04:00
}
2016-01-10 00:33:33 -05:00
private void BreakpointManager_BreakpointsChanged ( object sender , EventArgs e )
2015-08-02 19:27:02 -04:00
{
2016-11-27 19:43:17 -05:00
UpdateLineColors ( ) ;
2015-08-02 19:27:02 -04:00
}
private void ctrlDebuggerCode_Enter ( object sender , EventArgs e )
{
_lastCodeWindow = ctrlDebuggerCode ;
}
private void ctrlDebuggerCodeSplit_Enter ( object sender , EventArgs e )
{
_lastCodeWindow = ctrlDebuggerCodeSplit ;
}
2015-08-02 22:19:12 -04:00
2016-01-10 09:21:07 -05:00
private void mnuGoToAddress_Click ( object sender , EventArgs e )
2015-08-02 22:19:12 -04:00
{
_lastCodeWindow . GoToAddress ( ) ;
}
2015-08-04 19:50:57 -04:00
2016-01-10 09:21:07 -05:00
private void mnuGoToIrqHandler_Click ( object sender , EventArgs e )
{
2017-03-04 21:50:19 -05:00
int address = ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFF ) < < 8 ) | InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFE ) ;
2016-01-10 09:21:07 -05:00
_lastCodeWindow . ScrollToLineNumber ( address ) ;
}
private void mnuGoToNmiHandler_Click ( object sender , EventArgs e )
{
2017-03-04 21:50:19 -05:00
int address = ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFB ) < < 8 ) | InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFA ) ;
2016-01-10 09:21:07 -05:00
_lastCodeWindow . ScrollToLineNumber ( address ) ;
}
private void mnuGoToResetHandler_Click ( object sender , EventArgs e )
{
2017-03-04 21:50:19 -05:00
int address = ( InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFD ) < < 8 ) | InteropEmu . DebugGetMemoryValue ( DebugMemoryType . CpuMemory , 0xFFFC ) ;
2016-01-10 09:21:07 -05:00
_lastCodeWindow . ScrollToLineNumber ( address ) ;
}
2015-08-04 19:50:57 -04:00
private void mnuIncreaseFontSize_Click ( object sender , EventArgs e )
{
_lastCodeWindow . FontSize + + ;
}
private void mnuDecreaseFontSize_Click ( object sender , EventArgs e )
{
_lastCodeWindow . FontSize - - ;
}
private void mnuResetFontSize_Click ( object sender , EventArgs e )
{
2016-12-18 12:43:20 -05:00
_lastCodeWindow . FontSize = BaseControl . DefaultFontSize ;
2015-08-04 19:50:57 -04:00
}
2015-08-05 20:40:10 -04:00
private void mnuClose_Click ( object sender , EventArgs e )
{
this . Close ( ) ;
}
protected override void OnFormClosed ( FormClosedEventArgs e )
{
2017-05-06 18:35:25 -04:00
tmrCdlRatios . Stop ( ) ;
foreach ( Form frm in this . _childForms . ToArray ( ) ) {
frm . Close ( ) ;
}
2017-05-02 21:34:04 -04:00
LabelManager . OnLabelUpdated - = LabelManager_OnLabelUpdated ;
BreakpointManager . BreakpointsChanged - = BreakpointManager_BreakpointsChanged ;
ctrlConsoleStatus . OnStateChanged - = ctrlConsoleStatus_OnStateChanged ;
ctrlProfiler . OnFunctionSelected - = ctrlProfiler_OnFunctionSelected ;
if ( _notifListener ! = null ) {
_notifListener . Dispose ( ) ;
_notifListener = null ;
}
InteropEmu . DebugRelease ( ) ;
2016-11-26 20:58:27 -05:00
ConfigManager . Config . DebugInfo . WindowWidth = this . Width ;
ConfigManager . Config . DebugInfo . WindowHeight = this . Height ;
2016-12-06 22:50:27 -05:00
ConfigManager . Config . DebugInfo . TopPanelHeight = this . splitContainer . GetSplitterDistance ( ) ;
ConfigManager . Config . DebugInfo . LeftPanelWidth = this . ctrlSplitContainerTop . GetSplitterDistance ( ) ;
2016-11-26 20:58:27 -05:00
ConfigManager . ApplyChanges ( ) ;
2016-11-24 00:18:07 -05:00
SaveWorkspace ( ) ;
2015-08-05 20:40:10 -04:00
base . OnFormClosed ( e ) ;
}
2015-08-08 22:36:39 -04:00
private void mnuNametableViewer_Click ( object sender , EventArgs e )
{
OpenChildForm ( new frmPpuViewer ( ) ) ;
}
2015-08-09 14:47:27 -04:00
private void ctrlCallstack_FunctionSelected ( object sender , EventArgs e )
{
_lastCodeWindow . ScrollToLineNumber ( ( int ) sender ) ;
}
2015-08-17 19:32:10 -04:00
2016-11-26 17:48:11 -05:00
private void ctrlConsoleStatus_OnStateChanged ( object sender , EventArgs e )
{
UpdateDebugger ( true ) ;
}
2015-08-17 19:32:10 -04:00
private void tmrCdlRatios_Tick ( object sender , EventArgs e )
{
this . UpdateCdlRatios ( ) ;
}
private void mnuLoadCdlFile_Click ( object sender , EventArgs e )
{
OpenFileDialog ofd = new OpenFileDialog ( ) ;
2016-12-12 23:25:20 -05:00
ofd . SetFilter ( "CDL files (*.cdl)|*.cdl" ) ;
2015-08-17 19:32:10 -04:00
if ( ofd . ShowDialog ( ) = = System . Windows . Forms . DialogResult . OK ) {
if ( ! InteropEmu . DebugLoadCdlFile ( ofd . FileName ) ) {
MessageBox . Show ( "Could not load CDL file. The file selected file is invalid." , "Error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
}
}
}
private void mnuSaveAsCdlFile_Click ( object sender , EventArgs e )
{
SaveFileDialog sfd = new SaveFileDialog ( ) ;
2016-12-12 23:25:20 -05:00
sfd . SetFilter ( "CDL files (*.cdl)|*.cdl" ) ;
2015-08-17 19:32:10 -04:00
sfd . AddExtension = true ;
if ( sfd . ShowDialog ( ) = = System . Windows . Forms . DialogResult . OK ) {
if ( ! InteropEmu . DebugSaveCdlFile ( sfd . FileName ) ) {
MessageBox . Show ( "Error while trying to save CDL file." , "Error" , MessageBoxButtons . OK , MessageBoxIcon . Error ) ;
}
}
}
private void mnuResetCdlLog_Click ( object sender , EventArgs e )
{
InteropEmu . DebugResetCdlLog ( ) ;
}
2016-01-10 00:33:33 -05:00
private void ctrlBreakpoints_BreakpointNavigation ( object sender , EventArgs e )
{
_lastCodeWindow . ScrollToLineNumber ( ( int ) ( ( Breakpoint ) sender ) . Address ) ;
}
2016-01-10 19:56:40 -05:00
private void mnuTraceLogger_Click ( object sender , EventArgs e )
{
2016-09-03 21:52:59 -04:00
if ( _traceLogger = = null ) {
_traceLogger = new frmTraceLogger ( ) ;
_traceLogger . FormClosed + = ( s , evt ) = > {
_traceLogger = null ;
} ;
2016-12-04 10:30:15 -05:00
OpenChildForm ( _traceLogger ) ;
2016-09-03 21:52:59 -04:00
} else {
_traceLogger . Focus ( ) ;
}
2016-01-10 19:56:40 -05:00
}
2016-06-04 15:38:48 -04:00
2016-06-05 10:26:05 -04:00
private void mnuPpuPartialDraw_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . PpuPartialDraw = mnuPpuPartialDraw . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-11-19 19:21:28 -05:00
2016-12-04 09:37:01 -05:00
private void mnuShowEffectiveAddresses_Click ( object sender , EventArgs e )
2016-11-19 19:21:28 -05:00
{
ConfigManager . Config . DebugInfo . ShowEffectiveAddresses = mnuShowEffectiveAddresses . Checked ;
ConfigManager . ApplyChanges ( ) ;
2016-11-21 22:34:47 -05:00
UpdateDebugger ( false ) ;
}
2016-12-04 09:37:01 -05:00
private void mnuShowOnlyDisassembledCode_Click ( object sender , EventArgs e )
2016-11-21 22:34:47 -05:00
{
ConfigManager . Config . DebugInfo . ShowOnlyDisassembledCode = mnuShowOnlyDisassembledCode . Checked ;
ConfigManager . ApplyChanges ( ) ;
UpdateDebugger ( false ) ;
2016-11-19 19:21:28 -05:00
}
2016-09-04 18:08:16 -04:00
2016-12-04 09:37:01 -05:00
private void mnuShowCpuMemoryMapping_Click ( object sender , EventArgs e )
2016-09-04 18:08:16 -04:00
{
ctrlCpuMemoryMapping . Visible = mnuShowCpuMemoryMapping . Checked ;
ConfigManager . Config . DebugInfo . ShowCpuMemoryMapping = mnuShowCpuMemoryMapping . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-12-04 09:37:01 -05:00
private void mnuShowPpuMemoryMapping_Click ( object sender , EventArgs e )
2016-09-04 18:08:16 -04:00
{
ctrlPpuMemoryMapping . Visible = mnuShowPpuMemoryMapping . Checked ;
ConfigManager . Config . DebugInfo . ShowPpuMemoryMapping = mnuShowPpuMemoryMapping . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-09-05 16:48:20 -04:00
2016-11-27 19:43:17 -05:00
private void mnuHighlightUnexecutedCode_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . HighlightUnexecutedCode = mnuHighlightUnexecutedCode . Checked ;
ConfigManager . ApplyChanges ( ) ;
ctrlDebuggerCode . UpdateLineColors ( ) ;
ctrlDebuggerCodeSplit . UpdateLineColors ( ) ;
}
2016-12-04 09:53:25 -05:00
private void mnuBreakOnReset_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . BreakOnReset = mnuBreakOnReset . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-11-27 19:43:17 -05:00
2016-12-04 09:37:01 -05:00
private void mnuBreakOnOpen_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . BreakOnOpen = mnuBreakOnOpen . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-12-04 09:43:43 -05:00
2017-03-04 16:18:28 -05:00
private void mnuBreakOnUnofficialOpcodes_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . BreakOnUnofficialOpcodes = mnuBreakOnUnofficialOpcodes . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
private void mnuBreakOnBrk_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . BreakOnBrk = mnuBreakOnBrk . Checked ;
ConfigManager . ApplyChanges ( ) ;
2017-06-29 13:55:12 -04:00
}
private void mnuBreakOnDebuggerFocus_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . BreakOnDebuggerFocus = mnuBreakOnDebuggerFocus . Checked ;
ConfigManager . ApplyChanges ( ) ;
2017-03-04 16:18:28 -05:00
}
2017-06-29 13:47:49 -04:00
private void mnuRefreshWatchWhileRunning_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . RefreshWatchWhileRunning = mnuRefreshWatchWhileRunning . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-12-04 09:43:43 -05:00
private void mnuDisableDefaultLabels_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . DisableDefaultLabels = mnuDisableDefaultLabels . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
2016-12-04 09:37:01 -05:00
2016-12-04 11:16:44 -05:00
private void mnuDisplayOpCodesInLowerCase_Click ( object sender , EventArgs e )
{
ConfigManager . Config . DebugInfo . DisplayOpCodesInLowerCase = mnuDisplayOpCodesInLowerCase . Checked ;
ConfigManager . ApplyChanges ( ) ;
this . UpdateDebuggerFlags ( ) ;
this . UpdateDebugger ( false ) ;
}
2016-11-20 13:15:37 -05:00
private void ctrlFunctionList_OnFunctionSelected ( object relativeAddress , EventArgs e )
{
_lastCodeWindow . ScrollToLineNumber ( ( Int32 ) relativeAddress ) ;
}
2016-11-21 22:34:47 -05:00
private void LabelManager_OnLabelUpdated ( object sender , EventArgs e )
{
2016-11-27 10:56:37 -05:00
SaveWorkspace ( ) ;
2016-11-26 14:15:50 -05:00
ctrlLabelList . UpdateLabelList ( ) ;
ctrlFunctionList . UpdateFunctionList ( true ) ;
2016-11-21 22:34:47 -05:00
UpdateDebugger ( false ) ;
}
private void ctrlLabelList_OnLabelSelected ( object relativeAddress , EventArgs e )
{
_lastCodeWindow . ScrollToLineNumber ( ( Int32 ) relativeAddress ) ;
}
2016-11-24 00:18:07 -05:00
private void mnuResetWorkspace_Click ( object sender , EventArgs e )
{
if ( MessageBox . Show ( "This operation will empty the watch window, remove all breakpoints, and reset labels to their default state." + Environment . NewLine + "Are you sure?" , "" , MessageBoxButtons . OKCancel , MessageBoxIcon . Warning ) = = DialogResult . OK ) {
_workspace . Breakpoints = new List < Breakpoint > ( ) ;
_workspace . Labels = new List < CodeLabel > ( ) ;
_workspace . WatchValues = new List < string > ( ) ;
_workspace . Save ( ) ;
_workspace = null ;
2016-11-25 21:05:07 -05:00
LabelManager . ResetLabels ( ) ;
2016-11-24 00:18:07 -05:00
UpdateWorkspace ( ) ;
2016-12-04 11:16:44 -05:00
UpdateDebugger ( false ) ;
2016-11-24 00:18:07 -05:00
}
}
2016-11-25 21:05:07 -05:00
private void mnuImportLabels_Click ( object sender , EventArgs e )
{
OpenFileDialog ofd = new OpenFileDialog ( ) ;
2016-12-12 23:25:20 -05:00
ofd . SetFilter ( "All supported files (*.dbg)|*.dbg" ) ;
2016-11-25 21:05:07 -05:00
if ( ofd . ShowDialog ( ) = = DialogResult . OK ) {
Ld65DbgImporter dbgImporter = new Ld65DbgImporter ( ) ;
dbgImporter . Import ( ofd . FileName ) ;
}
}
2016-11-27 10:56:37 -05:00
private void ctrlLabelList_OnFindOccurrence ( object sender , EventArgs e )
{
CodeLabel label = sender as CodeLabel ;
2016-12-01 20:45:13 -05:00
_lastCodeWindow . FindAllOccurrences ( label . Label , true , true ) ;
2016-11-27 10:56:37 -05:00
}
private void ctrlFunctionList_OnFindOccurrence ( object sender , EventArgs e )
{
2016-12-01 20:45:13 -05:00
_lastCodeWindow . FindAllOccurrences ( sender as string , true , true ) ;
2016-11-27 10:56:37 -05:00
}
2016-11-28 20:57:53 -05:00
private void mnuBreakIn_Click ( object sender , EventArgs e )
{
using ( frmBreakIn frm = new frmBreakIn ( ) ) {
frm . ShowDialog ( ) ;
}
}
2016-12-01 20:45:13 -05:00
private void mnuFindAllOccurrences_Click ( object sender , EventArgs e )
{
frmFindOccurrences frm = new Debugger . frmFindOccurrences ( ) ;
if ( frm . ShowDialog ( ) = = DialogResult . OK ) {
_lastCodeWindow . FindAllOccurrences ( frm . SearchString , frm . MatchWholeWord , frm . MatchCase ) ;
}
}
2016-12-01 21:43:32 -05:00
2016-12-04 09:37:01 -05:00
private void mnuAutoLoadDbgFiles_Click ( object sender , EventArgs e )
2016-12-01 21:43:32 -05:00
{
if ( _debuggerInitialized ) {
ConfigManager . Config . DebugInfo . AutoLoadDbgFiles = mnuAutoLoadDbgFiles . Checked ;
ConfigManager . ApplyChanges ( ) ;
AutoLoadDbgFile ( false ) ;
}
}
2016-12-04 14:12:49 -05:00
private void ctrlConsoleStatus_OnGotoLocation ( object sender , EventArgs e )
{
_lastCodeWindow . ScrollToLineNumber ( ( int ) sender ) ;
}
2016-12-05 23:35:07 -05:00
private void SetDisassemblyType ( DisassemblyType type , ToolStripMenuItem item )
{
mnuDisassembleVerifiedCodeOnly . Checked = mnuDisassembleEverything . Checked = mnuDisassembleEverythingButData . Checked = false ;
item . Checked = true ;
ConfigManager . Config . DebugInfo . DisassemblyType = type ;
ConfigManager . ApplyChanges ( ) ;
UpdateDebuggerFlags ( ) ;
UpdateDebugger ( ) ;
}
private void mnuDisassembleVerifiedCodeOnly_Click ( object sender , EventArgs e )
{
SetDisassemblyType ( DisassemblyType . VerifiedCode , sender as ToolStripMenuItem ) ;
}
private void mnuDisassembleEverything_Click ( object sender , EventArgs e )
{
SetDisassemblyType ( DisassemblyType . Everything , sender as ToolStripMenuItem ) ;
}
private void mnuDisassembleEverythingButData_Click ( object sender , EventArgs e )
{
SetDisassemblyType ( DisassemblyType . EverythingButData , sender as ToolStripMenuItem ) ;
}
2016-12-06 22:50:27 -05:00
private void ctrlSplitContainerTop_PanelCollapsed ( object sender , EventArgs e )
{
mnuShowFunctionLabelLists . Checked = false ;
ConfigManager . Config . DebugInfo . ShowRightPanel = mnuShowFunctionLabelLists . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
private void ctrlSplitContainerTop_PanelExpanded ( object sender , EventArgs e )
{
mnuShowFunctionLabelLists . Checked = true ;
ConfigManager . Config . DebugInfo . ShowRightPanel = mnuShowFunctionLabelLists . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
private void mnuShowFunctionLabelLists_Click ( object sender , EventArgs e )
{
if ( mnuShowFunctionLabelLists . Checked ) {
this . ctrlSplitContainerTop . ExpandPanel ( ) ;
} else {
this . ctrlSplitContainerTop . CollapsePanel ( ) ;
}
}
private void splitContainer_PanelCollapsed ( object sender , EventArgs e )
{
mnuShowBottomPanel . Checked = false ;
ConfigManager . Config . DebugInfo . ShowBottomPanel = mnuShowBottomPanel . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
private void splitContainer_PanelExpanded ( object sender , EventArgs e )
{
mnuShowBottomPanel . Checked = true ;
ConfigManager . Config . DebugInfo . ShowBottomPanel = mnuShowBottomPanel . Checked ;
ConfigManager . ApplyChanges ( ) ;
}
private void mnuShowBottomPanel_Click ( object sender , EventArgs e )
{
if ( mnuShowBottomPanel . Checked ) {
splitContainer . ExpandPanel ( ) ;
} else {
splitContainer . CollapsePanel ( ) ;
}
}
2017-03-04 22:24:41 -05:00
private void mnuSaveRom_Click ( object sender , EventArgs e )
{
using ( SaveFileDialog sfd = new SaveFileDialog ( ) ) {
sfd . Filter = "NES roms (*.nes)|*.nes" ;
sfd . FileName = InteropEmu . GetRomInfo ( ) . GetRomName ( ) + "_Modified.nes" ;
sfd . InitialDirectory = ConfigManager . DebuggerFolder ;
if ( sfd . ShowDialog ( ) = = DialogResult . OK ) {
InteropEmu . DebugSaveRomToDisk ( sfd . FileName ) ;
}
}
}
2017-03-07 17:51:14 -05:00
2017-03-11 15:37:57 -05:00
private void OpenAssembler ( string code , UInt16 startAddress , UInt16 blockLength = 0 )
{
frmAssembler assembler = new frmAssembler ( code , startAddress , blockLength ) ;
assembler . FormClosed + = ( s , e ) = > {
if ( assembler . DialogResult = = DialogResult . OK ) {
this . UpdateDebugger ( false ) ;
}
} ;
OpenChildForm ( assembler ) ;
}
2017-03-07 17:51:14 -05:00
private void mnuAssembler_Click ( object sender , EventArgs e )
{
2017-03-11 15:37:57 -05:00
this . OpenAssembler ( string . Empty , 0x8000 ) ;
}
private void ctrlDebuggerCode_OnEditCode ( AssemblerEventArgs args )
{
this . OpenAssembler ( args . Code , args . StartAddress , args . BlockLength ) ;
2017-03-07 17:51:14 -05:00
}
2017-03-11 00:56:00 -05:00
private void mnuCode_DropDownOpening ( object sender , EventArgs e )
{
this . _lastCodeWindow . UpdateContextMenuItemVisibility ( false ) ;
mnuCode . DropDownItems . AddRange ( this . _lastCodeWindow . ContextMenuItems . ToArray ( ) ) ;
}
private void mnuCode_DropDownClosed ( object sender , EventArgs e )
{
List < ToolStripItem > items = new List < ToolStripItem > ( ) ;
foreach ( ToolStripItem item in mnuCode . DropDownItems ) {
items . Add ( item ) ;
}
this . _lastCodeWindow . ContextMenuItems = items ;
}
2015-07-01 23:17:14 -04:00
}
}