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

lskovlun at users.sourceforge.net lskovlun at users.sourceforge.net
Sun Jan 3 18:40:18 CET 2010


Revision: 46935
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46935&view=rev
Author:   lskovlun
Date:     2010-01-03 17:40:17 +0000 (Sun, 03 Jan 2010)

Log Message:
-----------
SCI: Support pointer arithmetics in +ag, +agi, etc. too

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-01-03 16:50:27 UTC (rev 46934)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2010-01-03 17:40:17 UTC (rev 46935)
@@ -516,7 +516,7 @@
 
 	default:
 		// Changed this to warning, because iceman does this during dancing with girl
-		warning("[VM] Error: Attempt to add %d to pointer %04x:%04x: Pointer arithmetics of this type unsupported", offset, PRINT_REG(base));
+		warning("[VM] Error: Attempt to add %d to pointer %04x:%04x, type %d: Pointer arithmetics of this type unsupported", offset, PRINT_REG(base), mobj->getType());
 		return NULL_REG;
 
 	}
@@ -1352,7 +1352,12 @@
 		case 0x63: // +ap
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0];
-			s->r_acc = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				s->r_acc = pointer_add(s, r_temp, 1);
+			} else
+				s->r_acc = make_reg(0, r_temp.offset + 1);
 			WRITE_VAR(var_type, var_number, s->r_acc);
 			break;
 
@@ -1362,7 +1367,12 @@
 		case 0x67: // +sp
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0];
-			r_temp = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				r_temp = pointer_add(s, r_temp, 1);
+			} else
+				r_temp = make_reg(0, r_temp.offset + 1);
 			PUSH32(r_temp);
 			WRITE_VAR(var_type, var_number, r_temp);
 			break;
@@ -1373,7 +1383,12 @@
 		case 0x6b: // +api
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0] + signed_validate_arithmetic(s->r_acc);
-			s->r_acc = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				s->r_acc = pointer_add(s, r_temp, 1);
+			} else
+				s->r_acc = make_reg(0, r_temp.offset + 1);
 			WRITE_VAR(var_type, var_number, s->r_acc);
 			break;
 
@@ -1383,7 +1398,12 @@
 		case 0x6f: // +spi
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0] + signed_validate_arithmetic(s->r_acc);
-			r_temp = make_reg(0, 1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				r_temp = pointer_add(s, r_temp, 1);
+			} else
+				r_temp = make_reg(0, r_temp.offset + 1);
 			PUSH32(r_temp);
 			WRITE_VAR(var_type, var_number, r_temp);
 			break;
@@ -1392,19 +1412,30 @@
 		case 0x71: // -al
 		case 0x72: // -at
 		case 0x73: // -ap
+		{
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0];
-			s->r_acc = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				s->r_acc = pointer_add(s, r_temp, -1);
+			} else
+				s->r_acc = make_reg(0, r_temp.offset - 1);
 			WRITE_VAR(var_type, var_number, s->r_acc);
 			break;
-
+		}
 		case 0x74: // -sg
 		case 0x75: // -sl
 		case 0x76: // -st
 		case 0x77: // -sp
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0];
-			r_temp = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				r_temp = pointer_add(s, r_temp, -1);
+			} else
+				r_temp = make_reg(0, r_temp.offset - 1);
 			PUSH32(r_temp);
 			WRITE_VAR(var_type, var_number, r_temp);
 			break;
@@ -1415,7 +1446,12 @@
 		case 0x7b: // -api
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0] + signed_validate_arithmetic(s->r_acc);
-			s->r_acc = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				s->r_acc = pointer_add(s, r_temp, -1);
+			} else
+				s->r_acc = make_reg(0, r_temp.offset - 1);
 			WRITE_VAR(var_type, var_number, s->r_acc);
 			break;
 
@@ -1425,7 +1461,12 @@
 		case 0x7f: // -spi
 			var_type = (opcode >> 1) & 0x3; // Gets the variable type: g, l, t or p
 			var_number = opparams[0] + signed_validate_arithmetic(s->r_acc);
-			r_temp = make_reg(0, -1 + validate_arithmetic(READ_VAR(var_type, var_number, s->r_acc)));
+			r_temp = READ_VAR(var_type, var_number, s->r_acc);
+			if (r_temp.segment) {
+				// Pointer arithmetics!
+				r_temp = pointer_add(s, r_temp, -1);
+			} else
+				r_temp = make_reg(0, r_temp.offset - 1);
 			PUSH32(r_temp);
 			WRITE_VAR(var_type, var_number, r_temp);
 			break;


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