mirror of https://github.com/stella-emu/stella.git
Added new Cheat infrastructure. Ram-based cheats are now supported.
Currently they must be 4 hex characters long, and do not support compare before writing (direct-write, not compare-write). These codes are also executed per-frame. Changed 'cheetah' commandline/debugger argument to 'cheat', and any type of cheat may be specified here. Currently supported are 4 char RAM, 6 char Cheetah, and 8 char Stella extended Cheetah. Still TODO is add load/save of cheats, add one-shot and compare-write cheats, and finally add a dialog to do all this from within Stella. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@874 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
d76d9247c2
commit
429cc63d1d
|
@ -24,6 +24,7 @@ _build_sound=yes
|
||||||
_build_developer=yes
|
_build_developer=yes
|
||||||
_build_snapshot=yes
|
_build_snapshot=yes
|
||||||
_build_joystick=yes
|
_build_joystick=yes
|
||||||
|
_build_cheats=yes
|
||||||
_build_static=no
|
_build_static=no
|
||||||
|
|
||||||
# more defaults
|
# more defaults
|
||||||
|
@ -259,6 +260,8 @@ Optional Features:
|
||||||
--disable-snapshot
|
--disable-snapshot
|
||||||
--enable-joystick enable/disable joystick support [enabled]
|
--enable-joystick enable/disable joystick support [enabled]
|
||||||
--disable-joystick
|
--disable-joystick
|
||||||
|
--enable-cheats enable/disable cheatcode support [enabled]
|
||||||
|
--disable-cheats
|
||||||
--enable-shared build shared binary [enabled]
|
--enable-shared build shared binary [enabled]
|
||||||
--enable-static build static binary (if possible) [disabled]
|
--enable-static build static binary (if possible) [disabled]
|
||||||
--disable-static
|
--disable-static
|
||||||
|
@ -302,6 +305,8 @@ for ac_option in $@; do
|
||||||
--disable-snapshot) _build_snapshot=no ;;
|
--disable-snapshot) _build_snapshot=no ;;
|
||||||
--enable-joystick) _build_joystick=yes ;;
|
--enable-joystick) _build_joystick=yes ;;
|
||||||
--disable-joystick) _build_joystick=no ;;
|
--disable-joystick) _build_joystick=no ;;
|
||||||
|
--enable-cheats) _build_cheats=yes ;;
|
||||||
|
--disable-cheats) _build_cheats=no ;;
|
||||||
--enable-zlib) _zlib=yes ;;
|
--enable-zlib) _zlib=yes ;;
|
||||||
--disable-zlib) _zlib=no ;;
|
--disable-zlib) _zlib=no ;;
|
||||||
--enable-png) _png=yes ;;
|
--enable-png) _png=yes ;;
|
||||||
|
@ -683,6 +688,14 @@ else
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$_build_cheats" = yes ; then
|
||||||
|
echo_n " Cheatcode support enabled"
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
echo_n " Cheatcode support disabled"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$_build_static" = yes ; then
|
if test "$_build_static" = yes ; then
|
||||||
echo_n " Static binary enabled"
|
echo_n " Static binary enabled"
|
||||||
echo
|
echo
|
||||||
|
@ -705,6 +718,7 @@ GUI="$SRC/gui"
|
||||||
DBG="$SRC/debugger"
|
DBG="$SRC/debugger"
|
||||||
DBGGUI="$SRC/debugger/gui"
|
DBGGUI="$SRC/debugger/gui"
|
||||||
YACC="$SRC/yacc"
|
YACC="$SRC/yacc"
|
||||||
|
CHEAT="$SRC/cheat"
|
||||||
|
|
||||||
INCLUDES="-I$CORE -I$CORE/m6502/src -I$CORE/m6502/src/bspf/src -I$COMMON -I$GUI"
|
INCLUDES="-I$CORE -I$CORE/m6502/src -I$CORE/m6502/src/bspf/src -I$COMMON -I$GUI"
|
||||||
|
|
||||||
|
@ -798,6 +812,13 @@ if test "$_build_joystick" = yes ; then
|
||||||
DEFINES="$DEFINES -DJOYSTICK_SUPPORT"
|
DEFINES="$DEFINES -DJOYSTICK_SUPPORT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "$_build_cheats" = yes ; then
|
||||||
|
DEFINES="$DEFINES -DCHEATCODE_SUPPORT"
|
||||||
|
MODULES="$MODULES $CHEAT"
|
||||||
|
INCLUDES="$INCLUDES -I$CHEAT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# 20051003 bkw: fix static Linux build.
|
# 20051003 bkw: fix static Linux build.
|
||||||
# No guarantee this will work for anyone other than me, and no
|
# No guarantee this will work for anyone other than me, and no
|
||||||
# guarantee it's needed by anyone but me (and Steve)...
|
# guarantee it's needed by anyone but me (and Steve)...
|
||||||
|
@ -851,7 +872,7 @@ if test $_host_os = "psp" ; then
|
||||||
cat >> config.mak << EOF
|
cat >> config.mak << EOF
|
||||||
|
|
||||||
PSP-STRIP := $PSP_STRIP
|
PSP-STRIP := $PSP_STRIP
|
||||||
PSP-FIX := $PSP_FIX
|
PSP-FIX := $PSP_FIX
|
||||||
PACK-PBP := $PACK_PBP
|
PACK-PBP := $PACK_PBP
|
||||||
MKSFO := $MKSFO
|
MKSFO := $MKSFO
|
||||||
PSP-MOUNTPOINT := $PSP_MOUNTPOINT
|
PSP-MOUNTPOINT := $PSP_MOUNTPOINT
|
||||||
|
|
|
@ -13,24 +13,22 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: BankRomCheat.cxx,v 1.2 2005-09-26 19:10:37 stephena Exp $
|
// $Id: BankRomCheat.cxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "BankRomCheat.hxx"
|
#include "BankRomCheat.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
BankRomCheat::BankRomCheat(OSystem *os, string code)
|
BankRomCheat::BankRomCheat(OSystem* os, const string& name, const string& code)
|
||||||
|
: Cheat(os, name, code)
|
||||||
{
|
{
|
||||||
myOSystem = os;
|
if(myCode.length() == 7)
|
||||||
_enabled = false;
|
myCode = "0" + code;
|
||||||
|
|
||||||
if(code.length() == 7)
|
bank = unhex(myCode.substr(0, 2));
|
||||||
code = "0" + code;
|
address = 0xf000 + unhex(myCode.substr(2, 3));
|
||||||
|
value = unhex(myCode.substr(5, 2));
|
||||||
bank = unhex(code.substr(0, 2));
|
count = unhex(myCode.substr(7, 1)) + 1;
|
||||||
address = 0xf000 + unhex(code.substr(2, 3));
|
|
||||||
value = unhex(code.substr(5, 2));
|
|
||||||
count = unhex(code.substr(7, 1)) + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -38,26 +36,11 @@ BankRomCheat::~BankRomCheat()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool BankRomCheat::enabled()
|
|
||||||
{
|
|
||||||
return _enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool BankRomCheat::enable()
|
bool BankRomCheat::enable()
|
||||||
{
|
{
|
||||||
int oldBank = myOSystem->console().cartridge().bank();
|
evaluate();
|
||||||
myOSystem->console().cartridge().bank(bank);
|
return myEnabled;
|
||||||
|
|
||||||
for(int i=0; i<count; i++)
|
|
||||||
{
|
|
||||||
savedRom[i] = myOSystem->console().cartridge().peek(address + i);
|
|
||||||
myOSystem->console().cartridge().patch(address + i, value);
|
|
||||||
}
|
|
||||||
myOSystem->console().cartridge().bank(oldBank);
|
|
||||||
|
|
||||||
return _enabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -70,5 +53,24 @@ bool BankRomCheat::disable()
|
||||||
|
|
||||||
myOSystem->console().cartridge().bank(oldBank);
|
myOSystem->console().cartridge().bank(oldBank);
|
||||||
|
|
||||||
return _enabled = false;
|
return myEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void BankRomCheat::evaluate()
|
||||||
|
{
|
||||||
|
if(!myEnabled)
|
||||||
|
{
|
||||||
|
int oldBank = myOSystem->console().cartridge().bank();
|
||||||
|
myOSystem->console().cartridge().bank(bank);
|
||||||
|
|
||||||
|
for(int i=0; i<count; i++)
|
||||||
|
{
|
||||||
|
savedRom[i] = myOSystem->console().cartridge().peek(address + i);
|
||||||
|
myOSystem->console().cartridge().patch(address + i, value);
|
||||||
|
}
|
||||||
|
myOSystem->console().cartridge().bank(oldBank);
|
||||||
|
|
||||||
|
myEnabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -13,29 +13,26 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: BankRomCheat.hxx,v 1.2 2005-09-28 19:59:24 stephena Exp $
|
// $Id: BankRomCheat.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef BANK_ROM_CHEAT_HXX
|
#ifndef BANK_ROM_CHEAT_HXX
|
||||||
#define BANK_ROM_CHEAT_HXX
|
#define BANK_ROM_CHEAT_HXX
|
||||||
|
|
||||||
#include "OSystem.hxx"
|
|
||||||
#include "Cheat.hxx"
|
#include "Cheat.hxx"
|
||||||
|
|
||||||
class BankRomCheat : public Cheat
|
class BankRomCheat : public Cheat
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BankRomCheat(OSystem *os, string code);
|
BankRomCheat(OSystem* os, const string& name, const string& code);
|
||||||
~BankRomCheat();
|
~BankRomCheat();
|
||||||
|
|
||||||
virtual bool enabled();
|
|
||||||
virtual bool enable();
|
virtual bool enable();
|
||||||
virtual bool disable();
|
virtual bool disable();
|
||||||
|
|
||||||
private:
|
virtual void evaluate();
|
||||||
OSystem* myOSystem;
|
|
||||||
|
|
||||||
bool _enabled;
|
private:
|
||||||
uInt8 savedRom[16];
|
uInt8 savedRom[16];
|
||||||
uInt16 address;
|
uInt16 address;
|
||||||
uInt8 value;
|
uInt8 value;
|
|
@ -0,0 +1,72 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: Cheat.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef CHEAT_HXX
|
||||||
|
#define CHEAT_HXX
|
||||||
|
|
||||||
|
#include "OSystem.hxx"
|
||||||
|
#include "bspf.hxx"
|
||||||
|
|
||||||
|
class Cheat
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Cheat(OSystem* osystem, const string& name, const string& code)
|
||||||
|
: myOSystem(osystem),
|
||||||
|
myName(name),
|
||||||
|
myCode(code),
|
||||||
|
myEnabled(false) { }
|
||||||
|
virtual ~Cheat() { }
|
||||||
|
|
||||||
|
bool enabled() const { return myEnabled; }
|
||||||
|
const string& name() const { return myName; }
|
||||||
|
const string& code() const { return myCode; }
|
||||||
|
|
||||||
|
virtual bool enable() = 0;
|
||||||
|
virtual bool disable() = 0;
|
||||||
|
|
||||||
|
virtual void evaluate() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static uInt16 unhex(const string& hex)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
for(unsigned int i=0; i<hex.size(); i++) {
|
||||||
|
char c = hex[i];
|
||||||
|
|
||||||
|
ret *= 16;
|
||||||
|
if(c >= '0' && c <= '9')
|
||||||
|
ret += c - '0';
|
||||||
|
else if(c >= 'A' && c <= 'F')
|
||||||
|
ret += c - 'A' + 10;
|
||||||
|
else
|
||||||
|
ret += c - 'a' + 10;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
OSystem* myOSystem;
|
||||||
|
|
||||||
|
string myName;
|
||||||
|
string myCode;
|
||||||
|
|
||||||
|
bool myEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,155 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: CheatManager.cxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#include "OSystem.hxx"
|
||||||
|
#include "Cheat.hxx"
|
||||||
|
#include "CheetahCheat.hxx"
|
||||||
|
#include "BankRomCheat.hxx"
|
||||||
|
#include "RamCheat.hxx"
|
||||||
|
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
CheatManager::CheatManager(OSystem* osystem)
|
||||||
|
: myOSystem(osystem)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
CheatManager::~CheatManager()
|
||||||
|
{
|
||||||
|
// Don't delete the items from per-frame list, since it will be done in
|
||||||
|
// the following loop
|
||||||
|
myPerFrameList.clear();
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < myCheatList.size(); i++)
|
||||||
|
{
|
||||||
|
cerr << myCheatList[i]->name() << ": " << myCheatList[i]->code() << endl;
|
||||||
|
delete myCheatList[i];
|
||||||
|
}
|
||||||
|
myCheatList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
const Cheat* CheatManager::add(const string& name, const string& code,
|
||||||
|
bool enable)
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < code.size(); i++)
|
||||||
|
if(!isxdigit(code[i]))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
Cheat* cheat = (Cheat*) NULL;
|
||||||
|
|
||||||
|
// Check if already present
|
||||||
|
bool duplicate = false;
|
||||||
|
for(unsigned int i = 0; i < myCheatList.size(); i++)
|
||||||
|
{
|
||||||
|
if(myCheatList[i]->code() == code)
|
||||||
|
{
|
||||||
|
cheat = myCheatList[i];
|
||||||
|
duplicate = true;
|
||||||
|
cerr << "Duplicate found: " << cheat->name() << ":" << cheat->code() << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only create new cheat when necessary
|
||||||
|
if(!duplicate)
|
||||||
|
{
|
||||||
|
switch(code.size())
|
||||||
|
{
|
||||||
|
case 4:
|
||||||
|
cheat = new RamCheat(myOSystem, name, code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
cheat = new CheetahCheat(myOSystem, name, code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
cheat = new BankRomCheat(myOSystem, name, code);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the cheat to the main cheat list
|
||||||
|
if(cheat)
|
||||||
|
myCheatList.push_back(cheat);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cheat)
|
||||||
|
{
|
||||||
|
// And enable/disable it (the cheat knows how to enable or disable itself)
|
||||||
|
if(enable)
|
||||||
|
cheat->enable();
|
||||||
|
else
|
||||||
|
cheat->disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
return cheat;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void CheatManager::addPerFrame(Cheat* cheat, bool enable)
|
||||||
|
{
|
||||||
|
if(!cheat)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Make sure there are no duplicates
|
||||||
|
bool found = false;
|
||||||
|
unsigned int i = 0;
|
||||||
|
for(i = 0; i < myPerFrameList.size(); i++)
|
||||||
|
{
|
||||||
|
if(myPerFrameList[i]->code() == cheat->code())
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(enable)
|
||||||
|
if(!found)
|
||||||
|
myPerFrameList.push_back(cheat);
|
||||||
|
else
|
||||||
|
if(found)
|
||||||
|
myPerFrameList.remove_at(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void CheatManager::parse(const string& cheats)
|
||||||
|
{
|
||||||
|
// FIXME - deal with comma-separated cheats
|
||||||
|
cerr << "parsing cheats: " << cheats << endl;
|
||||||
|
|
||||||
|
add("TEST", cheats, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void CheatManager::enable(const string& code, bool enable)
|
||||||
|
{
|
||||||
|
for(unsigned int i = 0; i < myCheatList.size(); i++)
|
||||||
|
{
|
||||||
|
if(myCheatList[i]->code() == code)
|
||||||
|
{
|
||||||
|
if(enable)
|
||||||
|
myCheatList[i]->enable();
|
||||||
|
else
|
||||||
|
myCheatList[i]->disable();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: CheatManager.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef CHEAT_MANAGER_HXX
|
||||||
|
#define CHEAT_MANAGER_HXX
|
||||||
|
|
||||||
|
#include "OSystem.hxx"
|
||||||
|
#include "bspf.hxx"
|
||||||
|
#include "Array.hxx"
|
||||||
|
|
||||||
|
#include "Cheat.hxx"
|
||||||
|
|
||||||
|
typedef GUI::Array<Cheat*> CheatList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
This class provides an interface for performing all cheat operations
|
||||||
|
in Stella. It is accessible from the OSystem interface, and contains
|
||||||
|
the list of all cheats currently in use.
|
||||||
|
|
||||||
|
@author Stephen Anthony
|
||||||
|
@version $Id: CheatManager.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
|
*/
|
||||||
|
class CheatManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CheatManager(OSystem* osystem);
|
||||||
|
virtual ~CheatManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adds the specified cheat to an internal list.
|
||||||
|
|
||||||
|
@param name Name of the cheat (not absolutely required)
|
||||||
|
@param code The actual cheatcode (in hex)
|
||||||
|
@param enable Whether to enable this cheat right away
|
||||||
|
|
||||||
|
@return The cheat (if was created), else NULL.
|
||||||
|
*/
|
||||||
|
const Cheat* add(const string& name, const string& code, bool enable = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Adds the specified cheat to the internal per-frame list.
|
||||||
|
This method doesn't create a new cheat; it just adds/removes
|
||||||
|
an already created cheat to the per-frame list.
|
||||||
|
|
||||||
|
@param cheat The actual cheat object
|
||||||
|
@param enable Add or remove the cheat to the per-frame list
|
||||||
|
*/
|
||||||
|
void addPerFrame(Cheat* cheat, bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parses a list of cheats and adds/enables each one.
|
||||||
|
|
||||||
|
@param cheats Comma-separated list of cheats (without any names)
|
||||||
|
*/
|
||||||
|
void parse(const string& cheats);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Enable/disabled the cheat specified by the given code.
|
||||||
|
|
||||||
|
@param code The actual cheatcode to search for
|
||||||
|
@param enable Enable/disable the cheat
|
||||||
|
*/
|
||||||
|
void enable(const string& code, bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Clear all lists of all cheats.
|
||||||
|
*/
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the per-frame cheatlist (needed to evaluate cheats each frame)
|
||||||
|
*/
|
||||||
|
const CheatList& perFrame() { return myPerFrameList; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
OSystem* myOSystem;
|
||||||
|
|
||||||
|
CheatList myCheatList;
|
||||||
|
CheatList myPerFrameList;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,17 +13,15 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: CheetahCheat.cxx,v 1.3 2005-09-26 19:10:37 stephena Exp $
|
// $Id: CheetahCheat.cxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "CheetahCheat.hxx"
|
#include "CheetahCheat.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CheetahCheat::CheetahCheat(OSystem *os, string code)
|
CheetahCheat::CheetahCheat(OSystem* os, const string& name, const string& code)
|
||||||
|
: Cheat(os, name, code)
|
||||||
{
|
{
|
||||||
myOSystem = os;
|
|
||||||
_enabled = false;
|
|
||||||
|
|
||||||
address = 0xf000 + unhex(code.substr(0, 3));
|
address = 0xf000 + unhex(code.substr(0, 3));
|
||||||
value = unhex(code.substr(3, 2));
|
value = unhex(code.substr(3, 2));
|
||||||
count = unhex(code.substr(5, 1)) + 1;
|
count = unhex(code.substr(5, 1)) + 1;
|
||||||
|
@ -34,22 +32,11 @@ CheetahCheat::~CheetahCheat()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
bool CheetahCheat::enabled()
|
|
||||||
{
|
|
||||||
return _enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool CheetahCheat::enable()
|
bool CheetahCheat::enable()
|
||||||
{
|
{
|
||||||
for(int i=0; i<count; i++)
|
evaluate();
|
||||||
{
|
return myEnabled;
|
||||||
savedRom[i] = myOSystem->console().cartridge().peek(address + i);
|
|
||||||
myOSystem->console().cartridge().patch(address + i, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _enabled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -58,5 +45,20 @@ bool CheetahCheat::disable()
|
||||||
for(int i=0; i<count; i++)
|
for(int i=0; i<count; i++)
|
||||||
myOSystem->console().cartridge().patch(address + i, savedRom[i]);
|
myOSystem->console().cartridge().patch(address + i, savedRom[i]);
|
||||||
|
|
||||||
return _enabled = false;
|
return myEnabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void CheetahCheat::evaluate()
|
||||||
|
{
|
||||||
|
if(!myEnabled)
|
||||||
|
{
|
||||||
|
for(int i=0; i<count; i++)
|
||||||
|
{
|
||||||
|
savedRom[i] = myOSystem->console().cartridge().peek(address + i);
|
||||||
|
myOSystem->console().cartridge().patch(address + i, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
myEnabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -13,29 +13,26 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: CheetahCheat.hxx,v 1.3 2005-09-26 19:10:37 stephena Exp $
|
// $Id: CheetahCheat.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef CHEETAH_CHEAT_HXX
|
#ifndef CHEETAH_CHEAT_HXX
|
||||||
#define CHEETAH_CHEAT_HXX
|
#define CHEETAH_CHEAT_HXX
|
||||||
|
|
||||||
#include "OSystem.hxx"
|
|
||||||
#include "Cheat.hxx"
|
#include "Cheat.hxx"
|
||||||
|
|
||||||
class CheetahCheat : public Cheat
|
class CheetahCheat : public Cheat
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CheetahCheat(OSystem *os, string code);
|
CheetahCheat(OSystem* os, const string& name, const string& code);
|
||||||
~CheetahCheat();
|
~CheetahCheat();
|
||||||
|
|
||||||
virtual bool enabled();
|
|
||||||
virtual bool enable();
|
virtual bool enable();
|
||||||
virtual bool disable();
|
virtual bool disable();
|
||||||
|
|
||||||
private:
|
virtual void evaluate();
|
||||||
OSystem* myOSystem;
|
|
||||||
|
|
||||||
bool _enabled;
|
private:
|
||||||
uInt8 savedRom[16];
|
uInt8 savedRom[16];
|
||||||
uInt16 address;
|
uInt16 address;
|
||||||
uInt8 value;
|
uInt8 value;
|
|
@ -0,0 +1,60 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// SSSS tt lll lll
|
||||||
|
// SS SS tt ll ll
|
||||||
|
// SS tttttt eeee ll ll aaaa
|
||||||
|
// SSSS tt ee ee ll ll aa
|
||||||
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
|
// SS SS tt ee ll ll aa aa
|
||||||
|
// SSSS ttt eeeee llll llll aaaaa
|
||||||
|
//
|
||||||
|
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
||||||
|
//
|
||||||
|
// See the file "license" for information on usage and redistribution of
|
||||||
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
|
//
|
||||||
|
// $Id: RamCheat.cxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#include "System.hxx"
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
|
||||||
|
#include "RamCheat.hxx"
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
RamCheat::RamCheat(OSystem* os, const string& name, const string& code)
|
||||||
|
: Cheat(os, name, code)
|
||||||
|
{
|
||||||
|
address = (uInt16) unhex(myCode.substr(0, 2));
|
||||||
|
value = (uInt8) unhex(myCode.substr(2, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
RamCheat::~RamCheat()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool RamCheat::enable()
|
||||||
|
{
|
||||||
|
if(!myEnabled)
|
||||||
|
{
|
||||||
|
myOSystem->cheat().addPerFrame(this, true);
|
||||||
|
myEnabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return myEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool RamCheat::disable()
|
||||||
|
{
|
||||||
|
cerr << "perFrame remove " << myName << ":" << myCode << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void RamCheat::evaluate()
|
||||||
|
{
|
||||||
|
myOSystem->console().system().poke(address, value);
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// SSSS tt lll lll
|
// SSSS tt lll lll
|
||||||
// SS SS tt ll ll
|
// SS SS tt ll ll
|
||||||
// SS tttttt eeee ll ll aaaa
|
// SS tttttt eeee ll ll aaaa
|
||||||
// SSSS tt ee ee ll ll aa
|
// SSSS tt ee ee ll ll aa
|
||||||
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||||
// SS SS tt ee ll ll aa aa
|
// SS SS tt ee ll ll aa aa
|
||||||
|
@ -13,30 +13,28 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: Cheat.hxx,v 1.3 2005-09-26 19:10:37 stephena Exp $
|
// $Id: RamCheat.hxx,v 1.1 2005-11-11 21:44:18 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef CHEAT_HXX
|
#ifndef RAM_CHEAT_HXX
|
||||||
#define CHEAT_HXX
|
#define RAM_CHEAT_HXX
|
||||||
|
|
||||||
#include "bspf.hxx"
|
#include "Cheat.hxx"
|
||||||
#include "OSystem.hxx"
|
|
||||||
|
|
||||||
class Cheat
|
class RamCheat : public Cheat
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Cheat() { }
|
RamCheat(OSystem* os, const string& name, const string& code);
|
||||||
virtual ~Cheat() { }
|
~RamCheat();
|
||||||
|
|
||||||
static Cheat *parse(OSystem *osystem, string code);
|
virtual bool enable();
|
||||||
static uInt16 unhex(string hex);
|
virtual bool disable();
|
||||||
|
|
||||||
virtual bool enabled() = 0;
|
virtual void evaluate();
|
||||||
virtual bool enable() = 0;
|
|
||||||
virtual bool disable() = 0;
|
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
//Cheat(string code);
|
uInt16 address;
|
||||||
|
uInt8 value;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,13 @@
|
||||||
|
MODULE := src/cheat
|
||||||
|
|
||||||
|
MODULE_OBJS := \
|
||||||
|
src/cheat/CheatManager.o \
|
||||||
|
src/cheat/CheetahCheat.o \
|
||||||
|
src/cheat/BankRomCheat.o \
|
||||||
|
src/cheat/RamCheat.o
|
||||||
|
|
||||||
|
MODULE_DIRS += \
|
||||||
|
src/cheat
|
||||||
|
|
||||||
|
# Include common rules
|
||||||
|
include $(srcdir)/common.rules
|
|
@ -1,59 +0,0 @@
|
||||||
//============================================================================
|
|
||||||
//
|
|
||||||
// SSSS tt lll lll
|
|
||||||
// SS SS tt ll ll
|
|
||||||
// SS tttttt eeee ll ll aaaa
|
|
||||||
// SSSS tt ee ee ll ll aa
|
|
||||||
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
|
||||||
// SS SS tt ee ll ll aa aa
|
|
||||||
// SSSS ttt eeeee llll llll aaaaa
|
|
||||||
//
|
|
||||||
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
|
|
||||||
//
|
|
||||||
// See the file "license" for information on usage and redistribution of
|
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
||||||
//
|
|
||||||
// $Id: Cheat.cxx,v 1.4 2005-09-26 19:10:37 stephena Exp $
|
|
||||||
//============================================================================
|
|
||||||
|
|
||||||
#include "Cheat.hxx"
|
|
||||||
#include "CheetahCheat.hxx"
|
|
||||||
#include "BankRomCheat.hxx"
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt16 Cheat::unhex(string hex) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
for(unsigned int i=0; i<hex.size(); i++) {
|
|
||||||
char c = hex[i];
|
|
||||||
|
|
||||||
ret *= 16;
|
|
||||||
if(c >= '0' && c <= '9')
|
|
||||||
ret += c - '0';
|
|
||||||
else if(c >= 'A' && c <= 'F')
|
|
||||||
ret += c - 'A' + 10;
|
|
||||||
else
|
|
||||||
ret += c - 'a' + 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
Cheat* Cheat::parse(OSystem *osystem, string code) {
|
|
||||||
for(unsigned int i=0; i<code.size(); i++)
|
|
||||||
if(!isxdigit(code[i]))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch(code.size()) {
|
|
||||||
case 7:
|
|
||||||
case 8:
|
|
||||||
return new BankRomCheat(osystem, code);
|
|
||||||
|
|
||||||
case 6:
|
|
||||||
return new CheetahCheat(osystem, code);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: mainSDL.cxx,v 1.52 2005-10-27 19:15:14 stephena Exp $
|
// $Id: mainSDL.cxx,v 1.53 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
@ -63,6 +63,10 @@
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
#endif
|
||||||
|
|
||||||
static void SetupProperties(PropertiesSet& set);
|
static void SetupProperties(PropertiesSet& set);
|
||||||
static void Cleanup();
|
static void Cleanup();
|
||||||
|
|
||||||
|
@ -215,6 +219,17 @@ int main(int argc, char* argv[])
|
||||||
if(theOSystem->settings().getBool("holdbutton0"))
|
if(theOSystem->settings().getBool("holdbutton0"))
|
||||||
theOSystem->eventHandler().handleEvent(Event::JoystickZeroFire, 1);
|
theOSystem->eventHandler().handleEvent(Event::JoystickZeroFire, 1);
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
// Set up any cheeetah code that was on the command line
|
||||||
|
// (and remove the key from the settings, so they won't get set again)
|
||||||
|
string cheats = theOSystem->settings().getString("cheat");
|
||||||
|
if(cheats != "")
|
||||||
|
{
|
||||||
|
theOSystem->cheat().parse(cheats);
|
||||||
|
theOSystem->settings().setString("cheat", "", false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEVELOPER_SUPPORT
|
#ifdef DEVELOPER_SUPPORT
|
||||||
Debugger& dbg = theOSystem->debugger();
|
Debugger& dbg = theOSystem->debugger();
|
||||||
|
|
||||||
|
@ -228,15 +243,6 @@ int main(int argc, char* argv[])
|
||||||
theOSystem->settings().setString("break", "", false);
|
theOSystem->settings().setString("break", "", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up any cheeetah code that was on the command line
|
|
||||||
// (and remove the key from the settings, so they won't get set again)
|
|
||||||
string cheetah = theOSystem->settings().getString("cheetah");
|
|
||||||
if(cheetah != "")
|
|
||||||
{
|
|
||||||
dbg.run("cheetah " + cheetah);
|
|
||||||
theOSystem->settings().setString("cheetah", "", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(theOSystem->settings().getBool("debug"))
|
if(theOSystem->settings().getBool("debug"))
|
||||||
handler.enterDebugMode();
|
handler.enterDebugMode();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
MODULE := src/common
|
MODULE := src/common
|
||||||
|
|
||||||
MODULE_OBJS := \
|
MODULE_OBJS := \
|
||||||
src/common/Cheat.o \
|
|
||||||
src/common/CheetahCheat.o \
|
|
||||||
src/common/BankRomCheat.o \
|
|
||||||
src/common/mainSDL.o \
|
src/common/mainSDL.o \
|
||||||
src/common/SoundNull.o \
|
src/common/SoundNull.o \
|
||||||
src/common/SoundSDL.o \
|
src/common/SoundSDL.o \
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: DebuggerParser.cxx,v 1.87 2005-10-27 19:15:14 stephena Exp $
|
// $Id: DebuggerParser.cxx,v 1.88 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
@ -25,10 +25,12 @@
|
||||||
#include "YaccParser.hxx"
|
#include "YaccParser.hxx"
|
||||||
#include "M6502.hxx"
|
#include "M6502.hxx"
|
||||||
#include "Expression.hxx"
|
#include "Expression.hxx"
|
||||||
#include "CheetahCheat.hxx"
|
|
||||||
#include "Cheat.hxx"
|
|
||||||
#include "RomWidget.hxx"
|
#include "RomWidget.hxx"
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "DebuggerParser.hxx"
|
#include "DebuggerParser.hxx"
|
||||||
|
|
||||||
Command DebuggerParser::commands[] = {
|
Command DebuggerParser::commands[] = {
|
||||||
|
@ -86,14 +88,16 @@ Command DebuggerParser::commands[] = {
|
||||||
&DebuggerParser::executeC
|
&DebuggerParser::executeC
|
||||||
},
|
},
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
{
|
{
|
||||||
"cheetah",
|
"cheat",
|
||||||
"Use Cheetah cheat code (see http://members.cox.net/rcolbert/)",
|
"Use a cheat code (see Stella manual for cheat types)",
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
{ kARG_LABEL, kARG_END_ARGS },
|
{ kARG_LABEL, kARG_END_ARGS },
|
||||||
&DebuggerParser::executeCheetah
|
&DebuggerParser::executeCheat
|
||||||
},
|
},
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
"clearbreaks",
|
"clearbreaks",
|
||||||
|
@ -1386,9 +1390,10 @@ void DebuggerParser::executeC() {
|
||||||
debugger->cpuDebug().setC(args[0]);
|
debugger->cpuDebug().setC(args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// "cheetah"
|
#ifdef CHEATCODE_SUPPORT
|
||||||
// (see http://members.cox.net/rcolbert/chtdox.htm)
|
// "cheat"
|
||||||
void DebuggerParser::executeCheetah() {
|
// (see Stella manual for different cheat types)
|
||||||
|
void DebuggerParser::executeCheat() {
|
||||||
if(argCount == 0) {
|
if(argCount == 0) {
|
||||||
commandResult = red("Missing cheat code");
|
commandResult = red("Missing cheat code");
|
||||||
return;
|
return;
|
||||||
|
@ -1396,15 +1401,15 @@ void DebuggerParser::executeCheetah() {
|
||||||
|
|
||||||
for(int arg = 0; arg < argCount; arg++) {
|
for(int arg = 0; arg < argCount; arg++) {
|
||||||
string& cheat = argStrings[arg];
|
string& cheat = argStrings[arg];
|
||||||
Cheat *c = Cheat::parse(debugger->getOSystem(), cheat);
|
const Cheat* c = debugger->getOSystem()->cheat().add("DBG", cheat);
|
||||||
if(c) {
|
if(c && c->enabled()) {
|
||||||
c->enable();
|
commandResult = "Cheat code " + cheat + " enabled\n";
|
||||||
commandResult = "Cheetah code " + cheat + " enabled\n";
|
|
||||||
} else {
|
} else {
|
||||||
commandResult = red("Invalid cheetah code " + cheat + "\n");
|
commandResult = red("Invalid cheat code " + cheat + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// "clearbreaks"
|
// "clearbreaks"
|
||||||
void DebuggerParser::executeClearbreaks() {
|
void DebuggerParser::executeClearbreaks() {
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: DebuggerParser.hxx,v 1.42 2005-09-15 19:43:36 stephena Exp $
|
// $Id: DebuggerParser.hxx,v 1.43 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef DEBUGGER_PARSER_HXX
|
#ifndef DEBUGGER_PARSER_HXX
|
||||||
|
@ -106,7 +106,9 @@ class DebuggerParser
|
||||||
void executeBreak();
|
void executeBreak();
|
||||||
void executeBreakif();
|
void executeBreakif();
|
||||||
void executeC();
|
void executeC();
|
||||||
void executeCheetah();
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
void executeCheat();
|
||||||
|
#endif
|
||||||
void executeClearbreaks();
|
void executeClearbreaks();
|
||||||
void executeCleartraps();
|
void executeCleartraps();
|
||||||
void executeClearwatches();
|
void executeClearwatches();
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: EventHandler.cxx,v 1.109 2005-11-01 16:32:27 stephena Exp $
|
// $Id: EventHandler.cxx,v 1.110 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -43,6 +43,10 @@
|
||||||
#include "Snapshot.hxx"
|
#include "Snapshot.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MAC_OSX
|
#ifdef MAC_OSX
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void handleMacOSXKeypress(int key);
|
void handleMacOSXKeypress(int key);
|
||||||
|
@ -747,6 +751,12 @@ void EventHandler::poll(uInt32 time)
|
||||||
// Used to implement continuous events
|
// Used to implement continuous events
|
||||||
if(myOverlay)
|
if(myOverlay)
|
||||||
myOverlay->updateTime(time);
|
myOverlay->updateTime(time);
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
const CheatList& cheats = myOSystem->cheat().perFrame();
|
||||||
|
for(unsigned int i = 0; i < cheats.size(); i++)
|
||||||
|
cheats[i]->evaluate();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: OSystem.cxx,v 1.43 2005-10-19 00:59:51 stephena Exp $
|
// $Id: OSystem.cxx,v 1.44 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -47,6 +47,10 @@
|
||||||
#include "Debugger.hxx"
|
#include "Debugger.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
#include "CheatManager.hxx"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "unzip.h"
|
#include "unzip.h"
|
||||||
#include "MD5.hxx"
|
#include "MD5.hxx"
|
||||||
#include "FSNode.hxx"
|
#include "FSNode.hxx"
|
||||||
|
@ -74,6 +78,7 @@ OSystem::OSystem()
|
||||||
myCommandMenu(NULL),
|
myCommandMenu(NULL),
|
||||||
myLauncher(NULL),
|
myLauncher(NULL),
|
||||||
myDebugger(NULL),
|
myDebugger(NULL),
|
||||||
|
myCheatManager(NULL),
|
||||||
myRomFile(""),
|
myRomFile(""),
|
||||||
myFeatures(""),
|
myFeatures(""),
|
||||||
myFont(NULL),
|
myFont(NULL),
|
||||||
|
@ -86,6 +91,9 @@ OSystem::OSystem()
|
||||||
#ifdef DEVELOPER_SUPPORT
|
#ifdef DEVELOPER_SUPPORT
|
||||||
myDebugger = new Debugger(this);
|
myDebugger = new Debugger(this);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
myCheatManager = new CheatManager(this);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create fonts to draw text
|
// Create fonts to draw text
|
||||||
myFont = new GUI::Font(GUI::stellaDesc);
|
myFont = new GUI::Font(GUI::stellaDesc);
|
||||||
|
@ -107,6 +115,9 @@ OSystem::OSystem()
|
||||||
#ifdef DEVELOPER_SUPPORT
|
#ifdef DEVELOPER_SUPPORT
|
||||||
myFeatures += "Debugger";
|
myFeatures += "Debugger";
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
myFeatures += "Cheats";
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -123,6 +134,9 @@ OSystem::~OSystem()
|
||||||
#ifdef DEVELOPER_SUPPORT
|
#ifdef DEVELOPER_SUPPORT
|
||||||
delete myDebugger;
|
delete myDebugger;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
delete myCheatManager;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Remove any game console that is currently attached
|
// Remove any game console that is currently attached
|
||||||
delete myConsole;
|
delete myConsole;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: OSystem.hxx,v 1.30 2005-10-19 00:59:51 stephena Exp $
|
// $Id: OSystem.hxx,v 1.31 2005-11-11 21:44:19 stephena Exp $
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#ifndef OSYSTEM_HXX
|
#ifndef OSYSTEM_HXX
|
||||||
|
@ -25,6 +25,7 @@ class Menu;
|
||||||
class CommandMenu;
|
class CommandMenu;
|
||||||
class Launcher;
|
class Launcher;
|
||||||
class Debugger;
|
class Debugger;
|
||||||
|
class CheatManager;
|
||||||
|
|
||||||
#include "EventHandler.hxx"
|
#include "EventHandler.hxx"
|
||||||
#include "FrameBuffer.hxx"
|
#include "FrameBuffer.hxx"
|
||||||
|
@ -43,7 +44,7 @@ class Debugger;
|
||||||
other objects belong.
|
other objects belong.
|
||||||
|
|
||||||
@author Stephen Anthony
|
@author Stephen Anthony
|
||||||
@version $Id: OSystem.hxx,v 1.30 2005-10-19 00:59:51 stephena Exp $
|
@version $Id: OSystem.hxx,v 1.31 2005-11-11 21:44:19 stephena Exp $
|
||||||
*/
|
*/
|
||||||
class OSystem
|
class OSystem
|
||||||
{
|
{
|
||||||
|
@ -152,6 +153,15 @@ class OSystem
|
||||||
Debugger& debugger(void) const { return *myDebugger; }
|
Debugger& debugger(void) const { return *myDebugger; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CHEATCODE_SUPPORT
|
||||||
|
/**
|
||||||
|
Get the cheat manager of the system.
|
||||||
|
|
||||||
|
@return The cheatmanager object
|
||||||
|
*/
|
||||||
|
CheatManager& cheat(void) const { return *myCheatManager; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the font object of the system
|
Get the font object of the system
|
||||||
|
|
||||||
|
@ -369,6 +379,9 @@ class OSystem
|
||||||
// Pointer to the Debugger object
|
// Pointer to the Debugger object
|
||||||
Debugger* myDebugger;
|
Debugger* myDebugger;
|
||||||
|
|
||||||
|
// Pointer to the CheatManager object
|
||||||
|
CheatManager* myCheatManager;
|
||||||
|
|
||||||
// Number of times per second to iterate through the main loop
|
// Number of times per second to iterate through the main loop
|
||||||
uInt32 myDisplayFrameRate;
|
uInt32 myDisplayFrameRate;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: CheatCodeDialog.cxx,v 1.7 2005-09-30 00:40:34 stephena Exp $
|
// $Id: CheatCodeDialog.cxx,v 1.8 2005-11-11 21:44:19 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -80,18 +80,15 @@ void CheatCodeDialog::handleCommand(CommandSender* sender, int cmd,
|
||||||
{
|
{
|
||||||
case kEditAcceptCmd:
|
case kEditAcceptCmd:
|
||||||
// cerr << myInput->getEditString() << endl;
|
// cerr << myInput->getEditString() << endl;
|
||||||
myCheat = Cheat::parse(instance(), myInput->getEditString());
|
const Cheat* cheat =
|
||||||
|
instance()->cheat().add("DLG", myInput->getEditString(), true);
|
||||||
|
|
||||||
if(myCheat)
|
if(cheat)
|
||||||
{
|
{
|
||||||
// make sure "invalid code" isn't showing any more:
|
// make sure "invalid code" isn't showing any more:
|
||||||
myError->setLabel("");
|
myError->setLabel("");
|
||||||
myErrorFlag = false;
|
myErrorFlag = false;
|
||||||
|
|
||||||
// set up the cheat
|
|
||||||
myCheat->enable();
|
|
||||||
delete myCheat; // TODO: keep and add to list
|
|
||||||
|
|
||||||
// get out of menu mode (back to emulation):
|
// get out of menu mode (back to emulation):
|
||||||
Dialog::handleCommand(sender, kCloseCmd, data, id);
|
Dialog::handleCommand(sender, kCloseCmd, data, id);
|
||||||
instance()->eventHandler().leaveMenuMode();
|
instance()->eventHandler().leaveMenuMode();
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// See the file "license" for information on usage and redistribution of
|
// See the file "license" for information on usage and redistribution of
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//
|
//
|
||||||
// $Id: CheatCodeDialog.hxx,v 1.4 2005-09-30 00:40:34 stephena Exp $
|
// $Id: CheatCodeDialog.hxx,v 1.5 2005-11-11 21:44:19 stephena Exp $
|
||||||
//
|
//
|
||||||
// Based on code from ScummVM - Scumm Interpreter
|
// Based on code from ScummVM - Scumm Interpreter
|
||||||
// Copyright (C) 2002-2004 The ScummVM project
|
// Copyright (C) 2002-2004 The ScummVM project
|
||||||
|
@ -30,7 +30,7 @@ class StaticTextWidget;
|
||||||
#include "OSystem.hxx"
|
#include "OSystem.hxx"
|
||||||
#include "Dialog.hxx"
|
#include "Dialog.hxx"
|
||||||
#include "Widget.hxx"
|
#include "Widget.hxx"
|
||||||
#include "Cheat.hxx"
|
#include "CheatManager.hxx"
|
||||||
#include "EditTextWidget.hxx"
|
#include "EditTextWidget.hxx"
|
||||||
#include "Props.hxx"
|
#include "Props.hxx"
|
||||||
#include "bspf.hxx"
|
#include "bspf.hxx"
|
||||||
|
@ -47,8 +47,6 @@ class CheatCodeDialog : public Dialog
|
||||||
void loadConfig();
|
void loadConfig();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Cheat* myCheat;
|
|
||||||
|
|
||||||
ButtonWidget* myExitButton;
|
ButtonWidget* myExitButton;
|
||||||
StaticTextWidget* myTitle;
|
StaticTextWidget* myTitle;
|
||||||
StaticTextWidget* myError;
|
StaticTextWidget* myError;
|
||||||
|
|
Loading…
Reference in New Issue