diff --git a/stella/src/build/makefile b/stella/src/build/makefile index 5f5e84c58..c11c04af4 100644 --- a/stella/src/build/makefile +++ b/stella/src/build/makefile @@ -13,7 +13,7 @@ ## See the file "license" for information on usage and redistribution of ## this file, and for a DISCLAIMER OF ALL WARRANTIES. ## -## $Id: makefile,v 1.94 2005-06-14 01:11:47 stephena Exp $ +## $Id: makefile,v 1.95 2005-06-14 01:55:47 urchlay Exp $ ##============================================================================ ##============================================================================ @@ -164,7 +164,7 @@ GUI_OBJS = Font.o Menu.o Launcher.o \ ProgressDialog.o \ DebuggerDialog.o PromptWidget.o CheatWidget.o -DBG_OBJS = Debugger.o DebuggerParser.o +DBG_OBJS = Debugger.o DebuggerParser.o EquateList.o CORE_OBJS = Booster.o Cart.o Cart2K.o Cart3F.o Cart4K.o CartAR.o CartDPC.o \ CartE0.o CartE7.o CartF4.o CartF4SC.o CartF6.o CartF6SC.o \ @@ -470,3 +470,6 @@ Debugger.o: $(DBG)/Debugger.cxx $(DBG)/Debugger.hxx DebuggerParser.o: $(DBG)/DebuggerParser.cxx $(DBG)/DebuggerParser.hxx $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(DBG)/DebuggerParser.cxx + +EquateList.o: $(DBG)/EquateList.cxx $(DBG)/EquateList.hxx $(DBG)/Equate.hxx + $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(DBG)/EquateList.cxx diff --git a/stella/src/debugger/Equate.hxx b/stella/src/debugger/Equate.hxx new file mode 100644 index 000000000..5afc02241 --- /dev/null +++ b/stella/src/debugger/Equate.hxx @@ -0,0 +1,10 @@ + +#ifndef EQUATE_HXX +#define EQUATE_HXX + +struct Equate { + char *label; + int address; +}; + +#endif diff --git a/stella/src/debugger/EquateList.cxx b/stella/src/debugger/EquateList.cxx new file mode 100644 index 000000000..26c1b346e --- /dev/null +++ b/stella/src/debugger/EquateList.cxx @@ -0,0 +1,111 @@ + +#include "bspf.hxx" +#include "Equate.hxx" +#include "EquateList.hxx" + +// built in labels +static struct Equate ourVcsEquates[] = { + { "VSYNC", 0x00 }, + { "VBLANK", 0x01 }, + { "WSYNC", 0x02 }, + { "RSYNC", 0x03 }, + { "NUSIZ0", 0x04 }, + { "NUSIZ1", 0x05 }, + { "COLUP0", 0x06 }, + { "COLUP1", 0x07 }, + { "COLUPF", 0x08 }, + { "COLUBK", 0x09 }, + { "CTRLPF", 0x0A }, + { "REFP0", 0x0B }, + { "REFP1", 0x0C }, + { "PF0", 0x0D }, + { "PF1", 0x0E }, + { "PF2", 0x0F }, + { "RESP0", 0x10 }, + { "RESP1", 0x11 }, + { "RESM0", 0x12 }, + { "RESM1", 0x13 }, + { "RESBL", 0x14 }, + { "AUDC0", 0x15 }, + { "AUDC1", 0x16 }, + { "AUDF0", 0x17 }, + { "AUDF1", 0x18 }, + { "AUDV0", 0x19 }, + { "AUDV1", 0x1A }, + { "GRP0", 0x1B }, + { "GRP1", 0x1C }, + { "ENAM0", 0x1D }, + { "ENAM1", 0x1E }, + { "ENABL", 0x1F }, + { "HMP0", 0x20 }, + { "HMP1", 0x21 }, + { "HMM0", 0x22 }, + { "HMM1", 0x23 }, + { "HMBL", 0x24 }, + { "VDELP0", 0x25 }, + { "VDEL01", 0x26 }, + { "VDELP1", 0x26 }, + { "VDELBL", 0x27 }, + { "RESMP0", 0x28 }, + { "RESMP1", 0x29 }, + { "HMOVE", 0x2A }, + { "HMCLR", 0x2B }, + { "CXCLR", 0x2C }, + { "CXM0P", 0x30 }, + { "CXM1P", 0x31 }, + { "CXP0FB", 0x32 }, + { "CXP1FB", 0x33 }, + { "CXM0FB", 0x34 }, + { "CXM1FB", 0x35 }, + { "CXBLPF", 0x36 }, + { "CXPPMM", 0x37 }, + { "INPT0", 0x38 }, + { "INPT1", 0x39 }, + { "INPT2", 0x3A }, + { "INPT3", 0x3B }, + { "INPT4", 0x3C }, + { "INPT5", 0x3D }, + { "SWCHA", 0x0280 }, + { "SWCHB", 0x0282 }, + { "SWACNT", 0x281 }, + { "SWBCNT", 0x283 }, + { "INTIM", 0x0284 }, + { "TIM1T", 0x0294 }, + { "TIM8T", 0x0295 }, + { "TIM64T", 0x0296 }, + { "TIM1024T", 0x0297 }, + { NULL, 0 } +}; + +EquateList::EquateList() { +} + +// FIXME: use something smarter than a linear search in the future. +char *EquateList::getLabel(int addr) { + for(int i=0; ourVcsEquates[i].label != NULL; i++) + if(ourVcsEquates[i].address == addr) + return ourVcsEquates[i].label; + + return NULL; +} + +// returns either the label, or a formatted hex string +// if no label found. +char *EquateList::getFormatted(int addr, int places) { + static char fmt[10], buf[255]; + char *res = getLabel(addr); + if(res != NULL) + return res; + + sprintf(fmt, "$%%0%dx", places); + sprintf(buf, fmt, addr); + return buf; +} + +int EquateList::getAddress(char *label) { + for(int i=0; ourVcsEquates[i].label != NULL; i++) + if( strcmp(ourVcsEquates[i].label, label) == 0 ) + return ourVcsEquates[i].address; + + return -1; +} diff --git a/stella/src/debugger/EquateList.hxx b/stella/src/debugger/EquateList.hxx new file mode 100644 index 000000000..dff0b9222 --- /dev/null +++ b/stella/src/debugger/EquateList.hxx @@ -0,0 +1,13 @@ + +#ifndef EQUATELIST_HXX +#define EQUATELIST_HXX + +class EquateList { + public: + EquateList(); + char *getLabel(int addr); + char *EquateList::getFormatted(int addr, int places); + int getAddress(char *label); +}; + +#endif diff --git a/stella/src/emucore/m6502/src/D6502.cxx b/stella/src/emucore/m6502/src/D6502.cxx index fcbe6f6e2..893e496f5 100644 --- a/stella/src/emucore/m6502/src/D6502.cxx +++ b/stella/src/emucore/m6502/src/D6502.cxx @@ -13,23 +13,26 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: D6502.cxx,v 1.3 2005-06-13 13:35:09 urchlay Exp $ +// $Id: D6502.cxx,v 1.4 2005-06-14 01:55:52 urchlay Exp $ //============================================================================ #include #include "D6502.hxx" #include "M6502.hxx" #include "System.hxx" +#include "EquateList.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - D6502::D6502(System* system) : mySystem(system) { + equateList = new EquateList(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - D6502::~D6502() { + delete equateList; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -53,20 +56,20 @@ uInt16 D6502::disassemble(uInt16 address, char* buffer) switch(M6502::ourAddressingModeTable[opcode]) { case M6502::Absolute: - sprintf(buffer, "%s $%04X ; %d", M6502::ourInstructionMnemonicTable[opcode], - dpeek(mySystem, address + 1), + sprintf(buffer, "%s %s ; %d", M6502::ourInstructionMnemonicTable[opcode], + equateList->getFormatted(dpeek(mySystem, address + 1), 4), M6502::ourInstructionProcessorCycleTable[opcode]); return 3; case M6502::AbsoluteX: - sprintf(buffer, "%s $%04X,x ; %d", M6502::ourInstructionMnemonicTable[opcode], - dpeek(mySystem, address + 1), + sprintf(buffer, "%s %s,x ; %d", M6502::ourInstructionMnemonicTable[opcode], + equateList->getFormatted(dpeek(mySystem, address + 1), 4), M6502::ourInstructionProcessorCycleTable[opcode]); return 3; case M6502::AbsoluteY: - sprintf(buffer, "%s $%04X,y ; %d", M6502::ourInstructionMnemonicTable[opcode], - dpeek(mySystem, address + 1), + sprintf(buffer, "%s %s,y ; %d", M6502::ourInstructionMnemonicTable[opcode], + equateList->getFormatted(dpeek(mySystem, address + 1), 4), M6502::ourInstructionProcessorCycleTable[opcode]); return 3; @@ -114,14 +117,14 @@ uInt16 D6502::disassemble(uInt16 address, char* buffer) return 2; case M6502::ZeroX: - sprintf(buffer, "%s $%02X,x ; %d", M6502::ourInstructionMnemonicTable[opcode], - mySystem->peek(address + 1), + sprintf(buffer, "%s %s,x ; %d", M6502::ourInstructionMnemonicTable[opcode], + equateList->getFormatted(dpeek(mySystem, address + 1), 2), M6502::ourInstructionProcessorCycleTable[opcode]); return 2; case M6502::ZeroY: - sprintf(buffer, "%s $%02X,y ; %d", M6502::ourInstructionMnemonicTable[opcode], - mySystem->peek(address + 1), + sprintf(buffer, "%s %s,y ; %d", M6502::ourInstructionMnemonicTable[opcode], + equateList->getFormatted(dpeek(mySystem, address + 1), 2), M6502::ourInstructionProcessorCycleTable[opcode]); return 2; diff --git a/stella/src/emucore/m6502/src/D6502.hxx b/stella/src/emucore/m6502/src/D6502.hxx index 62e4f67af..475a9c95e 100644 --- a/stella/src/emucore/m6502/src/D6502.hxx +++ b/stella/src/emucore/m6502/src/D6502.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: D6502.hxx,v 1.2 2005-06-13 02:47:44 urchlay Exp $ +// $Id: D6502.hxx,v 1.3 2005-06-14 01:55:52 urchlay Exp $ //============================================================================ #ifndef D6502_HXX @@ -24,13 +24,14 @@ class M6502; class System; #include "bspf.hxx" +#include "EquateList.hxx" /** This is a base class for 6502 debuggers. This class provides the basic functionality needed for interactive debuggers. @author Bradford W. Mott - @version $Id: D6502.hxx,v 1.2 2005-06-13 02:47:44 urchlay Exp $ + @version $Id: D6502.hxx,v 1.3 2005-06-14 01:55:52 urchlay Exp $ */ class D6502 { @@ -149,6 +150,7 @@ class D6502 protected: // Pointer to the system I'm debugging System* mySystem; + EquateList *equateList; }; #endif