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:
parent
634a465c06
commit
f08c737dcc
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue