add deathknight13579's actionreplay fixes from issue 1630

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4529 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Shawn Hoffman 2009-11-11 06:18:37 +00:00
parent 8d6aa79389
commit e4ec0ba33b
1 changed files with 40 additions and 62 deletions

View File

@ -87,7 +87,7 @@ void LogInfo(const char *format, ...);
bool Subtype_RamWriteAndFill(u32 addr, u32 data); bool Subtype_RamWriteAndFill(u32 addr, u32 data);
bool Subtype_WriteToPointer(u32 addr, u32 data); bool Subtype_WriteToPointer(u32 addr, u32 data);
bool Subtype_AddCode(u32 addr, u32 data); bool Subtype_AddCode(u32 addr, u32 data);
bool Subtype_MasterCodeAndWriteToCCXXXXXX(); bool Subtype_MasterCodeAndWriteToCCXXXXXX(u32 addr, u32 data);
bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data); bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data);
bool ZeroCode_MemoryCopy(u32 val_last, u32 addr, u32 data); bool ZeroCode_MemoryCopy(u32 val_last, u32 addr, u32 data);
bool NormalCode(u8 subtype, u32 addr, u32 data); bool NormalCode(u8 subtype, u32 addr, u32 data);
@ -448,8 +448,8 @@ bool IsSelfLogging()
// Code Functions // Code Functions
bool Subtype_RamWriteAndFill(u32 addr, u32 data) bool Subtype_RamWriteAndFill(u32 addr, u32 data)
{ {
u32 new_addr = ((addr & 0x7FFFFF) | 0x80000000); // real GC address u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000; // real GC address
u8 size = ((addr >> 25) & 0x03); u8 size = (addr >> 25) & 0x03;
LogInfo("Hardware Address: %08x", new_addr); LogInfo("Hardware Address: %08x", new_addr);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
switch (size) switch (size)
@ -458,8 +458,8 @@ bool Subtype_RamWriteAndFill(u32 addr, u32 data)
{ {
LogInfo("8-bit Write"); LogInfo("8-bit Write");
LogInfo("--------"); LogInfo("--------");
u8 repeat = data >> 8; u32 repeat = data >> 8;
for (int i = 0; i <= repeat; i++) { for (u32 i = 0; i <= repeat; i++) {
Memory::Write_U8(data & 0xFF, new_addr + i); Memory::Write_U8(data & 0xFF, new_addr + i);
LogInfo("Wrote %08x to address %08x", data & 0xFF, new_addr + i); LogInfo("Wrote %08x to address %08x", data & 0xFF, new_addr + i);
} }
@ -471,16 +471,15 @@ bool Subtype_RamWriteAndFill(u32 addr, u32 data)
{ {
LogInfo("16-bit Write"); LogInfo("16-bit Write");
LogInfo("--------"); LogInfo("--------");
u16 repeat = data >> 16; u32 repeat = data >> 16;
for (int i = 0; i <= repeat; i++) { for (u32 i = 0; i <= repeat; i++) {
Memory::Write_U16(data & 0xFFFF, new_addr + i * 2); Memory::Write_U16(data & 0xFFFF, new_addr + i * 2);
LogInfo("Wrote %08x to address %08x", data & 0xFFFF, new_addr + i * 2); LogInfo("Wrote %08x to address %08x", data & 0xFFFF, new_addr + i * 2);
} }
LogInfo("--------"); LogInfo("--------");
break; break;
} }
case DATATYPE_32BIT_FLOAT: //some codes use 03, but its just the same as 02... case DATATYPE_32BIT_FLOAT:
LogInfo("The odd size 3 code, could this really by floating point?");
case DATATYPE_32BIT: // Dword write case DATATYPE_32BIT: // Dword write
LogInfo("32bit Write"); LogInfo("32bit Write");
LogInfo("--------"); LogInfo("--------");
@ -498,8 +497,8 @@ bool Subtype_RamWriteAndFill(u32 addr, u32 data)
bool Subtype_WriteToPointer(u32 addr, u32 data) bool Subtype_WriteToPointer(u32 addr, u32 data)
{ {
u32 new_addr = ((addr & 0x7FFFFF) | 0x80000000); u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000;
u8 size = ((addr >> 25) & 0x03); u8 size = (addr >> 25) & 0x03;
LogInfo("Hardware Address: %08x", new_addr); LogInfo("Hardware Address: %08x", new_addr);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
switch (size) switch (size)
@ -555,8 +554,8 @@ bool Subtype_WriteToPointer(u32 addr, u32 data)
bool Subtype_AddCode(u32 addr, u32 data) bool Subtype_AddCode(u32 addr, u32 data)
{ {
// Used to incrment a value in memory // Used to incrment a value in memory
u32 new_addr = (addr & 0x81FFFFFF); u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000;
u8 size = ((addr >> 25) & 0x03); u8 size = (addr >> 25) & 0x03;
LogInfo("Hardware Address: %08x", new_addr); LogInfo("Hardware Address: %08x", new_addr);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
switch (size) switch (size)
@ -564,14 +563,14 @@ bool Subtype_AddCode(u32 addr, u32 data)
case DATATYPE_8BIT: case DATATYPE_8BIT:
LogInfo("8-bit Add"); LogInfo("8-bit Add");
LogInfo("--------"); LogInfo("--------");
Memory::Write_U8(Memory::Read_U8(new_addr) + (data & 0xFF), new_addr); Memory::Write_U8(Memory::Read_U8(new_addr) + data, new_addr);
LogInfo("Wrote %08x to address %08x", Memory::Read_U8(new_addr) + (data & 0xFF), new_addr); LogInfo("Wrote %08x to address %08x", Memory::Read_U8(new_addr) + (data & 0xFF), new_addr);
LogInfo("--------"); LogInfo("--------");
break; break;
case DATATYPE_16BIT: case DATATYPE_16BIT:
LogInfo("16-bit Add"); LogInfo("16-bit Add");
LogInfo("--------"); LogInfo("--------");
Memory::Write_U16(Memory::Read_U16(new_addr) + (data & 0xFFFF), new_addr); Memory::Write_U16(Memory::Read_U16(new_addr) + data, new_addr);
LogInfo("Wrote %08x to address %08x", Memory::Read_U16(new_addr) + (data & 0xFFFF), new_addr); LogInfo("Wrote %08x to address %08x", Memory::Read_U16(new_addr) + (data & 0xFFFF), new_addr);
LogInfo("--------"); LogInfo("--------");
break; break;
@ -603,8 +602,12 @@ bool Subtype_AddCode(u32 addr, u32 data)
return true; return true;
} }
bool Subtype_MasterCodeAndWriteToCCXXXXXX() bool Subtype_MasterCodeAndWriteToCCXXXXXX(u32 addr, u32 data)
{ {
u32 new_addr = (addr & 0x01FFFFFF) | 0x80000000;
u8 mcode_type = (data & 0xFF0000) >> 16;
u8 mcode_count = (data & 0xFF00) >> 8;
u8 mcode_number = data & 0xFF;
// code not yet implemented - TODO // code not yet implemented - TODO
PanicAlert("Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)", code.name.c_str()); PanicAlert("Action Replay Error: Master Code and Write To CCXXXXXX not implemented (%s)", code.name.c_str());
return false; return false;
@ -612,54 +615,32 @@ bool Subtype_MasterCodeAndWriteToCCXXXXXX()
bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more testing
{ {
u32 new_addr = (val_last & 0x81FFFFFF); u32 new_addr = (val_last & 0x01FFFFFF) | 0x80000000;
u8 size = ((val_last >> 25) & 0x03); u8 size = (val_last >> 25) & 0x03;
int addr_incr; s16 addr_incr = (s16)(data & 0xFFFF);
s8 val_incr = (s8)((data & 0xFF000000) >> 24);
u8 write_num = (data & 0xFF0000) >> 16;
u32 val = addr; u32 val = addr;
int val_incr;
u8 write_num = ((data & 0x78000) >> 16); // Z2
u32 curr_addr = new_addr; u32 curr_addr = new_addr;
LogInfo("Current Hardware Address: %08x", new_addr); LogInfo("Current Hardware Address: %08x", new_addr);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
LogInfo("Write Num: %08x", write_num); LogInfo("Write Num: %08x", write_num);
if (write_num < 1) {
LogInfo("Write Num is less than 1, exiting Fill and Slide call...");
return true;
}
if ((data >> 24) >> 3) { // z1 >> 3
addr_incr = ((data & 0x7FFF) + 0xFFFF0000); // FFFFZ3Z4
val_incr = (int)((data & 0x7F) + 0xFFFFFF00); // FFFFFFZ1
}
else {
addr_incr = (data & 0x7FFF); // 0000Z3Z4
val_incr = (int)(data & 0x7F); // 000000Z1
}
LogInfo("Address Increment: %i", addr_incr); LogInfo("Address Increment: %i", addr_incr);
LogInfo("Value Increment: %i", val_incr); LogInfo("Value Increment: %i", val_incr);
// Correct?
if (val_incr < 0)
{
curr_addr = new_addr + (addr_incr * write_num);
LogInfo("Value increment is less than 0, we need to go to the last address");
LogInfo("Current Hardware Address Update: %08x", curr_addr);
}
switch (size) switch (size)
{ {
case DATATYPE_8BIT: case DATATYPE_8BIT:
LogInfo("8-bit Write"); LogInfo("8-bit Write");
LogInfo("--------"); LogInfo("--------");
for (int i=0; i < write_num; i++) { for (int i = 0; i < write_num; i++)
{
Memory::Write_U8(val & 0xFF, curr_addr); Memory::Write_U8(val & 0xFF, curr_addr);
curr_addr += addr_incr;
val += val_incr;
LogInfo("Write %08x to address %08x", val & 0xFF, curr_addr); LogInfo("Write %08x to address %08x", val & 0xFF, curr_addr);
if (val_incr != 0)
val_incr > 0 ? val += (u32)val_incr : val -= (u32)(val_incr * -1);
if (addr_incr != 0)
addr_incr > 0 ? curr_addr += (u32)addr_incr : curr_addr -= (u32)(addr_incr * -1);
LogInfo("Value Update: %08x", val); LogInfo("Value Update: %08x", val);
LogInfo("Current Hardware Address Update: %08x", curr_addr); LogInfo("Current Hardware Address Update: %08x", curr_addr);
} }
@ -671,10 +652,8 @@ bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more
for (int i=0; i < write_num; i++) { for (int i=0; i < write_num; i++) {
Memory::Write_U16(val & 0xFFFF, curr_addr); Memory::Write_U16(val & 0xFFFF, curr_addr);
LogInfo("Write %08x to address %08x", val & 0xFFFF, curr_addr); LogInfo("Write %08x to address %08x", val & 0xFFFF, curr_addr);
if (val_incr != 0) curr_addr += addr_incr * 2;
val_incr > 0 ? val += (u32)val_incr : val -= (u32)(val_incr * -1); val += val_incr;
if (addr_incr != 0)
addr_incr > 0 ? curr_addr += (u32)addr_incr : curr_addr -= (u32)(addr_incr * -1);
LogInfo("Value Update: %08x", val); LogInfo("Value Update: %08x", val);
LogInfo("Current Hardware Address Update: %08x", curr_addr); LogInfo("Current Hardware Address Update: %08x", curr_addr);
} }
@ -686,10 +665,8 @@ bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more
for (int i = 0; i < write_num; i++) { for (int i = 0; i < write_num; i++) {
Memory::Write_U32(val, curr_addr); Memory::Write_U32(val, curr_addr);
LogInfo("Write %08x to address %08x", val, curr_addr); LogInfo("Write %08x to address %08x", val, curr_addr);
if (val_incr != 0) curr_addr += addr_incr * 4;
val_incr > 0 ? val += (u32)val_incr : val -= (u32)(val_incr * -1); val += val_incr;
if (addr_incr != 0)
addr_incr > 0 ? curr_addr += (u32)addr_incr : curr_addr -= (u32)(addr_incr * -1);
LogInfo("Value Update: %08x", val); LogInfo("Value Update: %08x", val);
LogInfo("Current Hardware Address Update: %08x", curr_addr); LogInfo("Current Hardware Address Update: %08x", curr_addr);
} }
@ -703,11 +680,12 @@ bool ZeroCode_FillAndSlide(u32 val_last, u32 addr, u32 data) // This needs more
return true; return true;
} }
// Looks like this is new??
bool ZeroCode_MemoryCopy(u32 val_last, u32 addr, u32 data) // Has not been tested bool ZeroCode_MemoryCopy(u32 val_last, u32 addr, u32 data) // Has not been tested
{ {
u32 addr_dest = (val_last | 0x06000000); u32 addr_dest = val_last | 0x06000000;
u32 addr_src = ((addr & 0x7FFFFF) | 0x80000000); u32 addr_src = (addr & 0x01FFFFFF) | 0x80000000;
u8 num_bytes = (data & 0x7FFF); u8 num_bytes = data & 0x7FFF;
LogInfo("Dest Address: %08x", addr_dest); LogInfo("Dest Address: %08x", addr_dest);
LogInfo("Src Address: %08x", addr_src); LogInfo("Src Address: %08x", addr_src);
LogInfo("Size: %08x", num_bytes); LogInfo("Size: %08x", num_bytes);
@ -766,7 +744,7 @@ bool NormalCode(u8 subtype, u32 addr, u32 data)
break; break;
case SUB_MASTER_CODE : // Master Code & Write to CCXXXXXX case SUB_MASTER_CODE : // Master Code & Write to CCXXXXXX
LogInfo("Doing Master Code And Write to CCXXXXXX (ncode not supported)"); LogInfo("Doing Master Code And Write to CCXXXXXX (ncode not supported)");
if (!Subtype_MasterCodeAndWriteToCCXXXXXX()) if (!Subtype_MasterCodeAndWriteToCCXXXXXX(addr, data))
return false; return false;
break; break;
default: default:
@ -779,7 +757,7 @@ bool NormalCode(u8 subtype, u32 addr, u32 data)
bool ConditionalCode(u8 subtype, u32 addr, u32 data, int *pCount, bool *pSkip, int compareType) bool ConditionalCode(u8 subtype, u32 addr, u32 data, int *pCount, bool *pSkip, int compareType)
{ {
u8 size = (addr >> 25) & 0x03; u8 size = (addr >> 25) & 0x03;
u32 new_addr = ((addr & 0x7FFFFF) | 0x80000000); u32 new_addr = ((addr & 0x01FFFFFF) | 0x80000000);
LogInfo("Size: %08x", size); LogInfo("Size: %08x", size);
LogInfo("Hardware Address: %08x", new_addr); LogInfo("Hardware Address: %08x", new_addr);
bool con = true; bool con = true;