[Scummvm-cvs-logs] SF.net SVN: scummvm:[54296] scummvm/trunk/engines/sci/engine/vm.cpp

lskovlun at users.sourceforge.net lskovlun at users.sourceforge.net
Wed Nov 17 18:21:02 CET 2010


Revision: 54296
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54296&view=rev
Author:   lskovlun
Date:     2010-11-17 17:21:02 +0000 (Wed, 17 Nov 2010)

Log Message:
-----------
Adapt SCI property instructions (pToa etc.) to SCI3

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/vm.cpp

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2010-11-17 15:02:58 UTC (rev 54295)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2010-11-17 17:21:02 UTC (rev 54296)
@@ -94,7 +94,7 @@
 
 // validation functionality
 
-static reg_t &validate_property(Object *obj, int index) {
+static reg_t &validate_property(EngineState *s, Object *obj, int index) {
 	// A static dummy reg_t, which we return if obj or index turn out to be
 	// invalid. Note that we cannot just return NULL_REG, because client code
 	// may modify the value of the returned reg_t.
@@ -105,6 +105,11 @@
 	if (!obj)
 		error("validate_property: Sending to disposed object");
 
+	if (getSciVersion() == SCI_VERSION_3)
+		index = obj->locateVarSelector(s->_segMan, index);
+	else
+		index >>= 1;
+
 	if (index < 0 || (uint)index >= obj->getVarCount()) {
 		// This is same way sierra does it and there are some games, that contain such scripts like
 		//  iceman script 998 (fred::canBeHere, executed right at the start)
@@ -1650,27 +1655,27 @@
 
 		case op_pToa: // 0x31 (49)
 			// Property To Accumulator
-			s->r_acc = validate_property(obj, (opparams[0] >> 1));
+			s->r_acc = validate_property(s, obj, opparams[0]);
 			break;
 
 		case op_aTop: // 0x32 (50)
 			// Accumulator To Property
-			validate_property(obj, (opparams[0] >> 1)) = s->r_acc;
+			validate_property(s, obj, opparams[0]) = s->r_acc;
 			break;
 
 		case op_pTos: // 0x33 (51)
 			// Property To Stack
-			PUSH32(validate_property(obj, opparams[0] >> 1));
+			PUSH32(validate_property(s, obj, opparams[0]));
 			break;
 
 		case op_sTop: // 0x34 (52)
 			// Stack To Property
-			validate_property(obj, (opparams[0] >> 1)) = POP32();
+			validate_property(s, obj, opparams[0]) = POP32();
 			break;
 
 		case op_ipToa: { // 0x35 (53)
 			// Increment Property and copy To Accumulator
-			reg_t &opProperty = validate_property(obj, opparams[0] >> 1);
+			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			uint16 valueProperty;
 			if (validate_unsignedInteger(opProperty, valueProperty))
 				s->r_acc = make_reg(0, valueProperty + 1);
@@ -1682,7 +1687,7 @@
 
 		case op_dpToa: { // 0x36 (54)
 			// Decrement Property and copy To Accumulator
-			reg_t &opProperty = validate_property(obj, opparams[0] >> 1);
+			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			uint16 valueProperty;
 			if (validate_unsignedInteger(opProperty, valueProperty))
 				s->r_acc = make_reg(0, valueProperty - 1);
@@ -1694,7 +1699,7 @@
 
 		case op_ipTos: { // 0x37 (55)
 			// Increment Property and push to Stack
-			reg_t &opProperty = validate_property(obj, opparams[0] >> 1);
+			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			uint16 valueProperty;
 			if (validate_unsignedInteger(opProperty, valueProperty))
 				valueProperty++;
@@ -1707,7 +1712,7 @@
 
 		case op_dpTos: { // 0x38 (56)
 			// Decrement Property and push to Stack
-			reg_t &opProperty = validate_property(obj, opparams[0] >> 1);
+			reg_t &opProperty = validate_property(s, obj, opparams[0]);
 			uint16 valueProperty;
 			if (validate_unsignedInteger(opProperty, valueProperty))
 				valueProperty--;


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list