mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-10 21:05:12 +01:00
Refactor cheat decoding, add support for Master System cheats.
This commit is contained in:
parent
7093f1b7b2
commit
929d8bd723
@ -1190,14 +1190,13 @@ static uint32_t decode_cheat(char *string, int index)
|
||||
uint32_t address = 0;
|
||||
uint16_t data = 0;
|
||||
uint8_t ref = 0;
|
||||
/* 16-bit Game Genie code (ABCD-EFGH) */
|
||||
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD){
|
||||
//If system is Genesis-based
|
||||
|
||||
//Game-Genie
|
||||
if ((strlen(string) >= 9) && (string[4] == '-'))
|
||||
{
|
||||
/* 16-bit system only */
|
||||
if ((system_hw & SYSTEM_PBC) != SYSTEM_MD)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (i == 4) string++;
|
||||
@ -1238,14 +1237,36 @@ static uint32_t decode_cheat(char *string, int index)
|
||||
/* code length */
|
||||
len = 9;
|
||||
}
|
||||
/* 8-bit Game Genie code (DDA-AAA-XXX) */
|
||||
else if ((strlen(string) >= 11) && (string[3] == '-') && (string[7] == '-'))
|
||||
|
||||
//Patch and PAR
|
||||
else if ((strlen(string) >=9) && (string[6] == ':'))
|
||||
{
|
||||
/* 8-bit system only */
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
/* decode 24-bit address */
|
||||
for (i=0; i<6; i++)
|
||||
{
|
||||
return 0;
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
address |= (n << ((5 - i) * 4));
|
||||
}
|
||||
/* decode 16-bit data */
|
||||
string++;
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) break;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
data |= (n << ((3 - i) * 4));
|
||||
}
|
||||
/* code length */
|
||||
len = 11;
|
||||
}
|
||||
} else {
|
||||
//If System is Master-based
|
||||
|
||||
//Game Genie
|
||||
if ((strlen(string) >=11) && (string[3] == '-') && (string[7] == '-'))
|
||||
{
|
||||
/* decode 8-bit data */
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
@ -1291,39 +1312,35 @@ static uint32_t decode_cheat(char *string, int index)
|
||||
/* code length */
|
||||
len = 11;
|
||||
}
|
||||
/* Action Replay code */
|
||||
else if (string[6] == ':')
|
||||
{
|
||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||
{
|
||||
/* 16-bit code (AAAAAA:DDDD) */
|
||||
if (strlen(string) < 11) return 0;
|
||||
/* decode 24-bit address */
|
||||
for (i=0; i<6; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
address |= (n << ((5 - i) * 4));
|
||||
}
|
||||
/* decode 16-bit data */
|
||||
string++;
|
||||
|
||||
//Action Replay
|
||||
else if ((strlen(string) >=9) && (string[4] == '-')){
|
||||
string+=2;
|
||||
/* decode 16-bit address */
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
data |= (n << ((3 - i) * 4));
|
||||
address |= (n << ((3 - i) * 4));
|
||||
if (i==1) string++;
|
||||
}
|
||||
/* decode 8-bit data */
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
data |= (n << ((1 - i) * 4));
|
||||
}
|
||||
/* code length */
|
||||
len = 11;
|
||||
len = 9;
|
||||
}
|
||||
else
|
||||
|
||||
//Fusion RAM
|
||||
else if ((strlen(string) >=7) && (string[4] == ':'))
|
||||
{
|
||||
/* 8-bit code (xxAAAA:DD) */
|
||||
if (strlen(string) < 9) return 0;
|
||||
/* decode 16-bit address */
|
||||
string+=2;
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
@ -1331,10 +1348,6 @@ static uint32_t decode_cheat(char *string, int index)
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
address |= (n << ((3 - i) * 4));
|
||||
}
|
||||
/* ROM addresses are not supported */
|
||||
if (address < 0xC000) return 0;
|
||||
/* convert to 24-bit Work RAM address */
|
||||
address = 0xFF0000 | (address & 0x1FFF);
|
||||
/* decode 8-bit data */
|
||||
string++;
|
||||
for (i=0; i<2; i++)
|
||||
@ -1345,6 +1358,40 @@ static uint32_t decode_cheat(char *string, int index)
|
||||
data |= (n << ((1 - i) * 4));
|
||||
}
|
||||
/* code length */
|
||||
len = 7;
|
||||
}
|
||||
|
||||
//Fusion ROM
|
||||
else if ((strlen(string) >=9) && (string[6] == ':'))
|
||||
{
|
||||
/* decode reference 8-bit data */
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
ref |= (n << ((1 - i) * 4));
|
||||
}
|
||||
/* decode 16-bit address */
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
address |= (n << ((3 - i) * 4));
|
||||
}
|
||||
/* decode 8-bit data */
|
||||
string++;
|
||||
for (i=0; i<2; i++)
|
||||
{
|
||||
p = strchr (arvalidchars, *string++);
|
||||
if (p == NULL) return 0;
|
||||
n = (p - arvalidchars) & 0xF;
|
||||
data |= (n << ((1 - i) * 4));
|
||||
}
|
||||
/* update old data value */
|
||||
cheatlist[index].old = ref;
|
||||
/* code length */
|
||||
len = 9;
|
||||
}
|
||||
}
|
||||
@ -1894,19 +1941,16 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code)
|
||||
{
|
||||
char codeCopy[256];
|
||||
char *buff;
|
||||
bool multiline=0;
|
||||
|
||||
/* Avoid crashing when giving empty input */
|
||||
if (code=='\0') return;
|
||||
|
||||
/* clear existing ROM patches */
|
||||
clear_cheats();
|
||||
|
||||
/* Detect and split multiline cheats */
|
||||
strcpy(codeCopy,code);
|
||||
if (strstr(code,"+")){
|
||||
multiline=1;
|
||||
buff = strtok(codeCopy,"+");
|
||||
} else {
|
||||
buff=codeCopy;
|
||||
}
|
||||
|
||||
while (buff != NULL)
|
||||
{
|
||||
@ -1933,8 +1977,6 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code)
|
||||
maxcheats++;
|
||||
}
|
||||
}
|
||||
if (!multiline)
|
||||
break;
|
||||
buff = strtok(NULL,"+");
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user