[Scummvm-cvs-logs] SF.net SVN: scummvm:[47776] scummvm/trunk/engines/sci/engine
waltervn at users.sourceforge.net
waltervn at users.sourceforge.net
Sun Jan 31 20:47:54 CET 2010
Revision: 47776
http://scummvm.svn.sourceforge.net/scummvm/?rev=47776&view=rev
Author: waltervn
Date: 2010-01-31 19:47:54 +0000 (Sun, 31 Jan 2010)
Log Message:
-----------
SCI: Implement kMemorySegment().
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/kernel.cpp
scummvm/trunk/engines/sci/engine/kernel.h
scummvm/trunk/engines/sci/engine/kmisc.cpp
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/engine/state.cpp
scummvm/trunk/engines/sci/engine/state.h
Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp 2010-01-31 19:47:54 UTC (rev 47776)
@@ -324,6 +324,7 @@
DEFUN("GetMessage", kGetMessage, "iiir"),
DEFUN("DoAudio", kDoAudio, ".*"),
DEFUN("DoSync", kDoSync, ".*"),
+ DEFUN("MemorySegment", kMemorySegment, "iri*"),
DEFUN("ResCheck", kResCheck, "iii*"),
DEFUN("SetQuitStr", kSetQuitStr, "r"),
DEFUN("ShowMovie", kShowMovie, "..*"),
@@ -370,7 +371,6 @@
// Stub functions
/*09*/ DEFUN("Show", kShow, "i"),
DEFUN("ShiftScreen", kShiftScreen, ".*"),
- DEFUN("MemorySegment", kMemorySegment, ".*"),
DEFUN("ListOps", kListOps, ".*"),
DEFUN("ATan", kATan, ".*"),
DEFUN("MergePoly", kMergePoly, ".*"),
Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/kernel.h 2010-01-31 19:47:54 UTC (rev 47776)
@@ -387,6 +387,7 @@
reg_t kMessage(EngineState *s, int argc, reg_t *argv);
reg_t kDoAudio(EngineState *s, int argc, reg_t *argv);
reg_t kDoSync(EngineState *s, int argc, reg_t *argv);
+reg_t kMemorySegment(EngineState *s, int argc, reg_t *argv);
reg_t kResCheck(EngineState *s, int argc, reg_t *argv);
reg_t kSetQuitStr(EngineState *s, int argc, reg_t *argv);
reg_t kShowMovie(EngineState *s, int argc, reg_t *argv);
Modified: scummvm/trunk/engines/sci/engine/kmisc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmisc.cpp 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/kmisc.cpp 2010-01-31 19:47:54 UTC (rev 47776)
@@ -121,6 +121,43 @@
return NULL_REG;
}
+enum kMemorySegmentFunc {
+ K_MEMORYSEGMENT_SAVE_DATA = 0,
+ K_MEMORYSEGMENT_RESTORE_DATA = 1
+};
+
+reg_t kMemorySegment(EngineState *s, int argc, reg_t *argv) {
+ // MemorySegment provides access to a 256-byte block of memory that remains
+ // intact across restarts and restores
+
+ switch (argv[0].toUint16()) {
+ case K_MEMORYSEGMENT_SAVE_DATA: {
+ if (argc < 3)
+ error("Insufficient number of arguments passed to MemorySegment");
+ uint16 size = argv[2].toUint16();
+
+ if (!size)
+ size = s->_segMan->strlen(argv[1]) + 1;
+
+ if (size > EngineState::kMemorySegmentMax)
+ size = EngineState::kMemorySegmentMax;
+
+ s->_memorySegmentSize = size;
+
+ // We assume that this won't be called on pointers
+ s->_segMan->memcpy(s->_memorySegment, argv[1], size);
+ break;
+ }
+ case K_MEMORYSEGMENT_RESTORE_DATA:
+ s->_segMan->memcpy(argv[1], s->_memorySegment, s->_memorySegmentSize);
+ break;
+ default:
+ error("Unknown MemorySegment operation %04x", argv[0].toUint16());
+ }
+
+ return argv[1];
+}
+
reg_t kFlushResources(EngineState *s, int argc, reg_t *argv) {
run_gc(s);
debugC(2, kDebugLevelRoom, "Entering room number %d", argv[0].toUint16());
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2010-01-31 19:47:54 UTC (rev 47776)
@@ -952,6 +952,10 @@
// Copy some old data
retval->_soundCmd = s->_soundCmd;
+ // Copy memory segment
+ retval->_memorySegmentSize = s->_memorySegmentSize;
+ memcpy(retval->_memorySegment, s->_memorySegment, s->_memorySegmentSize);
+
retval->saveLoadWithSerializer(ser); // FIXME: Error handling?
#ifdef USE_OLD_MUSIC_FUNCTIONS
Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/state.cpp 2010-01-31 19:47:54 UTC (rev 47776)
@@ -84,6 +84,8 @@
_sci21KernelType = SCI_VERSION_NONE;
#endif
+ _memorySegmentSize = 0;
+
_usesCdTrack = Common::File::exists("cdaudio.map");
_soundCmd = 0;
Modified: scummvm/trunk/engines/sci/engine/state.h
===================================================================
--- scummvm/trunk/engines/sci/engine/state.h 2010-01-31 19:46:46 UTC (rev 47775)
+++ scummvm/trunk/engines/sci/engine/state.h 2010-01-31 19:47:54 UTC (rev 47776)
@@ -140,6 +140,10 @@
EngineState(ResourceManager *res, Kernel *kernel, Vocabulary *voc, SegManager *segMan, SciGui *gui, AudioPlayer *audio);
virtual ~EngineState();
+ enum {
+ kMemorySegmentMax = 256
+ };
+
virtual void saveLoadWithSerializer(Common::Serializer &ser);
kLanguage getLanguage();
@@ -287,6 +291,9 @@
MessageState *_msgState;
+ uint _memorySegmentSize;
+ byte _memorySegment[kMemorySegmentMax];
+
EngineState *successor; /**< Successor of this state: Used for restoring */
Common::String getLanguageString(const char *str, kLanguage lang) const;
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