diff options
author | Andrew Kurushin | 2005-04-03 17:23:02 +0000 |
---|---|---|
committer | Andrew Kurushin | 2005-04-03 17:23:02 +0000 |
commit | db61624fd2317b64030f1ca1173baa239f1e1deb (patch) | |
tree | 3b209ae7f8111b57522d29d0c01f807da06c0697 | |
parent | aa50d6d7b0fbdbdbbae646eaa5aba752fc824403 (diff) | |
download | scummvm-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
-rw-r--r-- | saga/script.h | 2 | ||||
-rw-r--r-- | saga/sthread.cpp | 6 |
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; |