Hex Editor - fix increment/decrement logic with frozen addresses. Also support increment/decrement on all highlighted addresses at once, not just the primary one

This commit is contained in:
adelikat 2013-10-09 15:28:45 +00:00
parent 634a465c06
commit f08c737dcc
1 changed files with 129 additions and 184 deletions

View File

@ -1445,11 +1445,11 @@ namespace BizHawk.MultiClient
}
break;
case Keys.Add:
IncrementAddress();
IncrementHighlighted();
UpdateValues();
break;
case Keys.Subtract:
DecrementAddress();
DecrementHighlighted();
UpdateValues();
break;
case Keys.Space:
@ -1688,177 +1688,122 @@ namespace BizHawk.MultiClient
}
}
private void IncrementAddress()
{
if (HighlightedAddress.HasValue)
{
int address = HighlightedAddress.Value;
byte value;
switch (DataSize)
{
default:
case 1:
value = Domain.PeekByte(address);
HexPokeAddress(address, (byte)(value + 1));
break;
case 2:
if (BigEndian)
{
value = Domain.PeekByte(address + 1);
if (value == 0xFF) //Wrapping logic
{
HexPokeAddress(address, (byte)(value + 1));
HexPokeAddress(address + 1, (byte)(value + 1));
}
else
{
HexPokeAddress(address + 1, (byte)(value + 1));
}
}
else
{
value = Domain.PeekByte(address);
if (value == 0xFF) //Wrapping logic
{
HexPokeAddress(address, (byte)(value + 1));
HexPokeAddress(address + 1, (byte)(value + 1));
}
else
{
HexPokeAddress(address, (byte)(value + 1));
}
}
break;
case 4:
if (BigEndian)
{
value = Domain.PeekByte(address + 3);
if (value == 0xFF) //Wrapping logic
{
HexPokeAddress(address + 3, (byte)(value + 1));
HexPokeAddress(address + 2, (byte)(value + 1));
}
else
{
HexPokeAddress(address + 2, (byte)(value + 1));
}
}
else
{
value = Domain.PeekByte(address);
HexPokeAddress(address, (byte)(value + 1));
}
break;
}
}
}
private void HexPokeAddress(int address, byte value)
private void IncrementAddress(int address)
{
if (Global.CheatList.IsActive(Domain, address))
{
UnFreezeAddress(address);
Domain.PokeByte(address, value);
FreezeAddress(address);
var cheat = Global.CheatList.FirstOrDefault(x => x.Domain == Domain && x.Address == address);
cheat.Increment();
}
else
{
Domain.PokeByte(address, value);
}
}
private void DecrementAddress()
{
if (HighlightedAddress.HasValue)
{
int address = HighlightedAddress.Value;
byte value;
Endian endian = BigEndian ? Endian.Big : Endian.Little;
switch (DataSize)
{
default:
case 1:
value = Domain.PeekByte(address);
HexPokeAddress(address, (byte)(value - 1));
byte thebyte = Domain.PeekByte(address);
Domain.PokeByte(
address,
(byte)(Domain.PeekByte(address) + 1)
);
break;
case 2:
if (BigEndian)
{
value = Domain.PeekByte(address + 1);
if (value == 0) //Wrapping logic
{
HexPokeAddress(address, (byte)(value - 1));
HexPokeAddress(address + 1, (byte)(value - 1));
}
else
{
Domain.PokeByte(address + 1, (byte)(value - 1));
}
}
else
{
value = Domain.PeekByte(address);
if (value == 0) //Wrapping logic
{
HexPokeAddress(address, (byte)(value - 1));
HexPokeAddress(address + 1, (byte)(value - 1));
}
else
{
HexPokeAddress(address, (byte)(value - 1));
}
}
Domain.PokeWord(
address,
(ushort)(Domain.PeekWord(address, endian) + 1),
endian
);
break;
case 4:
if (BigEndian)
{
value = Domain.PeekByte(address + 3);
if (value == 0xFF) //Wrapping logic
{
HexPokeAddress(address + 3, (byte)(value - 1));
HexPokeAddress(address + 2, (byte)(value - 1));
}
else
{
HexPokeAddress(address + 3, (byte)(value - 1));
}
}
else
{
value = Domain.PeekByte(address);
if (value == 0)
{
HexPokeAddress(address, (byte)(value - 1));
HexPokeAddress(address + 1, (byte)(value - 1));
int value2 = Domain.PeekByte(address + 1);
if (value2 == 0xFF)
{
Domain.PokeByte(address + 2, (byte)(value - 1));
int value3 = Domain.PeekByte(address + 1);
if (value3 == 0xFF)
{
HexPokeAddress(address + 3, (byte)(value - 1));
}
}
}
else
{
HexPokeAddress(address, (byte)(value - 1));
}
}
Domain.PokeDWord(
address,
Domain.PeekDWord(address, endian) + 1,
endian
);
break;
}
}
}
private void DecrementAddress(int address)
{
if (Global.CheatList.IsActive(Domain, address))
{
var cheat = Global.CheatList.FirstOrDefault(x => x.Domain == Domain && x.Address == address);
cheat.Decrement();
}
else
{
Endian endian = BigEndian ? Endian.Big : Endian.Little;
switch (DataSize)
{
default:
case 1:
byte thebyte = Domain.PeekByte(address);
Domain.PokeByte(
address,
(byte)(Domain.PeekByte(address) - 1)
);
break;
case 2:
Domain.PokeWord(
address,
(ushort)(Domain.PeekWord(address, endian) - 1),
endian
);
break;
case 4:
Domain.PokeDWord(
address,
Domain.PeekDWord(address, endian) - 1,
endian
);
break;
}
}
}
private void IncrementHighlighted()
{
if (HighlightedAddress.HasValue)
{
IncrementAddress(HighlightedAddress.Value);
}
if (SecondaryHighlightedAddresses.Any())
{
foreach (int address in SecondaryHighlightedAddresses)
{
IncrementAddress(address);
}
}
}
private void DecrementHighlighted()
{
if (HighlightedAddress.HasValue)
{
DecrementAddress(HighlightedAddress.Value);
}
if (SecondaryHighlightedAddresses.Any())
{
foreach (int address in SecondaryHighlightedAddresses)
{
DecrementAddress(address);
}
}
}
private void incrementToolStripMenuItem_Click(object sender, EventArgs e)
{
IncrementAddress();
IncrementHighlighted();
}
private void decrementToolStripMenuItem_Click(object sender, EventArgs e)
{
DecrementAddress();
DecrementHighlighted();
}
private void ViewerContextMenuStrip_Opening(object sender, CancelEventArgs e)