[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
- Previous message: [Scummvm-cvs-logs] CVS: web/news 20051011.xml,NONE,1.1
- Next message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.199,1.200 events.cpp,1.69,1.70 font.cpp,1.36,1.37 gfx.cpp,1.67,1.68 interface.cpp,1.158,1.159 isomap.cpp,1.62,1.63 rscfile.cpp,1.49,1.50 saga.cpp,1.142,1.143 saveload.cpp,1.28,1.29 scene.cpp,1.154,1.155 sfuncs.cpp,1.174,1.175 sthread.cpp,1.107,1.108
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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
- Previous message: [Scummvm-cvs-logs] CVS: web/news 20051011.xml,NONE,1.1
- Next message: [Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.199,1.200 events.cpp,1.69,1.70 font.cpp,1.36,1.37 gfx.cpp,1.67,1.68 interface.cpp,1.158,1.159 isomap.cpp,1.62,1.63 rscfile.cpp,1.49,1.50 saga.cpp,1.142,1.143 saveload.cpp,1.28,1.29 scene.cpp,1.154,1.155 sfuncs.cpp,1.174,1.175 sthread.cpp,1.107,1.108
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Scummvm-git-logs
mailing list