[Scummvm-cvs-logs] CVS: scummvm/saga saveload.cpp,1.27,1.28 script.h,1.111,1.112 sthread.cpp,1.106,1.107

Torbjörn Andersson eriktorbjorn at users.sourceforge.net
Tue Oct 11 10:21:26 CEST 2005


Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23785

Modified Files:
	saveload.cpp script.h sthread.cpp 
Log Message:
This should ensure that savegames are endian-safe. Unfortunately, I've just
broken any old savegame made on a big-endian machine. Oh well, better now
than after 0.8.0 ...


Index: saveload.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saveload.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- saveload.cpp	4 Oct 2005 23:38:19 -0000	1.27
+++ saveload.cpp	11 Oct 2005 17:20:30 -0000	1.28
@@ -39,7 +39,7 @@
 #include "saga/scene.h"
 #include "saga/script.h"
 
-#define CURRENT_SAGA_VER 3
+#define CURRENT_SAGA_VER 4
 
 namespace Saga {
 
@@ -213,6 +213,9 @@
 	_saveHeader.size = FROM_LE_32(_saveHeader.size);
 	_saveHeader.version = FROM_LE_32(_saveHeader.version);
 
+	if (_saveHeader.version < 4)
+		warning("This savegame is not endian-safe. There may be problems");
+
 	if (_saveHeader.type != MKID('SAGA')) {
 		error("SagaEngine::load wrong format");
 	}

Index: script.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.h,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- script.h	4 Oct 2005 23:38:19 -0000	1.111
+++ script.h	11 Oct 2005 17:20:30 -0000	1.112
@@ -390,6 +390,38 @@
 	}
 
 private:
+	// When reading or writing data to the common buffer, we have to use a
+	// well-defined byte order since it's stored in savegames. Otherwise,
+	// we use native byte ordering since that data may be accessed in other
+	// ways than through these functions.
+	//
+	// The "module" area is a special case, which possibly never ever
+	// happens. But if it does, we need well-defined byte ordering.
+
+	uint16 readUint16(byte *addr, byte addrMode) {
+		switch (addrMode) {
+		case kAddressCommon:
+		case kAddressStatic:
+		case kAddressModule:
+			return READ_LE_UINT16(addr);
+		default:
+			return READ_UINT16(addr);
+		}
+	}
+
+	void writeUint16(byte *addr, uint16 value, byte addrMode) {
+		switch (addrMode) {
+		case kAddressCommon:
+		case kAddressStatic:
+		case kAddressModule:
+			WRITE_LE_UINT16(addr, value);
+			break;
+		default:
+			WRITE_UINT16(addr, value);
+			break;
+		}
+	}
+
 	SagaEngine *_vm;
 	ResourceContext *_scriptContext;
 

Index: sthread.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sthread.cpp,v
retrieving revision 1.106
retrieving revision 1.107
diff -u -d -r1.106 -r1.107
--- sthread.cpp	11 Oct 2005 14:03:36 -0000	1.106
+++ sthread.cpp	11 Oct 2005 17:20:30 -0000	1.107
@@ -199,6 +199,7 @@
 	uint16 savedInstructionOffset;
 
 	byte *addr;
+	byte mode;
 	uint16 jmpOffset1;
 	int16 iparam1;
 	int16 iparam2;
@@ -270,11 +271,12 @@
 			thread->push((*addr) & iparam1 ? 1 : 0);
 			break;
 		CASEOP(opGetInt)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			thread->push(READ_UINT16(addr));
-			debug(8, "0x%X", READ_UINT16(addr));
+			thread->push(readUint16(addr, mode));
+			debug(8, "0x%X", readUint16(addr, mode));
 			break;
 		CASEOP(opPutFlag)
 			addr = thread->baseAddress(scriptS.readByte());
@@ -288,10 +290,11 @@
 			}
 			break;
 		CASEOP(opPutInt)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			WRITE_UINT16(addr, thread->stackTop());
+			writeUint16(addr, thread->stackTop(), mode);
 			break;
 		CASEOP(opPutFlagV)
 			addr = thread->baseAddress(scriptS.readByte());
@@ -305,10 +308,11 @@
 			}
 			break;
 		CASEOP(opPutIntV)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			WRITE_UINT16(addr, thread->pop());
+			writeUint16(addr, thread->pop(), mode);
 			break;
 
 // FUNCTION CALL INSTRUCTIONS
@@ -465,34 +469,38 @@
 			break;
 
 		CASEOP(opIncV)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			iparam1 = READ_UINT16(addr);
-			WRITE_UINT16(addr, iparam1 + 1);
+			iparam1 = readUint16(addr, mode);
+			writeUint16(addr, iparam1 + 1, mode);
 			break;
 		CASEOP(opDecV)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			iparam1 = READ_UINT16(addr);
-			WRITE_UINT16(addr, iparam1 - 1);
+			iparam1 = readUint16(addr, mode);
+			writeUint16(addr, iparam1 - 1, mode);
 			break;
 		CASEOP(opPostInc)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			iparam1 = READ_UINT16(addr);
+			iparam1 = readUint16(addr, mode);
 			thread->push(iparam1);
-			WRITE_UINT16(addr, iparam1 + 1);
+			writeUint16(addr, iparam1 + 1, mode);
 			break;
 		CASEOP(opPostDec)
-			addr = thread->baseAddress(scriptS.readByte());
+			mode = scriptS.readByte();
+			addr = thread->baseAddress(mode);
 			iparam1 = scriptS.readSint16LE();
 			addr += iparam1;
-			iparam1 = READ_UINT16(addr);
+			iparam1 = readUint16(addr, mode);
 			thread->push(iparam1);
-			WRITE_UINT16(addr, iparam1 - 1);
+			writeUint16(addr, iparam1 - 1, mode);
 			break;
 
 // ARITHMETIC INSTRUCTIONS





More information about the Scummvm-git-logs mailing list