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

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Tue Sep 22 02:51:56 CEST 2009


Revision: 44245
          http://scummvm.svn.sourceforge.net/scummvm/?rev=44245&view=rev
Author:   fingolfin
Date:     2009-09-22 00:51:55 +0000 (Tue, 22 Sep 2009)

Log Message:
-----------
SCI: Add some FIXMEs, and print warning if accessing a raw segment as non-raw or vice versa

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kstring.cpp
    scummvm/trunk/engines/sci/engine/seg_manager.cpp
    scummvm/trunk/engines/sci/engine/segment.cpp
    scummvm/trunk/engines/sci/vocabulary.cpp

Modified: scummvm/trunk/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kstring.cpp	2009-09-22 00:36:24 UTC (rev 44244)
+++ scummvm/trunk/engines/sci/engine/kstring.cpp	2009-09-22 00:51:55 UTC (rev 44245)
@@ -789,6 +789,8 @@
 		byte *buffer = s->segMan->derefBulkPtr(argv[1], 10);
 
 		if (buffer) {
+			// FIXME: Is this correct? I.e., do we really write into a "raw" segment
+			// here? Or maybe we want to write 4 reg_t instead?
 			WRITE_LE_UINT16(buffer, module);
 			WRITE_LE_UINT16(buffer + 2, msg.noun);
 			WRITE_LE_UINT16(buffer + 4, msg.verb);

Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-22 00:36:24 UTC (rev 44244)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp	2009-09-22 00:51:55 UTC (rev 44245)
@@ -876,12 +876,19 @@
 	return mobj->dereference(pointer);
 }
 
-static void *_kernel_dereference_pointer(SegManager *segMan, reg_t pointer, int entries) {
+static void *_kernel_dereference_pointer(SegManager *segMan, reg_t pointer, int entries, bool wantRaw) {
 	SegmentRef ret = segMan->dereference(pointer);
 
 	if (!ret.raw)
 		return NULL;
 
+	if (ret.isRaw != wantRaw) {
+		warning("Dereferencing pointer %04x:%04x (type %d) which is %s, but expected %s", PRINT_REG(pointer),
+			segMan->_heap[pointer.segment]->getType(),
+			ret.isRaw ? "raw" : "not raw",
+			wantRaw ? "raw" : "not raw");
+	}
+
 	if (entries > ret.maxSize) {
 		warning("Trying to dereference pointer %04x:%04x beyond end of segment", PRINT_REG(pointer));
 		return NULL;
@@ -891,7 +898,7 @@
 }
 
 byte *SegManager::derefBulkPtr(reg_t pointer, int entries) {
-	return (byte *)_kernel_dereference_pointer(this, pointer, entries);
+	return (byte *)_kernel_dereference_pointer(this, pointer, entries, true);
 }
 
 reg_t *SegManager::derefRegPtr(reg_t pointer, int entries) {
@@ -901,11 +908,11 @@
 		return NULL;
 	}
 
-	return (reg_t *)_kernel_dereference_pointer(this, pointer, entries);
+	return (reg_t *)_kernel_dereference_pointer(this, pointer, entries, false);
 }
 
 char *SegManager::derefString(reg_t pointer, int entries) {
-	return (char *)_kernel_dereference_pointer(this, pointer, entries);
+	return (char *)_kernel_dereference_pointer(this, pointer, entries, true);
 }
 
 

Modified: scummvm/trunk/engines/sci/engine/segment.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-22 00:36:24 UTC (rev 44244)
+++ scummvm/trunk/engines/sci/engine/segment.cpp	2009-09-22 00:51:55 UTC (rev 44245)
@@ -233,6 +233,10 @@
 
 	SegmentRef ret;
 	ret.isRaw = true;
+	// FIXME: here we subtract pointer.offset from maxSize, elsewhere we don't -- huh?
+	// It's hard to say which is right, because it depends on how the various
+	// SegManager::deref*() methods are used. It's quite possible that this variant
+	// is "correct" and all the others aren't... we'll have to find out.
 	ret.maxSize = _bufSize - pointer.offset;
 	ret.raw = _buf + pointer.offset;
 	return ret;

Modified: scummvm/trunk/engines/sci/vocabulary.cpp
===================================================================
--- scummvm/trunk/engines/sci/vocabulary.cpp	2009-09-22 00:36:24 UTC (rev 44244)
+++ scummvm/trunk/engines/sci/vocabulary.cpp	2009-09-22 00:51:55 UTC (rev 44245)
@@ -345,7 +345,7 @@
 }
 
 void Vocabulary::decipherSaidBlock(byte *addr) {
-	int nextitem;
+	byte nextitem;
 
 	do {
 		nextitem = *addr++;


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