Hexeditor - stringbuilder for a slight speedup
This commit is contained in:
parent
c05a8770c4
commit
cce572f0c8
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue