diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index e2e5ee96828..7c351c62206 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -633,7 +633,7 @@ bool Console::cmdSetParseNodes(int argc, const char **argv) { bool Console::cmdRegisters(int argc, const char **argv) { EngineState *s = _engine->_gamestate; DebugPrintf("Current register values:\n"); - DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->restAdjust); + DebugPrintf("acc=%04x:%04x prev=%04x:%04x &rest=%x\n", PRINT_REG(s->r_acc), PRINT_REG(s->r_prev), s->r_rest); if (!s->_executionStack.empty()) { DebugPrintf("pc=%04x:%04x obj=%04x:%04x fp=ST:%04x sp=ST:%04x\n", diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 857b0746783..596494d61b8 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -208,12 +208,12 @@ reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode if (pos == s->xs->addr.pc) { // Extra information if debugging the current opcode if (opcode == op_callk) { - int stackframe = (scr[pos.offset + 2] >> 1) + (s->restAdjust); + int stackframe = (scr[pos.offset + 2] >> 1) + (s->r_rest); int argc = ((s->xs->sp)[- stackframe - 1]).offset; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) - argc += (s->restAdjust); + argc += (s->r_rest); debugN(" Kernel params: ("); @@ -224,7 +224,7 @@ reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode } debugN(")\n"); } else if ((opcode == op_send) || (opcode == op_self)) { - int restmod = s->restAdjust; + int restmod = s->r_rest; int stackframe = (scr[pos.offset + 1] >> 1) + restmod; reg_t *sb = s->xs->sp; uint16 selector; diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 12795adeb1e..f9d6c70389f 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -94,10 +94,9 @@ void EngineState::reset(bool isRestoring) { stack_base = 0; stack_top = 0; - restAdjust = 0; - r_acc = NULL_REG; r_prev = NULL_REG; + r_rest = 0; lastWaitTime = 0; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 861182f43e5..d91118ec1e4 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -183,9 +183,10 @@ public: int executionStackBase; bool _executionStackPosChanged; /**< Set to true if the execution stack position should be re-evaluated by the vm */ + // Registers reg_t r_acc; /**< Accumulator */ - int16 restAdjust; /**< current &rest register */ reg_t r_prev; /**< previous comparison result */ + int16 r_rest; /**< current &rest register */ StackPtr stack_base; /**< Pointer to the least stack element */ StackPtr stack_top; /**< First invalid stack element */ @@ -226,7 +227,7 @@ public: enum { kMemorySegmentMax = 256 }; - uint _memorySegmentSize; + uint16 _memorySegmentSize; byte _memorySegment[kMemorySegmentMax]; VideoState _videoState; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index f1e19800647..496efb6ceb0 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -84,10 +84,9 @@ static reg_t &validate_property(EngineState *s, Object *obj, int index) { static StackPtr validate_stack_addr(EngineState *s, StackPtr sp) { if (sp >= s->stack_base && sp < s->stack_top) return sp; - + else error("[VM] Stack index %d out of valid range [%d..%d]", (int)(sp - s->stack_base), 0, (int)(s->stack_top - s->stack_base - 1)); - return 0; } static bool validate_variable(reg_t *r, reg_t *stack_base, int type, int max, int index) { @@ -553,7 +552,7 @@ void run_vm(EngineState *s) { StackPtr s_temp; // Temporary stack pointer int16 opparams[4]; // opcode parameters - s->restAdjust = 0; // &rest adjusts the parameter count by this value + s->r_rest = 0; // &rest adjusts the parameter count by this value // Current execution data: s->xs = &(s->_executionStack.back()); ExecStack *xs_new = NULL; @@ -826,14 +825,14 @@ void run_vm(EngineState *s) { case op_call: { // 0x20 (32) // Call a script subroutine int argc = (opparams[1] >> 1) // Given as offset, but we need count - + 1 + s->restAdjust; + + 1 + s->r_rest; StackPtr call_base = s->xs->sp - argc; - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->r_rest; uint16 localCallOffset = s->xs->addr.pc.offset + opparams[0]; ExecStack xstack(s->xs->objp, s->xs->objp, s->xs->sp, - (call_base->requireUint16()) + s->restAdjust, call_base, + (call_base->requireUint16()) + s->r_rest, call_base, s->xs->local_segment, make_reg(s->xs->addr.pc.segment, localCallOffset), NULL_SELECTOR, -1, localCallOffset, s->_executionStack.size() - 1, EXEC_STACK_TYPE_CALL); @@ -841,7 +840,7 @@ void run_vm(EngineState *s) { s->_executionStack.push_back(xstack); xs_new = &(s->_executionStack.back()); - s->restAdjust = 0; // Used up the &rest adjustment + s->r_rest = 0; // Used up the &rest adjustment s->xs->sp = call_base; s->_executionStackPosChanged = true; @@ -860,17 +859,17 @@ void run_vm(EngineState *s) { bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); if (!oldScriptHeader) - s->xs->sp -= s->restAdjust; + s->xs->sp -= s->r_rest; int argc = s->xs->sp[0].requireUint16(); if (!oldScriptHeader) - argc += s->restAdjust; + argc += s->r_rest; callKernelFunc(s, opparams[0], argc); if (!oldScriptHeader) - s->restAdjust = 0; + s->r_rest = 0; // Calculate xs again: The kernel function might // have spawned a new VM @@ -887,28 +886,28 @@ void run_vm(EngineState *s) { case op_callb: // 0x22 (34) // Call base script - temp = ((opparams[1] >> 1) + s->restAdjust + 1); + temp = ((opparams[1] >> 1) + s->r_rest + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjust; + s->xs->sp[0].offset += s->r_rest; xs_new = execute_method(s, 0, opparams[0], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjust = 0; // Used up the &rest adjustment + s->r_rest = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; break; case op_calle: // 0x23 (35) // Call external script - temp = ((opparams[2] >> 1) + s->restAdjust + 1); + temp = ((opparams[2] >> 1) + s->r_rest + 1); s_temp = s->xs->sp; s->xs->sp -= temp; - s->xs->sp[0].offset += s->restAdjust; + s->xs->sp[0].offset += s->r_rest; xs_new = execute_method(s, opparams[0], opparams[1], s_temp, s->xs->objp, s->xs->sp[0].offset, s->xs->sp); - s->restAdjust = 0; // Used up the &rest adjustment + s->r_rest = 0; // Used up the &rest adjustment if (xs_new) // in case of error, keep old stack s->_executionStackPosChanged = true; @@ -960,16 +959,16 @@ void run_vm(EngineState *s) { case op_send: // 0x25 (37) // Send for one or more selectors s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->r_rest); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->r_rest; xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp, - (int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp); + (int)(opparams[0] >> 1) + (uint16)s->r_rest, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->r_rest = 0; break; @@ -1003,17 +1002,17 @@ void run_vm(EngineState *s) { case op_self: // 0x2a (42) // Send to self s_temp = s->xs->sp; - s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[0] >> 1) + s->r_rest); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->r_rest; xs_new = send_selector(s, s->xs->objp, s->xs->objp, - s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjust, + s_temp, (int)(opparams[0] >> 1) + (uint16)s->r_rest, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->r_rest = 0; break; case op_super: // 0x2b (43) @@ -1024,17 +1023,17 @@ void run_vm(EngineState *s) { error("[VM]: Invalid superclass in object"); else { s_temp = s->xs->sp; - s->xs->sp -= ((opparams[1] >> 1) + s->restAdjust); // Adjust stack + s->xs->sp -= ((opparams[1] >> 1) + s->r_rest); // Adjust stack - s->xs->sp[1].offset += s->restAdjust; + s->xs->sp[1].offset += s->r_rest; xs_new = send_selector(s, r_temp, s->xs->objp, s_temp, - (int)(opparams[1] >> 1) + (uint16)s->restAdjust, + (int)(opparams[1] >> 1) + (uint16)s->r_rest, s->xs->sp); if (xs_new && xs_new != s->xs) s->_executionStackPosChanged = true; - s->restAdjust = 0; + s->r_rest = 0; } break; @@ -1042,7 +1041,7 @@ void run_vm(EngineState *s) { case op_rest: // 0x2c (44) // Pushes all or part of the parameter variable list on the stack temp = (uint16) opparams[0]; // First argument - s->restAdjust = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't + s->r_rest = MAX(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't for (; temp <= s->xs->argc; temp++) PUSH32(s->xs->variables_argp[temp]); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index bcbb005eb00..85c2eced19f 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -575,9 +575,8 @@ bool SciEngine::initGame() { } // Reset parser - if (_vocabulary) { + if (_vocabulary) _vocabulary->reset(); - } _gamestate->lastWaitTime = _gamestate->_screenUpdateTime = g_system->getMillis();