aboutsummaryrefslogtreecommitdiff
path: root/saga
diff options
context:
space:
mode:
authorAndrew Kurushin2005-04-03 17:23:02 +0000
committerAndrew Kurushin2005-04-03 17:23:02 +0000
commitdb61624fd2317b64030f1ca1173baa239f1e1deb (patch)
tree3b209ae7f8111b57522d29d0c01f807da06c0697 /saga
parentaa50d6d7b0fbdbdbbae646eaa5aba752fc824403 (diff)
downloadscummvm-rg350-db61624fd2317b64030f1ca1173baa239f1e1deb.tar.gz
scummvm-rg350-db61624fd2317b64030f1ca1173baa239f1e1deb.tar.bz2
scummvm-rg350-db61624fd2317b64030f1ca1173baa239f1e1deb.zip
-fixed interpreter bug: on opCall now pushes additional data for compatibly
ps:doors can be opened svn-id: r17350
Diffstat (limited to 'saga')
-rw-r--r--saga/script.h2
-rw-r--r--saga/sthread.cpp6
2 files changed, 5 insertions, 3 deletions
diff --git a/saga/script.h b/saga/script.h
index 4cb99f99c0..029f38a567 100644
--- a/saga/script.h
+++ b/saga/script.h
@@ -290,7 +290,7 @@ public:
}
uint pushedSize() {
- return _stackSize - _stackTopIndex - 1;
+ return _stackSize - _stackTopIndex - 2;
}
void push(int16 value) {
diff --git a/saga/sthread.cpp b/saga/sthread.cpp
index dc759be65c..1513fa65ea 100644
--- a/saga/sthread.cpp
+++ b/saga/sthread.cpp
@@ -49,7 +49,7 @@ ScriptThread *Script::createThread(uint16 scriptModuleNumber, uint16 scriptEntry
newThread->_flags = kTFlagNone;
newThread->_stackSize = DEFAULT_THREAD_STACK_SIZE;
newThread->_stackBuf = (uint16 *)malloc(newThread->_stackSize * sizeof(*newThread->_stackBuf));
- newThread->_stackTopIndex = newThread->_stackSize - 1; // or 2 - as in original
+ newThread->_stackTopIndex = newThread->_stackSize - 2;
newThread->_instructionOffset = _modules[scriptModuleNumber].entryPoints[scriptEntryPointNumber].offset;
newThread->_commonBase = _commonBuffer;
newThread->_staticBase = _commonBuffer + _modules[scriptModuleNumber].staticOffset;
@@ -322,6 +322,8 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
// counter as a pointer here. But I don't think
// we will have to do that.
thread->push(param2);
+ // NOTE2: program counter is 32bit - so we should "emulate" it size - because kAddressStack relies on it
+ thread->push(0);
thread->_instructionOffset = iparam1;
break;
@@ -338,7 +340,6 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
(this->*scriptFunction)(thread, argumentsCount);
if (scriptFunction == &Saga::Script::sfScriptGotoScene) {
- //if (functionNumber == 16) { // sfScriptGotoScene
return true; // cause abortAllThreads called and _this_ thread destroyed
}
@@ -363,6 +364,7 @@ bool Script::runThread(ScriptThread *thread, uint instructionLimit) {
thread->_flags |= kTFlagFinished;
return true;
} else {
+ thread->pop(); //cause it 0
thread->_instructionOffset = thread->pop();
iparam1 = thread->pop();
iparam1 += iparam1;