diff --git a/src/debugger/CartDebug.cxx b/src/debugger/CartDebug.cxx index da442b7c6..6b45044ae 100644 --- a/src/debugger/CartDebug.cxx +++ b/src/debugger/CartDebug.cxx @@ -229,9 +229,10 @@ void CartDebug::disassemble(IntArray& addr, StringList& addrLabel, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CartDebug::disassemble(DisassemblyList& list, uInt16 start, bool autocode) { - DiStella distella(mySystem); + DiStella distella; distella.disassemble(list, start, autocode); + // TODO - look at list, extract address to label mappings } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/debugger/CartDebug.hxx b/src/debugger/CartDebug.hxx index a94ee3151..db4234884 100644 --- a/src/debugger/CartDebug.hxx +++ b/src/debugger/CartDebug.hxx @@ -99,8 +99,8 @@ class CartDebug : public DebuggerSystem int start, int end); /** - Disassemble from the starting address, placing results into a - DisassemblyList. If enabled, try to determine code vs. data. + Disassemble from the given address using the Distella disassembler + Address-to-label mappings (and vice-versa) are also determined here */ void disassemble(DisassemblyList& list, uInt16 start, bool autocode); diff --git a/src/debugger/Debugger.hxx b/src/debugger/Debugger.hxx index 7c2beaa95..c02fb04d8 100644 --- a/src/debugger/Debugger.hxx +++ b/src/debugger/Debugger.hxx @@ -259,7 +259,7 @@ class Debugger : public DialogContainer everywhere, but I feel it's better to place it here then in YaccParser (which technically isn't related to it at all). */ - static Debugger& debugger() { return *myStaticDebugger; } + inline static Debugger& debugger() { return *myStaticDebugger; } /** Get the dimensions of the various debugger dialog areas diff --git a/src/debugger/DiStella.cxx b/src/debugger/DiStella.cxx index 4a42e5344..c071d96df 100644 --- a/src/debugger/DiStella.cxx +++ b/src/debugger/DiStella.cxx @@ -21,12 +21,12 @@ #include #include "bspf.hxx" +#include "Debugger.hxx" #include "DiStella.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -DiStella::DiStella(System& system) - : mySystem(system), - labels(NULL) /* array of information about addresses-- can be from 2K-48K bytes in size */ +DiStella::DiStella() + : labels(NULL) /* array of information about addresses-- can be from 2K-48K bytes in size */ { } @@ -36,7 +36,7 @@ DiStella::~DiStella() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -uInt32 DiStella::disassemble(CartDebug::DisassemblyList& list, uInt16 PC, +uInt32 DiStella::disassemble(CartDebug::DisassemblyList& list, uInt16 start, bool autocode) { while(!myAddressQueue.empty()) @@ -56,20 +56,6 @@ uInt32 DiStella::disassemble(CartDebug::DisassemblyList& list, uInt16 PC, } memset(labels,0,myAppData.length); - /*----------------------------------------------------- - The last 3 words of a program are as follows: - - .word INTERRUPT (isr_adr) - .word START (start_adr) - .word BRKroutine (brk_adr) - - Since we always process START, move the Program - Counter 3 bytes back from the final byte. - -----------------------------------------------------*/ - - myPC = PC; - uInt16 start_adr = dpeek(); - /*============================================ The offset is the address where the code segment starts. For a 4K game, it is usually 0xf000, @@ -87,9 +73,9 @@ uInt32 DiStella::disassemble(CartDebug::DisassemblyList& list, uInt16 PC, Offset to code = $D000 Code range = $D000-$DFFF =============================================*/ - myOffset = (start_adr - (start_adr % 0x1000)); + myOffset = (start - (start % 0x1000)); - myAddressQueue.push(start_adr); + myAddressQueue.push(start); if(autocode) { @@ -121,21 +107,6 @@ uInt32 DiStella::disassemble(CartDebug::DisassemblyList& list, uInt16 PC, return list.size(); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -inline uInt16 DiStella::dpeek() -{ - uInt8 d1 = mySystem.peek(myPC++ | 0x1000); - uInt8 d2 = mySystem.peek(myPC++ | 0x1000); - - return (uInt16) ((d2 << 8)+d1); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -inline uInt8 DiStella::peek() -{ - return mySystem.peek(myPC | 0x1000); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass) { @@ -168,8 +139,8 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass else myBuf << HEX4 << myPC+myOffset << "' '"; - myBuf << ".byte $" << HEX2 << (int)peek() << " ; "; - showgfx(peek()); + myBuf << ".byte $" << HEX2 << (int)Debugger::debugger().peek(myPC|0x1000) << " ; "; + showgfx(Debugger::debugger().peek(myPC|0x1000)); myBuf << " $" << HEX4 << myPC+myOffset; addEntry(list); } @@ -183,7 +154,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass { bytes = 1; myBuf << HEX4 << myPC+myOffset << "'L" << myPC+myOffset << "'.byte " - << "$" << HEX2 << (int)peek(); + << "$" << HEX2 << (int)Debugger::debugger().peek(myPC|0x1000); } myPC++; @@ -196,11 +167,11 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass if (bytes == 17) { addEntry(list); - myBuf << " ' '.byte $" << HEX2 << (int)peek(); + myBuf << " ' '.byte $" << HEX2 << (int)Debugger::debugger().peek(myPC|0x1000); bytes = 1; } else - myBuf << ",$" << HEX2 << (int)peek(); + myBuf << ",$" << HEX2 << (int)Debugger::debugger().peek(myPC|0x1000); } myPC++; } @@ -214,7 +185,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass } else { - op = peek(); + op = Debugger::debugger().peek(myPC|0x1000); /* version 2.1 bug fix */ if (pass == 2) mark(myPC+myOffset, VALID_ENTRY); @@ -283,7 +254,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass else myBuf << HEX4 << myPC+myOffset << "' '"; - op = peek(); myPC++; + op = Debugger::debugger().peek(myPC|0x1000); myPC++; myBuf << ".byte $" << HEX2 << (int)op; addEntry(list); } @@ -350,7 +321,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ABSOLUTE: { - ad = dpeek(); + ad = Debugger::debugger().dpeek(myPC|0x1000); myPC+=2; labfound = mark(ad, REFERENCED); if (pass == 1) { @@ -409,7 +380,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ZERO_PAGE: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; labfound = mark(d1, REFERENCED); if (pass == 3) { @@ -431,7 +402,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case IMMEDIATE: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; if (pass == 3) { sprintf(linebuff," #$%.2X ",d1); @@ -444,7 +415,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ABSOLUTE_X: { - ad = dpeek(); + ad = Debugger::debugger().dpeek(myPC|0x1000); myPC+=2; labfound = mark(ad, REFERENCED); if (pass == 3) { @@ -494,7 +465,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ABSOLUTE_Y: { - ad = dpeek(); + ad = Debugger::debugger().dpeek(myPC|0x1000); myPC+=2; labfound = mark(ad, REFERENCED); if (pass == 3) { @@ -543,7 +514,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case INDIRECT_X: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; if (pass == 3) { sprintf(linebuff," ($%.2X,X)",d1); @@ -556,7 +527,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case INDIRECT_Y: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; if (pass == 3) { sprintf(linebuff," ($%.2X),Y",d1); @@ -569,7 +540,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ZERO_PAGE_X: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; labfound = mark(d1, REFERENCED); if (pass == 3) { @@ -591,7 +562,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ZERO_PAGE_Y: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; labfound = mark(d1,REFERENCED); if (pass == 3) { @@ -613,7 +584,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case RELATIVE: { - d1 = peek(); myPC++; + d1 = Debugger::debugger().peek(myPC|0x1000); myPC++; ad = d1; if (d1 >= 128) ad = d1 - 256; @@ -649,7 +620,7 @@ void DiStella::disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass case ABS_INDIRECT: { - ad = dpeek(); + ad = Debugger::debugger().dpeek(myPC|0x1000); myPC+=2; labfound = mark(ad, REFERENCED); if (pass == 3) { diff --git a/src/debugger/DiStella.hxx b/src/debugger/DiStella.hxx index 318860bc9..4f709e904 100644 --- a/src/debugger/DiStella.hxx +++ b/src/debugger/DiStella.hxx @@ -24,7 +24,6 @@ #include "Array.hxx" #include "bspf.hxx" -#include "System.hxx" #include "CartDebug.hxx" @@ -43,7 +42,7 @@ class DiStella { public: - DiStella(System& system); + DiStella(); ~DiStella(); public: @@ -51,12 +50,12 @@ class DiStella Disassemble the current state of the System from the given start address. @param list The results of the disassembly are placed here - @param start The start address for disassembly + @param start The address at which to start disassembly @param autocode If enabled, try to determine code vs. data sections @return The number of lines that were disassembled */ - uInt32 disassemble(CartDebug::DisassemblyList& list, uInt16 PC, + uInt32 disassemble(CartDebug::DisassemblyList& list, uInt16 start, bool autocode = true); private: @@ -78,12 +77,6 @@ class DiStella // Here, we add a new entry to the DisassemblyList void addEntry(CartDebug::DisassemblyList& list); - // Get a word and byte, respectively, from the System - // We use functions for this since Distella assumes that ROM starts - // at address 0, whereas the System class starts above $1000 instead - inline uInt16 dpeek(); - inline uInt8 peek(); - // These functions are part of the original Distella code void disasm(CartDebug::DisassemblyList& list, uInt32 distart, int pass); int mark(uInt32 address, MarkType bit); @@ -91,7 +84,6 @@ class DiStella void showgfx(uInt8 c); private: - System& mySystem; stringstream myBuf; queue myAddressQueue; uInt32 myOffset, myPC, myPCBeg, myPCEnd; diff --git a/src/debugger/gui/RomWidget.cxx b/src/debugger/gui/RomWidget.cxx index 21ff29bde..6a4c2b069 100644 --- a/src/debugger/gui/RomWidget.cxx +++ b/src/debugger/gui/RomWidget.cxx @@ -200,7 +200,7 @@ void RomWidget::loadConfig() */ CartDebug::DisassemblyList list; - cart.disassemble(list, 0xfffc, true); + cart.disassemble(list, dbg.dpeek(0xfffc), true); for(uInt32 i = 0; i < list.size(); ++i) {