diff --git a/src/CxbxDebugger/Form1.Designer.cs b/src/CxbxDebugger/Form1.Designer.cs index 5372ca6b9..706c35fa0 100644 --- a/src/CxbxDebugger/Form1.Designer.cs +++ b/src/CxbxDebugger/Form1.Designer.cs @@ -45,10 +45,11 @@ this.tabContainer = new System.Windows.Forms.TabControl(); this.tabDisassembly = new System.Windows.Forms.TabPage(); this.splitContainer2 = new System.Windows.Forms.SplitContainer(); - this.txDisassembly = new CxbxDebugger.RicherTextBox(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.btnDisassemble = new System.Windows.Forms.Button(); - this.txDisassemblyAddr = new System.Windows.Forms.TextBox(); + this.btnNext = new System.Windows.Forms.Button(); + this.btnPrev = new System.Windows.Forms.Button(); + this.btnGo = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.cbDisAddr = new System.Windows.Forms.ComboBox(); this.tabBreakpoints = new System.Windows.Forms.TabPage(); this.splitContainer3 = new System.Windows.Forms.SplitContainer(); this.groupBox4 = new System.Windows.Forms.GroupBox(); @@ -82,6 +83,7 @@ this.label3 = new System.Windows.Forms.Label(); this.lbDebug = new System.Windows.Forms.ListBox(); this.diagSaveMemory = new System.Windows.Forms.SaveFileDialog(); + this.txDisassembly = new CxbxDebugger.RicherTextBox(); this.toolStrip1.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout(); this.statusBar.SuspendLayout(); @@ -91,7 +93,6 @@ this.splitContainer2.Panel1.SuspendLayout(); this.splitContainer2.Panel2.SuspendLayout(); this.splitContainer2.SuspendLayout(); - this.groupBox3.SuspendLayout(); this.tabBreakpoints.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit(); this.splitContainer3.Panel1.SuspendLayout(); @@ -272,63 +273,80 @@ // splitContainer2 // this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer2.IsSplitterFixed = true; this.splitContainer2.Location = new System.Drawing.Point(3, 3); this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitContainer2.Panel1 // - this.splitContainer2.Panel1.Controls.Add(this.txDisassembly); + this.splitContainer2.Panel1.Controls.Add(this.btnNext); + this.splitContainer2.Panel1.Controls.Add(this.btnPrev); + this.splitContainer2.Panel1.Controls.Add(this.btnGo); + this.splitContainer2.Panel1.Controls.Add(this.label6); + this.splitContainer2.Panel1.Controls.Add(this.cbDisAddr); // // splitContainer2.Panel2 // - this.splitContainer2.Panel2.Controls.Add(this.groupBox3); + this.splitContainer2.Panel2.Controls.Add(this.txDisassembly); this.splitContainer2.Size = new System.Drawing.Size(742, 187); - this.splitContainer2.SplitterDistance = 519; + this.splitContainer2.SplitterDistance = 34; this.splitContainer2.TabIndex = 2; // - // txDisassembly + // btnNext // - this.txDisassembly.BackColor = System.Drawing.SystemColors.Window; - this.txDisassembly.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.txDisassembly.Cursor = System.Windows.Forms.Cursors.Default; - this.txDisassembly.Dock = System.Windows.Forms.DockStyle.Fill; - this.txDisassembly.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.txDisassembly.Location = new System.Drawing.Point(0, 0); - this.txDisassembly.Name = "txDisassembly"; - this.txDisassembly.ReadOnly = true; - this.txDisassembly.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; - this.txDisassembly.Size = new System.Drawing.Size(519, 187); - this.txDisassembly.TabIndex = 1; - this.txDisassembly.Text = ""; + this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnNext.Location = new System.Drawing.Point(690, 3); + this.btnNext.Name = "btnNext"; + this.btnNext.Size = new System.Drawing.Size(49, 23); + this.btnNext.TabIndex = 3; + this.btnNext.Text = "Next"; + this.btnNext.UseVisualStyleBackColor = true; + this.btnNext.Click += new System.EventHandler(this.button4_Click); // - // groupBox3 + // btnPrev // - this.groupBox3.Controls.Add(this.btnDisassemble); - this.groupBox3.Controls.Add(this.txDisassemblyAddr); - this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; - this.groupBox3.Location = new System.Drawing.Point(0, 0); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(219, 187); - this.groupBox3.TabIndex = 0; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "Disassemble Address"; + this.btnPrev.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnPrev.Location = new System.Drawing.Point(620, 3); + this.btnPrev.Name = "btnPrev"; + this.btnPrev.Size = new System.Drawing.Size(64, 23); + this.btnPrev.TabIndex = 2; + this.btnPrev.Text = "Previous"; + this.btnPrev.UseVisualStyleBackColor = true; + this.btnPrev.Click += new System.EventHandler(this.button3_Click); // - // btnDisassemble + // btnGo // - this.btnDisassemble.Location = new System.Drawing.Point(6, 45); - this.btnDisassemble.Name = "btnDisassemble"; - this.btnDisassemble.Size = new System.Drawing.Size(207, 23); - this.btnDisassemble.TabIndex = 1; - this.btnDisassemble.Text = "Go"; - this.btnDisassemble.UseVisualStyleBackColor = true; - this.btnDisassemble.Click += new System.EventHandler(this.button1_Click_1); + this.btnGo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnGo.Location = new System.Drawing.Point(539, 3); + this.btnGo.Name = "btnGo"; + this.btnGo.Size = new System.Drawing.Size(75, 23); + this.btnGo.TabIndex = 1; + this.btnGo.Text = "Go"; + this.btnGo.UseVisualStyleBackColor = true; + this.btnGo.Click += new System.EventHandler(this.button2_Click); // - // txDisassemblyAddr + // label6 // - this.txDisassemblyAddr.Location = new System.Drawing.Point(6, 19); - this.txDisassemblyAddr.Name = "txDisassemblyAddr"; - this.txDisassemblyAddr.Size = new System.Drawing.Size(207, 20); - this.txDisassemblyAddr.TabIndex = 0; + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(3, 8); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(123, 13); + this.label6.TabIndex = 2; + this.label6.Text = "Disassemble by address:"; + // + // cbDisAddr + // + this.cbDisAddr.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbDisAddr.FormattingEnabled = true; + this.cbDisAddr.Location = new System.Drawing.Point(132, 5); + this.cbDisAddr.Name = "cbDisAddr"; + this.cbDisAddr.Size = new System.Drawing.Size(401, 21); + this.cbDisAddr.TabIndex = 0; + this.cbDisAddr.SelectedIndexChanged += new System.EventHandler(this.cbDisAddr_SelectedIndexChanged); + this.cbDisAddr.KeyDown += new System.Windows.Forms.KeyEventHandler(this.comboBox1_KeyDown); // // tabBreakpoints // @@ -682,6 +700,21 @@ // this.diagSaveMemory.Filter = "Any Type|*.*"; // + // txDisassembly + // + this.txDisassembly.BackColor = System.Drawing.SystemColors.Window; + this.txDisassembly.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txDisassembly.Cursor = System.Windows.Forms.Cursors.Default; + this.txDisassembly.Dock = System.Windows.Forms.DockStyle.Fill; + this.txDisassembly.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txDisassembly.Location = new System.Drawing.Point(0, 0); + this.txDisassembly.Name = "txDisassembly"; + this.txDisassembly.ReadOnly = true; + this.txDisassembly.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; + this.txDisassembly.Size = new System.Drawing.Size(742, 149); + this.txDisassembly.TabIndex = 1; + this.txDisassembly.Text = ""; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -701,11 +734,10 @@ this.tabContainer.ResumeLayout(false); this.tabDisassembly.ResumeLayout(false); this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel1.PerformLayout(); this.splitContainer2.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); this.splitContainer2.ResumeLayout(false); - this.groupBox3.ResumeLayout(false); - this.groupBox3.PerformLayout(); this.tabBreakpoints.ResumeLayout(false); this.splitContainer3.Panel1.ResumeLayout(false); this.splitContainer3.Panel2.ResumeLayout(false); @@ -779,9 +811,6 @@ private System.Windows.Forms.ToolStripLabel toolStripLabel1; private System.Windows.Forms.ToolStripComboBox cbFrames; private System.Windows.Forms.ToolStripLabel toolStripLabel2; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.Button btnDisassemble; - private System.Windows.Forms.TextBox txDisassemblyAddr; private System.Windows.Forms.SplitContainer splitContainer5; private System.Windows.Forms.TextBox txFilter; private System.Windows.Forms.Label label3; @@ -792,6 +821,11 @@ private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label4; private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Button btnGo; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ComboBox cbDisAddr; + private System.Windows.Forms.Button btnNext; + private System.Windows.Forms.Button btnPrev; } } diff --git a/src/CxbxDebugger/Form1.cs b/src/CxbxDebugger/Form1.cs index adbe16f20..8ff0166fd 100644 --- a/src/CxbxDebugger/Form1.cs +++ b/src/CxbxDebugger/Form1.cs @@ -542,18 +542,18 @@ namespace CxbxDebugger return false; } - static private bool ReadAddress(TextBox Source, ref uint Out) + static private bool ReadAddress(string Source, ref uint Out) { try { - if (Source.Text.StartsWith("0x")) + if (Source.StartsWith("0x")) { - Out = Convert.ToUInt32(Source.Text.Substring(2), 16); + Out = Convert.ToUInt32(Source.Substring(2), 16); return true; } else { - if (uint.TryParse(Source.Text, out Out)) + if (uint.TryParse(Source, out Out)) { return true; } @@ -564,10 +564,27 @@ namespace CxbxDebugger return false; } + static private bool ReadAddress(ComboBox Source, ref uint Out) + { + string SelString = Source.Text; + + if ( ReadAddress(SelString, ref Out) ) + { + // Only add new addresses + if (Source.SelectedIndex == -1) + { + Source.Items.Insert(0, SelString); + } + return true; + } + + return false; + } + private byte[] ReadMemory() { uint addr = 0; - if (!ReadAddress(txAddress, ref addr)) + if (!ReadAddress(txAddress.Text, ref addr)) { return null; } @@ -666,7 +683,7 @@ namespace CxbxDebugger if (EP != 0) { string LinkName = string.Format("{0} +{1:x}", Name, Address - EP); - string Link = string.Format("{0:x8}", Address); + string Link = string.Format("0x{0:x8}", Address); tb.InsertLink(LinkName, Link); } @@ -679,17 +696,22 @@ namespace CxbxDebugger private void DumpDisassembly(uint DisAddress) { + // No threads + if (DebugThreads.Count == 0) + return; + // Read preceeding bytes for more context // TODO: This MUST align with a previous instruction or our disassembler will fail uint OffsetAddr = DisAddress; // -16 byte[] data = DebugThreads[0].OwningProcess.ReadMemoryBlock(new IntPtr(OffsetAddr), 64); - txDisassembly.Clear(); - // Dump requested after crashing - and read memory handles this silently - if(data == null) + if (data == null) return; + + txDisassembly.BeginUpdate(); + txDisassembly.Clear(); // TODO: Needs refactoring @@ -733,6 +755,7 @@ namespace CxbxDebugger }); } + txDisassembly.EndUpdate(); txDisassembly.Select(0, 0); } @@ -858,20 +881,14 @@ namespace CxbxDebugger private void ShowDisassemblyAt(string Address) { tabContainer.SelectedTab = tabDisassembly; - txDisassemblyAddr.Text = string.Format("0x{0}", Address); - + uint addr = 0; - if (ReadAddress(txDisassemblyAddr, ref addr)) - { - DumpDisassembly(addr); - } - } - - private void button1_Click_1(object sender, EventArgs e) - { - uint addr = 0; - if (ReadAddress(txDisassemblyAddr, ref addr)) + if (ReadAddress(Address, ref addr)) { + // Insert disassembly history + // TODO: Keep symbol name + cbDisAddr.Items.Insert(0, Address); + cbDisAddr.Text = Address; DumpDisassembly(addr); } } @@ -908,5 +925,56 @@ namespace CxbxDebugger return false; } + + private void HandleDisasmGo() + { + uint addr = 0; + if (ReadAddress(cbDisAddr, ref addr)) + { + DumpDisassembly(addr); + } + } + + private void HandleDisasmGo(int Offset) + { + int TargetIndex = cbDisAddr.SelectedIndex + Offset; + + if (TargetIndex < 0) + return; + + if (TargetIndex < cbDisAddr.Items.Count) + { + cbDisAddr.SelectedIndex = TargetIndex; + HandleDisasmGo(); + } + } + + private void button2_Click(object sender, EventArgs e) + { + HandleDisasmGo(); + } + + private void comboBox1_KeyDown(object sender, KeyEventArgs e) + { + if( e.KeyCode == Keys.Enter ) + { + HandleDisasmGo(); + } + } + + private void button3_Click(object sender, EventArgs e) + { + HandleDisasmGo(1); + } + + private void button4_Click(object sender, EventArgs e) + { + HandleDisasmGo(-1); + } + + private void cbDisAddr_SelectedIndexChanged(object sender, EventArgs e) + { + HandleDisasmGo(); + } } } diff --git a/src/CxbxDebugger/Form1.resx b/src/CxbxDebugger/Form1.resx index a5b78aded..929ec0b92 100644 --- a/src/CxbxDebugger/Form1.resx +++ b/src/CxbxDebugger/Form1.resx @@ -144,18 +144,24 @@ True + + True + + + True + + + True + + + True + + + True + True - - True - - - True - - - True - True