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

waltervn at users.sourceforge.net waltervn at users.sourceforge.net
Wed Jan 27 02:47:41 CET 2010


Revision: 47585
          http://scummvm.svn.sourceforge.net/scummvm/?rev=47585&view=rev
Author:   waltervn
Date:     2010-01-27 01:47:41 +0000 (Wed, 27 Jan 2010)

Log Message:
-----------
SCI: Add pointer comparison support to signed comparison operators.

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-26 23:23:10 UTC (rev 47584)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2010-01-27 01:47:41 UTC (rev 47585)
@@ -848,22 +848,40 @@
 
 		case 0x0f: // gt?
 			s->r_prev = s->r_acc;
-			s->r_acc = ACC_ARITHMETIC_L((int16)POP() > (int16)/*acc*/);
+			r_temp = POP32();
+			if (r_temp.segment && s->r_acc.segment) {
+				// Signed pointer comparison. We do unsigned comparison instead, as that is probably what was intended.
+				// FIXME: Add a warning when pointers in different segments are compared
+				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(r_temp.toSint16() > (int16)/*acc*/);
 			break;
 
 		case 0x10: // ge?
 			s->r_prev = s->r_acc;
-			s->r_acc = ACC_ARITHMETIC_L((int16)POP() >= (int16)/*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(r_temp.toSint16() >= (int16)/*acc*/);
 			break;
 
 		case 0x11: // lt?
 			s->r_prev = s->r_acc;
-			s->r_acc = ACC_ARITHMETIC_L((int16)POP() < (int16)/*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(r_temp.toSint16() < (int16)/*acc*/);
 			break;
 
 		case 0x12: // le?
 			s->r_prev = s->r_acc;
-			s->r_acc = ACC_ARITHMETIC_L((int16)POP() <= (int16)/*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(r_temp.toSint16() <= (int16)/*acc*/);
 			break;
 
 		case 0x13: // ugt?


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