[Scummvm-cvs-logs] SF.net SVN: scummvm:[43729] scummvm/trunk/engines/sci

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Tue Aug 25 17:14:30 CEST 2009


Revision: 43729
          http://scummvm.svn.sourceforge.net/scummvm/?rev=43729&view=rev
Author:   thebluegr
Date:     2009-08-25 15:14:29 +0000 (Tue, 25 Aug 2009)

Log Message:
-----------
- Replaced more cases of EngineState parameters
- Made some version comparisons for old SCI0 versions easier to read
- Removed the GET_SEL32SV macro

Modified Paths:
--------------
    scummvm/trunk/engines/sci/console.cpp
    scummvm/trunk/engines/sci/engine/gc.cpp
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kernel_types.h
    scummvm/trunk/engines/sci/engine/kevent.cpp
    scummvm/trunk/engines/sci/engine/kfile.cpp
    scummvm/trunk/engines/sci/engine/kgraphics.cpp
    scummvm/trunk/engines/sci/engine/klists.cpp
    scummvm/trunk/engines/sci/engine/kmenu.cpp
    scummvm/trunk/engines/sci/engine/kmisc.cpp
    scummvm/trunk/engines/sci/engine/kmovement.cpp
    scummvm/trunk/engines/sci/engine/kpathing.cpp
    scummvm/trunk/engines/sci/engine/kscripts.cpp
    scummvm/trunk/engines/sci/engine/ksound.cpp
    scummvm/trunk/engines/sci/engine/kstring.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/state.cpp
    scummvm/trunk/engines/sci/engine/stringfrag.cpp
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/engine/vm.h
    scummvm/trunk/engines/sci/gfx/menubar.cpp

Modified: scummvm/trunk/engines/sci/console.cpp
===================================================================
--- scummvm/trunk/engines/sci/console.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/console.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -2735,7 +2735,7 @@
 	}
 
 	int handle = id.segment << 16 | id.offset;	// frobnicate handle
-	EngineState* s = _vm->_gamestate;		// for PUT_SEL32V
+	SegManager *segManager = _vm->_gamestate->segmentManager;	// for PUT_SEL32V
 
 	if (id.segment) {
 		_vm->_gamestate->_sound.sfx_song_set_status(handle, SOUND_STATUS_STOPPED);

Modified: scummvm/trunk/engines/sci/engine/gc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/gc.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/gc.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -102,7 +102,7 @@
 			wm.push(es.objp);
 			wm.push(es.sendp);
 			if (es.type == EXEC_STACK_TYPE_VARSELECTOR)
-				wm.push(*(es.getVarPointer(s)));
+				wm.push(*(es.getVarPointer(s->segmentManager)));
 		}
 	}
 

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -422,6 +422,7 @@
 
 void Kernel::loadSelectorNames() {
 	Resource *r = _resourceManager->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
+	bool oldScriptHeader = (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY);
 
 	if (!r) { // No such resource?
 		// Check if we have a table for this game
@@ -433,7 +434,7 @@
 		
 		for (uint32 i = 0; i < staticSelectorTable.size(); i++) {
 			_selectorNames.push_back(staticSelectorTable[i]);
-			if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY)
+			if (oldScriptHeader)
 				_selectorNames.push_back(staticSelectorTable[i]);
 		}
 			
@@ -452,7 +453,7 @@
 
 		// Early SCI versions used the LSB in the selector ID as a read/write
 		// toggle. To compensate for that, we add every selector name twice.
-		if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY)
+		if (oldScriptHeader)
 			_selectorNames.push_back(tmp);
 	}
 }
@@ -714,14 +715,14 @@
 	return argtype_description[sci_ffs(type)];
 }
 
-bool kernel_matches_signature(EngineState *s, const char *sig, int argc, const reg_t *argv) {
+bool kernel_matches_signature(SegManager *segManager, const char *sig, int argc, const reg_t *argv) {
 	// Always "match" if no signature is given
 	if (!sig)
 		return true;
 
 	while (*sig && argc) {
 		if ((*sig & KSIG_ANY) != KSIG_ANY) {
-			int type = determine_reg_type(s->segmentManager, *argv, *sig & KSIG_ALLOW_INV);
+			int type = determine_reg_type(segManager, *argv, *sig & KSIG_ALLOW_INV);
 
 			if (!type) {
 				warning("[KERN] Could not determine type of ref %04x:%04x; failing signature check", PRINT_REG(*argv));
@@ -750,9 +751,9 @@
 		return (*sig == 0 || (*sig & KSIG_ELLIPSIS));
 }
 
-static void *_kernel_dereference_pointer(EngineState *s, reg_t pointer, int entries, int align) {
+static void *_kernel_dereference_pointer(SegManager *segManager, reg_t pointer, int entries, int align) {
 	int maxsize;
-	void *retval = s->segmentManager->dereference(pointer, &maxsize);
+	void *retval = segManager->dereference(pointer, &maxsize);
 
 	if (!retval)
 		return NULL;
@@ -770,12 +771,12 @@
 
 }
 
-byte *kernel_dereference_bulk_pointer(EngineState *s, reg_t pointer, int entries) {
-	return (byte*)_kernel_dereference_pointer(s, pointer, entries, 1);
+byte *kernel_dereference_bulk_pointer(SegManager *segManager, reg_t pointer, int entries) {
+	return (byte*)_kernel_dereference_pointer(segManager, pointer, entries, 1);
 }
 
-reg_t *kernel_dereference_reg_pointer(EngineState *s, reg_t pointer, int entries) {
-	return (reg_t*)_kernel_dereference_pointer(s, pointer, entries, sizeof(reg_t));
+reg_t *kernel_dereference_reg_pointer(SegManager *segManager, reg_t pointer, int entries) {
+	return (reg_t*)_kernel_dereference_pointer(segManager, pointer, entries, sizeof(reg_t));
 }
 
 void Kernel::setDefaultKernelNames() {

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-08-25 15:14:29 UTC (rev 43729)
@@ -187,9 +187,8 @@
 	kContinueOnInvalidSelector = 1
 };
 
-#define GET_SEL32(_o_, _slc_) read_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, __FILE__, __LINE__)
+#define GET_SEL32(_o_, _slc_) read_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, __FILE__, __LINE__)
 #define GET_SEL32V(_o_, _slc_) (GET_SEL32(_o_, _slc_).offset)
-#define GET_SEL32SV(_o_, _slc_) ((int16)(GET_SEL32(_o_, _slc_).offset))
 /* Retrieves a selector from an object
 ** Parameters: (reg_t) object: The address of the object which the selector should be read from
 **             (selector_name) selector: The selector to read
@@ -198,8 +197,8 @@
 ** selector_map_t and mapped in script.c.
 */
 
-#define PUT_SEL32(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, _val_, __FILE__, __LINE__)
-#define PUT_SEL32V(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__)
+#define PUT_SEL32(_o_, _slc_, _val_) write_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, _val_, __FILE__, __LINE__)
+#define PUT_SEL32V(_o_, _slc_, _val_) write_selector(segManager, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__)
 /* Writes a selector value to an object
 ** Parameters: (reg_t) object: The address of the object which the selector should be written to
 **             (selector_name) selector: The selector to read
@@ -217,8 +216,8 @@
 */
 
 
-reg_t read_selector(EngineState *s, reg_t object, Selector selector_id, const char *fname, int line);
-void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t value, const char *fname, int line);
+reg_t read_selector(SegManager *segManager, reg_t object, Selector selector_id, const char *fname, int line);
+void write_selector(SegManager *segManager, reg_t object, Selector selector_id, reg_t value, const char *fname, int line);
 int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct,
 	StackPtr k_argp, int k_argc, const char *fname, int line, int argc, ...);
 
@@ -260,8 +259,8 @@
  * if not enugh entries were available.
  * reg_t dereferenciation also assures alignedness of data.
  */
-reg_t *kernel_dereference_reg_pointer(EngineState *s, reg_t pointer, int entries);
-byte *kernel_dereference_bulk_pointer(EngineState *s, reg_t pointer, int entries);
+reg_t *kernel_dereference_reg_pointer(SegManager *segManager, reg_t pointer, int entries);
+byte *kernel_dereference_bulk_pointer(SegManager *segManager, reg_t pointer, int entries);
 #define kernel_dereference_char_pointer(state, pointer, entries) (char*)kernel_dereference_bulk_pointer(state, pointer, entries)
 
 /******************** Priority macros/functions ********************/

Modified: scummvm/trunk/engines/sci/engine/kernel_types.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel_types.h	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kernel_types.h	2009-08-25 15:14:29 UTC (rev 43729)
@@ -75,7 +75,7 @@
  * @param argv	argument list
  * @return true if the signature was matched, false otherwise
  */
-bool kernel_matches_signature(EngineState *s, const char *sig, int argc, const reg_t *argv);
+bool kernel_matches_signature(SegManager *segManager, const char *sig, int argc, const reg_t *argv);
 
 /**
  * Determines the type of the object indicated by reg.

Modified: scummvm/trunk/engines/sci/engine/kevent.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kevent.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kevent.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -41,6 +41,7 @@
 	sci_event_t e;
 	int oldx, oldy;
 	int modifier_mask = s->resourceManager->sciVersion() <= SCI_VERSION_01 ? SCI_EVM_ALL : SCI_EVM_NO_FOOLOCK;
+	SegManager *segManager = s->segmentManager;
 
 	// If there's a simkey pending, and the game wants a keyboard event, use the
 	// simkey instead of a normal event
@@ -152,6 +153,7 @@
 
 reg_t kMapKeyToDir(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	reg_t obj = argv[0];
+	SegManager *segManager = s->segmentManager;
 
 	if (GET_SEL32V(obj, type) == SCI_EVT_KEYBOARD) { // Keyboard
 		int mover = -1;
@@ -201,6 +203,7 @@
 
 reg_t kGlobalToLocal(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
+	SegManager *segManager = s->segmentManager;
 
 	if (obj.segment) {
 		int x = GET_SEL32V(obj, x);
@@ -216,6 +219,7 @@
 
 reg_t kLocalToGlobal(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	reg_t obj = argc ? argv[0] : NULL_REG; // Can this really happen? Lars
+	SegManager *segManager = s->segmentManager;
 
 	if (obj.segment) {
 		int x = GET_SEL32V(obj, x);

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -196,7 +196,7 @@
 }
 
 reg_t kFOpen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *name = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *name = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int mode = argv[1].toUint16();
 
 	debug(3, "kFOpen(%s,0x%x)", name, mode);
@@ -249,7 +249,7 @@
 
 reg_t kFPuts(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	int handle = argv[0].toUint16();
-	char *data = kernel_dereference_char_pointer(s, argv[1], 0);
+	char *data = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 	fwrite_wrapper(s, handle, data, strlen(data));
 	return s->r_acc;
@@ -306,7 +306,7 @@
 }
 
 reg_t kFGets(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *dest = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int maxsize = argv[1].toUint16();
 	int handle = argv[2].toUint16();
 
@@ -319,7 +319,7 @@
  * Writes the cwd to the supplied address and returns the address in acc.
  */
 reg_t kGetCWD(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *targetaddr = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *targetaddr = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 
 	// We do not let the scripts see the file system, instead pretending
 	// we are always in the same directory.
@@ -355,8 +355,8 @@
 
 	switch (mode) {
 	case K_DEVICE_INFO_GET_DEVICE:
-		input_s = kernel_dereference_char_pointer(s, argv[1], 0);
-		output_s = kernel_dereference_char_pointer(s, argv[2], 0);
+		input_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
+		output_s = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 		assert(input_s != output_s);
 
 		strcpy(output_s, "/");
@@ -364,15 +364,15 @@
 		break;
 
 	case K_DEVICE_INFO_GET_CURRENT_DEVICE:
-		output_s = kernel_dereference_char_pointer(s, argv[1], 0);
+		output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 		strcpy(output_s, "/");
 		debug(3, "K_DEVICE_INFO_GET_CURRENT_DEVICE() -> %s", output_s);
 		break;
 
 	case K_DEVICE_INFO_PATHS_EQUAL: {
-		char *path1_s = kernel_dereference_char_pointer(s, argv[1], 0);
-		char *path2_s = kernel_dereference_char_pointer(s, argv[2], 0);
+		char *path1_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
+		char *path2_s = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 		debug(3, "K_DEVICE_INFO_PATHS_EQUAL(%s,%s)", path1_s, path2_s);
 
 		return make_reg(0, Common::matchString(path2_s, path1_s, true));
@@ -380,7 +380,7 @@
 		break;
 
 	case K_DEVICE_INFO_IS_FLOPPY:
-		input_s = kernel_dereference_char_pointer(s, argv[1], 0);
+		input_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 		debug(3, "K_DEVICE_INFO_IS_FLOPPY(%s)", input_s);
 		return NULL_REG; /* Never */
 
@@ -389,8 +389,8 @@
 	** for more information on our workaround for this.
 	*/
 	case K_DEVICE_INFO_GET_SAVECAT_NAME: {
-		output_s = kernel_dereference_char_pointer(s, argv[1], 0);
-		game_prefix = kernel_dereference_char_pointer(s, argv[2], 0);
+		output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
+		game_prefix = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 
 		sprintf(output_s, "__throwaway");
 		debug(3, "K_DEVICE_INFO_GET_SAVECAT_NAME(%s) -> %s", game_prefix, output_s);
@@ -398,8 +398,8 @@
 
 	break;
 	case K_DEVICE_INFO_GET_SAVEFILE_NAME: {
-		output_s = kernel_dereference_char_pointer(s, argv[1], 0);
-		game_prefix = kernel_dereference_char_pointer(s, argv[2], 0);
+		output_s = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
+		game_prefix = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 		int savegame_id = argv[3].toUint16();
 		sprintf(output_s, "__throwaway");
 		debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix, savegame_id, output_s);
@@ -421,7 +421,7 @@
 }
 
 reg_t kCheckFreeSpace(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *path = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *path = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 
 	debug(3, "kCheckFreeSpace(%s)", path);
 	// We simply always pretend that there is enough space.
@@ -479,7 +479,7 @@
 }
 
 reg_t kCheckSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *game_id = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int savedir_nr = argv[1].toUint16();
 
 	debug(3, "kCheckSaveGame(%s, %d)", game_id, savedir_nr);
@@ -515,10 +515,10 @@
 }
 
 reg_t kGetSaveFiles(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *game_id = kernel_dereference_char_pointer(s, argv[0], 0);
-	char *nametarget = kernel_dereference_char_pointer(s, argv[1], 0);
+	char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
+	char *nametarget = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 	reg_t nametarget_base = argv[1];
-	reg_t *nameoffsets = kernel_dereference_reg_pointer(s, argv[2], 0);
+	reg_t *nameoffsets = kernel_dereference_reg_pointer(s->segmentManager, argv[2], 0);
 
 	debug(3, "kGetSaveFiles(%s,%s)", game_id, nametarget);
 
@@ -565,11 +565,11 @@
 }
 
 reg_t kSaveGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *game_id = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int savedir_nr = argv[1].toUint16();
 	int savedir_id; // Savegame ID, derived from savedir_nr and the savegame ID list
-	char *game_description = kernel_dereference_char_pointer(s, argv[2], 0);
-	char *version = argc > 3 ? strdup(kernel_dereference_char_pointer(s, argv[3], 0)) : NULL;
+	char *game_description = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
+	char *version = argc > 3 ? strdup(kernel_dereference_char_pointer(s->segmentManager, argv[3], 0)) : NULL;
 
 	debug(3, "kSaveGame(%s,%d,%s,%s)", game_id, savedir_nr, game_description, version);
 	s->game_version = version;
@@ -638,7 +638,7 @@
 }
 
 reg_t kRestoreGame(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *game_id = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *game_id = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int savedir_nr = argv[1].toUint16();
 
 	debug(3, "kRestoreGame(%s,%d)", game_id, savedir_nr);
@@ -677,7 +677,7 @@
 }
 
 reg_t kValidPath(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	const char *path = kernel_dereference_char_pointer(s, argv[0], 0);
+	const char *path = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 
 	// FIXME: For now, we only accept the (fake) root dir "/" as a valid path.
 	s->r_acc = make_reg(0, 0 == strcmp(path, "/"));
@@ -728,7 +728,7 @@
 		return;
 	}
 
-	char *mem = kernel_dereference_char_pointer(_vm, _outbuffer, 0);
+	char *mem = kernel_dereference_char_pointer(_vm->segmentManager, _outbuffer, 0);
 	memset(mem, 0, 13);
 
 	// TODO: Transform the string back into a format usable by the SCI scripts.
@@ -749,7 +749,7 @@
 
 	switch (func_nr) {
 	case K_FILEIO_OPEN : {
-		char *name = kernel_dereference_char_pointer(s, argv[1], 0);
+		char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 		int mode = argv[2].toUint16();
 
 		file_open(s, name, mode);
@@ -765,7 +765,7 @@
 	}
 	case K_FILEIO_READ_RAW : {
 		int handle = argv[1].toUint16();
-		char *dest = kernel_dereference_char_pointer(s, argv[2], 0);
+		char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 		int size = argv[3].toUint16();
 		debug(3, "K_FILEIO_READ_RAW(%d,%d)", handle, size);
 
@@ -774,7 +774,7 @@
 	}
 	case K_FILEIO_WRITE_RAW : {
 		int handle = argv[1].toUint16();
-		char *buf = kernel_dereference_char_pointer(s, argv[2], 0);
+		char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[2], 0);
 		int size = argv[3].toUint16();
 		debug(3, "K_FILEIO_WRITE_RAW(%d,%d)", handle, size);
 
@@ -782,7 +782,7 @@
 		break;
 	}
 	case K_FILEIO_UNLINK : {
-		char *name = kernel_dereference_char_pointer(s, argv[1], 0);
+		char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 		debug(3, "K_FILEIO_UNLINK(%s)", name);
 
 		Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
@@ -793,7 +793,7 @@
 		break;
 	}
 	case K_FILEIO_READ_STRING : {
-		char *dest = kernel_dereference_char_pointer(s, argv[1], 0);
+		char *dest = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 		int size = argv[2].toUint16();
 		int handle = argv[3].toUint16();
 		debug(3, "K_FILEIO_READ_STRING(%d,%d)", handle, size);
@@ -804,7 +804,7 @@
 	case K_FILEIO_WRITE_STRING : {
 		int handle = argv[1].toUint16();
 		int size = argv[3].toUint16();
-		char *buf = kernel_dereference_char_pointer(s, argv[2], size);
+		char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[2], size);
 		debug(3, "K_FILEIO_WRITE_STRING(%d,%d)", handle, size);
 
 		// FIXME: What is the difference between K_FILEIO_WRITE_STRING and
@@ -825,7 +825,7 @@
 		break;
 	}
 	case K_FILEIO_FIND_FIRST : {
-		char *mask = kernel_dereference_char_pointer(s, argv[1], 0);
+		char *mask = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 		reg_t buf = argv[2];
 		int attr = argv[3].toUint16(); // We won't use this, Win32 might, though...
 		debug(3, "K_FILEIO_FIND_FIRST(%s,0x%x)", mask, attr);
@@ -844,7 +844,7 @@
 		break;
 	}
 	case K_FILEIO_FILE_EXISTS : {
-		char *name = kernel_dereference_char_pointer(s, argv[1], 0);
+		char *name = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 		// Check for regular file
 		bool exists = Common::File::exists(name);

Modified: scummvm/trunk/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kgraphics.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -627,14 +627,14 @@
 
 reg_t kTextSize(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	int width, height;
-	char *text = argv[1].segment ? (char *) kernel_dereference_bulk_pointer(s, argv[1], 0) : NULL;
+	char *text = argv[1].segment ? (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 0) : NULL;
 	const char *sep = NULL; 
-	reg_t *dest = kernel_dereference_reg_pointer(s, argv[0], 4);
+	reg_t *dest = kernel_dereference_reg_pointer(s->segmentManager, argv[0], 4);
 	int maxwidth = (argc > 3) ? argv[3].toUint16() : 0;
 	int font_nr = argv[2].toUint16();
 
 	if ((argc > 4) && (argv[4].segment))
-		sep = (const char *)kernel_dereference_bulk_pointer(s, argv[4], 0);	
+		sep = (const char *)kernel_dereference_bulk_pointer(s->segmentManager, argv[4], 0);	
 
 	if (maxwidth < 0)
 		maxwidth = 0;
@@ -689,6 +689,7 @@
 }
 
 void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	int view = GET_SEL32V(obj, view);
 	int signal = GET_SEL32V(obj, signal);
 	int loop;
@@ -746,9 +747,10 @@
 static Common::Rect nsrect_clip(EngineState *s, int y, Common::Rect retval, int priority);
 
 static int collides_with(EngineState *s, Common::Rect area, reg_t other_obj, int use_nsrect, int view_mask, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	int other_signal = GET_SEL32V(other_obj, signal);
 	int other_priority = GET_SEL32V(other_obj, priority);
-	int y = GET_SEL32SV(other_obj, y);
+	int y = (int16)GET_SEL32V(other_obj, y);
 	Common::Rect other_area;
 
 	if (use_nsrect) {
@@ -785,6 +787,7 @@
 }
 
 reg_t kCanBeHere(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t obj = argv[0];
 	reg_t cliplist_ref = (argc > 1) ? argv[1] : NULL_REG;
 	List *cliplist = NULL;
@@ -797,10 +800,10 @@
 	uint16 edgehit;
 	uint16 illegal_bits;
 
-	abs_zone.left = GET_SEL32SV(obj, brLeft);
-	abs_zone.right = GET_SEL32SV(obj, brRight);
-	abs_zone.top = GET_SEL32SV(obj, brTop);
-	abs_zone.bottom = GET_SEL32SV(obj, brBottom);
+	abs_zone.left = (int16)GET_SEL32V(obj, brLeft);
+	abs_zone.right = (int16)GET_SEL32V(obj, brRight);
+	abs_zone.top = (int16)GET_SEL32V(obj, brTop);
+	abs_zone.bottom = (int16)GET_SEL32V(obj, brBottom);
 
 	zone = gfx_rect(abs_zone.left + port->zone.x, abs_zone.top + port->zone.y, abs_zone.width(), abs_zone.height());
 
@@ -939,6 +942,7 @@
 }
 
 reg_t kNumLoops(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t obj = argv[0];
 	int view = GET_SEL32V(obj, view);
 	int loops_nr = gfxop_lookup_view_get_loops(s->gfx_state, view);
@@ -954,12 +958,12 @@
 }
 
 reg_t kNumCels(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t obj = argv[0];
 	int loop = GET_SEL32V(obj, loop);
 	int view = GET_SEL32V(obj, view);
 	int cel = 0xffff;
 
-
 	if (gfxop_check_cel(s->gfx_state, view, &loop, &cel)) {
 		// OK, this is a hack and there's a
 		// real function to calculate cel numbers...
@@ -1073,6 +1077,7 @@
 }
 
 Common::Rect set_base(EngineState *s, reg_t object) {
+	SegManager *segManager = s->segmentManager;
 	int x, y, original_y, z, ystep, xsize, ysize;
 	int xbase, ybase, xend, yend;
 	int view, loop, cel;
@@ -1080,19 +1085,19 @@
 	int xmod = 0, ymod = 0;
 	Common::Rect retval;
 
-	x = GET_SEL32SV(object, x);
-	original_y = y = GET_SEL32SV(object, y);
+	x = (int16)GET_SEL32V(object, x);
+	original_y = y = (int16)GET_SEL32V(object, y);
 
 	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
-		z = GET_SEL32SV(object, z);
+		z = (int16)GET_SEL32V(object, z);
 	else
 		z = 0;
 
 	y -= z; // Subtract z offset
 
-	ystep = GET_SEL32SV(object, yStep);
+	ystep = (int16)GET_SEL32V(object, yStep);
 
-	view = GET_SEL32SV(object, view);
+	view = (int16)GET_SEL32V(object, view);
 	oldloop = loop = sign_extend_byte(GET_SEL32V(object, loop));
 	oldcel = cel = sign_extend_byte(GET_SEL32V(object, cel));
 
@@ -1135,6 +1140,7 @@
 }
 
 void _k_base_setter(EngineState *s, reg_t object) {
+	SegManager *segManager = s->segmentManager;
 	Common::Rect absrect = set_base(s, object);
 
 	if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.brLeft, NULL, NULL) != kSelectorVariable)
@@ -1211,28 +1217,29 @@
 }
 
 Common::Rect get_nsrect(EngineState *s, reg_t object, byte clip) {
+	SegManager *segManager = s->segmentManager;
 	int x, y, z;
 	int view, loop, cel;
 	Common::Rect retval;
 
-	x = GET_SEL32SV(object, x);
-	y = GET_SEL32SV(object, y);
+	x = (int16)GET_SEL32V(object, x);
+	y = (int16)GET_SEL32V(object, y);
 
 	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
-		z = GET_SEL32SV(object, z);
+		z = (int16)GET_SEL32V(object, z);
 	else
 		z = 0;
 
 	y -= z; // Subtract z offset
 
-	view = GET_SEL32SV(object, view);
-	loop = sign_extend_byte(GET_SEL32SV(object, loop));
-	cel = sign_extend_byte(GET_SEL32SV(object, cel));
+	view = (int16)GET_SEL32V(object, view);
+	loop = sign_extend_byte((int16)GET_SEL32V(object, loop));
+	cel = sign_extend_byte((int16)GET_SEL32V(object, cel));
 
 	retval = calculate_nsrect(s, x, y, view, loop, cel);
 
 	if (clip) {
-		int priority = GET_SEL32SV(object, priority);
+		int priority = (int16)GET_SEL32V(object, priority);
 		return nsrect_clip(s, y, retval, priority);
 	}
 
@@ -1240,6 +1247,7 @@
 }
 
 static void _k_set_now_seen(EngineState *s, reg_t object) {
+	SegManager *segManager = s->segmentManager;
 	Common::Rect absrect = get_nsrect(s, object, 0);
 
 	if (lookup_selector(s->segmentManager, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsTop, NULL, NULL) != kSelectorVariable) {
@@ -1331,6 +1339,7 @@
 static void _k_draw_control(EngineState *s, reg_t obj, int inverse);
 
 static void _k_disable_delete_for_now(EngineState *s, reg_t obj) {
+	SegManager *segManager = s->segmentManager;
 	reg_t text_pos = GET_SEL32(obj, text);
 	char *text = text_pos.isNull() ? NULL : (char *)s->segmentManager->dereference(text_pos, NULL);
 	int type = GET_SEL32V(obj, type);
@@ -1401,6 +1410,7 @@
 	}
 
 reg_t kEditControl(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t obj = argv[0];
 	reg_t event = argv[1];
 
@@ -1575,10 +1585,11 @@
 }
 
 static void _k_draw_control(EngineState *s, reg_t obj, int inverse) {
-	int x = GET_SEL32SV(obj, nsLeft);
-	int y = GET_SEL32SV(obj, nsTop);
-	int xl = GET_SEL32SV(obj, nsRight) - x;
-	int yl = GET_SEL32SV(obj, nsBottom) - y;
+	SegManager *segManager = s->segmentManager;
+	int x = (int16)GET_SEL32V(obj, nsLeft);
+	int y = (int16)GET_SEL32V(obj, nsTop);
+	int xl = (int16)GET_SEL32V(obj, nsRight) - x;
+	int yl = (int16)GET_SEL32V(obj, nsBottom) - y;
 	rect_t area = gfx_rect(x, y, xl, yl);
 
 	int font_nr = GET_SEL32V(obj, font);
@@ -1708,7 +1719,7 @@
 	if (!is_object(s->segmentManager, obj))
 		warning("View %d does not contain valid object reference %04x:%04x", view->_ID, PRINT_REG(obj));
 
-	reg_t* sp = view->signalp.getPointer(s);
+	reg_t* sp = view->signalp.getPointer(s->segmentManager);
 	if (!(sp && (sp->offset & _K_VIEW_SIG_FLAG_IGNORE_ACTOR))) {
 		Common::Rect abs_zone = get_nsrect(s, make_reg(view->_ID, view->_subID), 1);
 		draw_rect_to_control_map(s, abs_zone);
@@ -1716,6 +1727,7 @@
 }
 
 static void _k_view_list_do_postdraw(EngineState *s, GfxList *list) {
+	SegManager *segManager = s->segmentManager;
 	GfxDynView *widget = (GfxDynView *) list->_contents;
 
 	while (widget) {
@@ -1760,7 +1772,7 @@
 		fprintf(stderr, "obj %04x:%04x has pflags %x\n", PRINT_REG(obj), (widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)));
 #endif
 
-		reg_t* sp = widget->signalp.getPointer(s);
+		reg_t* sp = widget->signalp.getPointer(s->segmentManager);
 		if (sp) {
 			*sp = make_reg(0, widget->signal & 0xffff); /* Write back signal */
 		}
@@ -1792,6 +1804,7 @@
 // returns non-zero IFF views were dropped
 	int signal;
 	int dropped = 0;
+	SegManager *segManager = s->segmentManager;
 
 	_k_animate_ran = false;
 
@@ -1804,7 +1817,7 @@
 			return -1;
 
 		if (GFXW_IS_DYN_VIEW(widget) && (widget->_ID != GFXW_NO_ID)) {
-			signal = widget->signalp.getPointer(s)->offset;
+			signal = widget->signalp.getPointer(segManager)->offset;
 			if (signal & _K_VIEW_SIG_FLAG_DISPOSE_ME) {
 				reg_t obj = make_reg(widget->_ID, widget->_subID);
 				reg_t under_bits = NULL_REG;
@@ -1813,7 +1826,7 @@
 					error("Non-object %04x:%04x present in view list during delete time", PRINT_REG(obj));
 					obj = NULL_REG;
 				} else {
-					reg_t *ubp = widget->under_bitsp.getPointer(s);
+					reg_t *ubp = widget->under_bitsp.getPointer(segManager);
 					if (ubp) { // Is there a bg picture left to clean?
 						reg_t mem_handle = *ubp;
 
@@ -1827,7 +1840,7 @@
 						}
 					}
 				}
-				if (is_object(s->segmentManager, obj)) {
+				if (is_object(segManager, obj)) {
 					if (invoke_selector(INV_SEL(obj, delete_, kContinueOnInvalidSelector), 0))
 						warning("Object at %04x:%04x requested deletion, but does not have a delete funcselector", PRINT_REG(obj));
 					if (_k_animate_ran) {
@@ -1835,7 +1848,7 @@
 						return dropped;
 					}
 
-					reg_t *ubp = widget->under_bitsp.getPointer(s);
+					reg_t *ubp = widget->under_bitsp.getPointer(segManager);
 					if (ubp)
 						under_bits = *ubp;
 
@@ -1880,8 +1893,9 @@
 };
 
 static GfxDynView *_k_make_dynview_obj(EngineState *s, reg_t obj, int options, int nr, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	short oldloop, oldcel;
-	int cel, loop, view_nr = GET_SEL32SV(obj, view);
+	int cel, loop, view_nr = (int16)GET_SEL32V(obj, view);
 	int palette;
 	int signal;
 	reg_t under_bits;
@@ -1893,12 +1907,12 @@
 
 	obj = obj;
 
-	pos.x = GET_SEL32SV(obj, x);
-	pos.y = GET_SEL32SV(obj, y);
+	pos.x = (int16)GET_SEL32V(obj, x);
+	pos.y = (int16)GET_SEL32V(obj, y);
 
 	pos.y++; // magic: Sierra appears to do something like this
 
-	z = GET_SEL32SV(obj, z);
+	z = (int16)GET_SEL32V(obj, z);
 
 	// !-- nsRect used to be checked here!
 	loop = oldloop = sign_extend_byte(GET_SEL32V(obj, loop));
@@ -1932,7 +1946,7 @@
 		under_bits = NULL_REG;
 		debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no underBits\n", PRINT_REG(obj));
 	} else
-		under_bits = *under_bitsp.getPointer(s);
+		under_bits = *under_bitsp.getPointer(s->segmentManager);
 
 	ObjVarRef signalp;
 	if (lookup_selector(s->segmentManager, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.signal, &(signalp), NULL) != kSelectorVariable) {
@@ -1940,7 +1954,7 @@
 		signal = 0;
 		debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no signal selector\n", PRINT_REG(obj));
 	} else {
-		signal = signalp.getPointer(s)->offset;
+		signal = signalp.getPointer(s->segmentManager)->offset;
 		debugC(2, kDebugLevelGraphics, "    with signal = %04x\n", signal);
 	}
 
@@ -1963,6 +1977,7 @@
 ** number of list entries in *list_nr. Calls doit for each entry if cycle is set.
 ** argc, argv, funct_nr should be the same as in the calling kernel function.
 */
+	SegManager *segManager = s->segmentManager;
 	Node *node;
 	int sequence_nr = 0;
 	GfxDynView *widget;
@@ -2015,7 +2030,7 @@
 	widget = (GfxDynView *)(*widget_list)->_contents;
 
 	while (widget) { // Read back widget values
-		reg_t *sp = widget->signalp.getPointer(s);
+		reg_t *sp = widget->signalp.getPointer(s->segmentManager);
 		if (sp)
 			widget->signal = sp->offset;
 
@@ -2024,6 +2039,7 @@
 }
 
 static void _k_prepare_view_list(EngineState *s, GfxList *list, int options) {
+	SegManager *segManager = s->segmentManager;
 	GfxDynView *view = (GfxDynView *) list->_contents;
 	while (view) {
 		reg_t obj = make_reg(view->_ID, view->_subID);
@@ -2036,7 +2052,7 @@
 		_priority = _find_view_priority(s, _priority - 1);
 
 		if (options & _K_MAKE_VIEW_LIST_DRAW_TO_CONTROL_MAP) { // Picview
-			priority = GET_SEL32SV(obj, priority);
+			priority = (int16)GET_SEL32V(obj, priority);
 			if (priority < 0)
 				priority = _priority; // Always for picviews
 		} else { // Dynview
@@ -2047,7 +2063,7 @@
 				priority = _priority;
 
 			} else // DON'T calculate the priority
-				priority = GET_SEL32SV(obj, priority);
+				priority = (int16)GET_SEL32V(obj, priority);
 		}
 
 		view->_color.priority = priority;
@@ -2243,7 +2259,7 @@
 			widget = gfxw_picviewize_dynview(widget);
 
 		if (GFXW_IS_DYN_VIEW(widget) && widget->_ID) {
-			uint16 signal = (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) ? widget->signalp.getPointer(s)->offset : 0;
+			uint16 signal = (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) ? widget->signalp.getPointer(s->segmentManager)->offset : 0;
 
 			if (signal & _K_VIEW_SIG_FLAG_HIDDEN)
 				gfxw_hide_widget(widget);
@@ -2263,7 +2279,7 @@
 					else
 						gfxw_show_widget(widget);
 
-					*widget->signalp.getPointer(s) = make_reg(0, signal); // Write the changes back
+					*widget->signalp.getPointer(s->segmentManager) = make_reg(0, signal); // Write the changes back
 				};
 
 			} // ...if we're drawing disposeables and this one is disposeable, or if we're drawing non-
@@ -2537,7 +2553,7 @@
 	lWhite.alpha = 0;
 	lWhite.priority = -1;
 	lWhite.control = -1;
-	const char *title = argv[4 + argextra].segment ? kernel_dereference_char_pointer(s, argv[4 + argextra], 0) : NULL;
+	const char *title = argv[4 + argextra].segment ? kernel_dereference_char_pointer(s->segmentManager, argv[4 + argextra], 0) : NULL;
 
 	window = sciw_new_window(s, gfx_rect(x, y, xl, yl), s->titlebar_port->_font, fgcolor, bgcolor,
 							s->titlebar_port->_font, lWhite, black, title ? s->strSplit(title, NULL).c_str() : NULL, flags);
@@ -3164,7 +3180,7 @@
 
 	if (textp.segment) {
 		argpt = 1;
-		text = (char *)kernel_dereference_bulk_pointer(s, textp, 0);
+		text = (char *)kernel_dereference_bulk_pointer(s->segmentManager, textp, 0);
 	} else {
 		argpt = 2;
 		text = kernel_lookup_text(s, textp, index);
@@ -3332,7 +3348,7 @@
 }
 
 reg_t kShowMovie(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	const char *filename = kernel_dereference_char_pointer(s, argv[0], 0);
+	const char *filename = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 	int delay = argv[1].toUint16(); // Time between frames in ticks
 	int frameNr = 0;
 	SeqDecoder seq;

Modified: scummvm/trunk/engines/sci/engine/klists.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/klists.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/klists.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -425,11 +425,12 @@
 }
 
 reg_t kSort(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t source = argv[0];
 	reg_t dest = argv[1];
 	reg_t order_func = argv[2];
 
-	int input_size = GET_SEL32SV(source, size);
+	int input_size = (int16)GET_SEL32V(source, size);
 	int i;
 
 	sort_temp_t *temp_array = (sort_temp_t *)malloc(sizeof(sort_temp_t) * input_size);

Modified: scummvm/trunk/engines/sci/engine/kmenu.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmenu.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kmenu.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -34,8 +34,8 @@
 namespace Sci {
 
 reg_t kAddMenu(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *name = kernel_dereference_char_pointer(s, argv[0], 0);
-	char *contents = kernel_dereference_char_pointer(s, argv[1], 0);
+	char *name = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
+	char *contents = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 	s->_menubar->addMenu(s->gfx_state, name,
 	                 contents, s->titlebar_port->_font, argv[1]);
@@ -78,7 +78,7 @@
 	s->status_bar_background = bgcolor;
 
 	if (text.segment) {
-		const char *tmp = strdup(kernel_dereference_char_pointer(s, text, 0));
+		const char *tmp = strdup(kernel_dereference_char_pointer(s->segmentManager, text, 0));
 		s->_statusBarText = tmp ? tmp : "";
 	}
 
@@ -124,6 +124,7 @@
 
 
 reg_t kMenuSelect(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t event = argv[0];
 	/*int pause_sound = (argc > 1) ? argv[1].toUint16() : 1;*/ /* FIXME: Do this eventually */
 	bool claimed = false;

Modified: scummvm/trunk/engines/sci/engine/kmisc.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kmisc.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -195,8 +195,8 @@
 		break;
 	case K_MEMORY_MEMCPY : {
 		int size = argv[3].toUint16();
-		byte *dest = kernel_dereference_bulk_pointer(s, argv[1], size);
-		byte *src = kernel_dereference_bulk_pointer(s, argv[2], size);
+		byte *dest = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], size);
+		byte *src = kernel_dereference_bulk_pointer(s->segmentManager, argv[2], size);
 
 		if (dest && src)
 			memcpy(dest, src, size);
@@ -212,7 +212,7 @@
 		break;
 	}
 	case K_MEMORY_PEEK : {
-		byte *ref = kernel_dereference_bulk_pointer(s, argv[1], 2);
+		byte *ref = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 2);
 
 		if (!ref) {
 			// This occurs in KQ5CD when interacting with certain objects
@@ -226,7 +226,7 @@
 		break;
 	}
 	case K_MEMORY_POKE : {
-		byte *ref = kernel_dereference_bulk_pointer(s, argv[1], 2);
+		byte *ref = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 2);
 
 		if (!ref) {
 			warning("Attempt to poke invalid memory at %04x:%04x", PRINT_REG(argv[1]));

Modified: scummvm/trunk/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kmovement.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kmovement.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -68,6 +68,7 @@
 used in an iterative stepping algorithm
 */
 reg_t kSetJump(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	// Input data
 	reg_t object = argv[0];
 	int dx = argv[1].toSint16();
@@ -164,10 +165,10 @@
 #define _K_BRESEN_AXIS_X 0
 #define _K_BRESEN_AXIS_Y 1
 
-static void initialize_bresen(EngineState *s, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) {
+static void initialize_bresen(SegManager *segManager, int argc, reg_t *argv, reg_t mover, int step_factor, int deltax, int deltay) {
 	reg_t client = GET_SEL32(mover, client);
-	int stepx = GET_SEL32SV(client, xStep) * step_factor;
-	int stepy = GET_SEL32SV(client, yStep) * step_factor;
+	int stepx = (int16)GET_SEL32V(client, xStep) * step_factor;
+	int stepy = (int16)GET_SEL32V(client, yStep) * step_factor;
 	int numsteps_x = stepx ? (abs(deltax) + stepx - 1) / stepx : 0;
 	int numsteps_y = stepy ? (abs(deltay) + stepy - 1) / stepy : 0;
 	int bdi, i1;
@@ -218,14 +219,15 @@
 }
 
 reg_t kInitBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t mover = argv[0];
 	reg_t client = GET_SEL32(mover, client);
 
-	int deltax = GET_SEL32SV(mover, x) - GET_SEL32SV(client, x);
-	int deltay = GET_SEL32SV(mover, y) - GET_SEL32SV(client, y);
+	int deltax = (int16)GET_SEL32V(mover, x) - (int16)GET_SEL32V(client, x);
+	int deltay = (int16)GET_SEL32V(mover, y) - (int16)GET_SEL32V(client, y);
 	int step_factor = (argc < 1) ? argv[1].toUint16() : 1;
 
-	initialize_bresen(s, argc, argv, mover, step_factor, deltax, deltay);
+	initialize_bresen(s->segmentManager, argc, argv, mover, step_factor, deltax, deltay);
 
 	return s->r_acc;
 }
@@ -283,11 +285,12 @@
 }
 
 reg_t kDoBresen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t mover = argv[0];
 	reg_t client = GET_SEL32(mover, client);
 
-	int x = GET_SEL32SV(client, x);
-	int y = GET_SEL32SV(client, y);
+	int x = (int16)GET_SEL32V(client, x);
+	int y = (int16)GET_SEL32V(client, y);
 	int oldx, oldy, destx, desty, dx, dy, bdi, bi1, bi2, movcnt, bdelta, axis;
 	uint16 signal = GET_SEL32V(client, signal);
 	int completed = 0;
@@ -302,16 +305,16 @@
 	PUT_SEL32(client, signal, make_reg(0, signal)); // This is a NOP for SCI0
 	oldx = x;
 	oldy = y;
-	destx = GET_SEL32SV(mover, x);
-	desty = GET_SEL32SV(mover, y);
-	dx = GET_SEL32SV(mover, dx);
-	dy = GET_SEL32SV(mover, dy);
-	bdi = GET_SEL32SV(mover, b_di);
-	bi1 = GET_SEL32SV(mover, b_i1);
-	bi2 = GET_SEL32SV(mover, b_i2);
+	destx = (int16)GET_SEL32V(mover, x);
+	desty = (int16)GET_SEL32V(mover, y);
+	dx = (int16)GET_SEL32V(mover, dx);
+	dy = (int16)GET_SEL32V(mover, dy);
+	bdi = (int16)GET_SEL32V(mover, b_di);
+	bi1 = (int16)GET_SEL32V(mover, b_i1);
+	bi2 = (int16)GET_SEL32V(mover, b_i2);
 	movcnt = GET_SEL32V(mover, b_movCnt);
-	bdelta = GET_SEL32SV(mover, b_incr);
-	axis = GET_SEL32SV(mover, b_xAxis);
+	bdelta = (int16)GET_SEL32V(mover, b_incr);
+	axis = (int16)GET_SEL32V(mover, b_xAxis);
 
 	//printf("movecnt %d, move speed %d\n", movcnt, max_movcnt);
 
@@ -392,6 +395,7 @@
 extern int get_angle(int xrel, int yrel);
 
 reg_t kDoAvoider(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t avoider = argv[0];
 	reg_t client, looper, mover;
 	int angle;

Modified: scummvm/trunk/engines/sci/engine/kpathing.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kpathing.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kpathing.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -284,7 +284,7 @@
 /**
  * Checks whether two polygons are equal
  */
-static bool polygons_equal(EngineState *s, reg_t p1, reg_t p2) {
+static bool polygons_equal(SegManager *segManager, reg_t p1, reg_t p2) {
 	// Check for same type
 	if (GET_SEL32(p1, type).toUint16() != GET_SEL32(p2, type).toUint16())
 		return false;
@@ -295,8 +295,8 @@
 	if (size != GET_SEL32(p2, size).toUint16())
 		return false;
 
-	const byte *p1_points = kernel_dereference_bulk_pointer(s, GET_SEL32(p1, points), size * POLY_POINT_SIZE);
-	const byte *p2_points = kernel_dereference_bulk_pointer(s, GET_SEL32(p2, points), size * POLY_POINT_SIZE);
+	const byte *p1_points = kernel_dereference_bulk_pointer(segManager, GET_SEL32(p1, points), size * POLY_POINT_SIZE);
+	const byte *p2_points = kernel_dereference_bulk_pointer(segManager, GET_SEL32(p2, points), size * POLY_POINT_SIZE);
 	bool p1_is_reg_t = polygon_is_reg_t(p1_points, size);
 	bool p2_is_reg_t = polygon_is_reg_t(p2_points, size);
 
@@ -359,7 +359,7 @@
 	int size = GET_SEL32(polygon, size).toUint16();
 	int type = GET_SEL32(polygon, type).toUint16();
 	Common::Point first, prev;
-	const byte *list = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE);
+	const byte *list = kernel_dereference_bulk_pointer(s->segmentManager, points, size * POLY_POINT_SIZE);
 	int is_reg_t = polygon_is_reg_t(list, size);
 	int i;
 
@@ -401,12 +401,12 @@
 
 #endif	// DEBUG_AVOIDPATH
 
-static void print_polygon(EngineState *s, reg_t polygon) {
+static void print_polygon(SegManager *segManager, reg_t polygon) {
 	reg_t points = GET_SEL32(polygon, points);
 	int size = GET_SEL32(polygon, size).toUint16();
 	int type = GET_SEL32(polygon, type).toUint16();
 	int i;
-	const byte *point_array = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE);
+	const byte *point_array = kernel_dereference_bulk_pointer(segManager, points, size * POLY_POINT_SIZE);
 	int is_reg_t = polygon_is_reg_t(point_array, size);
 	Common::Point point;
 
@@ -443,7 +443,7 @@
 	node = lookup_node(s, list->first);
 
 	while (node) {
-		print_polygon(s, node->value);
+		print_polygon(s->segmentManager, node->value);
 		node = lookup_node(s, node->succ);
 	}
 }
@@ -1226,10 +1226,11 @@
 	// Parameters: (EngineState *) s: The game state
 	//             (reg_t) polygon: The SCI polygon to convert
 	// Returns   : (Polygon *) The converted polygon
+	SegManager *segManager = s->segmentManager;
 	int i;
 	reg_t points = GET_SEL32(polygon, points);
 	int size = GET_SEL32(polygon, size).toUint16();
-	const byte *list = kernel_dereference_bulk_pointer(s, points, size * POLY_POINT_SIZE);
+	const byte *list = kernel_dereference_bulk_pointer(s->segmentManager, points, size * POLY_POINT_SIZE);
 	Polygon *poly = new Polygon(GET_SEL32(polygon, type).toUint16());
 	int is_reg_t = polygon_is_reg_t(list, size);
 
@@ -1362,6 +1363,7 @@
 	//             (int) opt: Optimization level (0, 1 or 2)
 	// Returns   : (PathfindingState *) On success a newly allocated pathfinding state,
 	//                            NULL otherwise
+	SegManager *segManager = s->segmentManager;
 	Polygon *polygon;
 	int err;
 	int count = 0;
@@ -1377,7 +1379,7 @@
 
 			// Workaround for game bugs that put a polygon in the list more than once
 			while (dup != node) {
-				if (polygons_equal(s, node->value, dup->value)) {
+				if (polygons_equal(s->segmentManager, node->value, dup->value)) {
 					warning("[avoidpath] Ignoring duplicate polygon");
 					break;
 				}

Modified: scummvm/trunk/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kscripts.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -31,16 +31,16 @@
 
 namespace Sci {
 
-reg_t read_selector(EngineState *s, reg_t object, Selector selector_id, const char *file, int line) {
+reg_t read_selector(SegManager *segManager, reg_t object, Selector selector_id, const char *file, int line) {
 	ObjVarRef address;
 
-	if (lookup_selector(s->segmentManager, object, selector_id, &address, NULL) != kSelectorVariable)
+	if (lookup_selector(segManager, object, selector_id, &address, NULL) != kSelectorVariable)
 		return NULL_REG;
 	else
-		return *address.getPointer(s);
+		return *address.getPointer(segManager);
 }
 
-void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t value, const char *fname, int line) {
+void write_selector(SegManager *segManager, reg_t object, Selector selector_id, reg_t value, const char *fname, int line) {
 	ObjVarRef address;
 
 	if ((selector_id < 0) || (selector_id > (int)((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize())) {
@@ -49,11 +49,11 @@
 		return;
 	}
 
-	if (lookup_selector(s->segmentManager, object, selector_id, &address, NULL) != kSelectorVariable)
+	if (lookup_selector(segManager, object, selector_id, &address, NULL) != kSelectorVariable)
 		warning("Selector '%s' of object at %04x:%04x could not be"
 		         " written to (%s L%d)", ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
 	else
-		*address.getPointer(s) = value;
+		*address.getPointer(segManager) = value;
 }
 
 int invoke_selector(EngineState *s, reg_t object, int selector_id, SelectorInvocation noinvalid, int kfunct,
@@ -221,6 +221,7 @@
 extern void _k_view_list_mark_free(EngineState *s, reg_t off);
 
 reg_t kDisposeClone(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t victim_addr = argv[0];
 	Clone *victim_obj = obj_get(s->segmentManager, victim_addr);
 	uint16 underBits;

Modified: scummvm/trunk/engines/sci/engine/ksound.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/ksound.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/ksound.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -122,6 +122,7 @@
 
 
 static void script_set_priority(EngineState *s, reg_t obj, int priority) {
+	SegManager *segManager = s->segmentManager;
 	int song_nr = GET_SEL32V(obj, number);
 	Resource *song = s->resourceManager->findResource(ResourceId(kResourceTypeSound, song_nr), 0);
 	int flags = GET_SEL32V(obj, flags);
@@ -156,6 +157,7 @@
 	int result;
 	SongHandle handle;
 	int cue;
+	SegManager *segManager = s->segmentManager;
 
 	if (s->resourceManager->sciVersion() > SCI_VERSION_01)
 		return;
@@ -205,6 +207,7 @@
 
 
 reg_t kDoSoundSci0(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
 	uint16 command = argv[0].toUint16();
 	SongHandle handle = FROBNICATE_HANDLE(obj);
@@ -384,6 +387,7 @@
 
 
 reg_t kDoSoundSci1Early(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	uint16 command = argv[0].toUint16();
 	reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
 	SongHandle handle = FROBNICATE_HANDLE(obj);
@@ -674,6 +678,7 @@
 }
 
 reg_t kDoSoundSci1Late(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	uint16 command = argv[0].toUint16();
 	reg_t obj = (argc > 1) ? argv[1] : NULL_REG;
 	SongHandle handle = FROBNICATE_HANDLE(obj);
@@ -1062,6 +1067,7 @@
 }
 
 reg_t kDoSync(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	switch (argv[0].toUint16()) {
 	case kSciAudioSyncStart: {
 		ResourceId id;

Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -44,7 +44,7 @@
 	Resource *textres;
 
 	if (address.segment)
-		return (char *)kernel_dereference_bulk_pointer(s, address, 0);
+		return (char *)kernel_dereference_bulk_pointer(s->segmentManager, address, 0);
 	else {
 		int textlen;
 		int _index = index;
@@ -79,6 +79,7 @@
 
 
 reg_t kSaid(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t heap_said_block = argv[0];
 	byte *said_block;
 	int new_lastmatch;
@@ -86,7 +87,7 @@
 	if (!heap_said_block.segment)
 		return NULL_REG;
 
-	said_block = (byte *) kernel_dereference_bulk_pointer(s, heap_said_block, 0);
+	said_block = (byte *) kernel_dereference_bulk_pointer(s->segmentManager, heap_said_block, 0);
 
 	if (!said_block) {
 		warning("Said on non-string, pointer %04x:%04x", PRINT_REG(heap_said_block));
@@ -128,6 +129,7 @@
 
 
 reg_t kSetSynonyms(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t object = argv[0];
 	List *list;
 	Node *node;
@@ -185,8 +187,9 @@
 
 
 reg_t kParse(EngineState *s, int funct_nr, int argc, reg_t *argv) {
+	SegManager *segManager = s->segmentManager;
 	reg_t stringpos = argv[0];
-	char *string = kernel_dereference_char_pointer(s, stringpos, 0);
+	char *string = kernel_dereference_char_pointer(s->segmentManager, stringpos, 0);
 	char *error;
 	ResultWordList words;
 	reg_t event = argv[1];
@@ -239,7 +242,7 @@
 		s->r_acc = make_reg(0, 0);
 		PUT_SEL32V(event, claimed, 1);
 		if (error) {
-			char *pbase_str = kernel_dereference_char_pointer(s, s->parser_base, 0);
+			char *pbase_str = kernel_dereference_char_pointer(s->segmentManager, s->parser_base, 0);
 			strcpy(pbase_str, error);
 			debugC(2, kDebugLevelParser, "Word unknown: %s\n", error);
 			/* Issue warning: */
@@ -256,7 +259,7 @@
 
 reg_t kStrEnd(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	reg_t address = argv[0];
-	char *seeker = kernel_dereference_char_pointer(s, address, 0);
+	char *seeker = kernel_dereference_char_pointer(s->segmentManager, address, 0);
 
 	while (*seeker++)
 		++address.offset;
@@ -265,16 +268,16 @@
 }
 
 reg_t kStrCat(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *s1 = kernel_dereference_char_pointer(s, argv[0], 0);
-	char *s2 = kernel_dereference_char_pointer(s, argv[1], 0);
+	char *s1 = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
+	char *s2 = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 	strcat(s1, s2);
 	return argv[0];
 }
 
 reg_t kStrCmp(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *s1 = kernel_dereference_char_pointer(s, argv[0], 0);
-	char *s2 = kernel_dereference_char_pointer(s, argv[1], 0);
+	char *s1 = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
+	char *s2 = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
 
 	if (argc > 2)
 		return make_reg(0, strncmp(s1, s2, argv[2].toUint16()));
@@ -284,8 +287,8 @@
 
 
 reg_t kStrCpy(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *dest = (char *) kernel_dereference_bulk_pointer(s, argv[0], 0);
-	char *src = (char *) kernel_dereference_bulk_pointer(s, argv[1], 0);
+	char *dest = (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[0], 0);
+	char *src = (char *) kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 0);
 
 	if (!dest) {
 		warning("Attempt to strcpy TO invalid pointer %04x:%04x",
@@ -349,7 +352,7 @@
 
 
 reg_t kStrAt(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	byte *dest = (byte *)kernel_dereference_bulk_pointer(s, argv[0], 0);
+	byte *dest = (byte *)kernel_dereference_bulk_pointer(s->segmentManager, argv[0], 0);
 	reg_t *dest2;
 
 	if (!dest) {
@@ -391,7 +394,7 @@
 
 
 reg_t kReadNumber(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *source = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *source = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 
 	while (isspace(*source))
 		source++; /* Skip whitespace */
@@ -417,7 +420,7 @@
 reg_t kFormat(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	int *arguments;
 	reg_t dest = argv[0];
-	char *target = (char *) kernel_dereference_bulk_pointer(s, dest, 0);
+	char *target = (char *) kernel_dereference_bulk_pointer(s->segmentManager, dest, 0);
 	reg_t position = argv[1]; /* source */
 	int index = argv[2].toUint16();
 	char *source;
@@ -630,7 +633,7 @@
 
 
 reg_t kStrLen(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	char *str = kernel_dereference_char_pointer(s, argv[0], 0);
+	char *str = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
 
 	if (!str) {
 		warning("StrLen: invalid pointer %04x:%04x", PRINT_REG(argv[0]));
@@ -662,7 +665,7 @@
 	** resource.
 	*/
 
-	strcpy(kernel_dereference_char_pointer(s, argv[2], 0), seeker); /* Copy the string and get return value */
+	strcpy(kernel_dereference_char_pointer(s->segmentManager, argv[2], 0), seeker); /* Copy the string and get return value */
 	return argv[2];
 }
 
@@ -737,7 +740,7 @@
 
 		if (!bufferReg.isNull()) {
 			int len = str.size() + 1;
-			buffer = kernel_dereference_char_pointer(s, bufferReg, len);
+			buffer = kernel_dereference_char_pointer(s->segmentManager, bufferReg, len);
 
 			if (buffer) {
 				strcpy(buffer, str.c_str());
@@ -745,7 +748,7 @@
 				warning("Message: buffer %04x:%04x invalid or too small to hold the following text of %i bytes: '%s'", PRINT_REG(bufferReg), len, str.c_str());
 
 				// Set buffer to empty string if possible
-				buffer = kernel_dereference_char_pointer(s, bufferReg, 1);
+				buffer = kernel_dereference_char_pointer(s->segmentManager, bufferReg, 1);
 				if (buffer)
 					*buffer = 0;
 			}
@@ -785,7 +788,7 @@
 	case K_MESSAGE_LASTMESSAGE: {
 		MessageTuple msg = s->_msgState.getLastTuple();
 		int module = s->_msgState.getLastModule();
-		byte *buffer = kernel_dereference_bulk_pointer(s, argv[1], 10);
+		byte *buffer = kernel_dereference_bulk_pointer(s->segmentManager, argv[1], 10);
 
 		if (buffer) {
 			WRITE_LE_UINT16(buffer, module);
@@ -807,18 +810,18 @@
 }
 
 reg_t kSetQuitStr(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-        char *quitStr = kernel_dereference_char_pointer(s, argv[0], 0);
+        char *quitStr = kernel_dereference_char_pointer(s->segmentManager, argv[0], 0);
         debug("Setting quit string to '%s'", quitStr);
         return s->r_acc;
 }
 
 reg_t kStrSplit(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	const char *format = kernel_dereference_char_pointer(s, argv[1], 0);
-	const char *sep = !argv[2].isNull() ? kernel_dereference_char_pointer(s, argv[2], 0) : NULL;
+	const char *format = kernel_dereference_char_pointer(s->segmentManager, argv[1], 0);
+	const char *sep = !argv[2].isNull() ? kernel_dereference_char_pointer(s->segmentManager, argv[2], 0) : NULL;
 	Common::String str = s->strSplit(format, sep);
 
 	// Make sure target buffer is large enough
-	char *buf = kernel_dereference_char_pointer(s, argv[0], str.size() + 1);
+	char *buf = kernel_dereference_char_pointer(s->segmentManager, argv[0], str.size() + 1);
 
 	if (buf) {
 		strcpy(buf, str.c_str());

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -138,6 +138,7 @@
 void SegManager::setScriptSize(Script &scr, int script_nr) {
 	Resource *script = _resourceManager->findResource(ResourceId(kResourceTypeScript, script_nr), 0);
 	Resource *heap = _resourceManager->findResource(ResourceId(kResourceTypeHeap, script_nr), 0);
+	bool oldScriptHeader = (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY);
 
 	scr.script_size = script->size;
 	scr.heap_size = 0; // Set later
@@ -145,7 +146,7 @@
 	if (!script || (_resourceManager->sciVersion() >= SCI_VERSION_1_1 && !heap)) {
 		error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
 	}
-	if (_resourceManager->sciVersion() == SCI_VERSION_0_EARLY) {	// check if we got an old script header
+	if (oldScriptHeader) {
 		scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
 		//locals_size = READ_LE_UINT16(script->data) * 2;
 	} else if (_resourceManager->sciVersion() < SCI_VERSION_1_1) {
@@ -390,7 +391,6 @@
 				for (k = 0; k < scr->_objects.size(); k++)
 					printf("- obj#%d at %04x w/ %d vars\n", k, scr->_objects[k].pos.offset, scr->_objects[k]._variables.size());
 				// SQ3 script 71 has broken relocation entries.
-				// Since this is mainstream, we can't break out as we used to do.
 				printf("Trying to continue anyway...\n");
 			}
 		}

Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/state.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -183,11 +183,11 @@
 	kLanguage lang = K_LANG_ENGLISH;
 
 	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.printLang != -1) {
-		EngineState *s = this;
+		SegManager *segManager = this->segmentManager;
 
-		lang = (kLanguage)GET_SEL32V(s->game_obj, printLang);
+		lang = (kLanguage)GET_SEL32V(this->game_obj, printLang);
 
-		if ((s->resourceManager->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
+		if ((segManager->sciVersion() == SCI_VERSION_1_1) || (lang == K_LANG_NONE)) {
 			// If language is set to none, we use the language from the game detector.
 			// SSCI reads this from resource.cfg (early games do not have a language
 			// setting in resource.cfg, but instead have the secondary language number
@@ -220,7 +220,7 @@
 			}
 
 			// Store language in printLang selector
-			PUT_SEL32V(s->game_obj, printLang, lang);
+			PUT_SEL32V(this->game_obj, printLang, lang);
 		}
 	}
 
@@ -228,13 +228,13 @@
 }
 
 Common::String EngineState::strSplit(const char *str, const char *sep) {
-	EngineState *s = this;
+	SegManager *segManager = this->segmentManager;
 
 	kLanguage lang = getLanguage();
 	kLanguage subLang = K_LANG_NONE;
 
 	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.subtitleLang != -1)
-		subLang = (kLanguage)GET_SEL32V(s->game_obj, subtitleLang);
+		subLang = (kLanguage)GET_SEL32V(this->game_obj, subtitleLang);
 
 	Common::String retval = getLanguageString(str, lang);
 

Modified: scummvm/trunk/engines/sci/engine/stringfrag.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/stringfrag.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/stringfrag.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -103,7 +103,7 @@
 }
 
 int is_valid_stringfrag(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	return internal_is_valid_stringfrag(s, buffer);
 }
@@ -138,7 +138,7 @@
 }
 
 int stringfrag_length(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	return internal_stringfrag_length(s, buffer);
 }
@@ -169,7 +169,7 @@
 }
 
 void stringfrag_to_ascii(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	internal_stringfrag_to_ascii(s, buffer);
 }
@@ -191,7 +191,7 @@
 }
 
 void ascii_to_stringfrag(EngineState *s, reg_t pos) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	internal_ascii_to_stringfrag(s, buffer);
 }
@@ -214,7 +214,7 @@
 }
 
 void stringfrag_append_char(EngineState *s, reg_t pos, unsigned char c) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	internal_stringfrag_append_char(s, buffer, c);
 }
@@ -311,7 +311,7 @@
 }
 
 void stringfrag_insert_char(EngineState *s, reg_t pos, int p, unsigned char c) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	internal_stringfrag_insert_char(s, buffer, p, c);
 }
@@ -343,7 +343,7 @@
 }
 
 void stringfrag_delete_char(EngineState *s, reg_t pos, int p) {
-	reg_t *buffer = kernel_dereference_reg_pointer(s, pos, 1);
+	reg_t *buffer = kernel_dereference_reg_pointer(s->segmentManager, pos, 1);
 
 	internal_stringfrag_delete_char(s, buffer, p);
 }
@@ -360,8 +360,8 @@
 }
 
 void stringfrag_strcpy(EngineState *s, reg_t dest, reg_t src) {
-	reg_t *destbuf = kernel_dereference_reg_pointer(s, dest, 1);
-	reg_t *srcbuf = kernel_dereference_reg_pointer(s, src, 1);
+	reg_t *destbuf = kernel_dereference_reg_pointer(s->segmentManager, dest, 1);
+	reg_t *srcbuf = kernel_dereference_reg_pointer(s->segmentManager, src, 1);
 
 	internal_stringfrag_strcpy(s, destbuf, srcbuf);
 }
@@ -388,8 +388,8 @@
 }
 
 void stringfrag_strncpy(EngineState *s, reg_t dest, reg_t src, int len) {
-	reg_t *destbuf = kernel_dereference_reg_pointer(s, dest, 1);
-	reg_t *srcbuf = kernel_dereference_reg_pointer(s, src, 1);
+	reg_t *destbuf = kernel_dereference_reg_pointer(s->segmentManager, dest, 1);
+	reg_t *srcbuf = kernel_dereference_reg_pointer(s->segmentManager, src, 1);
 
 	internal_stringfrag_strncpy(s, destbuf, srcbuf, len);
 }
@@ -416,8 +416,8 @@
 }
 
 void stringfrag_strcmp(EngineState *s, reg_t s1, reg_t s2) {
-	reg_t *s1buf = kernel_dereference_reg_pointer(s, s1, 1);
-	reg_t *s2buf = kernel_dereference_reg_pointer(s, s2, 1);
+	reg_t *s1buf = kernel_dereference_reg_pointer(s->segmentManager, s1, 1);
+	reg_t *s2buf = kernel_dereference_reg_pointer(s->segmentManager, s2, 1);
 
 	internal_stringfrag_strcmp(s, s1buf, s2buf);
 }
@@ -449,8 +449,8 @@
 }
 
 void stringfrag_strncmp(EngineState *s, reg_t s1, reg_t s2, int len) {
-	reg_t *s1buf = kernel_dereference_reg_pointer(s, s1, 1);
-	reg_t *s2buf = kernel_dereference_reg_pointer(s, s2, 1);
+	reg_t *s1buf = kernel_dereference_reg_pointer(s->segmentManager, s1, 1);
+	reg_t *s2buf = kernel_dereference_reg_pointer(s->segmentManager, s2, 1);
 
 	internal_stringfrag_strncmp(s, s1buf, s2buf, len);
 }

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -248,10 +248,10 @@
 		ExecStack &xs = s->_executionStack.back();
 		// varselector access?
 		if (xs.argc) { // write?
-			*(xs.getVarPointer(s)) = xs.variables_argp[1];
+			*(xs.getVarPointer(s->segmentManager)) = xs.variables_argp[1];
 
 		} else // No, read
-			s->r_acc = *(xs.getVarPointer(s));
+			s->r_acc = *(xs.getVarPointer(s->segmentManager));
 
 		s->_executionStack.pop_back();
 	}
@@ -338,7 +338,7 @@
 #endif
 				{ // Argument is supplied -> Selector should be set
 					if (print_send_action) {
-						reg_t oldReg = *varp.getPointer(s);
+						reg_t oldReg = *varp.getPointer(s->segmentManager);
 						reg_t newReg = argp[1];
 
 						printf("[write to selector: change %04x:%04x to %04x:%04x]\n", PRINT_REG(oldReg), PRINT_REG(newReg));
@@ -936,7 +936,7 @@
 					argc += scriptState.restAdjust;
 
 				if (((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature
-						&& !kernel_matches_signature(s,
+						&& !kernel_matches_signature(s->segmentManager,
 						((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature, argc,
 						scriptState.xs->sp + 1)) {
 					error("[VM] Invalid arguments to kernel call %x", opparams[0]);
@@ -1003,9 +1003,9 @@
 				if (old_xs->type == EXEC_STACK_TYPE_VARSELECTOR) {
 					// varselector access?
 					if (old_xs->argc) // write?
-						*(old_xs->getVarPointer(s)) = old_xs->variables_argp[1];
+						*(old_xs->getVarPointer(s->segmentManager)) = old_xs->variables_argp[1];
 					else // No, read
-						s->r_acc = *(old_xs->getVarPointer(s));
+						s->r_acc = *(old_xs->getVarPointer(s->segmentManager));
 				}
 
 				// Not reached the base, so let's do a soft return
@@ -1984,15 +1984,15 @@
 	s->_executionStack.erase(iter, s->_executionStack.end());
 }
 
-reg_t* ObjVarRef::getPointer(EngineState *s) const {
-	Object *o = obj_get(s->segmentManager, obj);
+reg_t* ObjVarRef::getPointer(SegManager *segManager) const {
+	Object *o = obj_get(segManager, obj);
 	if (!o) return 0;
 	return &(o->_variables[varindex]);
 }
 
-reg_t* ExecStack::getVarPointer(EngineState *s) const {
+reg_t* ExecStack::getVarPointer(SegManager *segManager) const {
 	assert(type == EXEC_STACK_TYPE_VARSELECTOR);
-	return addr.varp.getPointer(s);
+	return addr.varp.getPointer(segManager);
 }
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/engine/vm.h
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.h	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/engine/vm.h	2009-08-25 15:14:29 UTC (rev 43729)
@@ -212,7 +212,7 @@
 	reg_t obj;
 	int varindex;
 
-	reg_t* getPointer(EngineState *s) const;
+	reg_t* getPointer(SegManager *segManager) const;
 };
 
 
@@ -263,7 +263,7 @@
 	int origin;             // The stack frame position the call was made from, or -1 if it was the initial call
 	ExecStackType type;
 
-	reg_t* getVarPointer(EngineState *s) const;
+	reg_t* getVarPointer(SegManager *segManager) const;
 };
 
 

Modified: scummvm/trunk/engines/sci/gfx/menubar.cpp
===================================================================
--- scummvm/trunk/engines/sci/gfx/menubar.cpp	2009-08-25 12:49:16 UTC (rev 43728)
+++ scummvm/trunk/engines/sci/gfx/menubar.cpp	2009-08-25 15:14:29 UTC (rev 43729)
@@ -294,7 +294,7 @@
 	case MENU_ATTRIBUTE_SAID:
 		if (value.segment) {
 			item->_saidPos = value;
-			memcpy(item->_said, kernel_dereference_bulk_pointer(s, value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec
+			memcpy(item->_said, kernel_dereference_bulk_pointer(s->segmentManager, value, 0), MENU_SAID_SPEC_SIZE); // Copy Said spec
 			item->_flags |= MENU_ATTRIBUTE_FLAGS_SAID;
 
 		} else
@@ -304,7 +304,7 @@
 
 	case MENU_ATTRIBUTE_TEXT:
 		assert(value.segment);
-		item->_text = kernel_dereference_char_pointer(s, value, 0);
+		item->_text = kernel_dereference_char_pointer(s->segmentManager, value, 0);
 		item->_textPos = value;
 		break;
 


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