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

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Sat Jan 30 05:01:15 CET 2010


Revision: 47700
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47700&view=rev
Author:   waltervn
Date:     2010-01-30 04:01:15 +0000 (Sat, 30 Jan 2010)

Log Message:
-----------
SCI: Apply fix from r47683 to u> and u<= as well. Fixes Longbow.

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-30 03:57:58 UTC (rev 47699)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2010-01-30 04:01:15 UTC (rev 47700)
@@ -885,16 +885,7 @@
 		case op_ugt_: // 0x13 (19)
 			s->r_prev = s->r_acc;
 			r_temp = POP32();
-			if (r_temp.segment && s->r_acc.segment)
-				s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset);
-			else
-				s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) > /*acc*/);
-			break;
 
-		case op_uge_: // 0x14 (20)
-			s->r_prev = s->r_acc;
-			r_temp = POP32();
-
 			// SCI0/SCI1 scripts use this to check whether a
 			// parameter is a pointer or a far text
 			// reference. It is used e.g. by the standard library
@@ -905,9 +896,22 @@
 
 			// It works because in those games, the maximum resource number is 999, 
 			// so any parameter value above that threshold must be a pointer. 
-			if (s->r_acc == make_reg(0, 0x3e8))
-				s->r_acc = make_reg(0, r_temp.segment);
+			if (r_temp.segment && (s->r_acc == make_reg(0, 0x3e8)))
+				s->r_acc = make_reg(0, 1);
 			else if (r_temp.segment && s->r_acc.segment)
+				s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset > s->r_acc.offset);
+			else
+				s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) > /*acc*/);
+			break;
+
+		case op_uge_: // 0x14 (20)
+			s->r_prev = s->r_acc;
+			r_temp = POP32();
+
+			// See above
+			if (r_temp.segment && (s->r_acc == make_reg(0, 0x3e8)))
+				s->r_acc = make_reg(0, 1);
+			else if (r_temp.segment && s->r_acc.segment)
 				s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset >= s->r_acc.offset);
 			else
 				s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) >= /*acc*/);
@@ -918,8 +922,8 @@
 			r_temp = POP32();
 
 			// See above
-			if (s->r_acc == make_reg(0, 0x3e8))
-				s->r_acc = make_reg(0, !r_temp.segment);
+			if (r_temp.segment && (s->r_acc == make_reg(0, 0x3e8)))
+				s->r_acc = NULL_REG;
 			else if (r_temp.segment && s->r_acc.segment)
 				s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset < s->r_acc.offset);
 			else
@@ -929,7 +933,11 @@
 		case op_ule_: // 0x16 (22)
 			s->r_prev = s->r_acc;
 			r_temp = POP32();
-			if (r_temp.segment && s->r_acc.segment)
+
+			// See above
+			if (r_temp.segment && (s->r_acc == make_reg(0, 0x3e8)))
+				s->r_acc = NULL_REG;
+			else if (r_temp.segment && s->r_acc.segment)
 				s->r_acc = make_reg(0, (r_temp.segment == s->r_acc.segment) && r_temp.offset <= s->r_acc.offset);
 			else
 				s->r_acc = ACC_ARITHMETIC_L(validate_arithmetic(r_temp) <= /*acc*/);


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