GLK: ADVSYS: Script interpreter fixes

This commit is contained in:
Paul Gilbert 2019-06-14 20:11:36 -07:00
parent 23c6c13da2
commit 75fe5b5024
2 changed files with 14 additions and 8 deletions

View File

@ -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() {

View File

@ -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;
}
/**