"Support all functions of type D and E codes" for cheat patches (pnach) by

tadatada
This commit is contained in:
ramapcsx2 2014-09-16 11:03:10 +02:00
parent f287754477
commit 12e8f7d0b4
1 changed files with 401 additions and 292 deletions

View File

@ -22,27 +22,27 @@
u32 SkipCount = 0, IterationCount = 0; u32 SkipCount = 0, IterationCount = 0;
u32 IterationIncrement = 0, ValueIncrement = 0; u32 IterationIncrement = 0, ValueIncrement = 0;
u32 PrevCheatType = 0, PrevCheatAddr = 0,LastType = 0; u32 PrevCheatType = 0, PrevCheatAddr = 0, LastType = 0;
void writeCheat() void writeCheat()
{ {
switch (LastType) switch (LastType)
{ {
case 0x0: case 0x0:
memWrite8(PrevCheatAddr,IterationIncrement & 0xFF); memWrite8(PrevCheatAddr, IterationIncrement & 0xFF);
break; break;
case 0x1: case 0x1:
memWrite16(PrevCheatAddr,IterationIncrement & 0xFFFF); memWrite16(PrevCheatAddr, IterationIncrement & 0xFFFF);
break; break;
case 0x2: case 0x2:
memWrite32(PrevCheatAddr,IterationIncrement); memWrite32(PrevCheatAddr, IterationIncrement);
break; break;
default: default:
break; break;
} }
} }
void handle_extended_t( IniPatch *p) void handle_extended_t(IniPatch *p)
{ {
if (SkipCount > 0) if (SkipCount > 0)
{ {
@ -67,15 +67,15 @@ void handle_extended_t( IniPatch *p)
} }
case 0x4000: // vvvvvvvv iiiiiiii case 0x4000: // vvvvvvvv iiiiiiii
for(u32 i = 0; i < IterationCount; i++) for (u32 i = 0; i < IterationCount; i++)
{ {
memWrite32((u32)(PrevCheatAddr + (i * IterationIncrement)),(u32)(p->addr + ((u32)p->data * i))); memWrite32((u32)(PrevCheatAddr + (i * IterationIncrement)), (u32)(p->addr + ((u32)p->data * i)));
} }
PrevCheatType = 0; PrevCheatType = 0;
break; break;
case 0x5000: // dddddddd iiiiiiii case 0x5000: // dddddddd iiiiiiii
for(u32 i = 0; i < IterationCount; i++) for (u32 i = 0; i < IterationCount; i++)
{ {
u8 mem = memRead8(PrevCheatAddr + i); u8 mem = memRead8(PrevCheatAddr + i);
memWrite8(((u32)p->data) + i, mem); memWrite8(((u32)p->data) + i, mem);
@ -108,16 +108,16 @@ void handle_extended_t( IniPatch *p)
PrevCheatType = 0; PrevCheatType = 0;
if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0)
{ {
switch(LastType) switch (LastType)
{ {
case 0x0: case 0x0:
memWrite8(PrevCheatAddr,(u8)p->data & 0xFF); memWrite8(PrevCheatAddr, (u8)p->data & 0xFF);
break; break;
case 0x1: case 0x1:
memWrite16(PrevCheatAddr,(u16)p->data & 0x0FFFF); memWrite16(PrevCheatAddr, (u16)p->data & 0x0FFFF);
break; break;
case 0x2: case 0x2:
memWrite32(PrevCheatAddr,(u32)p->data); memWrite32(PrevCheatAddr, (u32)p->data);
break; break;
default: default:
break; break;
@ -259,58 +259,167 @@ void handle_extended_t( IniPatch *p)
if ((p->data & 0x00F00000) == 0x00000000) // 7aaaaaaa 000000vv if ((p->data & 0x00F00000) == 0x00000000) // 7aaaaaaa 000000vv
{ {
u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF); u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF);
memWrite8((u32)p->addr & 0x0FFFFFFF,(u8)(mem | (p->data & 0x000000FF))); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem | (p->data & 0x000000FF)));
} }
else if ((p->data & 0x00F00000) == 0x00100000) // 7aaaaaaa 0010vvvv else if ((p->data & 0x00F00000) == 0x00100000) // 7aaaaaaa 0010vvvv
{ {
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
memWrite16((u32)p->addr & 0x0FFFFFFF,(u16)(mem | (p->data & 0x0000FFFF))); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem | (p->data & 0x0000FFFF)));
} }
else if ((p->data & 0x00F00000) == 0x00200000) // 7aaaaaaa 002000vv else if ((p->data & 0x00F00000) == 0x00200000) // 7aaaaaaa 002000vv
{ {
u8 mem = memRead8((u32)p->addr&0x0FFFFFFF); u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF);
memWrite8((u32)p->addr & 0x0FFFFFFF,(u8)(mem & (p->data & 0x000000FF))); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem & (p->data & 0x000000FF)));
} }
else if ((p->data & 0x00F00000) == 0x00300000) // 7aaaaaaa 0030vvvv else if ((p->data & 0x00F00000) == 0x00300000) // 7aaaaaaa 0030vvvv
{ {
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
memWrite16((u32)p->addr & 0x0FFFFFFF,(u16)(mem & (p->data & 0x0000FFFF))); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem & (p->data & 0x0000FFFF)));
} }
else if ((p->data & 0x00F00000) == 0x00400000) // 7aaaaaaa 004000vv else if ((p->data & 0x00F00000) == 0x00400000) // 7aaaaaaa 004000vv
{ {
u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF); u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF);
memWrite8((u32)p->addr & 0x0FFFFFFF,(u8)(mem ^ (p->data & 0x000000FF))); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem ^ (p->data & 0x000000FF)));
} }
else if ((p->data & 0x00F00000) == 0x00500000) // 7aaaaaaa 0050vvvv else if ((p->data & 0x00F00000) == 0x00500000) // 7aaaaaaa 0050vvvv
{ {
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
memWrite16((u32)p->addr & 0x0FFFFFFF,(u16)(mem ^ (p->data & 0x0000FFFF))); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem ^ (p->data & 0x0000FFFF)));
} }
} }
else if (p->addr < 0xE0000000) else if (p->addr < 0xE0000000)
{ {
if ((((u32)p->data & 0xFFFF0000) == 0x00000000) || if (((u32)p->data & 0xFFFF0000) == 0x00000000) // Daaaaaaa 0000dddd
(((u32)p->data & 0xFFFF0000) == 0x00100000) ||
(((u32)p->data & 0xFFFF0000) == 0x00200000) ||
(((u32)p->data & 0xFFFF0000) == 0x00300000))
{ {
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
if (mem != (0x0000FFFF & (u32)p->data)) SkipCount = 1; if (mem != (0x0000FFFF & (u32)p->data))
{
SkipCount = 1;
}
PrevCheatType = 0;
}
else if (((u32)p->data & 0xFFFF0000) == 0x00100000) // Daaaaaaa 0010dddd
{
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
if (mem == (0x0000FFFF & (u32)p->data))
{
SkipCount = 1;
}
PrevCheatType = 0;
}
else if (((u32)p->data & 0xFFFF0000) == 0x00200000) // Daaaaaaa 0020dddd
{
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
if (mem >= (0x0000FFFF & (u32)p->data))
{
SkipCount = 1;
}
PrevCheatType = 0;
}
else if (((u32)p->data & 0xFFFF0000) == 0x00300000) // Daaaaaaa 0030dddd
{
u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF);
if (mem <= (0x0000FFFF & (u32)p->data))
{
SkipCount = 1;
}
PrevCheatType = 0; PrevCheatType = 0;
} }
} }
else if (p->addr < 0xF0000000) else if (p->addr < 0xF0000000)
{ {
if (((u32)p->data & 0xC0000000) == 0x00000000) if ((((u32)p->data & 0xF0000000) == 0x00000000)) // Ezyyvvvv 0aaaaaaa
if ((((u32)p->data & 0xF0000000) == 0x00000000) ||
(((u32)p->data & 0xF0000000) == 0x10000000) ||
(((u32)p->data & 0xF0000000) == 0x20000000) ||
(((u32)p->data & 0xF0000000) == 0x30000000))
{ {
u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000;
if (mem != (0x0000FFFF & (u32)p->addr)) SkipCount = ((u32)p->addr & 0xFFF0000) / 0x10000;
if (z == 0) // E0yyvvvv 0aaaaaaa
{
u16 mem16 = memRead16((u32)p->data & 0x0FFFFFFF);
if (mem16 != (0x0000FFFF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0; PrevCheatType = 0;
} }
else if (z == 1) // E1yy00vv 0aaaaaaa
{
u8 mem8 = memRead8((u32)p->data & 0x0FFFFFFF);
if (mem8 != (0x000000FF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
}
else if ((((u32)p->data & 0xF0000000) == 0x10000000)) // Ezyyvvvv 1aaaaaaa
{
u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000;
if (z == 0) // E0yyvvvv 1aaaaaaa
{
u16 mem16 = memRead16((u32)p->data & 0x0FFFFFFF);
if (mem16 == (0x0000FFFF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
else if (z == 1) // E1yy00vv 1aaaaaaa
{
u8 mem8 = memRead8((u32)p->data & 0x0FFFFFFF);
if (mem8 == (0x000000FF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
}
else if ((((u32)p->data & 0xF0000000) == 0x20000000)) // Ezyyvvvv 2aaaaaaa
{
u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000;
if (z == 0) // E0yyvvvv 2aaaaaaa
{
u16 mem16 = memRead16((u32)p->data & 0x0FFFFFFF);
if (mem16 >= (0x0000FFFF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
else if (z == 1) // E1yy00vv 2aaaaaaa
{
u8 mem8 = memRead8((u32)p->data & 0x0FFFFFFF);
if (mem8 >= (0x000000FF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
}
else if ((((u32)p->data & 0xF0000000) == 0x30000000)) // Ezyyvvvv 3aaaaaaa
{
u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000;
if (z == 0) // E0yyvvvv 3aaaaaaa
{
u16 mem16 = memRead16((u32)p->data & 0x0FFFFFFF);
if (mem16 <= (0x0000FFFF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
else if (z == 1) // E1yy00vv 3aaaaaaa
{
u8 mem8 = memRead8((u32)p->data & 0x0FFFFFFF);
if (mem8 <= (0x000000FF & (u32)p->addr))
{
SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000;
}
PrevCheatType = 0;
}
}
} }
} }
} }