diff options
author | Filippos Karapetis | 2009-06-08 08:38:10 +0000 |
---|---|---|
committer | Filippos Karapetis | 2009-06-08 08:38:10 +0000 |
commit | 95d32180dfec56ca981fca105f0dc4edc83ce183 (patch) | |
tree | 17909fe866141d9bf1abc633df88382ed30150db | |
parent | e4a3219103af365be9b6bd86f076e842e5c11c77 (diff) | |
download | scummvm-rg350-95d32180dfec56ca981fca105f0dc4edc83ce183.tar.gz scummvm-rg350-95d32180dfec56ca981fca105f0dc4edc83ce183.tar.bz2 scummvm-rg350-95d32180dfec56ca981fca105f0dc4edc83ce183.zip |
Moved some more debug commands to ScummVM's console
svn-id: r41364
-rw-r--r-- | engines/sci/console.cpp | 85 | ||||
-rw-r--r-- | engines/sci/console.h | 2 | ||||
-rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 91 |
3 files changed, 87 insertions, 91 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e98c0e0f95..4816f87a20 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -159,6 +159,8 @@ Console::Console(SciEngine *vm) : GUI::Debugger() { DCmd_Register("step_callk", WRAP_METHOD(Console, cmdStepCallk)); DCmd_Register("disasm", WRAP_METHOD(Console, cmdDissassemble)); DCmd_Register("disasm_addr", WRAP_METHOD(Console, cmdDissassembleAddress)); + DCmd_Register("send", WRAP_METHOD(Console, cmdSend)); + DCmd_Register("go", WRAP_METHOD(Console, cmdGo)); // Breakpoints DCmd_Register("bp_list", WRAP_METHOD(Console, cmdBreakpointList)); DCmd_Register("bp_del", WRAP_METHOD(Console, cmdBreakpointDelete)); @@ -316,6 +318,8 @@ bool Console::cmdHelp(int argc, const char **argv) { DebugPrintf(" step_callk - Steps forward until it hits the next callk operation, or a specific callk (specified as a parameter)\n"); DebugPrintf(" disasm - Disassembles a method by name\n"); DebugPrintf(" disasm_addr - Disassembles one or more commands\n"); + DebugPrintf(" send - Sends a message to an object\n"); + DebugPrintf(" go - Executes the script\n"); DebugPrintf("\n"); DebugPrintf("Breakpoints:\n"); DebugPrintf(" bp_list - Lists the current breakpoints\n"); @@ -2260,6 +2264,87 @@ bool Console::cmdDissassembleAddress(int argc, const char **argv) { return true; } +bool Console::cmdSend(int argc, const char **argv) { + if (argc < 3) { + DebugPrintf("Sends a message to an object.\n"); + DebugPrintf("Usage: %s <object> <selector name> <param1> <param2> ... <paramn>\n", argv[0]); + DebugPrintf("Example: send ?fooScript cue\n"); + return true; + } + + reg_t object; + + if (parse_reg_t(_vm->_gamestate, argv[1], &object)) { + DebugPrintf("Invalid address passed for parameter 1.\n"); + DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); + return true; + } + + const char *selector_name = argv[2]; + StackPtr stackframe = _vm->_gamestate->_executionStack.front().sp; + int selector_id; + int i; + ExecStack *xstack; + Object *o; + reg_t fptr; + + selector_id = _vm->_gamestate->_kernel->findSelector(selector_name); + + if (selector_id < 0) { + sciprintf("Unknown selector: \"%s\"\n", selector_name); + return 1; + } + + o = obj_get(_vm->_gamestate, object); + if (o == NULL) { + sciprintf("Address \"%04x:%04x\" is not an object\n", PRINT_REG(object)); + return 1; + } + + SelectorType selector_type = lookup_selector(_vm->_gamestate, object, selector_id, 0, &fptr); + + if (selector_type == kSelectorNone) { + sciprintf("Object does not support selector: \"%s\"\n", selector_name); + return 1; + } + + stackframe[0] = make_reg(0, selector_id); + stackframe[1] = make_reg(0, argc - 3); // -object -selector name -command name + + for (i = 3; i < argc; i++) { + if (parse_reg_t(_vm->_gamestate, argv[i], &stackframe[i])) { + DebugPrintf("Invalid address passed for parameter %d.\n", i); + DebugPrintf("Check the \"addresses\" command on how to use addresses\n"); + return true; + } + } + + xstack = add_exec_stack_entry(_vm->_gamestate, fptr, + _vm->_gamestate->_executionStack.front().sp + argc, + object, argc - 3, + _vm->_gamestate->_executionStack.front().sp - 1, 0, object, + _vm->_gamestate->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); + xstack->selector = selector_id; + xstack->type = selector_type == kSelectorVariable ? EXEC_STACK_TYPE_VARSELECTOR : EXEC_STACK_TYPE_CALL; + + // Now commit the actual function: + xstack = send_selector(_vm->_gamestate, object, object, stackframe, argc - 3, stackframe); + + xstack->sp += argc; + xstack->fp += argc; + + _vm->_gamestate->_executionStackPosChanged = true; + + return true; +} + +bool Console::cmdGo(int argc, const char **argv) { + g_debug_seeking = 0; + g_debugstate_valid = 0; + + return true; +} + bool Console::cmdBreakpointList(int argc, const char **argv) { Breakpoint *bp = _vm->_gamestate->bp_list; int i = 0; diff --git a/engines/sci/console.h b/engines/sci/console.h index bc4d84abf2..c45202de16 100644 --- a/engines/sci/console.h +++ b/engines/sci/console.h @@ -129,6 +129,8 @@ private: bool cmdStepCallk(int argc, const char **argv); bool cmdDissassemble(int argc, const char **argv); bool cmdDissassembleAddress(int argc, const char **argv); + bool cmdSend(int argc, const char **argv); + bool cmdGo(int argc, const char **argv); // Breakpoints bool cmdBreakpointList(int argc, const char **argv); bool cmdBreakpointDelete(int argc, const char **argv); diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 29e1bcf8db..63e99ad122 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -61,32 +61,6 @@ static reg_t **p_vars; static reg_t **p_var_base; static int *p_var_max; // May be NULL even in valid state! -char inputbuf[256] = ""; - -union cmd_param_t { - int32 val; - const char *str; - reg_t reg; -}; - -typedef int (*ConCommand)(EngineState *s, const Common::Array<cmd_param_t> &cmdParams); - -struct cmd_mm_entry_t { - const char *name; - const char *description; -}; // All later structures must "extend" this - -struct cmd_command_t : public cmd_mm_entry_t { - ConCommand command; - const char *param; -}; - -// Dummy function, so that it compiles -int con_hook_command(ConCommand command, const char *name, const char *param, const char *description) { - - return 0; -} - extern const char *selector_name(EngineState *s, int selector); int prop_ofs_to_id(EngineState *s, int prop_ofs, reg_t objp) { @@ -365,68 +339,6 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod return retval; } -static int c_go(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { - g_debug_seeking = 0; - g_debugstate_valid = 0; - return 0; -} - -static int c_send(EngineState *s, const Common::Array<cmd_param_t> &cmdParams) { - reg_t object = cmdParams[0].reg; - const char *selector_name = cmdParams[1].str; - StackPtr stackframe = s->_executionStack.front().sp; - int selector_id; - unsigned int i; - ExecStack *xstack; - Object *o; - reg_t fptr; - - selector_id = s->_kernel->findSelector(selector_name); - - if (selector_id < 0) { - sciprintf("Unknown selector: \"%s\"\n", selector_name); - return 1; - } - - o = obj_get(s, object); - if (o == NULL) { - sciprintf("Address \"%04x:%04x\" is not an object\n", PRINT_REG(object)); - return 1; - } - - SelectorType selector_type = lookup_selector(s, object, selector_id, 0, &fptr); - - if (selector_type == kSelectorNone) { - sciprintf("Object does not support selector: \"%s\"\n", selector_name); - return 1; - } - - stackframe[0] = make_reg(0, selector_id); - stackframe[1] = make_reg(0, cmdParams.size() - 2); - - for (i = 2; i < cmdParams.size(); i++) - stackframe[i] = cmdParams[i].reg; - - xstack = add_exec_stack_entry(s, fptr, - s->_executionStack.front().sp + cmdParams.size(), - object, cmdParams.size() - 2, - s->_executionStack.front().sp - 1, 0, object, - s->_executionStack.size()-1, SCI_XS_CALLEE_LOCALS); - xstack->selector = selector_id; - xstack->type = selector_type == kSelectorVariable ? EXEC_STACK_TYPE_VARSELECTOR : EXEC_STACK_TYPE_CALL; - - // Now commit the actual function: - xstack = send_selector(s, object, object, stackframe, cmdParams.size() - 2, stackframe); - - xstack->sp += cmdParams.size(); - xstack->fp += cmdParams.size(); - - s->_executionStackPosChanged = true; - - return 0; -} - -// Breakpoint commands void script_debug(EngineState *s, reg_t *pc, StackPtr *sp, StackPtr *pp, reg_t *objp, int *restadjust, SegmentId *segids, reg_t **variables, reg_t **variables_base, int *variables_nr, int bp) { @@ -517,9 +429,6 @@ void script_debug(EngineState *s, reg_t *pc, StackPtr *sp, StackPtr *pp, reg_t * sciprintf("Step #%d\n", script_step_counter); disassemble(s, *pc, 0, 1); - - con_hook_command(c_send, "send", "!asa*", "Sends a message to an object\nExample: send ?fooScript cue"); - con_hook_command(c_go, "go", "", "Executes the script.\n"); } } |