diff options
| -rw-r--r-- | engines/sci/console.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/engine/scriptdebug.cpp | 6 | ||||
| -rw-r--r-- | engines/sci/engine/state.h | 1 | ||||
| -rw-r--r-- | engines/sci/engine/vm.cpp | 58 | 
4 files changed, 34 insertions, 33 deletions
| diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 2549be9403..814fbff636 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -597,7 +597,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->restAdjustCur);  	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 159c278e8c..b465ab3d4e 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -205,12 +205,12 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod  	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->restAdjustCur);  			int argc = ((s->xs->sp)[- stackframe - 1]).offset;  			bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);  			if (!oldScriptHeader) -				argc += (s->restAdjust); +				argc += (s->restAdjustCur);  			printf(" Kernel params: ("); @@ -221,7 +221,7 @@ reg_t disassemble(EngineState *s, reg_t pos, int print_bw_tag, int print_bytecod  			}  			printf(")\n");  		} else if ((opcode == op_send) || (opcode == op_self)) { -			int restmod = s->restAdjust; +			int restmod = s->restAdjustCur;  			int stackframe = (scr[pos.offset + 1] >> 1) + restmod;  			reg_t *sb = s->xs->sp;  			uint16 selector; diff --git a/engines/sci/engine/state.h b/engines/sci/engine/state.h index 68e6a5516a..bcdf66d6ef 100644 --- a/engines/sci/engine/state.h +++ b/engines/sci/engine/state.h @@ -143,6 +143,7 @@ public:  	reg_t r_acc; /**< Accumulator */  	int16 restAdjust; /**< &rest register (only used for save games) */ +	int16 restAdjustCur; /**< current &rest register (only used for save games) */  	reg_t r_prev; /**< previous comparison result */  	StackPtr stack_base; /**< Pointer to the least stack element */ diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index b04cc473b5..1dcdf450ba 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -718,7 +718,7 @@ void run_vm(EngineState *s, bool restoring) {  	StackPtr s_temp; // Temporary stack pointer  	int16 opparams[4]; // opcode parameters -	s->restAdjust = s->restAdjust; +	s->restAdjustCur = s->restAdjust;  	// &rest adjusts the parameter count by this value  	// Current execution data:  	s->xs = &(s->_executionStack.back()); @@ -1116,17 +1116,17 @@ void run_vm(EngineState *s, bool restoring) {  		case op_call: { // 0x20 (32)  			int argc = (opparams[1] >> 1) // Given as offset, but we need count -			           + 1 + s->restAdjust; +			           + 1 + s->restAdjustCur;  			StackPtr call_base = s->xs->sp - argc; -			s->xs->sp[1].offset += s->restAdjust; +			s->xs->sp[1].offset += s->restAdjustCur;  			xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment,  											s->xs->addr.pc.offset + opparams[0]),  											s->xs->sp, s->xs->objp, -											(validate_arithmetic(*call_base)) + s->restAdjust, +											(validate_arithmetic(*call_base)) + s->restAdjustCur,  											call_base, NULL_SELECTOR, s->xs->objp,  											s->_executionStack.size()-1, s->xs->local_segment); -			s->restAdjust = 0; // Used up the &rest adjustment +			s->restAdjustCur = 0; // Used up the &rest adjustment  			s->xs->sp = call_base;  			s->_executionStackPosChanged = true; @@ -1140,19 +1140,19 @@ void run_vm(EngineState *s, bool restoring) {  			bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);  			if (!oldScriptHeader) { -				s->xs->sp -= s->restAdjust; -				s->restAdjust = 0; // We just used up the s->restAdjust, remember? +				s->xs->sp -= s->restAdjustCur; +				s->restAdjust = 0; // We just used up the s->restAdjustCur, remember?  			}  			int argc = validate_arithmetic(s->xs->sp[0]);  			if (!oldScriptHeader) -				argc += s->restAdjust; +				argc += s->restAdjustCur;  			callKernelFunc(s, opparams[0], argc);  			if (!oldScriptHeader) -				s->restAdjust = s->restAdjust; +				s->restAdjustCur = s->restAdjust;  			// Calculate xs again: The kernel function might  			// have spawned a new VM @@ -1163,27 +1163,27 @@ void run_vm(EngineState *s, bool restoring) {  		}  		case op_callb: // 0x22 (34) -			temp = ((opparams[1] >> 1) + s->restAdjust + 1); +			temp = ((opparams[1] >> 1) + s->restAdjustCur + 1);  			s_temp = s->xs->sp;  			s->xs->sp -= temp; -			s->xs->sp[0].offset += s->restAdjust; +			s->xs->sp[0].offset += s->restAdjustCur;  			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->restAdjustCur = 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) -			temp = ((opparams[2] >> 1) + s->restAdjust + 1); +			temp = ((opparams[2] >> 1) + s->restAdjustCur + 1);  			s_temp = s->xs->sp;  			s->xs->sp -= temp; -			s->xs->sp[0].offset += s->restAdjust; +			s->xs->sp[0].offset += s->restAdjustCur;  			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->restAdjustCur = 0; // Used up the &rest adjustment  			if (xs_new)  // in case of error, keep old stack  				s->_executionStackPosChanged = true; @@ -1201,7 +1201,7 @@ void run_vm(EngineState *s, bool restoring) {  					s->_executionStack.pop_back();  					s->_executionStackPosChanged = true; -					s->restAdjust = s->restAdjust; // Update &rest +					s->restAdjust = s->restAdjustCur; // Update &rest  					return; // "Hard" return  				} @@ -1234,16 +1234,16 @@ void run_vm(EngineState *s, bool restoring) {  		case op_send: // 0x25 (37)  			s_temp = s->xs->sp; -			s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack +			s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack -			s->xs->sp[1].offset += s->restAdjust; +			s->xs->sp[1].offset += s->restAdjustCur;  			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->restAdjustCur, s->xs->sp);  			if (xs_new && xs_new != s->xs)  				s->_executionStackPosChanged = true; -			s->restAdjust = 0; +			s->restAdjustCur = 0;  			break; @@ -1263,17 +1263,17 @@ void run_vm(EngineState *s, bool restoring) {  		case op_self: // 0x2a (42)  			s_temp = s->xs->sp; -			s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack +			s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack -			s->xs->sp[1].offset += s->restAdjust; +			s->xs->sp[1].offset += s->restAdjustCur;  			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->restAdjustCur,  									s->xs->sp);  			if (xs_new && xs_new != s->xs)  				s->_executionStackPosChanged = true; -			s->restAdjust = 0; +			s->restAdjustCur = 0;  			break;  		case op_super: // 0x2b (43) @@ -1283,24 +1283,24 @@ void run_vm(EngineState *s, bool restoring) {  				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->restAdjustCur); // Adjust stack -				s->xs->sp[1].offset += s->restAdjust; +				s->xs->sp[1].offset += s->restAdjustCur;  				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->restAdjustCur,  										s->xs->sp);  				if (xs_new && xs_new != s->xs)  					s->_executionStackPosChanged = true; -				s->restAdjust = 0; +				s->restAdjustCur = 0;  			}  			break;  		case op_rest: // 0x2c (44)  			temp = (uint16) opparams[0]; // First argument -			s->restAdjust = MAX<int16>(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't +			s->restAdjustCur = MAX<int16>(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]); | 
