[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