aboutsummaryrefslogtreecommitdiff
path: root/source/cheats.c
diff options
context:
space:
mode:
authoraliaspider2014-10-30 00:23:30 +0100
committeraliaspider2014-10-30 00:23:30 +0100
commit804169dd621a3ad3eec1a32ce30350de667fee80 (patch)
tree5bce839a3652f6725d50639cccd3f589ee901515 /source/cheats.c
parent5382d193371c8db303d056b87b8ffd51316bf2e0 (diff)
downloadsnes9x2005-804169dd621a3ad3eec1a32ce30350de667fee80.tar.gz
snes9x2005-804169dd621a3ad3eec1a32ce30350de667fee80.tar.bz2
snes9x2005-804169dd621a3ad3eec1a32ce30350de667fee80.zip
apply a facelift
Diffstat (limited to 'source/cheats.c')
-rw-r--r--source/cheats.c629
1 files changed, 323 insertions, 306 deletions
diff --git a/source/cheats.c b/source/cheats.c
index 060d2ba..62d9a76 100644
--- a/source/cheats.c
+++ b/source/cheats.c
@@ -1,6 +1,6 @@
/*******************************************************************************
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
-
+
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
Jerremy Koot (jkoot@snes9x.com)
@@ -43,46 +43,46 @@
S-DD1 C emulator code
(c) Copyright 2003 Brad Jorsch with research by
Andreas Naive and John Weidman
-
+
S-RTC C emulator code
(c) Copyright 2001 John Weidman
-
+
ST010 C++ emulator code
(c) Copyright 2003 Feather, Kris Bleakley, John Weidman and Matthew Kendora
- Super FX x86 assembler emulator code
- (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
+ Super FX x86 assembler emulator code
+ (c) Copyright 1998 - 2003 zsKnight, _Demo_, and pagefault
- Super FX C emulator code
+ Super FX C emulator code
(c) Copyright 1997 - 1999 Ivar, Gary Henderson and John Weidman
SH assembler code partly based on x86 assembler code
- (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
+ (c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
+
-
Specific ports contains the works of other authors. See headers in
individual files.
-
+
Snes9x homepage: http://www.snes9x.com
-
+
Permission to use, copy, modify and distribute Snes9x in both binary and
source form, for non-commercial purposes, is hereby granted without fee,
providing that this license information and copyright notice appear with
all copies and any derived work.
-
+
This software is provided 'as-is', without any express or implied
warranty. In no event shall the authors be held liable for any damages
arising from the use of this software.
-
+
Snes9x is freeware for PERSONAL USE only. Commercial users should
seek permission of the copyright holders first. Commercial use includes
charging money for Snes9x or software derived from Snes9x.
-
+
The copyright holders request that bug fixes and improvements to the code
should be forwarded to them so everyone can benefit from the modifications
in future versions.
-
+
Super NES and Super Nintendo Entertainment System are trademarks of
Nintendo Co., Limited and its subsidiary companies.
*******************************************************************************/
@@ -93,114 +93,115 @@
#include "cheats.h"
#include "memmap.h"
-static bool8 S9xAllHex (const char *code, int len)
+static bool8 S9xAllHex(const char* code, int len)
{
int i;
- for (i = 0; i < len; i++)
- if ((code [i] < '0' || code [i] > '9') &&
+ for (i = 0; i < len; i++)
+ if ((code [i] < '0' || code [i] > '9') &&
(code [i] < 'a' || code [i] > 'f') &&
(code [i] < 'A' || code [i] > 'F'))
- return (FALSE);
+ return (FALSE);
- return (TRUE);
+ return (TRUE);
}
-const char *S9xProActionReplayToRaw (const char *code, uint32 *address, uint8 *byte)
+const char* S9xProActionReplayToRaw(const char* code, uint32* address,
+ uint8* byte)
{
- uint32 data = 0;
- if (strlen (code) != 8 || !S9xAllHex (code, 8) ||
- sscanf (code, "%x", &data) != 1)
- return ("Invalid Pro Action Replay code - should be 8 hex digits in length.");
-
- *address = data >> 8;
- *byte = (uint8) data;
- return (NULL);
+ uint32 data = 0;
+ if (strlen(code) != 8 || !S9xAllHex(code, 8) ||
+ sscanf(code, "%x", &data) != 1)
+ return ("Invalid Pro Action Replay code - should be 8 hex digits in length.");
+
+ *address = data >> 8;
+ *byte = (uint8) data;
+ return (NULL);
}
-const char *S9xGoldFingerToRaw (const char *code, uint32 *address, bool8 *sram,
- uint8 *num_bytes, uint8 bytes[3])
+const char* S9xGoldFingerToRaw(const char* code, uint32* address, bool8* sram,
+ uint8* num_bytes, uint8 bytes[3])
{
- char tmp [15];
- if (strlen (code) != 14)
- return ("Invalid Gold Finger code should be 14 hex digits in length.");
-
- strncpy (tmp, code, 5);
- tmp [5] = 0;
- if (sscanf (tmp, "%x", address) != 1)
- return ("Invalid Gold Finger code.");
-
- int i;
- for (i = 0; i < 3; i++)
- {
- strncpy (tmp, code + 5 + i * 2, 2);
- tmp [2] = 0;
- int byte;
- if (sscanf (tmp, "%x", &byte) != 1)
- break;
- bytes [i] = (uint8) byte;
- }
- *num_bytes = i;
- *sram = code [13] == '1';
- return (NULL);
+ char tmp [15];
+ if (strlen(code) != 14)
+ return ("Invalid Gold Finger code should be 14 hex digits in length.");
+
+ strncpy(tmp, code, 5);
+ tmp [5] = 0;
+ if (sscanf(tmp, "%x", address) != 1)
+ return ("Invalid Gold Finger code.");
+
+ int i;
+ for (i = 0; i < 3; i++)
+ {
+ strncpy(tmp, code + 5 + i * 2, 2);
+ tmp [2] = 0;
+ int byte;
+ if (sscanf(tmp, "%x", &byte) != 1)
+ break;
+ bytes [i] = (uint8) byte;
+ }
+ *num_bytes = i;
+ *sram = code [13] == '1';
+ return (NULL);
}
-const char *S9xGameGenieToRaw (const char *code, uint32 *address, uint8 *byte)
+const char* S9xGameGenieToRaw(const char* code, uint32* address, uint8* byte)
{
- char new_code [12];
-
- if (strlen (code) != 9 || *(code + 4) != '-' || !S9xAllHex (code, 4) ||
- !S9xAllHex (code + 5, 4))
- return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'.");
-
- strcpy (new_code, "0x");
- strncpy (new_code + 2, code, 4);
- strcpy (new_code + 6, code + 5);
-
- static char *real_hex = "0123456789ABCDEF";
- static char *genie_hex = "DF4709156BC8A23E";
-
- int i;
- for (i = 2; i < 10; i++)
- {
- if (islower (new_code [i]))
- new_code [i] = toupper (new_code [i]);
- int j;
- for (j = 0; j < 16; j++)
- {
- if (new_code [i] == genie_hex [j])
- {
- new_code [i] = real_hex [j];
- break;
- }
- }
- if (j == 16)
- return ("Invalid hex-character in Game Genie(tm) code");
- }
- uint32 data = 0;
- sscanf (new_code, "%x", &data);
- *byte = (uint8)(data >> 24);
- *address = ((data & 0x003c00) << 10) +
- ((data & 0x00003c) << 14) +
- ((data & 0xf00000) >> 8) +
- ((data & 0x000003) << 10) +
- ((data & 0x00c000) >> 6) +
- ((data & 0x0f0000) >> 12) +
- ((data & 0x0003c0) >> 6);
-
- return (NULL);
+ char new_code [12];
+
+ if (strlen(code) != 9 || *(code + 4) != '-' || !S9xAllHex(code, 4) ||
+ !S9xAllHex(code + 5, 4))
+ return ("Invalid Game Genie(tm) code - should be 'xxxx-xxxx'.");
+
+ strcpy(new_code, "0x");
+ strncpy(new_code + 2, code, 4);
+ strcpy(new_code + 6, code + 5);
+
+ static char* real_hex = "0123456789ABCDEF";
+ static char* genie_hex = "DF4709156BC8A23E";
+
+ int i;
+ for (i = 2; i < 10; i++)
+ {
+ if (islower(new_code [i]))
+ new_code [i] = toupper(new_code [i]);
+ int j;
+ for (j = 0; j < 16; j++)
+ {
+ if (new_code [i] == genie_hex [j])
+ {
+ new_code [i] = real_hex [j];
+ break;
+ }
+ }
+ if (j == 16)
+ return ("Invalid hex-character in Game Genie(tm) code");
+ }
+ uint32 data = 0;
+ sscanf(new_code, "%x", &data);
+ *byte = (uint8)(data >> 24);
+ *address = ((data & 0x003c00) << 10) +
+ ((data & 0x00003c) << 14) +
+ ((data & 0xf00000) >> 8) +
+ ((data & 0x000003) << 10) +
+ ((data & 0x00c000) >> 6) +
+ ((data & 0x0f0000) >> 12) +
+ ((data & 0x0003c0) >> 6);
+
+ return (NULL);
}
-void S9xStartCheatSearch (SCheatData *d)
+void S9xStartCheatSearch(SCheatData* d)
{
- // memmove may be required: Source is usually a different malloc, but could be pointed to d->CWRAM [Neb]
- memmove (d->CWRAM, d->RAM, 0x20000);
- // memmove may be required: Source is usually a different malloc, but could be pointed to d->CSRAM [Neb]
- memmove (d->CSRAM, d->SRAM, 0x10000);
- // memmove may be required: Source is usually a different malloc, but could be pointed to d->CIRAM [Neb]
- memmove (d->CIRAM, &d->FillRAM [0x3000], 0x2000);
- memset ((char *) d->WRAM_BITS, 0xff, 0x20000 >> 3);
- memset ((char *) d->SRAM_BITS, 0xff, 0x10000 >> 3);
- memset ((char *) d->IRAM_BITS, 0xff, 0x2000 >> 3);
+ // memmove may be required: Source is usually a different malloc, but could be pointed to d->CWRAM [Neb]
+ memmove(d->CWRAM, d->RAM, 0x20000);
+ // memmove may be required: Source is usually a different malloc, but could be pointed to d->CSRAM [Neb]
+ memmove(d->CSRAM, d->SRAM, 0x10000);
+ // memmove may be required: Source is usually a different malloc, but could be pointed to d->CIRAM [Neb]
+ memmove(d->CIRAM, &d->FillRAM [0x3000], 0x2000);
+ memset((char*) d->WRAM_BITS, 0xff, 0x20000 >> 3);
+ memset((char*) d->SRAM_BITS, 0xff, 0x10000 >> 3);
+ memset((char*) d->IRAM_BITS, 0xff, 0x2000 >> 3);
}
#define BIT_CLEAR(a,v) \
@@ -232,213 +233,229 @@ void S9xStartCheatSearch (SCheatData *d)
(s) == S9X_24_BITS ? (((int32) ((*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16)) << 8)) >> 8): \
((int32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24))))
-void S9xSearchForChange (SCheatData *d, S9xCheatComparisonType cmp,
- S9xCheatDataSize size, bool8 is_signed, bool8 update)
+void S9xSearchForChange(SCheatData* d, S9xCheatComparisonType cmp,
+ S9xCheatDataSize size, bool8 is_signed, bool8 update)
{
- int l;
-
- switch (size)
- {
- case S9X_8_BITS: l = 0; break;
- case S9X_16_BITS: l = 1; break;
- case S9X_24_BITS: l = 2; break;
- default:
- case S9X_32_BITS: l = 3; break;
- }
-
- int i;
- if (is_signed)
- {
- for (i = 0; i < 0x20000 - l; i++)
- {
- if (TEST_BIT (d->WRAM_BITS, i) &&
- _C(cmp, _DS(size, d->RAM, i), _DS(size, d->CWRAM, i)))
- {
- if (update)
- d->CWRAM [i] = d->RAM [i];
- }
- else
- BIT_CLEAR (d->WRAM_BITS, i);
- }
-
- for (i = 0; i < 0x10000 - l; i++)
- {
- if (TEST_BIT (d->SRAM_BITS, i) &&
- _C(cmp, _DS(size, d->SRAM, i), _DS(size, d->CSRAM, i)))
- {
- if (update)
- d->CSRAM [i] = d->SRAM [i];
- }
- else
- BIT_CLEAR (d->SRAM_BITS, i);
- }
-
- for (i = 0; i < 0x2000 - l; i++)
- {
- if (TEST_BIT (d->IRAM_BITS, i) &&
- _C(cmp, _DS(size, d->FillRAM + 0x3000, i), _DS(size, d->CIRAM, i)))
- {
- if (update)
- d->CIRAM [i] = d->FillRAM [i + 0x3000];
- }
- else
- BIT_CLEAR (d->IRAM_BITS, i);
- }
- }
- else
- {
- for (i = 0; i < 0x20000 - l; i++)
- {
- if (TEST_BIT (d->WRAM_BITS, i) &&
- _C(cmp, _D(size, d->RAM, i), _D(size, d->CWRAM, i)))
- {
- if (update)
- d->CWRAM [i] = d->RAM [i];
- }
- else
- BIT_CLEAR (d->WRAM_BITS, i);
- }
-
- for (i = 0; i < 0x10000 - l; i++)
- {
- if (TEST_BIT (d->SRAM_BITS, i) &&
- _C(cmp, _D(size, d->SRAM, i), _D(size, d->CSRAM, i)))
- {
- if (update)
- d->CSRAM [i] = d->SRAM [i];
- }
- else
- BIT_CLEAR (d->SRAM_BITS, i);
- }
-
- for (i = 0; i < 0x2000 - l; i++)
- {
- if (TEST_BIT (d->IRAM_BITS, i) &&
- _C(cmp, _D(size, d->FillRAM + 0x3000, i), _D(size, d->CIRAM, i)))
- {
- if (update)
- d->CIRAM [i] = d->FillRAM [i + 0x3000];
- }
- else
- BIT_CLEAR (d->IRAM_BITS, i);
- }
- }
+ int l;
+
+ switch (size)
+ {
+ case S9X_8_BITS:
+ l = 0;
+ break;
+ case S9X_16_BITS:
+ l = 1;
+ break;
+ case S9X_24_BITS:
+ l = 2;
+ break;
+ default:
+ case S9X_32_BITS:
+ l = 3;
+ break;
+ }
+
+ int i;
+ if (is_signed)
+ {
+ for (i = 0; i < 0x20000 - l; i++)
+ {
+ if (TEST_BIT(d->WRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->RAM, i), _DS(size, d->CWRAM, i)))
+ {
+ if (update)
+ d->CWRAM [i] = d->RAM [i];
+ }
+ else
+ BIT_CLEAR(d->WRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x10000 - l; i++)
+ {
+ if (TEST_BIT(d->SRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->SRAM, i), _DS(size, d->CSRAM, i)))
+ {
+ if (update)
+ d->CSRAM [i] = d->SRAM [i];
+ }
+ else
+ BIT_CLEAR(d->SRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x2000 - l; i++)
+ {
+ if (TEST_BIT(d->IRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->FillRAM + 0x3000, i), _DS(size, d->CIRAM, i)))
+ {
+ if (update)
+ d->CIRAM [i] = d->FillRAM [i + 0x3000];
+ }
+ else
+ BIT_CLEAR(d->IRAM_BITS, i);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 0x20000 - l; i++)
+ {
+ if (TEST_BIT(d->WRAM_BITS, i) &&
+ _C(cmp, _D(size, d->RAM, i), _D(size, d->CWRAM, i)))
+ {
+ if (update)
+ d->CWRAM [i] = d->RAM [i];
+ }
+ else
+ BIT_CLEAR(d->WRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x10000 - l; i++)
+ {
+ if (TEST_BIT(d->SRAM_BITS, i) &&
+ _C(cmp, _D(size, d->SRAM, i), _D(size, d->CSRAM, i)))
+ {
+ if (update)
+ d->CSRAM [i] = d->SRAM [i];
+ }
+ else
+ BIT_CLEAR(d->SRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x2000 - l; i++)
+ {
+ if (TEST_BIT(d->IRAM_BITS, i) &&
+ _C(cmp, _D(size, d->FillRAM + 0x3000, i), _D(size, d->CIRAM, i)))
+ {
+ if (update)
+ d->CIRAM [i] = d->FillRAM [i + 0x3000];
+ }
+ else
+ BIT_CLEAR(d->IRAM_BITS, i);
+ }
+ }
}
-void S9xSearchForValue (SCheatData *d, S9xCheatComparisonType cmp,
- S9xCheatDataSize size, uint32 value,
- bool8 is_signed, bool8 update)
+void S9xSearchForValue(SCheatData* d, S9xCheatComparisonType cmp,
+ S9xCheatDataSize size, uint32 value,
+ bool8 is_signed, bool8 update)
{
- int l;
-
- switch (size)
- {
- case S9X_8_BITS: l = 0; break;
- case S9X_16_BITS: l = 1; break;
- case S9X_24_BITS: l = 2; break;
- default:
- case S9X_32_BITS: l = 3; break;
- }
-
- int i;
-
- if (is_signed)
- {
- for (i = 0; i < 0x20000 - l; i++)
- {
- if (TEST_BIT (d->WRAM_BITS, i) &&
- _C(cmp, _DS(size, d->RAM, i), (int32) value))
- {
- if (update)
- d->CWRAM [i] = d->RAM [i];
- }
- else
- BIT_CLEAR (d->WRAM_BITS, i);
- }
-
- for (i = 0; i < 0x10000 - l; i++)
- {
- if (TEST_BIT (d->SRAM_BITS, i) &&
- _C(cmp, _DS(size, d->SRAM, i), (int32) value))
- {
- if (update)
- d->CSRAM [i] = d->SRAM [i];
- }
- else
- BIT_CLEAR (d->SRAM_BITS, i);
- }
-
- for (i = 0; i < 0x2000 - l; i++)
- {
- if (TEST_BIT (d->IRAM_BITS, i) &&
- _C(cmp, _DS(size, d->FillRAM + 0x3000, i), (int32) value))
- {
- if (update)
- d->CIRAM [i] = d->FillRAM [i + 0x3000];
- }
- else
- BIT_CLEAR (d->IRAM_BITS, i);
- }
- }
- else
- {
- for (i = 0; i < 0x20000 - l; i++)
- {
- if (TEST_BIT (d->WRAM_BITS, i) &&
- _C(cmp, _D(size, d->RAM, i), value))
- {
- if (update)
- d->CWRAM [i] = d->RAM [i];
- }
- else
- BIT_CLEAR (d->WRAM_BITS, i);
- }
-
- for (i = 0; i < 0x10000 - l; i++)
- {
- if (TEST_BIT (d->SRAM_BITS, i) &&
- _C(cmp, _D(size, d->SRAM, i), value))
- {
- if (update)
- d->CSRAM [i] = d->SRAM [i];
- }
- else
- BIT_CLEAR (d->SRAM_BITS, i);
- }
-
- for (i = 0; i < 0x2000 - l; i++)
- {
- if (TEST_BIT (d->IRAM_BITS, i) &&
- _C(cmp, _D(size, d->FillRAM + 0x3000, i), value))
- {
- if (update)
- d->CIRAM [i] = d->FillRAM [i + 0x3000];
- }
- else
- BIT_CLEAR (d->IRAM_BITS, i);
- }
- }
+ int l;
+
+ switch (size)
+ {
+ case S9X_8_BITS:
+ l = 0;
+ break;
+ case S9X_16_BITS:
+ l = 1;
+ break;
+ case S9X_24_BITS:
+ l = 2;
+ break;
+ default:
+ case S9X_32_BITS:
+ l = 3;
+ break;
+ }
+
+ int i;
+
+ if (is_signed)
+ {
+ for (i = 0; i < 0x20000 - l; i++)
+ {
+ if (TEST_BIT(d->WRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->RAM, i), (int32) value))
+ {
+ if (update)
+ d->CWRAM [i] = d->RAM [i];
+ }
+ else
+ BIT_CLEAR(d->WRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x10000 - l; i++)
+ {
+ if (TEST_BIT(d->SRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->SRAM, i), (int32) value))
+ {
+ if (update)
+ d->CSRAM [i] = d->SRAM [i];
+ }
+ else
+ BIT_CLEAR(d->SRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x2000 - l; i++)
+ {
+ if (TEST_BIT(d->IRAM_BITS, i) &&
+ _C(cmp, _DS(size, d->FillRAM + 0x3000, i), (int32) value))
+ {
+ if (update)
+ d->CIRAM [i] = d->FillRAM [i + 0x3000];
+ }
+ else
+ BIT_CLEAR(d->IRAM_BITS, i);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 0x20000 - l; i++)
+ {
+ if (TEST_BIT(d->WRAM_BITS, i) &&
+ _C(cmp, _D(size, d->RAM, i), value))
+ {
+ if (update)
+ d->CWRAM [i] = d->RAM [i];
+ }
+ else
+ BIT_CLEAR(d->WRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x10000 - l; i++)
+ {
+ if (TEST_BIT(d->SRAM_BITS, i) &&
+ _C(cmp, _D(size, d->SRAM, i), value))
+ {
+ if (update)
+ d->CSRAM [i] = d->SRAM [i];
+ }
+ else
+ BIT_CLEAR(d->SRAM_BITS, i);
+ }
+
+ for (i = 0; i < 0x2000 - l; i++)
+ {
+ if (TEST_BIT(d->IRAM_BITS, i) &&
+ _C(cmp, _D(size, d->FillRAM + 0x3000, i), value))
+ {
+ if (update)
+ d->CIRAM [i] = d->FillRAM [i + 0x3000];
+ }
+ else
+ BIT_CLEAR(d->IRAM_BITS, i);
+ }
+ }
}
-void S9xOutputCheatSearchResults (SCheatData *d)
+void S9xOutputCheatSearchResults(SCheatData* d)
{
- int i;
- for (i = 0; i < 0x20000; i++)
- {
- if (TEST_BIT (d->WRAM_BITS, i))
- printf ("WRAM: %05x: %02x\n", i, d->RAM [i]);
- }
-
- for (i = 0; i < 0x10000; i++)
- {
- if (TEST_BIT (d->SRAM_BITS, i))
- printf ("SRAM: %04x: %02x\n", i, d->SRAM [i]);
- }
-
- for (i = 0; i < 0x2000; i++)
- {
- if (TEST_BIT (d->IRAM_BITS, i))
- printf ("IRAM: %05x: %02x\n", i, d->FillRAM [i + 0x3000]);
- }
+ int i;
+ for (i = 0; i < 0x20000; i++)
+ {
+ if (TEST_BIT(d->WRAM_BITS, i))
+ printf("WRAM: %05x: %02x\n", i, d->RAM [i]);
+ }
+
+ for (i = 0; i < 0x10000; i++)
+ {
+ if (TEST_BIT(d->SRAM_BITS, i))
+ printf("SRAM: %04x: %02x\n", i, d->SRAM [i]);
+ }
+
+ for (i = 0; i < 0x2000; i++)
+ {
+ if (TEST_BIT(d->IRAM_BITS, i))
+ printf("IRAM: %05x: %02x\n", i, d->FillRAM [i + 0x3000]);
+ }
}