diff options
-rw-r--r-- | engines/sci/console.cpp | 3 | ||||
-rw-r--r-- | engines/sci/console.h | 1 | ||||
-rw-r--r-- | engines/sci/debug.h | 15 | ||||
-rw-r--r-- | engines/sci/engine/grammar.cpp | 4 | ||||
-rw-r--r-- | engines/sci/engine/kevent.cpp | 6 | ||||
-rw-r--r-- | engines/sci/engine/kmisc.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 18 | ||||
-rw-r--r-- | engines/sci/gfx/operations.cpp | 5 | ||||
-rw-r--r-- | engines/sci/sci.cpp | 13 | ||||
-rw-r--r-- | engines/sci/sci.h | 1 | ||||
-rw-r--r-- | engines/sci/tools.cpp | 2 | ||||
-rw-r--r-- | engines/sci/vocabulary.cpp | 4 |
12 files changed, 38 insertions, 36 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 002acbae86..bf919c3a25 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -50,7 +50,6 @@ int g_debug_sleeptime_factor = 1; int g_debug_simulated_key = 0; bool g_debug_track_mouse_clicks = false; bool g_debug_weak_validations = true; -extern DebugState debugState; Console::Console(SciEngine *vm) : GUI::Debugger() { _vm = vm; @@ -1598,7 +1597,7 @@ bool Console::cmdGCObjects(int argc, const char **argv) { void _print_address(void * _, reg_t addr) { if (addr.segment) - ((SciEngine *)g_engine)->getDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(addr)); + ((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf(" %04x:%04x\n", PRINT_REG(addr)); } bool Console::cmdGCShowReachable(int argc, const char **argv) { diff --git a/engines/sci/console.h b/engines/sci/console.h index c45202de16..84a8d2f942 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -154,6 +154,7 @@ private: private: SciEngine *_vm; + bool _mouseVisible; }; } // End of namespace Sci diff --git a/engines/sci/debug.h b/engines/sci/debug.h index 60bf938300..fbd98e0d6f 100644 --- a/engines/sci/debug.h +++ b/engines/sci/debug.h @@ -28,12 +28,6 @@ namespace Sci { -// Various global variables used for debugging are declared here -extern int g_debug_sleeptime_factor; -extern int g_debug_simulated_key; -extern bool g_debug_track_mouse_clicks; -extern bool g_debug_weak_validations; - enum DebugSeeking { kDebugSeekNothing = 0, kDebugSeekCallk = 1, // Step forward until callk is found @@ -50,6 +44,8 @@ struct DebugState { int runningStep; // Set to > 0 to allow multiple stepping int seekLevel; // Used for seekers that want to check their exec stack depth int seekSpecial; // Used for special seeks + int old_pc_offset; + StackPtr old_sp; reg_t *p_pc; StackPtr *p_sp; StackPtr *p_pp; @@ -61,6 +57,13 @@ struct DebugState { int *p_var_max; // May be NULL even in valid state! }; +// Various global variables used for debugging are declared here +extern int g_debug_sleeptime_factor; +extern int g_debug_simulated_key; +extern bool g_debug_track_mouse_clicks; +extern bool g_debug_weak_validations; +extern DebugState debugState; + } // End of namespace Sci #endif diff --git a/engines/sci/engine/grammar.cpp b/engines/sci/engine/grammar.cpp index 275a31a0d4..e75441432d 100644 --- a/engines/sci/engine/grammar.cpp +++ b/engines/sci/engine/grammar.cpp @@ -351,7 +351,7 @@ parse_rule_list_t *Vocabulary::buildGNF(bool verbose) { int ntrules_nr; parse_rule_list_t *ntlist = NULL; parse_rule_list_t *tlist, *new_tlist; - GUI::Debugger *con = ((SciEngine *)g_engine)->getDebugger(); + Console *con = ((SciEngine *)g_engine)->getSciDebugger(); for (uint i = 1; i < _parserBranches.size(); i++) { // branch rule 0 is treated specially parse_rule_t *rule = _vbuild_rule(&_parserBranches[i]); @@ -477,7 +477,7 @@ static int _vbpt_write_subexpression(parse_tree_node_t *nodes, int *pos, parse_r } int Vocabulary::parseGNF(parse_tree_node_t *nodes, const ResultWordList &words, bool verbose) { - GUI::Debugger *con = ((SciEngine *)g_engine)->getDebugger(); + Console *con = ((SciEngine *)g_engine)->getSciDebugger(); // Get the start rules: parse_rule_list_t *work = _vocab_clone_rule_list_by_id(_parserRules, _parserBranches[0].data[1]); parse_rule_list_t *results = NULL; diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 3b37506e6c..e40368a5c0 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -33,8 +33,6 @@ namespace Sci { -extern DebugState debugState; - #define SCI_VARIABLE_GAME_SPEED 3 reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) { @@ -112,7 +110,7 @@ reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) { // track left buttton clicks, if requested if (e.type == SCI_EVT_MOUSE_PRESS && e.data == 1 && g_debug_track_mouse_clicks) { - ((SciEngine *)g_engine)->getDebugger()->DebugPrintf("Mouse clicked at %d, %d\n", + ((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf("Mouse clicked at %d, %d\n", s->gfx_state->pointer_pos.x, s->gfx_state->pointer_pos.y); } @@ -143,7 +141,7 @@ reg_t kGetEvent(EngineState *s, int funct_nr, int argc, reg_t *argv) { debugState.stopOnEvent = false; // A SCI event occured, and we have been asked to stop, so open the debug console - GUI::Debugger *con = ((Sci::SciEngine*)g_engine)->getDebugger(); + Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger(); con->DebugPrintf("SCI event occured: "); switch (e.type) { case SCI_EVT_QUIT: diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index 99665bae7d..98fba97f0e 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -93,8 +93,6 @@ reg_t kFlushResources(EngineState *s, int funct_nr, int argc, reg_t *argv) { return s->r_acc; } -extern DebugState debugState; - reg_t kSetDebug(EngineState *s, int funct_nr, int argc, reg_t *argv) { sciprintf("Debug mode activated\n"); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 30b2f07edd..44b119ab46 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -49,7 +49,6 @@ reg_t NULL_REG = {0, 0}; int script_abort_flag = 0; // Set to 1 to abort execution. Set to 2 to force a replay afterwards // FIXME: Avoid non-const global vars int script_step_counter = 0; // Counts the number of steps executed // FIXME: Avoid non-const global vars int script_gc_interval = GC_INTERVAL; // Number of steps in between gcs // FIXME: Avoid non-const global vars -extern DebugState debugState; static bool breakpointFlag = false; // FIXME: Avoid non-const global vars static reg_t _dummy_register; // FIXME: Avoid non-const global vars @@ -606,14 +605,12 @@ void run_vm(EngineState *s, int restoring) { while (1) { byte opcode; - int old_pc_offset; - StackPtr old_sp; byte opnumber; int var_type; // See description below int var_number; - old_pc_offset = xs->addr.pc.offset; - old_sp = xs->sp; + debugState.old_pc_offset = xs->addr.pc.offset; + debugState.old_sp = xs->sp; if (s->_executionStackPosChanged) { Script *scr; @@ -1424,16 +1421,7 @@ void run_vm(EngineState *s, int restoring) { opnumber); } //#endif - -#if 0 - if (script_error_flag) { - debugState.runningStep = 0; // Stop multiple execution - debugState.seeking = 0; // Stop special seeks - xs->addr.pc.offset = old_pc_offset; - xs->sp = old_sp; - } else -#endif - ++script_step_counter; + ++script_step_counter; } } diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp index 7496c55868..82b5e78117 100644 --- a/engines/sci/gfx/operations.cpp +++ b/engines/sci/gfx/operations.cpp @@ -1418,8 +1418,9 @@ static sci_event_t scummvm_get_event(GfxDriver *drv) { // Debug console if (ev.kbd.flags == Common::KBD_CTRL && ev.kbd.keycode == Common::KEYCODE_d) { // Open debug console - ((Sci::SciEngine*)g_engine)->getDebugger()->attach(); - ((Sci::SciEngine*)g_engine)->getDebugger()->onFrame(); + Console *con = ((Sci::SciEngine*)g_engine)->getSciDebugger(); + con->attach(); + con->onFrame(); // Clear keyboard event input.type = SCI_EVT_NONE; diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index f58d729bf6..aa9e2415f5 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -29,6 +29,7 @@ #include "engines/advancedDetector.h" #include "sci/sci.h" +#include "sci/debug.h" #include "sci/console.h" #include "sci/engine/state.h" @@ -254,7 +255,19 @@ Common::Error SciEngine::run() { return Common::kNoError; } +// Invoked by error() when a severe error occurs GUI::Debugger *SciEngine::getDebugger() { + ExecStack *xs = &(_gamestate->_executionStack.back()); + debugState.runningStep = 0; // Stop multiple execution + debugState.seeking = kDebugSeekNothing; // Stop special seeks + xs->addr.pc.offset = debugState.old_pc_offset; + xs->sp = debugState.old_sp; + + return _console; +} + +// Used to obtain the engine's console in order to print messages to it +Console *SciEngine::getSciDebugger() { return _console; } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 91f491fe71..b68301546d 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -142,6 +142,7 @@ public: virtual Common::Error run(); void pauseEngineIntern(bool pause); virtual GUI::Debugger *getDebugger(); + Console *getSciDebugger(); const char* getGameID() const; int getResourceVersion() const; diff --git a/engines/sci/tools.cpp b/engines/sci/tools.cpp index 589ce298d7..d0e11aca09 100644 --- a/engines/sci/tools.cpp +++ b/engines/sci/tools.cpp @@ -70,7 +70,7 @@ void sciprintf(const char *fmt, ...) { // Display the result suitably if (g_redirect_sciprintf_to_gui) - ((SciEngine *)g_engine)->getDebugger()->DebugPrintf("%s", buf); + ((SciEngine *)g_engine)->getSciDebugger()->DebugPrintf("%s", buf); printf("%s", buf); free(buf); diff --git a/engines/sci/vocabulary.cpp b/engines/sci/vocabulary.cpp index c877053060..6616ac362d 100644 --- a/engines/sci/vocabulary.cpp +++ b/engines/sci/vocabulary.cpp @@ -438,7 +438,7 @@ bool Vocabulary::tokenizeString(ResultWordList &retval, const char *sentence, ch void Vocabulary::printSuffixes() const { char word_buf[256], alt_buf[256]; - GUI::Debugger *con = ((SciEngine *)g_engine)->getDebugger(); + Console *con = ((SciEngine *)g_engine)->getSciDebugger(); int i = 0; for (SuffixList::const_iterator suf = _parserSuffixes.begin(); suf != _parserSuffixes.end(); ++suf) { @@ -453,7 +453,7 @@ void Vocabulary::printSuffixes() const { } void Vocabulary::printParserWords() const { - GUI::Debugger *con = ((SciEngine *)g_engine)->getDebugger(); + Console *con = ((SciEngine *)g_engine)->getSciDebugger(); int j = 0; for (WordMap::iterator i = _parserWords.begin(); i != _parserWords.end(); ++i) { |