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

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Thu Dec 24 03:43:08 CET 2009


Revision: 46521
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46521&view=rev
Author:   mthreepwood
Date:     2009-12-24 02:43:07 +0000 (Thu, 24 Dec 2009)

Log Message:
-----------
SCI32:
	- Fix dup for kArray/kString
	- Implement kFileIO::rename (SCI1.1)
	- Implement part of the SCI32 additions to kFileIO
	- Implement the GetSaveDir part of kSave (SCI2.1)
	- Torin (SCI2.1!) now shows signs of life -- it will create the torin.prf file with correct data!

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kernel.cpp
    scummvm/trunk/engines/sci/engine/kernel.h
    scummvm/trunk/engines/sci/engine/kernel32.cpp
    scummvm/trunk/engines/sci/engine/kfile.cpp
    scummvm/trunk/engines/sci/engine/segment.h
    scummvm/trunk/engines/sci/engine/vm.cpp
    scummvm/trunk/engines/sci/sci.cpp

Modified: scummvm/trunk/engines/sci/engine/kernel.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.cpp	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/kernel.cpp	2009-12-24 02:43:07 UTC (rev 46521)
@@ -338,10 +338,13 @@
 	DEFUN("Portrait", kPortrait, ".*"),
 	
 #ifdef ENABLE_SCI32
-	// SCI32 Kernel Functions
+	// SCI2 Kernel Functions
 	DEFUN("IsHiRes", kIsHiRes, ""),
 	DEFUN("Array", kArray, ".*"),
 	DEFUN("String", kString, ".*"),
+	
+	// SCI2.1 Kernel Functions
+	DEFUN("Save", kSave, ".*"),
 #endif
 
 	// its a stub, but its needed for Pharkas to work

Modified: scummvm/trunk/engines/sci/engine/kernel.h
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel.h	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/kernel.h	2009-12-24 02:43:07 UTC (rev 46521)
@@ -395,6 +395,9 @@
 reg_t kIsHiRes(EngineState *s, int argc, reg_t *argv);
 reg_t kArray(EngineState *s, int argc, reg_t *argv);
 reg_t kString(EngineState *s, int argc, reg_t *argv);
+
+// SCI2.1 Kernel Functions
+reg_t kSave(EngineState *s, int argc, reg_t *argv);
 #endif
 
 } // End of namespace Sci

Modified: scummvm/trunk/engines/sci/engine/kernel32.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kernel32.cpp	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/kernel32.cpp	2009-12-24 02:43:07 UTC (rev 46521)
@@ -433,7 +433,13 @@
 		SciArray<reg_t> *array = s->_segMan->lookupArray(argv[1]);
 		reg_t arrayHandle;
 		SciArray<reg_t> *dupArray = s->_segMan->allocateArray(&arrayHandle);
-		*dupArray = SciArray<reg_t>(*array);
+
+		dupArray->setType(array->getType());
+		dupArray->setSize(array->getSize());
+
+		for (uint32 i = 0; i < array->getSize(); i++)
+			dupArray->setValue(i, array->getValue(i));
+
 		return arrayHandle;
 		}
 	case 9: // Getdata
@@ -453,7 +459,6 @@
 	case 0: { // New
 		reg_t stringHandle;
 		SciString *string = s->_segMan->allocateString(&stringHandle);
-		string->setType(3);
 		string->setSize(argv[1].toUint16());
 
 		// Make sure the first character is a null character
@@ -512,7 +517,7 @@
 			break;
 
 		// A count of -1 means fill the rest of the array
-		uint32 count = argv[5].toSint16() == -1 ? string2.size() - index2 : argv[5].toUint16();
+		uint32 count = argv[5].toSint16() == -1 ? string2.size() - index2 + 1 : argv[5].toUint16();
 
 		if (string1->getSize() < index1 + count)
 			string1->setSize(index1 + count);
@@ -534,10 +539,16 @@
 			return make_reg(0, strcmp(string1.c_str(), string2.c_str()));
 		}
 	case 8: { // Dup
-		SciString *string = s->_segMan->lookupString(argv[1]);
+		Common::String string = s->_segMan->getString(argv[1]);
 		reg_t stringHandle;
 		SciString *dupString = s->_segMan->allocateString(&stringHandle);
-		*dupString = SciString(*string);
+		dupString->setSize(string.size() + 1);
+		
+		for (uint32 i = 0; i < string.size(); i++)
+			dupString->setValue(i, string.c_str()[i]);
+			
+		dupString->setValue(dupString->getSize() - 1, 0);
+
 		return stringHandle;
 		}
 	case 9: // Getdata
@@ -566,6 +577,18 @@
 	return NULL_REG;
 }
 
