Fill 'N' Slide fixes.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1505 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
omegadox 2008-12-12 08:12:09 +00:00
parent 3e33e06844
commit ffae8c51d6
1 changed files with 57 additions and 19 deletions

View File

@ -55,7 +55,7 @@ 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();
// Zero Codes // Zero Codes
bool ZeroCode_FillAndSlide(u32 addr_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);
// Normal Codes // Normal Codes
bool NormalCode_Type_0(u8 subtype, u32 addr, u32 data); bool NormalCode_Type_0(u8 subtype, u32 addr, u32 data);
@ -212,7 +212,7 @@ bool RunActionReplayCode(const ARCode &arcode) {
bool skip = false; bool skip = false;
bool cond = false; bool cond = false;
u32 addr_last = 0; u32 addr_last = 0;
u32 val_last; u32 val_last = 0;
code = arcode; code = arcode;
@ -254,7 +254,7 @@ bool RunActionReplayCode(const ARCode &arcode) {
if (doFillNSlide) { if (doFillNSlide) {
doFillNSlide = false; doFillNSlide = false;
LogInfo("Doing Fill And Slide"); LogInfo("Doing Fill And Slide");
if (!ZeroCode_FillAndSlide(addr_last, addr, data)) if (!ZeroCode_FillAndSlide(val_last, addr, data))
return false; return false;
continue; continue;
} }
@ -308,7 +308,7 @@ bool RunActionReplayCode(const ARCode &arcode) {
{ {
LogInfo("ZCode: Fill And Slide"); LogInfo("ZCode: Fill And Slide");
doFillNSlide = true; doFillNSlide = true;
addr_last = addr; val_last = data;
} }
continue; continue;
default: default:
@ -545,10 +545,10 @@ bool Subtype_MasterCodeAndWriteToCCXXXXXX()
// Zero Codes // Zero Codes
bool ZeroCode_FillAndSlide(u32 addr_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 = (addr_last & 0x81FFFFFF); u32 new_addr = (val_last & 0x81FFFFFF);
u8 size = ((addr_last >> 25) & 0x03); u8 size = ((val_last >> 25) & 0x03);
int addr_incr; int addr_incr;
u32 val = addr; u32 val = addr;
int val_incr; int val_incr;
@ -572,8 +572,8 @@ bool ZeroCode_FillAndSlide(u32 addr_last, u32 addr, u32 data) // This needs more
val_incr = (int)(data & 0x7F); // 000000Z1 val_incr = (int)(data & 0x7F); // 000000Z1
} }
LogInfo("Address Increment: %08x", addr_incr); LogInfo("Address Increment: %i", addr_incr);
LogInfo("Value Increment: %08x", val_incr); LogInfo("Value Increment: %i", val_incr);
// Correct? // Correct?
if (val_incr < 0) if (val_incr < 0)
@ -591,38 +591,76 @@ bool ZeroCode_FillAndSlide(u32 addr_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_U8(val & 0xFF, curr_addr); Memory::Write_U8(val & 0xFF, curr_addr);
LogInfo("Write %08x to address %08x", val & 0xFF, curr_addr); LogInfo("Write %08x to address %08x", val & 0xFF, curr_addr);
val += val_incr; if (val_incr < 0)
curr_addr += addr_incr; {
val -= (u32)val_incr;
}
if (val_incr > 0)
{
val += (u32)(abs(val_incr));
}
if (addr_incr < 0)
{
curr_addr -= (u32)(abs(addr_incr));
}
if (addr_incr > 0)
{
curr_addr += (u32)addr_incr;
}
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);
} }
LogInfo("--------"); LogInfo("--------");
break; break;
case 0x1: // Halfword case 0x1: // Halfword
addr_incr >>= 1;
LogInfo ("Address increment shifted right by 1: %08x", addr_incr);
LogInfo("Short Write"); LogInfo("Short Write");
LogInfo("--------"); LogInfo("--------");
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);
val += val_incr; if (val_incr < 0)
curr_addr += addr_incr; {
val -= (u32)val_incr;
}
if (val_incr > 0)
{
val += (u32)(abs(val_incr));
}
if (addr_incr < 0)
{
curr_addr -= (u32)(abs(addr_incr));
}
if (addr_incr > 0)
{
curr_addr += (u32)addr_incr;
}
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);
} }
LogInfo("--------"); LogInfo("--------");
break; break;
case 0x2: // Word case 0x2: // Word
addr_incr >>= 2;
LogInfo ("Address increment shifted right by 2: %08x", addr_incr);
LogInfo("Word Write"); LogInfo("Word Write");
LogInfo("--------"); LogInfo("--------");
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);
val += val_incr; if (val_incr < 0)
curr_addr += addr_incr; {
val -= (u32)val_incr;
}
if (val_incr > 0)
{
val += (u32)(abs(val_incr));
}
if (addr_incr < 0)
{
curr_addr -= (u32)(abs(addr_incr));
}
if (addr_incr > 0)
{
curr_addr += (u32)addr_incr;
}
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);
} }