aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2019-06-14 20:11:36 -0700
committerPaul Gilbert2019-06-14 20:11:47 -0700
commit75fe5b5024d8532b0f84fa220391b58806d23ba8 (patch)
tree6599e32e3d0308cfb363cc8b26623ace33abbdc2
parent23c6c13da25518f495972d21da67529b2a640fa9 (diff)
downloadscummvm-rg350-75fe5b5024d8532b0f84fa220391b58806d23ba8.tar.gz
scummvm-rg350-75fe5b5024d8532b0f84fa220391b58806d23ba8.tar.bz2
scummvm-rg350-75fe5b5024d8532b0f84fa220391b58806d23ba8.zip
GLK: ADVSYS: Script interpreter fixes
-rw-r--r--engines/glk/advsys/vm.cpp18
-rw-r--r--engines/glk/advsys/vm.h4
2 files changed, 14 insertions, 8 deletions
diff --git a/engines/glk/advsys/vm.cpp b/engines/glk/advsys/vm.cpp
index e21c5ac2d6..b1ba7a0ad5 100644
--- a/engines/glk/advsys/vm.cpp
+++ b/engines/glk/advsys/vm.cpp
@@ -106,6 +106,12 @@ void VM::executeOpcode() {
// Get next opcode
uint opcode = readCodeByte();
+ if (gDebugLevel > 0) {
+ Common::String s;
+ for (int idx = (int)_stack.size() - 1; idx >= 0; --idx) s += Common::String::format(" %d", _stack[idx]);
+ debug("%.4x - %.2x - %d%s", _pc - 1, opcode, _stack.size(), s.c_str());
+ }
+
if (opcode >= OP_BRT && opcode <= OP_VOWEL) {
(this->*_METHODS[(int)opcode - 1])();
} else if (opcode >= OP_XVAR && opcode < OP_XSET) {
@@ -256,7 +262,7 @@ void VM::opEXIT() {
}
void VM::opRETURN() {
- if (_stack.empty()) {
+ if (_fp == 0) {
_status = CHAIN;
} else {
int val = _stack.top();
@@ -314,18 +320,16 @@ void VM::opRESTORE() {
void VM::opARG() {
int argNum = readCodeByte();
- int varsSize = _stack[_fp - 3];
- if (argNum >= varsSize)
+ if (argNum >= _fp[FP_ARGS_SIZE])
error("Invalid argument number");
- _stack.top() = _stack[_fp - 4 - argNum];
+ _stack.top() = _fp[argNum + FP_ARGS];
}
void VM::opASET() {
int argNum = readCodeByte();
- int varsSize = _stack[_fp - 3];
- if (argNum >= varsSize)
+ if (argNum >= _fp[FP_ARGS_SIZE])
error("Invalid argument number");
- _stack[_fp - 4 - argNum] = _stack.top();
+ _fp[argNum + FP_ARGS] = _stack.top();
}
void VM::opTMP() {
diff --git a/engines/glk/advsys/vm.h b/engines/glk/advsys/vm.h
index 76f05de691..58689170e1 100644
--- a/engines/glk/advsys/vm.h
+++ b/engines/glk/advsys/vm.h
@@ -253,7 +253,9 @@ private:
* Gets the next code word and increases the PC counter to after it
*/
int readCodeWord() {
- return getCodeWord(_pc += 2);
+ int v = getCodeWord(_pc);
+ _pc += 2;
+ return v;
}
/**