mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-01 00:15:14 +01:00
Enable cheats
This commit is contained in:
parent
17d6488545
commit
15f45cf523
499
source/snes9x/cheats.cpp
Normal file
499
source/snes9x/cheats.cpp
Normal file
@ -0,0 +1,499 @@
|
||||
/**********************************************************************************
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
|
||||
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
|
||||
Jerremy Koot (jkoot@snes9x.com)
|
||||
|
||||
(c) Copyright 2002 - 2004 Matthew Kendora
|
||||
|
||||
(c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
|
||||
|
||||
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
|
||||
|
||||
(c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
|
||||
|
||||
(c) Copyright 2002 - 2006 Brad Jorsch (anomie@users.sourceforge.net),
|
||||
funkyass (funkyass@spam.shaw.ca),
|
||||
Kris Bleakley (codeviolation@hotmail.com),
|
||||
Nach (n-a-c-h@users.sourceforge.net), and
|
||||
zones (kasumitokoduck@yahoo.com)
|
||||
|
||||
BS-X C emulator code
|
||||
(c) Copyright 2005 - 2006 Dreamer Nom,
|
||||
zones
|
||||
|
||||
C4 x86 assembler and some C emulation code
|
||||
(c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
|
||||
Nach,
|
||||
zsKnight (zsknight@zsnes.com)
|
||||
|
||||
C4 C++ code
|
||||
(c) Copyright 2003 - 2006 Brad Jorsch,
|
||||
Nach
|
||||
|
||||
DSP-1 emulator code
|
||||
(c) Copyright 1998 - 2006 _Demo_,
|
||||
Andreas Naive (andreasnaive@gmail.com)
|
||||
Gary Henderson,
|
||||
Ivar (ivar@snes9x.com),
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
neviksti (neviksti@hotmail.com)
|
||||
|
||||
DSP-2 emulator code
|
||||
(c) Copyright 2003 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lord Nightmare (lord_nightmare@users.sourceforge.net),
|
||||
Matthew Kendora,
|
||||
neviksti
|
||||
|
||||
|
||||
DSP-3 emulator code
|
||||
(c) Copyright 2003 - 2006 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lancer,
|
||||
z80 gaiden
|
||||
|
||||
DSP-4 emulator code
|
||||
(c) Copyright 2004 - 2006 Dreamer Nom,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Nach,
|
||||
z80 gaiden
|
||||
|
||||
OBC1 emulator code
|
||||
(c) Copyright 2001 - 2004 zsKnight,
|
||||
pagefault (pagefault@zsnes.com),
|
||||
Kris Bleakley,
|
||||
Ported from x86 assembler to C by sanmaiwashi
|
||||
|
||||
SPC7110 and RTC C++ emulator code
|
||||
(c) Copyright 2002 Matthew Kendora with research by
|
||||
zsKnight,
|
||||
John Weidman,
|
||||
Dark Force
|
||||
|
||||
S-DD1 C emulator code
|
||||
(c) Copyright 2003 Brad Jorsch with research by
|
||||
Andreas Naive,
|
||||
John Weidman
|
||||
|
||||
S-RTC C emulator code
|
||||
(c) Copyright 2001-2006 byuu,
|
||||
John Weidman
|
||||
|
||||
ST010 C++ emulator code
|
||||
(c) Copyright 2003 Feather,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora
|
||||
|
||||
Super FX x86 assembler emulator code
|
||||
(c) Copyright 1998 - 2003 _Demo_,
|
||||
pagefault,
|
||||
zsKnight,
|
||||
|
||||
Super FX C emulator code
|
||||
(c) Copyright 1997 - 1999 Ivar,
|
||||
Gary Henderson,
|
||||
John Weidman
|
||||
|
||||
Sound DSP emulator code is derived from SNEeSe and OpenSPC:
|
||||
(c) Copyright 1998 - 2003 Brad Martin
|
||||
(c) Copyright 1998 - 2006 Charles Bilyue'
|
||||
|
||||
SH assembler code partly based on x86 assembler code
|
||||
(c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
|
||||
|
||||
2xSaI filter
|
||||
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
|
||||
|
||||
HQ2x filter
|
||||
(c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
|
||||
|
||||
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/or 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 or it's derivatives.
|
||||
|
||||
Snes9x is freeware for PERSONAL USE only. Commercial users should
|
||||
seek permission of the copyright holders first. Commercial use includes,
|
||||
but is not limited to, charging money for Snes9x or software derived from
|
||||
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
|
||||
using Snes9x as a promotion for your commercial product.
|
||||
|
||||
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.
|
||||
**********************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include "snes9x.h"
|
||||
#include "cheats.h"
|
||||
#include "memmap.h"
|
||||
|
||||
static bool8 S9xAllHex (const char *code, int len)
|
||||
{
|
||||
for (int 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 (TRUE);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
unsigned 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)
|
||||
{
|
||||
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";
|
||||
|
||||
for (int 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 & 0xffffff;
|
||||
address = ((address & 0x003c00) << 10) +
|
||||
((address & 0x00003c) << 14) +
|
||||
((address & 0xf00000) >> 8) +
|
||||
((address & 0x000003) << 10) +
|
||||
((address & 0x00c000) >> 6) +
|
||||
((address & 0x0f0000) >> 12) +
|
||||
((address & 0x0003c0) >> 6);
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
void S9xStartCheatSearch (SCheatData *d)
|
||||
{
|
||||
memmove (d->CWRAM, d->RAM, 0x20000);
|
||||
memmove (d->CSRAM, d->SRAM, 0x10000);
|
||||
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) \
|
||||
(a)[(v) >> 5] &= ~(1 << ((v) & 31))
|
||||
|
||||
#define BIT_SET(a,v) \
|
||||
(a)[(v) >> 5] |= 1 << ((v) & 31)
|
||||
|
||||
#define TEST_BIT(a,v) \
|
||||
((a)[(v) >> 5] & (1 << ((v) & 31)))
|
||||
|
||||
#ifdef NGC
|
||||
#undef _C /*** Stops powerpc-gekko-g++ complaining -;) ***/
|
||||
#endif
|
||||
|
||||
#define _C(c,a,b) \
|
||||
((c) == S9X_LESS_THAN ? (a) < (b) : \
|
||||
(c) == S9X_GREATER_THAN ? (a) > (b) : \
|
||||
(c) == S9X_LESS_THAN_OR_EQUAL ? (a) <= (b) : \
|
||||
(c) == S9X_GREATER_THAN_OR_EQUAL ? (a) >= (b) : \
|
||||
(c) == S9X_EQUAL ? (a) == (b) : \
|
||||
(a) != (b))
|
||||
|
||||
#define _D(s,m,o) \
|
||||
((s) == S9X_8_BITS ? (uint8) (*((m) + (o))) : \
|
||||
(s) == S9X_16_BITS ? ((uint16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \
|
||||
(s) == S9X_24_BITS ? ((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16))) : \
|
||||
((uint32) (*((m) + (o)) + (*((m) + (o) + 1) << 8) + (*((m) + (o) + 2) << 16) + (*((m) + (o) + 3) << 24))))
|
||||
|
||||
#define _DS(s,m,o) \
|
||||
((s) == S9X_8_BITS ? ((int8) *((m) + (o))) : \
|
||||
(s) == S9X_16_BITS ? ((int16) (*((m) + (o)) + (*((m) + (o) + 1) << 8))) : \
|
||||
(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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
213
source/snes9x/cheats.h
Normal file
213
source/snes9x/cheats.h
Normal file
@ -0,0 +1,213 @@
|
||||
/**********************************************************************************
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
|
||||
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
|
||||
Jerremy Koot (jkoot@snes9x.com)
|
||||
|
||||
(c) Copyright 2002 - 2004 Matthew Kendora
|
||||
|
||||
(c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
|
||||
|
||||
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
|
||||
|
||||
(c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
|
||||
|
||||
(c) Copyright 2002 - 2006 Brad Jorsch (anomie@users.sourceforge.net),
|
||||
funkyass (funkyass@spam.shaw.ca),
|
||||
Kris Bleakley (codeviolation@hotmail.com),
|
||||
Nach (n-a-c-h@users.sourceforge.net), and
|
||||
zones (kasumitokoduck@yahoo.com)
|
||||
|
||||
BS-X C emulator code
|
||||
(c) Copyright 2005 - 2006 Dreamer Nom,
|
||||
zones
|
||||
|
||||
C4 x86 assembler and some C emulation code
|
||||
(c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
|
||||
Nach,
|
||||
zsKnight (zsknight@zsnes.com)
|
||||
|
||||
C4 C++ code
|
||||
(c) Copyright 2003 - 2006 Brad Jorsch,
|
||||
Nach
|
||||
|
||||
DSP-1 emulator code
|
||||
(c) Copyright 1998 - 2006 _Demo_,
|
||||
Andreas Naive (andreasnaive@gmail.com)
|
||||
Gary Henderson,
|
||||
Ivar (ivar@snes9x.com),
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
neviksti (neviksti@hotmail.com)
|
||||
|
||||
DSP-2 emulator code
|
||||
(c) Copyright 2003 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lord Nightmare (lord_nightmare@users.sourceforge.net),
|
||||
Matthew Kendora,
|
||||
neviksti
|
||||
|
||||
|
||||
DSP-3 emulator code
|
||||
(c) Copyright 2003 - 2006 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lancer,
|
||||
z80 gaiden
|
||||
|
||||
DSP-4 emulator code
|
||||
(c) Copyright 2004 - 2006 Dreamer Nom,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Nach,
|
||||
z80 gaiden
|
||||
|
||||
OBC1 emulator code
|
||||
(c) Copyright 2001 - 2004 zsKnight,
|
||||
pagefault (pagefault@zsnes.com),
|
||||
Kris Bleakley,
|
||||
Ported from x86 assembler to C by sanmaiwashi
|
||||
|
||||
SPC7110 and RTC C++ emulator code
|
||||
(c) Copyright 2002 Matthew Kendora with research by
|
||||
zsKnight,
|
||||
John Weidman,
|
||||
Dark Force
|
||||
|
||||
S-DD1 C emulator code
|
||||
(c) Copyright 2003 Brad Jorsch with research by
|
||||
Andreas Naive,
|
||||
John Weidman
|
||||
|
||||
S-RTC C emulator code
|
||||
(c) Copyright 2001-2006 byuu,
|
||||
John Weidman
|
||||
|
||||
ST010 C++ emulator code
|
||||
(c) Copyright 2003 Feather,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora
|
||||
|
||||
Super FX x86 assembler emulator code
|
||||
(c) Copyright 1998 - 2003 _Demo_,
|
||||
pagefault,
|
||||
zsKnight,
|
||||
|
||||
Super FX C emulator code
|
||||
(c) Copyright 1997 - 1999 Ivar,
|
||||
Gary Henderson,
|
||||
John Weidman
|
||||
|
||||
Sound DSP emulator code is derived from SNEeSe and OpenSPC:
|
||||
(c) Copyright 1998 - 2003 Brad Martin
|
||||
(c) Copyright 1998 - 2006 Charles Bilyue'
|
||||
|
||||
SH assembler code partly based on x86 assembler code
|
||||
(c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
|
||||
|
||||
2xSaI filter
|
||||
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
|
||||
|
||||
HQ2x filter
|
||||
(c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
|
||||
|
||||
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/or 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 or it's derivatives.
|
||||
|
||||
Snes9x is freeware for PERSONAL USE only. Commercial users should
|
||||
seek permission of the copyright holders first. Commercial use includes,
|
||||
but is not limited to, charging money for Snes9x or software derived from
|
||||
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
|
||||
using Snes9x as a promotion for your commercial product.
|
||||
|
||||
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.
|
||||
**********************************************************************************/
|
||||
|
||||
#ifndef _CHEATS_H_
|
||||
#define _CHEATS_H_
|
||||
|
||||
struct SCheat
|
||||
{
|
||||
uint32 address;
|
||||
uint8 byte;
|
||||
uint8 saved_byte;
|
||||
bool8 enabled;
|
||||
bool8 saved;
|
||||
char name [22];
|
||||
};
|
||||
|
||||
#define MAX_CHEATS 75
|
||||
|
||||
struct SCheatData
|
||||
{
|
||||
struct SCheat c [MAX_CHEATS];
|
||||
uint32 num_cheats;
|
||||
uint8 CWRAM [0x20000];
|
||||
uint8 CSRAM [0x10000];
|
||||
uint8 CIRAM [0x2000];
|
||||
uint8 *RAM;
|
||||
uint8 *FillRAM;
|
||||
uint8 *SRAM;
|
||||
uint32 WRAM_BITS [0x20000 >> 3];
|
||||
uint32 SRAM_BITS [0x10000 >> 3];
|
||||
uint32 IRAM_BITS [0x2000 >> 3];
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
S9X_LESS_THAN, S9X_GREATER_THAN, S9X_LESS_THAN_OR_EQUAL,
|
||||
S9X_GREATER_THAN_OR_EQUAL, S9X_EQUAL, S9X_NOT_EQUAL
|
||||
} S9xCheatComparisonType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
S9X_8_BITS, S9X_16_BITS, S9X_24_BITS, S9X_32_BITS
|
||||
} S9xCheatDataSize;
|
||||
|
||||
void S9xInitCheatData ();
|
||||
|
||||
const char *S9xGameGenieToRaw (const char *code, uint32 &address, uint8 &byte);
|
||||
const char *S9xProActionReplayToRaw (const char *code, uint32 &address, uint8 &byte);
|
||||
const char *S9xGoldFingerToRaw (const char *code, uint32 &address, bool8 &sram,
|
||||
uint8 &num_bytes, uint8 bytes[3]);
|
||||
void S9xApplyCheats ();
|
||||
void S9xApplyCheat (uint32 which1);
|
||||
void S9xRemoveCheats ();
|
||||
void S9xRemoveCheat (uint32 which1);
|
||||
void S9xEnableCheat (uint32 which1);
|
||||
void S9xDisableCheat (uint32 which1);
|
||||
void S9xAddCheat (bool8 enable, bool8 save_current_value, uint32 address,
|
||||
uint8 byte);
|
||||
void S9xDeleteCheats ();
|
||||
void S9xDeleteCheat (uint32 which1);
|
||||
bool8 S9xLoadCheatFile (const char *filename);
|
||||
bool8 S9xSaveCheatFile (const char *filename);
|
||||
|
||||
void S9xStartCheatSearch (SCheatData *);
|
||||
void S9xSearchForChange (SCheatData *, S9xCheatComparisonType cmp,
|
||||
S9xCheatDataSize size, bool8 is_signed, bool8 update);
|
||||
void S9xSearchForValue (SCheatData *, S9xCheatComparisonType cmp,
|
||||
S9xCheatDataSize size, uint32 value,
|
||||
bool8 is_signed, bool8 update);
|
||||
void S9xOutputCheatSearchResults (SCheatData *);
|
||||
|
||||
#endif
|
||||
|
338
source/snes9x/cheats2.cpp
Normal file
338
source/snes9x/cheats2.cpp
Normal file
@ -0,0 +1,338 @@
|
||||
/**********************************************************************************
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
|
||||
(c) Copyright 1996 - 2002 Gary Henderson (gary.henderson@ntlworld.com) and
|
||||
Jerremy Koot (jkoot@snes9x.com)
|
||||
|
||||
(c) Copyright 2002 - 2004 Matthew Kendora
|
||||
|
||||
(c) Copyright 2002 - 2005 Peter Bortas (peter@bortas.org)
|
||||
|
||||
(c) Copyright 2004 - 2005 Joel Yliluoma (http://iki.fi/bisqwit/)
|
||||
|
||||
(c) Copyright 2001 - 2006 John Weidman (jweidman@slip.net)
|
||||
|
||||
(c) Copyright 2002 - 2006 Brad Jorsch (anomie@users.sourceforge.net),
|
||||
funkyass (funkyass@spam.shaw.ca),
|
||||
Kris Bleakley (codeviolation@hotmail.com),
|
||||
Nach (n-a-c-h@users.sourceforge.net), and
|
||||
zones (kasumitokoduck@yahoo.com)
|
||||
|
||||
BS-X C emulator code
|
||||
(c) Copyright 2005 - 2006 Dreamer Nom,
|
||||
zones
|
||||
|
||||
C4 x86 assembler and some C emulation code
|
||||
(c) Copyright 2000 - 2003 _Demo_ (_demo_@zsnes.com),
|
||||
Nach,
|
||||
zsKnight (zsknight@zsnes.com)
|
||||
|
||||
C4 C++ code
|
||||
(c) Copyright 2003 - 2006 Brad Jorsch,
|
||||
Nach
|
||||
|
||||
DSP-1 emulator code
|
||||
(c) Copyright 1998 - 2006 _Demo_,
|
||||
Andreas Naive (andreasnaive@gmail.com)
|
||||
Gary Henderson,
|
||||
Ivar (ivar@snes9x.com),
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora,
|
||||
Nach,
|
||||
neviksti (neviksti@hotmail.com)
|
||||
|
||||
DSP-2 emulator code
|
||||
(c) Copyright 2003 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lord Nightmare (lord_nightmare@users.sourceforge.net),
|
||||
Matthew Kendora,
|
||||
neviksti
|
||||
|
||||
|
||||
DSP-3 emulator code
|
||||
(c) Copyright 2003 - 2006 John Weidman,
|
||||
Kris Bleakley,
|
||||
Lancer,
|
||||
z80 gaiden
|
||||
|
||||
DSP-4 emulator code
|
||||
(c) Copyright 2004 - 2006 Dreamer Nom,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Nach,
|
||||
z80 gaiden
|
||||
|
||||
OBC1 emulator code
|
||||
(c) Copyright 2001 - 2004 zsKnight,
|
||||
pagefault (pagefault@zsnes.com),
|
||||
Kris Bleakley,
|
||||
Ported from x86 assembler to C by sanmaiwashi
|
||||
|
||||
SPC7110 and RTC C++ emulator code
|
||||
(c) Copyright 2002 Matthew Kendora with research by
|
||||
zsKnight,
|
||||
John Weidman,
|
||||
Dark Force
|
||||
|
||||
S-DD1 C emulator code
|
||||
(c) Copyright 2003 Brad Jorsch with research by
|
||||
Andreas Naive,
|
||||
John Weidman
|
||||
|
||||
S-RTC C emulator code
|
||||
(c) Copyright 2001-2006 byuu,
|
||||
John Weidman
|
||||
|
||||
ST010 C++ emulator code
|
||||
(c) Copyright 2003 Feather,
|
||||
John Weidman,
|
||||
Kris Bleakley,
|
||||
Matthew Kendora
|
||||
|
||||
Super FX x86 assembler emulator code
|
||||
(c) Copyright 1998 - 2003 _Demo_,
|
||||
pagefault,
|
||||
zsKnight,
|
||||
|
||||
Super FX C emulator code
|
||||
(c) Copyright 1997 - 1999 Ivar,
|
||||
Gary Henderson,
|
||||
John Weidman
|
||||
|
||||
Sound DSP emulator code is derived from SNEeSe and OpenSPC:
|
||||
(c) Copyright 1998 - 2003 Brad Martin
|
||||
(c) Copyright 1998 - 2006 Charles Bilyue'
|
||||
|
||||
SH assembler code partly based on x86 assembler code
|
||||
(c) Copyright 2002 - 2004 Marcus Comstedt (marcus@mc.pp.se)
|
||||
|
||||
2xSaI filter
|
||||
(c) Copyright 1999 - 2001 Derek Liauw Kie Fa
|
||||
|
||||
HQ2x filter
|
||||
(c) Copyright 2003 Maxim Stepin (maxim@hiend3d.com)
|
||||
|
||||
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/or 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 or it's derivatives.
|
||||
|
||||
Snes9x is freeware for PERSONAL USE only. Commercial users should
|
||||
seek permission of the copyright holders first. Commercial use includes,
|
||||
but is not limited to, charging money for Snes9x or software derived from
|
||||
Snes9x, including Snes9x or derivatives in commercial game bundles, and/or
|
||||
using Snes9x as a promotion for your commercial product.
|
||||
|
||||
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.
|
||||
**********************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include "snes9x.h"
|
||||
#include "cheats.h"
|
||||
#include "memmap.h"
|
||||
|
||||
extern SCheatData Cheat;
|
||||
|
||||
void S9xInitCheatData ()
|
||||
{
|
||||
Cheat.RAM = Memory.RAM;
|
||||
Cheat.SRAM = ::SRAM;
|
||||
Cheat.FillRAM = Memory.FillRAM;
|
||||
}
|
||||
|
||||
void S9xAddCheat (bool8 enable, bool8 save_current_value,
|
||||
uint32 address, uint8 byte)
|
||||
{
|
||||
if (Cheat.num_cheats < sizeof (Cheat.c) / sizeof (Cheat. c [0]))
|
||||
{
|
||||
Cheat.c [Cheat.num_cheats].address = address;
|
||||
Cheat.c [Cheat.num_cheats].byte = byte;
|
||||
#ifdef __MACOSX__
|
||||
Cheat.c [Cheat.num_cheats].enabled = enable;
|
||||
#else
|
||||
Cheat.c [Cheat.num_cheats].enabled = TRUE;
|
||||
#endif
|
||||
if (save_current_value)
|
||||
{
|
||||
Cheat.c [Cheat.num_cheats].saved_byte = S9xGetByte (address);
|
||||
Cheat.c [Cheat.num_cheats].saved = TRUE;
|
||||
}
|
||||
Cheat.num_cheats++;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xDeleteCheat (uint32 which1)
|
||||
{
|
||||
if (which1 < Cheat.num_cheats)
|
||||
{
|
||||
if (Cheat.c [which1].enabled)
|
||||
S9xRemoveCheat (which1);
|
||||
|
||||
memmove (&Cheat.c [which1], &Cheat.c [which1 + 1],
|
||||
sizeof (Cheat.c [0]) * (Cheat.num_cheats - which1 - 1));
|
||||
Cheat.num_cheats--; //MK: This used to set it to 0??
|
||||
}
|
||||
}
|
||||
|
||||
void S9xDeleteCheats ()
|
||||
{
|
||||
S9xRemoveCheats ();
|
||||
Cheat.num_cheats = 0;
|
||||
}
|
||||
|
||||
void S9xEnableCheat (uint32 which1)
|
||||
{
|
||||
if (which1 < Cheat.num_cheats && !Cheat.c [which1].enabled)
|
||||
{
|
||||
Cheat.c [which1].enabled = TRUE;
|
||||
S9xApplyCheat (which1);
|
||||
}
|
||||
}
|
||||
|
||||
void S9xDisableCheat (uint32 which1)
|
||||
{
|
||||
if (which1 < Cheat.num_cheats && Cheat.c [which1].enabled)
|
||||
{
|
||||
S9xRemoveCheat (which1);
|
||||
Cheat.c [which1].enabled = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void S9xRemoveCheat (uint32 which1)
|
||||
{
|
||||
if (Cheat.c [which1].saved)
|
||||
{
|
||||
uint32 address = Cheat.c [which1].address;
|
||||
|
||||
int block = ((address&0xffffff) >> MEMMAP_SHIFT);
|
||||
uint8 *ptr = Memory.Map [block];
|
||||
|
||||
if (ptr >= (uint8 *) CMemory::MAP_LAST)
|
||||
*(ptr + (address & 0xffff)) = Cheat.c [which1].saved_byte;
|
||||
else
|
||||
S9xSetByte (Cheat.c [which1].saved_byte, address);
|
||||
}
|
||||
}
|
||||
|
||||
void S9xApplyCheat (uint32 which1)
|
||||
{
|
||||
uint32 address = Cheat.c [which1].address;
|
||||
|
||||
if (!Cheat.c [which1].saved)
|
||||
Cheat.c [which1].saved_byte = S9xGetByte (address);
|
||||
|
||||
int block = ((address&0xffffff) >> MEMMAP_SHIFT);
|
||||
uint8 *ptr = Memory.Map [block];
|
||||
|
||||
if (ptr >= (uint8 *) CMemory::MAP_LAST)
|
||||
*(ptr + (address & 0xffff)) = Cheat.c [which1].byte;
|
||||
else
|
||||
S9xSetByte (Cheat.c [which1].byte, address);
|
||||
Cheat.c [which1].saved = TRUE;
|
||||
}
|
||||
|
||||
void S9xApplyCheats ()
|
||||
{
|
||||
if (Settings.ApplyCheats)
|
||||
{
|
||||
for (uint32 i = 0; i < Cheat.num_cheats; i++)
|
||||
if (Cheat.c [i].enabled)
|
||||
S9xApplyCheat (i);
|
||||
}
|
||||
}
|
||||
|
||||
void S9xRemoveCheats ()
|
||||
{
|
||||
for (uint32 i = 0; i < Cheat.num_cheats; i++)
|
||||
if (Cheat.c [i].enabled)
|
||||
S9xRemoveCheat (i);
|
||||
}
|
||||
|
||||
bool8 S9xLoadCheatFile (const char *filename)
|
||||
{
|
||||
Cheat.num_cheats = 0;
|
||||
|
||||
FILE *fs = fopen (filename, "rb");
|
||||
uint8 data [28];
|
||||
|
||||
if (!fs)
|
||||
return (FALSE);
|
||||
|
||||
while (fread ((void *) data, 1, 28, fs) == 28)
|
||||
{
|
||||
Cheat.c [Cheat.num_cheats].enabled = (data [0] & 4) == 0;
|
||||
Cheat.c [Cheat.num_cheats].byte = data [1];
|
||||
Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16);
|
||||
Cheat.c [Cheat.num_cheats].saved_byte = data [5];
|
||||
Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0;
|
||||
memmove (Cheat.c [Cheat.num_cheats].name, &data [8], 20);
|
||||
Cheat.c [Cheat.num_cheats++].name [20] = 0;
|
||||
}
|
||||
fclose (fs);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
bool8 S9xSaveCheatFile (const char *filename)
|
||||
{
|
||||
if (Cheat.num_cheats == 0)
|
||||
{
|
||||
(void) remove (filename);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
FILE *fs = fopen (filename, "wb");
|
||||
uint8 data [28];
|
||||
|
||||
if (!fs)
|
||||
return (FALSE);
|
||||
|
||||
uint32 i;
|
||||
for (i = 0; i < Cheat.num_cheats; i++)
|
||||
{
|
||||
memset (data, 0, 28);
|
||||
if (i == 0)
|
||||
{
|
||||
data [6] = 254;
|
||||
data [7] = 252;
|
||||
}
|
||||
if (!Cheat.c [i].enabled)
|
||||
data [0] |= 4;
|
||||
|
||||
if (Cheat.c [i].saved)
|
||||
data [0] |= 8;
|
||||
|
||||
data [1] = Cheat.c [i].byte;
|
||||
data [2] = (uint8) Cheat.c [i].address;
|
||||
data [3] = (uint8) (Cheat.c [i].address >> 8);
|
||||
data [4] = (uint8) (Cheat.c [i].address >> 16);
|
||||
data [5] = Cheat.c [i].saved_byte;
|
||||
|
||||
memmove (&data [8], Cheat.c [i].name, 19);
|
||||
if (fwrite (data, 28, 1, fs) != 1)
|
||||
{
|
||||
fclose (fs);
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
return (fclose (fs) == 0);
|
||||
}
|
||||
|
||||
|
@ -151,9 +151,7 @@
|
||||
#include "controls.h"
|
||||
#include "screenshot.h"
|
||||
|
||||
#ifndef NGC
|
||||
#include "cheats.h"
|
||||
#endif
|
||||
|
||||
static void S9xDisplayString(const char *string);
|
||||
static void S9xDisplayFrameRate();
|
||||
@ -406,9 +404,7 @@ void S9xEndScreenRefresh() {
|
||||
S9xControlEOF();
|
||||
}
|
||||
|
||||
#ifndef NGC
|
||||
S9xApplyCheats();
|
||||
#endif
|
||||
|
||||
#ifdef DEBUGGER
|
||||
if(CPU.Flags & FRAME_ADVANCE_FLAG) {
|
||||
|
@ -156,9 +156,7 @@
|
||||
#include "gfx.h"
|
||||
#include "soundux.h"
|
||||
|
||||
#ifndef NGC
|
||||
#include "cheats.h"
|
||||
#endif
|
||||
|
||||
#include "sa1.h"
|
||||
#include "bsx.h"
|
||||
@ -276,9 +274,7 @@ uint32 current_graphic_format = RGB565;
|
||||
|
||||
uint8 GetBank = 0;
|
||||
|
||||
#ifndef NGC
|
||||
struct SCheatData Cheat;
|
||||
#endif
|
||||
|
||||
volatile SoundStatus so;
|
||||
|
||||
|
@ -163,9 +163,7 @@
|
||||
#include "ppu.h"
|
||||
#include "display.h"
|
||||
|
||||
#ifndef NGC
|
||||
#include "cheats.h"
|
||||
#endif
|
||||
|
||||
#include "apu.h"
|
||||
#include "sa1.h"
|
||||
|
Loading…
Reference in New Issue
Block a user