+reg_t kSave(EngineState *s, int argc, reg_t *argv) {
+	switch (argv[0].toUint16()) {
+	case 2: // GetSaveDir
+		// Yay! Reusing the old kernel function!
+		return kGetSaveDir(s, argc - 1, argv + 1);
+	default:
+		warning("Unknown/unhandled kSave subop %d", argv[0].toUint16());
+	}
+
+	return NULL_REG;
+}
+
 } // End of namespace Sci
 
 #endif	// ENABLE_SCI32

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2009-12-24 02:43:07 UTC (rev 46521)
@@ -615,12 +615,19 @@
 	K_FILEIO_SEEK			= 7,
 	K_FILEIO_FIND_FIRST		= 8,
 	K_FILEIO_FIND_NEXT		= 9,
-	K_FILEIO_FILE_EXISTS	= 10
+	K_FILEIO_FILE_EXISTS	= 10,
+	// SCI1.1
+	K_FILEIO_RENAME         = 11,
+	// SCI32
+	// 12?
+	K_FILEIO_READ_BYTE      = 13,
+	K_FILEIO_WRITE_BYTE     = 14,
+	K_FILEIO_READ_WORD      = 15,
+	K_FILEIO_WRITE_WORD     = 16
 };
 
 
 reg_t DirSeeker::firstFile(const Common::String &mask, reg_t buffer) {
-
 	// Verify that we are given a valid buffer
 	if (!buffer.segment) {
 		error("DirSeeker::firstFile('%s') invoked with invalid buffer", mask.c_str());
@@ -842,6 +849,30 @@
 		debug(3, "K_FILEIO_FILE_EXISTS(%s) -> %d", name.c_str(), exists);
 		return make_reg(0, exists);
 	}
+	case K_FILEIO_RENAME: {
+		Common::String oldName = s->_segMan->getString(argv[1]);
+		Common::String newName = s->_segMan->getString(argv[2]);
+
+		// SCI1.1 returns 0 on success and a DOS error code on fail. SCI32 returns -1 on fail.
+		// We just return -1 for all versions.
+		if (g_engine->getSaveFileManager()->renameSavefile(oldName, newName))
+			return NULL_REG;
+		else 
+			return SIGNAL_REG;
+	}
+#ifdef ENABLE_SCI32
+	case K_FILEIO_READ_BYTE:
+		// Read the byte into the low byte of the accumulator
+		return make_reg(0, s->r_acc.toUint16() & 0xff00 | getFileFromHandle(s, argv[1].toUint16())->_in->readByte());
+	case K_FILEIO_WRITE_BYTE:
+		getFileFromHandle(s, argv[1].toUint16())->_out->writeByte(argv[2].toUint16() & 0xff);
+		break;
+	case K_FILEIO_READ_WORD:
+		return make_reg(0, getFileFromHandle(s, argv[1].toUint16())->_in->readUint16LE());
+	case K_FILEIO_WRITE_WORD:
+		getFileFromHandle(s, argv[1].toUint16())->_out->writeUint16LE(argv[2].toUint16());
+		break;
+#endif
 	default :
 		error("Unknown FileIO() sub-command: %d", func_nr);
 	}

Modified: scummvm/trunk/engines/sci/engine/segment.h
===================================================================
--- scummvm/trunk/engines/sci/engine/segment.h	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/segment.h	2009-12-24 02:43:07 UTC (rev 46521)
@@ -747,7 +747,7 @@
 
 class SciString : public SciArray<char> {
 public:
-	SciString() : SciArray<char>() {}
+	SciString() : SciArray<char>() { setType(3); }
 	
 	Common::String toString();
 	void fromString(Common::String string);

Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/engine/vm.cpp	2009-12-24 02:43:07 UTC (rev 46521)
@@ -343,7 +343,14 @@
 		ObjVarRef varp;
 		switch (lookup_selector(s->_segMan, send_obj, selector, &varp, &funcp)) {
 		case kSelectorNone:
-			error("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj));
+#ifdef ENABLE_SCI32
+			// HACK: Temporarily switch to a warning in SCI32 games until we can figure out why Torin has
+			// an invalid selector.
+			if (getSciVersion() >= SCI_VERSION_2)
+				warning("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj));
+			else
+#endif
+				error("Send to invalid selector 0x%x of object at %04x:%04x", 0xffff & selector, PRINT_REG(send_obj));
 
 			break;
 

Modified: scummvm/trunk/engines/sci/sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sci.cpp	2009-12-23 21:35:32 UTC (rev 46520)
+++ scummvm/trunk/engines/sci/sci.cpp	2009-12-24 02:43:07 UTC (rev 46521)
@@ -177,7 +177,7 @@
 
 	// Set the savegame dir (actually, we set it to a fake value,
 	// since we cannot let the game control where saves are stored)
-	strcpy(_gamestate->sys_strings->_strings[SYS_STRING_SAVEDIR]._value, "/");
+	strcpy(_gamestate->sys_strings->_strings[SYS_STRING_SAVEDIR]._value, "");
 
 	_gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _audio, _gamestate->detectDoSoundType());
 


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