From cce572f0c8c27c60a2d8c9bbcd6c4815ed37cd01 Mon Sep 17 00:00:00 2001 From: "andres.delikat" Date: Sun, 7 Aug 2011 15:54:29 +0000 Subject: [PATCH] Hexeditor - stringbuilder for a slight speedup --- BizHawk.MultiClient/NEStools/NESPPU.cs | 311 ++++----- BizHawk.MultiClient/tools/MemoryViewer.cs | 767 +++++++++++----------- 2 files changed, 541 insertions(+), 537 deletions(-) diff --git a/BizHawk.MultiClient/NEStools/NESPPU.cs b/BizHawk.MultiClient/NEStools/NESPPU.cs index f2306a25a4..cd7c8a21d4 100644 --- a/BizHawk.MultiClient/NEStools/NESPPU.cs +++ b/BizHawk.MultiClient/NEStools/NESPPU.cs @@ -44,7 +44,7 @@ namespace BizHawk.MultiClient public void Restart() { if (!(Global.Emulator is NES)) this.Close(); - if (!this.IsHandleCreated || this.IsDisposed) return; + if (!this.IsHandleCreated || this.IsDisposed) return; Nes = Global.Emulator as NES; } @@ -117,9 +117,9 @@ namespace BizHawk.MultiClient } PatternView.pattern.UnlockBits(bmpdata); PatternView.Refresh(); - + /* int SpriteNum, TileNum, Attr, MemAddr; - + //Sprite Viewer for (int y = 0; y < 4; y++) { @@ -133,7 +133,7 @@ namespace BizHawk.MultiClient MemAddr = ((TileNum & 0xFE) << 4) | ((TileNum & 0x01) << 12); //DrawTile(SprArray + y * 24 * D_SPR_W + x * 16, MemAddr, 4 | (Attr & 3), D_SPR_W); //DrawTile(SprArray + y * 24 * D_SPR_W + x * 16 + 8 * D_SPR_W, MemAddr + 16, 4 | (Attr & 3), D_SPR_W); - + } else { @@ -142,6 +142,7 @@ namespace BizHawk.MultiClient } } } + * */ } public unsafe void UpdateValues() @@ -151,7 +152,7 @@ namespace BizHawk.MultiClient ppu.PPUViewCallback = Callback; } - private void NESPPU_Load(object sender, EventArgs e) + private void NESPPU_Load(object sender, EventArgs e) { LoadConfigSettings(); Nes = Global.Emulator as NES; @@ -163,7 +164,7 @@ namespace BizHawk.MultiClient SectionLabel.Text = ""; AddressLabel.Text = ""; ValueLabel.Text = ""; - Value2Label.Text = ""; + Value2Label.Text = ""; } private void PaletteView_MouseLeave(object sender, EventArgs e) @@ -191,10 +192,10 @@ namespace BizHawk.MultiClient val = PaletteView.spritePalettes[column].GetValue(); ValueLabel.Text = "Color: 0x" + String.Format("{0:X2}", val, NumberStyles.HexNumber); - if (baseAddr == 0x3F00) - Value2Label.Text = "ID: BG" + (column / 4).ToString(); - else - Value2Label.Text = "ID: SPR" + (column / 4).ToString(); + if (baseAddr == 0x3F00) + Value2Label.Text = "ID: BG" + (column / 4).ToString(); + else + Value2Label.Text = "ID: SPR" + (column / 4).ToString(); } private void autoloadToolStripMenuItem_Click(object sender, EventArgs e) @@ -213,165 +214,165 @@ namespace BizHawk.MultiClient saveWindowPositionToolStripMenuItem.Checked = Global.Config.NESPPUSaveWindowPosition; } - private void PatternView_Click(object sender, MouseEventArgs e) - { - if (e.X < PatternView.Width / 2) - { - PatternView.Pal0++; - if (PatternView.Pal0 > 7) PatternView.Pal0 = 0; - } - else - { - PatternView.Pal1++; - if (PatternView.Pal1 > 7) PatternView.Pal1 = 0; - } - UpdateTableLabels(); - } + private void PatternView_Click(object sender, MouseEventArgs e) + { + if (e.X < PatternView.Width / 2) + { + PatternView.Pal0++; + if (PatternView.Pal0 > 7) PatternView.Pal0 = 0; + } + else + { + PatternView.Pal1++; + if (PatternView.Pal1 > 7) PatternView.Pal1 = 0; + } + UpdateTableLabels(); + } - private void UpdateTableLabels() - { - Table0PaletteLabel.Text = "Palette: " + PatternView.Pal0; - Table1PaletteLabel.Text = "Palette: " + PatternView.Pal1; - PatternView.Refresh(); - } + private void UpdateTableLabels() + { + Table0PaletteLabel.Text = "Palette: " + PatternView.Pal0; + Table1PaletteLabel.Text = "Palette: " + PatternView.Pal1; + PatternView.Refresh(); + } - private void PatternView_MouseEnter(object sender, EventArgs e) - { - SectionLabel.Text = "Section: Pattern"; - } + private void PatternView_MouseEnter(object sender, EventArgs e) + { + SectionLabel.Text = "Section: Pattern"; + } - private void PatternView_MouseLeave(object sender, EventArgs e) - { - ClearDetails(); - } + private void PatternView_MouseLeave(object sender, EventArgs e) + { + ClearDetails(); + } - private void PatternView_MouseMove(object sender, MouseEventArgs e) - { - int table = 0; - int address = 0; - int tile = 0; - if (e.X > PatternView.Width / 2) - table = 1; + private void PatternView_MouseMove(object sender, MouseEventArgs e) + { + int table = 0; + int address = 0; + int tile = 0; + if (e.X > PatternView.Width / 2) + table = 1; - if (table == 0) - { - tile = address = (e.X - 1) / 8; - - } - else - { - address = 0x1000 + ((e.X - 128) / 8); - tile = (e.X - 128) / 8; - } + if (table == 0) + { + tile = address = (e.X - 1) / 8; - address += (e.Y / 8) * 256; - tile += (e.Y / 8) * 16; + } + else + { + address = 0x1000 + ((e.X - 128) / 8); + tile = (e.X - 128) / 8; + } - AddressLabel.Text = "Address: " + String.Format("{0:X4}", address); - ValueLabel.Text = "Table " + table.ToString(); - Value2Label.Text = "Tile " + String.Format("{0:X2}", tile); - } + address += (e.Y / 8) * 256; + tile += (e.Y / 8) * 16; - private void toolStripDropDownButton2_DropDownOpened(object sender, EventArgs e) - { - Table0P0.Checked = false; - Table0P1.Checked = false; - Table0P2.Checked = false; - Table0P3.Checked = false; - Table0P4.Checked = false; - Table0P5.Checked = false; - Table0P6.Checked = false; - Table0P7.Checked = false; - Table1P0.Checked = false; - Table1P1.Checked = false; - Table1P2.Checked = false; - Table1P3.Checked = false; - Table1P4.Checked = false; - Table1P5.Checked = false; - Table1P6.Checked = false; - Table1P7.Checked = false; + AddressLabel.Text = "Address: " + String.Format("{0:X4}", address); + ValueLabel.Text = "Table " + table.ToString(); + Value2Label.Text = "Tile " + String.Format("{0:X2}", tile); + } - Table0P0.Checked = false; + private void toolStripDropDownButton2_DropDownOpened(object sender, EventArgs e) + { + Table0P0.Checked = false; + Table0P1.Checked = false; + Table0P2.Checked = false; + Table0P3.Checked = false; + Table0P4.Checked = false; + Table0P5.Checked = false; + Table0P6.Checked = false; + Table0P7.Checked = false; + Table1P0.Checked = false; + Table1P1.Checked = false; + Table1P2.Checked = false; + Table1P3.Checked = false; + Table1P4.Checked = false; + Table1P5.Checked = false; + Table1P6.Checked = false; + Table1P7.Checked = false; - switch (PatternView.Pal0) - { - case 0: - Table0P0.Checked = true; - break; - case 1: - Table0P1.Checked = true; - break; - case 2: - Table0P2.Checked = true; - break; - case 3: - Table0P3.Checked = true; - break; - case 4: - Table0P4.Checked = true; - break; - case 5: - Table0P5.Checked = true; - break; - case 6: - Table0P6.Checked = true; - break; - case 7: - Table0P7.Checked = true; - break; - } + Table0P0.Checked = false; - switch (PatternView.Pal1) - { - case 0: - Table1P0.Checked = true; - break; - case 1: - Table1P1.Checked = true; - break; - case 2: - Table1P2.Checked = true; - break; - case 3: - Table1P3.Checked = true; - break; - case 4: - Table1P4.Checked = true; - break; - case 5: - Table1P5.Checked = true; - break; - case 6: - Table1P6.Checked = true; - break; - case 7: - Table1P7.Checked = true; - break; - } - } + switch (PatternView.Pal0) + { + case 0: + Table0P0.Checked = true; + break; + case 1: + Table0P1.Checked = true; + break; + case 2: + Table0P2.Checked = true; + break; + case 3: + Table0P3.Checked = true; + break; + case 4: + Table0P4.Checked = true; + break; + case 5: + Table0P5.Checked = true; + break; + case 6: + Table0P6.Checked = true; + break; + case 7: + Table0P7.Checked = true; + break; + } - private void Palette_Click(object sender, EventArgs e) - { - if (sender == Table0P0) PatternView.Pal0 = 0; - if (sender == Table0P1) PatternView.Pal0 = 1; - if (sender == Table0P2) PatternView.Pal0 = 2; - if (sender == Table0P3) PatternView.Pal0 = 3; - if (sender == Table0P4) PatternView.Pal0 = 4; - if (sender == Table0P5) PatternView.Pal0 = 5; - if (sender == Table0P6) PatternView.Pal0 = 6; - if (sender == Table0P7) PatternView.Pal0 = 7; + switch (PatternView.Pal1) + { + case 0: + Table1P0.Checked = true; + break; + case 1: + Table1P1.Checked = true; + break; + case 2: + Table1P2.Checked = true; + break; + case 3: + Table1P3.Checked = true; + break; + case 4: + Table1P4.Checked = true; + break; + case 5: + Table1P5.Checked = true; + break; + case 6: + Table1P6.Checked = true; + break; + case 7: + Table1P7.Checked = true; + break; + } + } - if (sender == Table1P0) PatternView.Pal1 = 0; - if (sender == Table1P1) PatternView.Pal1 = 1; - if (sender == Table1P2) PatternView.Pal1 = 2; - if (sender == Table1P3) PatternView.Pal1 = 3; - if (sender == Table1P4) PatternView.Pal1 = 4; - if (sender == Table1P5) PatternView.Pal1 = 5; - if (sender == Table1P6) PatternView.Pal1 = 6; - if (sender == Table1P7) PatternView.Pal1 = 7; + private void Palette_Click(object sender, EventArgs e) + { + if (sender == Table0P0) PatternView.Pal0 = 0; + if (sender == Table0P1) PatternView.Pal0 = 1; + if (sender == Table0P2) PatternView.Pal0 = 2; + if (sender == Table0P3) PatternView.Pal0 = 3; + if (sender == Table0P4) PatternView.Pal0 = 4; + if (sender == Table0P5) PatternView.Pal0 = 5; + if (sender == Table0P6) PatternView.Pal0 = 6; + if (sender == Table0P7) PatternView.Pal0 = 7; - UpdateTableLabels(); - } + if (sender == Table1P0) PatternView.Pal1 = 0; + if (sender == Table1P1) PatternView.Pal1 = 1; + if (sender == Table1P2) PatternView.Pal1 = 2; + if (sender == Table1P3) PatternView.Pal1 = 3; + if (sender == Table1P4) PatternView.Pal1 = 4; + if (sender == Table1P5) PatternView.Pal1 = 5; + if (sender == Table1P6) PatternView.Pal1 = 6; + if (sender == Table1P7) PatternView.Pal1 = 7; + + UpdateTableLabels(); + } private void txtScanline_TextChanged(object sender, EventArgs e) { diff --git a/BizHawk.MultiClient/tools/MemoryViewer.cs b/BizHawk.MultiClient/tools/MemoryViewer.cs index 672a546154..bf2e805107 100644 --- a/BizHawk.MultiClient/tools/MemoryViewer.cs +++ b/BizHawk.MultiClient/tools/MemoryViewer.cs @@ -8,415 +8,418 @@ using System.Globalization; namespace BizHawk.MultiClient { - public class MemoryViewer : Panel - { - //TODO: highlighting and address determining for 2 & 4 byte viewing - //2 & 4 byte typing in - //show nibbles on top of highlighted address - //Multi-highlight + public class MemoryViewer : Panel + { + //TODO: highlighting and address determining for 2 & 4 byte viewing + //2 & 4 byte typing in + //show nibbles on top of highlighted address + //Multi-highlight - public VScrollBar vScrollBar1; - public Label info; - MemoryDomain Domain = new MemoryDomain("NULL", 1024, Endian.Little, addr => { return 0; }, (a, v) => { v = 0; }); + public VScrollBar vScrollBar1; + public Label info; + MemoryDomain Domain = new MemoryDomain("NULL", 1024, Endian.Little, addr => { return 0; }, (a, v) => { v = 0; }); - Font font = new Font("Courier New", 10); - public Brush regBrush = Brushes.Black; - public Brush highlightBrush = Brushes.LightBlue; - int RowsVisible = 0; - int DataSize = 1; - public bool BigEndian = false; - string Header = ""; - char[] nibbles = { 'G', 'G', 'G', 'G' }; //G = off 0-9 & A-F are acceptable values - int addressHighlighted = -1; - int addressOver = -1; - int addrOffset = 0; //If addresses are > 4 digits, this offset is how much the columns are moved to the right - int maxRow = 0; + Font font = new Font("Courier New", 10); + public Brush regBrush = Brushes.Black; + public Brush highlightBrush = Brushes.LightBlue; + int RowsVisible = 0; + int DataSize = 1; + public bool BigEndian = false; + string Header = ""; + char[] nibbles = { 'G', 'G', 'G', 'G' }; //G = off 0-9 & A-F are acceptable values + int addressHighlighted = -1; + int addressOver = -1; + int addrOffset = 0; //If addresses are > 4 digits, this offset is how much the columns are moved to the right + int maxRow = 0; - public MemoryViewer() - { - SetStyle(ControlStyles.AllPaintingInWmPaint, true); - SetStyle(ControlStyles.UserPaint, true); - SetStyle(ControlStyles.DoubleBuffer, true); - this.BorderStyle = BorderStyle.Fixed3D; - this.Paint += new System.Windows.Forms.PaintEventHandler(this.MemoryViewer_Paint); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MemoryViewer_MouseMove); - this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MemoryViewer_MouseClick); - this.vScrollBar1 = new VScrollBar(); - Point n = new Point(this.Size); - this.vScrollBar1.Location = new System.Drawing.Point(n.X-16, n.Y-this.Height+7); - this.vScrollBar1.Height = this.Height-8; - this.vScrollBar1.Width = 16; - this.vScrollBar1.Visible = true; - this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.vScrollBar1.LargeChange = 16; - this.vScrollBar1.Name = "vScrollBar1"; - this.vScrollBar1.TabIndex = 0; - this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.vScrollBar1_Scroll); - this.Controls.Add(this.vScrollBar1); + public MemoryViewer() + { + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.DoubleBuffer, true); + this.BorderStyle = BorderStyle.Fixed3D; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.MemoryViewer_Paint); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MemoryViewer_MouseMove); + this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MemoryViewer_MouseClick); + this.vScrollBar1 = new VScrollBar(); + Point n = new Point(this.Size); + this.vScrollBar1.Location = new System.Drawing.Point(n.X - 16, n.Y - this.Height + 7); + this.vScrollBar1.Height = this.Height - 8; + this.vScrollBar1.Width = 16; + this.vScrollBar1.Visible = true; + this.vScrollBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.vScrollBar1.LargeChange = 16; + this.vScrollBar1.Name = "vScrollBar1"; + this.vScrollBar1.TabIndex = 0; + this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.vScrollBar1_Scroll); + this.Controls.Add(this.vScrollBar1); - //Debugging control - this.info = new Label(); - this.info.Text = ""; - this.info.Font = new Font("Courier New", 8); - this.info.Location = new System.Drawing.Point(n.X / 2, 1); - this.info.Height = 11; - this.Controls.Add(this.info); + //Debugging control + this.info = new Label(); + this.info.Text = ""; + this.info.Font = new Font("Courier New", 8); + this.info.Location = new System.Drawing.Point(n.X / 2, 1); + this.info.Height = 11; + this.Controls.Add(this.info); - this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MemoryViewer_KeyDown); - } + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MemoryViewer_KeyDown); + } - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - if (keyData == Keys.Up) - { - addressHighlighted -= 16; - this.Refresh(); - } + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + if (keyData == Keys.Up) + { + addressHighlighted -= 16; + this.Refresh(); + } - else if (keyData == Keys.Down) - { - addressHighlighted += 16; - this.Refresh(); - } + else if (keyData == Keys.Down) + { + addressHighlighted += 16; + this.Refresh(); + } - else if (keyData == Keys.Left) - { - addressHighlighted -= 1; - this.Refresh(); - } + else if (keyData == Keys.Left) + { + addressHighlighted -= 1; + this.Refresh(); + } - else if (keyData == Keys.Right) - { - addressHighlighted += 1; - this.Refresh(); - } + else if (keyData == Keys.Right) + { + addressHighlighted += 1; + this.Refresh(); + } - else if (keyData == Keys.Tab) - { - addressHighlighted += 8; - this.Refresh(); - } + else if (keyData == Keys.Tab) + { + addressHighlighted += 8; + this.Refresh(); + } - return true; - } + return true; + } - private void ClearNibbles() - { - for (int x = 0; x < 4; x++) - nibbles[x] = 'G'; - } + private void ClearNibbles() + { + for (int x = 0; x < 4; x++) + nibbles[x] = 'G'; + } - private void MemoryViewer_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) - { - if (!InputValidate.IsValidHexNumber( ((char)e.KeyCode).ToString())) - { - e.Handled = true; - return; - } + private void MemoryViewer_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + if (!InputValidate.IsValidHexNumber(((char)e.KeyCode).ToString())) + { + e.Handled = true; + return; + } - //TODO: 2 byte & 4 byte - if (nibbles[0] == 'G') - { - nibbles[0] = (char)e.KeyCode; - info.Text = nibbles[0].ToString(); - } - else - { - string temp = nibbles[0].ToString() + ((char)e.KeyCode).ToString(); - int x = int.Parse(temp, NumberStyles.HexNumber); - Domain.PokeByte(addressHighlighted, (byte)x); - ClearNibbles(); - SetHighlighted(addressHighlighted + 1); - this.Refresh(); - } + //TODO: 2 byte & 4 byte + if (nibbles[0] == 'G') + { + nibbles[0] = (char)e.KeyCode; + info.Text = nibbles[0].ToString(); + } + else + { + string temp = nibbles[0].ToString() + ((char)e.KeyCode).ToString(); + int x = int.Parse(temp, NumberStyles.HexNumber); + Domain.PokeByte(addressHighlighted, (byte)x); + ClearNibbles(); + SetHighlighted(addressHighlighted + 1); + this.Refresh(); + } - } + } - public void SetHighlighted(int addr) - { - if (addr < Domain.Size) - { - if (!IsVisible(addr)) - { - vScrollBar1.Value = (addr / 16) - RowsVisible + 1; - } - addressHighlighted = addr; - } - } + public void SetHighlighted(int addr) + { + if (addr < Domain.Size) + { + if (!IsVisible(addr)) + { + vScrollBar1.Value = (addr / 16) - RowsVisible + 1; + } + addressHighlighted = addr; + } + } - private void Display(Graphics g) - { - unchecked - { - int row = 0; - int rowX = 8; - int rowY = 16; - int rowYoffset = 20; - string rowStr = ""; - int addr = 0; - addrOffset = (GetNumDigits(Domain.Size) % 4) * 9 ; - g.DrawLine(new Pen(regBrush), this.Left + 38 + addrOffset, this.Top, this.Left + 38 + addrOffset, this.Bottom - 40); - g.DrawLine(new Pen(regBrush), this.Left, 34, this.Right - 16, 34); - - if (addressHighlighted >= 0 && IsVisible(addressHighlighted)) - { - int left = ((addressHighlighted % 16) * 25) + 56 + addrOffset -(addressHighlighted % 4); - int top = (((addressHighlighted / 16)-vScrollBar1.Value) * 16) + 36; - Rectangle rect = new Rectangle(left, top, 25, 16); - g.DrawRectangle(new Pen(highlightBrush), rect); - g.FillRectangle(highlightBrush, rect); - } - - for (int i = 0; i < RowsVisible; i++) - { - row = i + vScrollBar1.Value; - rowStr = String.Format("{0:X" + GetNumDigits(Domain.Size) + "}", row * 16) + " "; - switch (DataSize) - { - default: - case 1: - Header = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; - for (int j = 0; j < 16; j++) - { - addr = (row * 16) + j; - if (addr < Domain.Size) - rowStr += String.Format("{0:X2}", Domain.PeekByte(addr)) + " "; - } - break; - case 2: - Header = " 0 2 4 6 8 A C E"; - for (int j = 0; j < 16; j+=2) - { - addr = (row * 16) + j; - if (addr < Domain.Size) - rowStr += String.Format("{0:X4}", MakeValue(addr, DataSize, BigEndian)) + " "; - } - break; - case 4: - Header = " 0 4 8 C"; - for (int j = 0; j < 16; j += 4) - { - addr = (row * 16) + j; - if (addr < Domain.Size) - rowStr += String.Format("{0:X8}", MakeValue(addr, DataSize, BigEndian)) + " "; - } - break; - - } - g.DrawString(Domain.Name, font, regBrush, new Point(1, 1)); - g.DrawString(Header, font, regBrush, new Point(rowX + addrOffset, rowY)); - if (row * 16 < Domain.Size) - g.DrawString(rowStr, font, regBrush, new Point(rowX, (rowY * (i + 1)) + rowYoffset)); - } - } - } - - private int MakeValue(int addr, int size, bool Bigendian) - { - int x = 0; - if (size == 1 || size == 2 || size == 4) - { - switch (size) - { - case 1: - x = Domain.PeekByte(addr); - break; - case 2: - x = MakeWord(addr, Bigendian); - break; - case 4: - x = (MakeWord(addr, Bigendian) * 65536) + - MakeWord(addr + 2, Bigendian); - break; - } - return x; - } - else - return 0; //fail - } - - private int MakeWord(int addr, bool endian) - { - if (endian) - return Domain.PeekByte(addr) + (Domain.PeekByte(addr + 1) * 255); - else - return (Domain.PeekByte(addr) * 255) + Domain.PeekByte(addr + 1); - } - - public void ResetScrollBar() - { - vScrollBar1.Value = 0; - SetUpScrollBar(); - Refresh(); - } - - public void SetUpScrollBar() - { - RowsVisible = ((this.Height - 8) / 16) - 2; - int totalRows = Domain.Size / 16; - int MaxRows = (totalRows - RowsVisible) + 17; - - if (MaxRows > 0) - { - vScrollBar1.Visible = true; - if (vScrollBar1.Value > MaxRows) - vScrollBar1.Value = MaxRows; - vScrollBar1.Maximum = MaxRows; - } - else - vScrollBar1.Visible = false; - - } - - public void SetMemoryDomain(MemoryDomain d) - { - Domain = d; - maxRow = Domain.Size / 2; - SetUpScrollBar(); - vScrollBar1.Value = 0; - Refresh(); - } - - public string GetMemoryDomainStr() - { - return Domain.ToString(); - } - - private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) - { - this.SetUpScrollBar(); - this.Refresh(); - } - - private void MemoryViewer_Paint(object sender, PaintEventArgs e) - { - Display(e.Graphics); - } - - public void SetDataSize(int size) - { - if (size == 1 || size == 2 || size == 4) - DataSize = size; - } - - public int GetDataSize() - { - return DataSize; - } - - private int GetNumDigits(Int32 i) - { - if (i <= 0x10000) return 4; - if (i <= 0x1000000) return 6; - else return 8; - } - - private void SetAddressOver(int x, int y) - { - //info.Text = e.X.ToString() + "," + e.Y.ToString(); //Debug - - //Determine row - 32 pix header, 16 pix width - //Scroll value determines the first row - int row = vScrollBar1.Value; - row += (y - 36) / 16; - //info.Text += " " + row.ToString(); //Debug - - //Determine colums - 60 + addrOffset left padding - //25 pixel wide addresses (when 1 byte) (actually more like 24.75 ugh - int column = (x - (56 + addrOffset)) / 25; - //info.Text += " " + column.ToString(); //Debug - //TODO: 2 & 4 byte views + private void Display(Graphics g) + { + unchecked + { + int row = 0; + int rowX = 8; + int rowY = 16; + int rowYoffset = 20; - if (row >= 0 && row <= maxRow && column >= 0 && column < 16) - { - addressOver = row * 16 + column; - info.Text = String.Format("{0:X4}", addressOver); - } - else - { - addressOver = -1; - info.Text = ""; - } - } - - private void MemoryViewer_MouseMove(object sender, MouseEventArgs e) - { - SetAddressOver(e.X, e.Y); - } + StringBuilder rowStr = new StringBuilder(); + + int addr = 0; + addrOffset = (GetNumDigits(Domain.Size) % 4) * 9; + g.DrawLine(new Pen(regBrush), this.Left + 38 + addrOffset, this.Top, this.Left + 38 + addrOffset, this.Bottom - 40); + g.DrawLine(new Pen(regBrush), this.Left, 34, this.Right - 16, 34); - public void HighlightPointed() - { - if (addressOver >= 0) - { - addressHighlighted = addressOver; - } - else - addressHighlighted = -1; - ClearNibbles(); - this.Focus(); - this.Refresh(); - } + if (addressHighlighted >= 0 && IsVisible(addressHighlighted)) + { + int left = ((addressHighlighted % 16) * 25) + 56 + addrOffset - (addressHighlighted % 4); + int top = (((addressHighlighted / 16) - vScrollBar1.Value) * 16) + 36; + Rectangle rect = new Rectangle(left, top, 25, 16); + g.DrawRectangle(new Pen(highlightBrush), rect); + g.FillRectangle(highlightBrush, rect); + } - private void MemoryViewer_MouseClick(object sender, MouseEventArgs e) - { - SetAddressOver(e.X, e.Y); - if (addressOver == addressHighlighted && addressOver >= 0) - { - addressHighlighted = -1; - this.Refresh(); - } - else - HighlightPointed(); - } + for (int i = 0; i < RowsVisible; i++) + { + row = i + vScrollBar1.Value; + rowStr.Append(String.Format("{0:X" + GetNumDigits(Domain.Size) + "}", row * 16) + " "); + switch (DataSize) + { + default: + case 1: + Header = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; + for (int j = 0; j < 16; j++) + { + addr = (row * 16) + j; + if (addr < Domain.Size) + rowStr.Append(String.Format("{0:X2}", Domain.PeekByte(addr)) + " "); + } + break; + case 2: + Header = " 0 2 4 6 8 A C E"; + for (int j = 0; j < 16; j += 2) + { + addr = (row * 16) + j; + if (addr < Domain.Size) + rowStr.Append(String.Format("{0:X4}", MakeValue(addr, DataSize, BigEndian)) + " "); + } + break; + case 4: + Header = " 0 4 8 C"; + for (int j = 0; j < 16; j += 4) + { + addr = (row * 16) + j; + if (addr < Domain.Size) + rowStr.Append(String.Format("{0:X8}", MakeValue(addr, DataSize, BigEndian)) + " "); + } + break; - public int GetPointedAddress() - { - if (addressOver >= 0) - return addressOver; - else - return -1; //Negative = no address pointed - } + } + g.DrawString(Domain.Name, font, regBrush, new Point(1, 1)); + g.DrawString(Header, font, regBrush, new Point(rowX + addrOffset, rowY)); + if (row * 16 < Domain.Size) + g.DrawString(rowStr.ToString(), font, regBrush, new Point(rowX, (rowY * (i + 1)) + rowYoffset)); + } + } + } - public int GetHighlightedAddress() - { - if (addressHighlighted >= 0) - return addressHighlighted; - else - return -1; //Negative = no address highlighted - } + private int MakeValue(int addr, int size, bool Bigendian) + { + int x = 0; + if (size == 1 || size == 2 || size == 4) + { + switch (size) + { + case 1: + x = Domain.PeekByte(addr); + break; + case 2: + x = MakeWord(addr, Bigendian); + break; + case 4: + x = (MakeWord(addr, Bigendian) * 65536) + + MakeWord(addr + 2, Bigendian); + break; + } + return x; + } + else + return 0; //fail + } - public bool IsVisible(int addr) - { - int row = addr / 16; + private int MakeWord(int addr, bool endian) + { + if (endian) + return Domain.PeekByte(addr) + (Domain.PeekByte(addr + 1) * 255); + else + return (Domain.PeekByte(addr) * 255) + Domain.PeekByte(addr + 1); + } - if (row >= vScrollBar1.Value && row < (RowsVisible + vScrollBar1.Value)) - return true; - else - return false; - } + public void ResetScrollBar() + { + vScrollBar1.Value = 0; + SetUpScrollBar(); + Refresh(); + } - public void PokeHighlighted(int value) - { - //TODO: 2 byte & 4 byte - if (addressHighlighted >= 0) - Domain.PokeByte(addressHighlighted, (byte)value); - } + public void SetUpScrollBar() + { + RowsVisible = ((this.Height - 8) / 16) - 2; + int totalRows = Domain.Size / 16; + int MaxRows = (totalRows - RowsVisible) + 17; - public int GetSize() - { - return Domain.Size; - } + if (MaxRows > 0) + { + vScrollBar1.Visible = true; + if (vScrollBar1.Value > MaxRows) + vScrollBar1.Value = MaxRows; + vScrollBar1.Maximum = MaxRows; + } + else + vScrollBar1.Visible = false; - public byte GetPointedValue() - { - return Domain.PeekByte(addressOver); - } + } - public MemoryDomain GetDomain() - { - return Domain; - } - } + public void SetMemoryDomain(MemoryDomain d) + { + Domain = d; + maxRow = Domain.Size / 2; + SetUpScrollBar(); + vScrollBar1.Value = 0; + Refresh(); + } + + public string GetMemoryDomainStr() + { + return Domain.ToString(); + } + + private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) + { + this.SetUpScrollBar(); + this.Refresh(); + } + + private void MemoryViewer_Paint(object sender, PaintEventArgs e) + { + Display(e.Graphics); + } + + public void SetDataSize(int size) + { + if (size == 1 || size == 2 || size == 4) + DataSize = size; + } + + public int GetDataSize() + { + return DataSize; + } + + private int GetNumDigits(Int32 i) + { + if (i <= 0x10000) return 4; + if (i <= 0x1000000) return 6; + else return 8; + } + + private void SetAddressOver(int x, int y) + { + //info.Text = e.X.ToString() + "," + e.Y.ToString(); //Debug + + //Determine row - 32 pix header, 16 pix width + //Scroll value determines the first row + int row = vScrollBar1.Value; + row += (y - 36) / 16; + //info.Text += " " + row.ToString(); //Debug + + //Determine colums - 60 + addrOffset left padding + //25 pixel wide addresses (when 1 byte) (actually more like 24.75 ugh + int column = (x - (56 + addrOffset)) / 25; + //info.Text += " " + column.ToString(); //Debug + //TODO: 2 & 4 byte views + + + if (row >= 0 && row <= maxRow && column >= 0 && column < 16) + { + addressOver = row * 16 + column; + info.Text = String.Format("{0:X4}", addressOver); + } + else + { + addressOver = -1; + info.Text = ""; + } + } + + private void MemoryViewer_MouseMove(object sender, MouseEventArgs e) + { + SetAddressOver(e.X, e.Y); + } + + public void HighlightPointed() + { + if (addressOver >= 0) + { + addressHighlighted = addressOver; + } + else + addressHighlighted = -1; + ClearNibbles(); + this.Focus(); + this.Refresh(); + } + + private void MemoryViewer_MouseClick(object sender, MouseEventArgs e) + { + SetAddressOver(e.X, e.Y); + if (addressOver == addressHighlighted && addressOver >= 0) + { + addressHighlighted = -1; + this.Refresh(); + } + else + HighlightPointed(); + } + + public int GetPointedAddress() + { + if (addressOver >= 0) + return addressOver; + else + return -1; //Negative = no address pointed + } + + public int GetHighlightedAddress() + { + if (addressHighlighted >= 0) + return addressHighlighted; + else + return -1; //Negative = no address highlighted + } + + public bool IsVisible(int addr) + { + int row = addr / 16; + + if (row >= vScrollBar1.Value && row < (RowsVisible + vScrollBar1.Value)) + return true; + else + return false; + } + + public void PokeHighlighted(int value) + { + //TODO: 2 byte & 4 byte + if (addressHighlighted >= 0) + Domain.PokeByte(addressHighlighted, (byte)value); + } + + public int GetSize() + { + return Domain.Size; + } + + public byte GetPointedValue() + { + return Domain.PeekByte(addressOver); + } + + public MemoryDomain GetDomain() + { + return Domain; + } + } }