GOB: Gave tons of opcode explicit names. As a result, found potential bugs in parse_v2.cpp (related to OP_LOAD_VAR_UINT8 and OP_LOAD_VAR_UINT16, see FIXME comments in parse.h)
svn-id: r39889
This commit is contained in:
parent
37bfe22a54
commit
3f22e4b401
4 changed files with 379 additions and 314 deletions
|
@ -82,10 +82,10 @@ void Parse::skipExpr(char stopToken) {
|
||||||
int16 dim;
|
int16 dim;
|
||||||
|
|
||||||
num = 0;
|
num = 0;
|
||||||
while (1) {
|
while (true) {
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
|
|
||||||
if ((operation >= 14) && (operation <= 29)) {
|
if ((operation >= 14) && (operation <= OP_FUNC)) {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 14:
|
case 14:
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
|
@ -95,26 +95,26 @@ void Parse::skipExpr(char stopToken) {
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
case 18:
|
case 18:
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
case 23:
|
case 23:
|
||||||
case 24:
|
case 24:
|
||||||
_vm->_global->_inter_execPtr += 2;
|
_vm->_global->_inter_execPtr += 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case OP_LOAD_IMM_INT32:
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case OP_LOAD_IMM_INT8:
|
||||||
_vm->_global->_inter_execPtr += 1;
|
_vm->_global->_inter_execPtr += 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case OP_LOAD_IMM_STR:
|
||||||
_vm->_global->_inter_execPtr +=
|
_vm->_global->_inter_execPtr +=
|
||||||
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
_vm->_global->_inter_execPtr += 2;
|
_vm->_global->_inter_execPtr += 2;
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
|
@ -125,10 +125,10 @@ void Parse::skipExpr(char stopToken) {
|
||||||
case 15:
|
case 15:
|
||||||
_vm->_global->_inter_execPtr += 2;
|
_vm->_global->_inter_execPtr += 2;
|
||||||
|
|
||||||
case 16:
|
case OP_ARRAY_UINT8:
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 27:
|
case OP_ARRAY_UINT16:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
dimCount = _vm->_global->_inter_execPtr[2];
|
dimCount = _vm->_global->_inter_execPtr[2];
|
||||||
// skip header and dimensions
|
// skip header and dimensions
|
||||||
_vm->_global->_inter_execPtr += 3 + dimCount;
|
_vm->_global->_inter_execPtr += 3 + dimCount;
|
||||||
|
@ -136,31 +136,31 @@ void Parse::skipExpr(char stopToken) {
|
||||||
for (dim = 0; dim < dimCount; dim++)
|
for (dim = 0; dim < dimCount; dim++)
|
||||||
skipExpr(12);
|
skipExpr(12);
|
||||||
|
|
||||||
if ((operation == 28) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_ARRAY_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
skipExpr(12);
|
skipExpr(12);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case OP_FUNC:
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
skipExpr(10);
|
skipExpr(10);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} // if ((operation >= 16) && (operation <= 29))
|
} // if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC))
|
||||||
|
|
||||||
if (operation == 9) {
|
if (operation == OP_BEGIN_EXPR) {
|
||||||
num++;
|
num++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((operation == 11) || ((operation >= 1) && (operation <= 8)))
|
if ((operation == OP_NOT) || ((operation >= OP_NEG) && (operation <= 8)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((operation >= 30) && (operation <= 37))
|
if ((operation >= OP_OR) && (operation <= OP_NEQ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (operation == 10)
|
if (operation == OP_END_EXPR)
|
||||||
num--;
|
num--;
|
||||||
|
|
||||||
if (operation != stopToken)
|
if (operation != stopToken)
|
||||||
|
@ -191,10 +191,10 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
byte func;
|
byte func;
|
||||||
|
|
||||||
num = 0;
|
num = 0;
|
||||||
while (1) {
|
while (true) {
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
|
|
||||||
if ((operation >= 16) && (operation <= 29)) {
|
if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC)) {
|
||||||
// operands
|
// operands
|
||||||
|
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
|
@ -206,20 +206,20 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
debugN(5, "var8_%d", _vm->_inter->load16());
|
debugN(5, "var8_%d", _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19: // int32/uint32 immediate
|
case OP_LOAD_IMM_INT32: // int32/uint32 immediate
|
||||||
debugN(5, "%d", READ_LE_UINT32(_vm->_global->_inter_execPtr));
|
debugN(5, "%d", READ_LE_UINT32(_vm->_global->_inter_execPtr));
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20: // int16 immediate
|
case OP_LOAD_IMM_INT16: // int16 immediate
|
||||||
debugN(5, "%d", _vm->_inter->load16());
|
debugN(5, "%d", _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21: // int8 immediate
|
case OP_LOAD_IMM_INT8: // int8 immediate
|
||||||
debugN(5, "%d", (int8) *_vm->_global->_inter_execPtr++);
|
debugN(5, "%d", (int8) *_vm->_global->_inter_execPtr++);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22: // string immediate
|
case OP_LOAD_IMM_STR: // string immediate
|
||||||
debugN(5, "\42%s\42", _vm->_global->_inter_execPtr);
|
debugN(5, "\42%s\42", _vm->_global->_inter_execPtr);
|
||||||
_vm->_global->_inter_execPtr +=
|
_vm->_global->_inter_execPtr +=
|
||||||
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
||||||
|
@ -230,7 +230,7 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
debugN(5, "var_%d", _vm->_inter->load16());
|
debugN(5, "var_%d", _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25: // string variable load
|
case OP_LOAD_VAR_STR: // string variable load
|
||||||
debugN(5, "(&var_%d)", _vm->_inter->load16());
|
debugN(5, "(&var_%d)", _vm->_inter->load16());
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
|
@ -239,12 +239,12 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16: // uint8 array access
|
case OP_ARRAY_UINT8: // uint8 array access
|
||||||
case 26: // uint32 array access
|
case OP_ARRAY_UINT32: // uint32 array access
|
||||||
case 27: // uint16 array access
|
case OP_ARRAY_UINT16: // uint16 array access
|
||||||
case 28: // string array access
|
case OP_ARRAY_STR: // string array access
|
||||||
debugN(5, "\n");
|
debugN(5, "\n");
|
||||||
if (operation == 28)
|
if (operation == OP_ARRAY_STR)
|
||||||
debugN(5, "(&");
|
debugN(5, "(&");
|
||||||
|
|
||||||
debugN(5, "var_%d[", _vm->_inter->load16());
|
debugN(5, "var_%d[", _vm->_inter->load16());
|
||||||
|
@ -258,25 +258,25 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
debugN(5, ",");
|
debugN(5, ",");
|
||||||
}
|
}
|
||||||
debugN(5, "]");
|
debugN(5, "]");
|
||||||
if (operation == 28)
|
if (operation == OP_ARRAY_STR)
|
||||||
debugN(5, ")");
|
debugN(5, ")");
|
||||||
|
|
||||||
if ((operation == 28) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_ARRAY_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
debugN(5, "{");
|
debugN(5, "{");
|
||||||
printExpr_internal(12); // this also prints the closing }
|
printExpr_internal(12); // this also prints the closing }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29: // function
|
case OP_FUNC: // function
|
||||||
func = *_vm->_global->_inter_execPtr++;
|
func = *_vm->_global->_inter_execPtr++;
|
||||||
if (func == 5)
|
if (func == FUNC_SQR)
|
||||||
debugN(5, "sqr(");
|
debugN(5, "sqr(");
|
||||||
else if (func == 10)
|
else if (func == FUNC_RAND)
|
||||||
debugN(5, "rand(");
|
debugN(5, "rand(");
|
||||||
else if (func == 7)
|
else if (func == FUNC_ABS)
|
||||||
debugN(5, "abs(");
|
debugN(5, "abs(");
|
||||||
else if ((func == 0) || (func == 1) || (func == 6))
|
else if ((func == FUNC_SQRT1) || (func == FUNC_SQRT2) || (func == FUNC_SQRT3))
|
||||||
debugN(5, "sqrt(");
|
debugN(5, "sqrt(");
|
||||||
else
|
else
|
||||||
debugN(5, "id(");
|
debugN(5, "id(");
|
||||||
|
@ -284,23 +284,23 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} // if ((operation >= 16) && (operation <= 29))
|
} // if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC))
|
||||||
|
|
||||||
// operators
|
// operators
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 9:
|
case OP_BEGIN_EXPR:
|
||||||
debugN(5, "(");
|
debugN(5, "(");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case OP_NOT:
|
||||||
debugN(5, "!");
|
debugN(5, "!");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case OP_END_EXPR:
|
||||||
debugN(5, ")");
|
debugN(5, ")");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case OP_NEG:
|
||||||
debugN(5, "-");
|
debugN(5, "-");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
debugN(5, "&");
|
debugN(5, "&");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30:
|
case OP_OR:
|
||||||
debugN(5, "||");
|
debugN(5, "||");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -340,27 +340,27 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
debugN(5, "&&");
|
debugN(5, "&&");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case OP_LESS:
|
||||||
debugN(5, "<");
|
debugN(5, "<");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 33:
|
case OP_LEQ:
|
||||||
debugN(5, "<=");
|
debugN(5, "<=");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 34:
|
case OP_GREATER:
|
||||||
debugN(5, ">");
|
debugN(5, ">");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 35:
|
case OP_GEQ:
|
||||||
debugN(5, ">=");
|
debugN(5, ">=");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36:
|
case OP_EQ:
|
||||||
debugN(5, "==");
|
debugN(5, "==");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37:
|
case OP_NEQ:
|
||||||
debugN(5, "!=");
|
debugN(5, "!=");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -381,18 +381,18 @@ void Parse::printExpr_internal(char stopToken) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (operation == 9) {
|
if (operation == OP_BEGIN_EXPR) {
|
||||||
num++;
|
num++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((operation == 11) || ((operation >= 1) && (operation <= 8)))
|
if ((operation == OP_NOT) || ((operation >= OP_NEG) && (operation <= 8)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((operation >= 30) && (operation <= 37))
|
if ((operation >= OP_OR) && (operation <= OP_NEQ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (operation == 10)
|
if (operation == OP_END_EXPR)
|
||||||
num--;
|
num--;
|
||||||
|
|
||||||
if (operation == stopToken) {
|
if (operation == stopToken) {
|
||||||
|
@ -416,18 +416,18 @@ void Parse::printVarIndex() {
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 23:
|
case 23:
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
debugN(5, "&var_%d", temp);
|
debugN(5, "&var_%d", temp);
|
||||||
if ((operation == 25) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_LOAD_VAR_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
debugN(5, "+");
|
debugN(5, "+");
|
||||||
printExpr(12);
|
printExpr(12);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
debugN(5, "&var_%d[", _vm->_inter->load16());
|
debugN(5, "&var_%d[", _vm->_inter->load16());
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDesc = _vm->_global->_inter_execPtr;
|
arrDesc = _vm->_global->_inter_execPtr;
|
||||||
|
@ -440,7 +440,7 @@ void Parse::printVarIndex() {
|
||||||
}
|
}
|
||||||
debugN(5, "]");
|
debugN(5, "]");
|
||||||
|
|
||||||
if ((operation == 28) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_ARRAY_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
debugN(5, "+");
|
debugN(5, "+");
|
||||||
printExpr(12);
|
printExpr(12);
|
||||||
|
@ -459,9 +459,9 @@ void Parse::printVarIndex() {
|
||||||
int Parse::cmpHelper(byte *operPtr, int32 *valPtr) {
|
int Parse::cmpHelper(byte *operPtr, int32 *valPtr) {
|
||||||
byte var_C = operPtr[-3];
|
byte var_C = operPtr[-3];
|
||||||
int cmpTemp;
|
int cmpTemp;
|
||||||
if (var_C == 20) {
|
if (var_C == OP_LOAD_IMM_INT16) {
|
||||||
cmpTemp = (int)valPtr[-3] - (int)valPtr[-1];
|
cmpTemp = (int)valPtr[-3] - (int)valPtr[-1];
|
||||||
} else if (var_C == 22) {
|
} else if (var_C == OP_LOAD_IMM_STR) {
|
||||||
if ((char *)decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
if ((char *)decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *)decodePtr(valPtr[-3]));
|
strcpy(_vm->_global->_inter_resStr, (char *)decodePtr(valPtr[-3]));
|
||||||
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
|
|
@ -29,13 +29,70 @@
|
||||||
namespace Gob {
|
namespace Gob {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
OP_NEG = 1,
|
||||||
OP_ADD = 2,
|
OP_ADD = 2,
|
||||||
OP_SUB = 3,
|
OP_SUB = 3,
|
||||||
OP_BITOR = 4,
|
OP_BITOR = 4,
|
||||||
OP_MUL = 5,
|
OP_MUL = 5,
|
||||||
OP_DIV = 6,
|
OP_DIV = 6,
|
||||||
OP_MOD = 7,
|
OP_MOD = 7,
|
||||||
OP_BITAND = 8
|
OP_BITAND = 8,
|
||||||
|
OP_BEGIN_EXPR = 9,
|
||||||
|
OP_END_EXPR = 10,
|
||||||
|
OP_NOT = 11,
|
||||||
|
|
||||||
|
|
||||||
|
OP_ARRAY_UINT8 = 16,
|
||||||
|
|
||||||
|
// FIXME: OP_LOAD_VAR_UINT16 comment says "uint16 variable load" in
|
||||||
|
// Parse::printExpr_internal, and does that in Parse_v2::parseExpr,
|
||||||
|
// but reads int8 in Parse_v2::parseValExpr
|
||||||
|
OP_LOAD_VAR_UINT16 = 17,
|
||||||
|
// FIXME: OP_LOAD_VAR_UINT8 comment says "uint8 variable load" in
|
||||||
|
// Parse::printExpr_internal, but reads int8 in Parse_v2::parseValExpr
|
||||||
|
OP_LOAD_VAR_UINT8 = 18,
|
||||||
|
OP_LOAD_IMM_INT32 = 19,
|
||||||
|
OP_LOAD_IMM_INT16 = 20,
|
||||||
|
OP_LOAD_IMM_INT8 = 21,
|
||||||
|
OP_LOAD_IMM_STR = 22,
|
||||||
|
|
||||||
|
OP_LOAD_VAR_UINT32 = 23, // ???
|
||||||
|
OP_LOAD_VAR_UINT32_AS_UINT16 = 24, // ???
|
||||||
|
OP_LOAD_VAR_STR = 25,
|
||||||
|
|
||||||
|
OP_ARRAY_UINT32 = 26,
|
||||||
|
OP_ARRAY_UINT16 = 27,
|
||||||
|
OP_ARRAY_STR = 28,
|
||||||
|
|
||||||
|
OP_FUNC = 29,
|
||||||
|
|
||||||
|
OP_OR = 30, // Logical OR
|
||||||
|
OP_AND = 31, // Logical AND
|
||||||
|
OP_LESS = 32,
|
||||||
|
OP_LEQ = 33,
|
||||||
|
OP_GREATER = 34,
|
||||||
|
OP_GEQ = 35,
|
||||||
|
OP_EQ = 36,
|
||||||
|
OP_NEQ = 37
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FUNC_SQRT1 = 0,
|
||||||
|
FUNC_SQRT2 = 1,
|
||||||
|
FUNC_SQRT3 = 6,
|
||||||
|
|
||||||
|
FUNC_SQR = 5,
|
||||||
|
FUNC_ABS = 7,
|
||||||
|
FUNC_RAND = 10
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
// FIXME: The following two 'truth values' are stored inside the list
|
||||||
|
// of "operators". So they somehow coincide with OP_LOAD_VAR_UINT32
|
||||||
|
// and OP_LOAD_VAR_UINT32_AS_UINT16. I haven't yet quite understood
|
||||||
|
// how, resp. what that means. You have been warned.
|
||||||
|
GOB_TRUE = 24,
|
||||||
|
GOB_FALSE = 23
|
||||||
};
|
};
|
||||||
|
|
||||||
class Parse {
|
class Parse {
|
||||||
|
|
|
@ -49,12 +49,12 @@ int16 Parse_v1::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
debugC(5, kDebugParser, "var parse = %d", operation);
|
debugC(5, kDebugParser, "var parse = %d", operation);
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 23:
|
case 23:
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
debugC(5, kDebugParser, "oper = %d",
|
debugC(5, kDebugParser, "oper = %d",
|
||||||
(int16) *_vm->_global->_inter_execPtr);
|
(int16) *_vm->_global->_inter_execPtr);
|
||||||
|
|
||||||
if ((operation == 25) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_LOAD_VAR_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
val = parseValExpr(12);
|
val = parseValExpr(12);
|
||||||
temp += val;
|
temp += val;
|
||||||
|
@ -62,8 +62,8 @@ int16 Parse_v1::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
}
|
}
|
||||||
return temp;
|
return temp;
|
||||||
|
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDesc = _vm->_global->_inter_execPtr;
|
arrDesc = _vm->_global->_inter_execPtr;
|
||||||
|
@ -74,7 +74,7 @@ int16 Parse_v1::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
offset *= 4;
|
offset *= 4;
|
||||||
if (operation != 28)
|
if (operation != OP_ARRAY_STR)
|
||||||
return temp + offset;
|
return temp + offset;
|
||||||
|
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
|
@ -115,21 +115,21 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
operPtr = operStack - 1;
|
operPtr = operStack - 1;
|
||||||
valPtr = values - 1;
|
valPtr = values - 1;
|
||||||
|
|
||||||
while (1) {
|
while (true) {
|
||||||
stkPos++;
|
stkPos++;
|
||||||
operPtr++;
|
operPtr++;
|
||||||
valPtr++;
|
valPtr++;
|
||||||
|
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
if ((operation >= 19) && (operation <= 29)) {
|
if ((operation >= OP_LOAD_IMM_INT32) && (operation <= OP_FUNC)) {
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 19:
|
case OP_LOAD_IMM_INT32:
|
||||||
*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
|
*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
*valPtr = _vm->_inter->load16();
|
*valPtr = _vm->_inter->load16();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -137,15 +137,15 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
*valPtr = (uint16) VAR(_vm->_inter->load16());
|
*valPtr = (uint16) VAR(_vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*valPtr = READ_VARO_UINT8(temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
temp = _vm->_inter->load16();
|
temp = _vm->_inter->load16();
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDesc = _vm->_global->_inter_execPtr;
|
arrDesc = _vm->_global->_inter_execPtr;
|
||||||
|
@ -155,7 +155,7 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 26) {
|
if (operation == OP_ARRAY_UINT32) {
|
||||||
*valPtr = (uint16) VAR(temp + offset);
|
*valPtr = (uint16) VAR(temp + offset);
|
||||||
} else {
|
} else {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
|
@ -165,17 +165,17 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case OP_FUNC:
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
parseExpr(10, 0);
|
parseExpr(10, 0);
|
||||||
|
|
||||||
if (operation == 5) {
|
if (operation == FUNC_SQR) {
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
||||||
} else if (operation == 7) {
|
} else if (operation == FUNC_ABS) {
|
||||||
if (_vm->_global->_inter_resVal < 0)
|
if (_vm->_global->_inter_resVal < 0)
|
||||||
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
||||||
} else if (operation == 10) {
|
} else if (operation == FUNC_RAND) {
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
||||||
}
|
}
|
||||||
|
@ -183,15 +183,15 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} // switch
|
} // switch
|
||||||
if ((stkPos > 0) && (operPtr[-1] == 1)) {
|
if ((stkPos > 0) && (operPtr[-1] == OP_NEG)) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
operPtr[0] = 20;
|
operPtr[0] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[0] = -valPtr[1];
|
valPtr[0] = -valPtr[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 0) && (operPtr[-1] > 4) && (operPtr[-1] < 9)) {
|
if ((stkPos > 0) && (operPtr[-1] >= OP_MUL) && (operPtr[-1] <= OP_BITAND)) {
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -213,25 +213,25 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
valPtr[0] &= valPtr[2];
|
valPtr[0] &= valPtr[2];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // if ((stkPos > 0) && (cmdPtr[-1] > 4) && (cmdPtr[-1] < 9))
|
} // if ((stkPos > 0) && (cmdPtr[-1] >= OP_MUL) && (cmdPtr[-1] <= OP_BITAND))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((operation >= 1) && (operation <= 9)) {
|
if ((operation >= OP_NEG) && (operation <= OP_BEGIN_EXPR)) {
|
||||||
*operPtr = operation;
|
*operPtr = operation;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (stkPos >= 2) {
|
while (stkPos >= 2) {
|
||||||
if (operPtr[-2] == 9) {
|
if (operPtr[-2] == OP_BEGIN_EXPR) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
operPtr[-1] = operPtr[0];
|
operPtr[-1] = operPtr[0];
|
||||||
valPtr[-1] = valPtr[0];
|
valPtr[-1] = valPtr[0];
|
||||||
if ((stkPos > 1) && (operPtr[-2] == 1)) {
|
if ((stkPos > 1) && (operPtr[-2] == OP_NEG)) {
|
||||||
valPtr[-2] = 20;
|
valPtr[-2] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[-2] = -valPtr[-1];
|
valPtr[-2] = -valPtr[-1];
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
|
@ -239,7 +239,7 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
valPtr--;
|
valPtr--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 2) && (operPtr[-2] > 4) && (operPtr[-2] < 9)) {
|
if ((stkPos > 2) && (operPtr[-2] >= OP_MUL) && (operPtr[-2] <= OP_BITAND)) {
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -261,16 +261,16 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (operation == 10)
|
if (operation == OP_END_EXPR)
|
||||||
break;
|
break;
|
||||||
} // operPtr[-2] == 9
|
} // operPtr[-2] == OP_BEGIN_EXPR
|
||||||
|
|
||||||
for (brackPos = (stkPos - 2); (brackPos > 0) &&
|
for (brackPos = (stkPos - 2); (brackPos > 0) &&
|
||||||
(operStack[brackPos] < 30) && (operStack[brackPos] != 9);
|
(operStack[brackPos] < OP_OR) && (operStack[brackPos] != OP_BEGIN_EXPR);
|
||||||
brackPos--)
|
brackPos--)
|
||||||
;
|
;
|
||||||
|
|
||||||
if ((operStack[brackPos] >= 30) || (operStack[brackPos] == 9))
|
if ((operStack[brackPos] >= OP_OR) || (operStack[brackPos] == OP_BEGIN_EXPR))
|
||||||
brackPos++;
|
brackPos++;
|
||||||
|
|
||||||
if ((operPtr[-2] < 2) || (operPtr[-2] > 8))
|
if ((operPtr[-2] < 2) || (operPtr[-2] > 8))
|
||||||
|
@ -304,7 +304,7 @@ int16 Parse_v1::parseValExpr(byte stopToken) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (operation != 10) {
|
if (operation != OP_END_EXPR) {
|
||||||
if (operation != stopToken)
|
if (operation != stopToken)
|
||||||
debugC(5, kDebugParser, "stoptoken error: %d != %d",
|
debugC(5, kDebugParser, "stoptoken error: %d != %d",
|
||||||
operation, stopToken);
|
operation, stopToken);
|
||||||
|
@ -342,51 +342,51 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
operPtr = operStack - 1;
|
operPtr = operStack - 1;
|
||||||
valPtr = values - 1;
|
valPtr = values - 1;
|
||||||
|
|
||||||
while (1) {
|
while (true) {
|
||||||
stkPos++;
|
stkPos++;
|
||||||
operPtr++;
|
operPtr++;
|
||||||
valPtr++;
|
valPtr++;
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
if ((operation >= 19) && (operation <= 29)) {
|
if ((operation >= OP_LOAD_IMM_INT32) && (operation <= OP_FUNC)) {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 19:
|
case OP_LOAD_IMM_INT32:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
|
*valPtr = READ_LE_UINT32(_vm->_global->_inter_execPtr);
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = _vm->_inter->load16();
|
*valPtr = _vm->_inter->load16();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case OP_LOAD_IMM_STR:
|
||||||
*operPtr = 22;
|
*operPtr = OP_LOAD_IMM_STR;
|
||||||
*valPtr = encodePtr(_vm->_global->_inter_execPtr, kExecPtr);
|
*valPtr = encodePtr(_vm->_global->_inter_execPtr, kExecPtr);
|
||||||
_vm->_global->_inter_execPtr +=
|
_vm->_global->_inter_execPtr +=
|
||||||
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = VAR(_vm->_inter->load16());
|
*valPtr = VAR(_vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
*operPtr = 22;
|
*operPtr = OP_LOAD_IMM_STR;
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(temp, 0),
|
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(temp, 0),
|
||||||
kInterVar);
|
kInterVar);
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_VARO_UINT8(temp);
|
*valPtr = READ_VARO_UINT8(temp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
*operPtr = operation - 6;
|
*operPtr = operation - 6;
|
||||||
temp = _vm->_inter->load16();
|
temp = _vm->_inter->load16();
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
|
@ -399,7 +399,7 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
offset = offset * arrDescPtr[dim] + temp2;
|
offset = offset * arrDescPtr[dim] + temp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (operation == 26) {
|
if (operation == OP_ARRAY_UINT32) {
|
||||||
*valPtr = VAR(temp + offset);
|
*valPtr = VAR(temp + offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -409,25 +409,25 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_VARO_UINT8(temp * 4 +
|
*valPtr = READ_VARO_UINT8(temp * 4 +
|
||||||
offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case OP_FUNC:
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
parseExpr(10, 0);
|
parseExpr(10, 0);
|
||||||
|
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 5:
|
case FUNC_SQR:
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0:
|
case FUNC_SQRT1:
|
||||||
case 1:
|
case FUNC_SQRT2:
|
||||||
case 6:
|
case FUNC_SQRT3:
|
||||||
curVal = 1;
|
curVal = 1;
|
||||||
prevVal = 1;
|
prevVal = 1;
|
||||||
|
|
||||||
|
@ -439,33 +439,33 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_resVal = curVal;
|
_vm->_global->_inter_resVal = curVal;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case FUNC_RAND:
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case FUNC_ABS:
|
||||||
if (_vm->_global->_inter_resVal < 0)
|
if (_vm->_global->_inter_resVal < 0)
|
||||||
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = _vm->_global->_inter_resVal;
|
*valPtr = _vm->_global->_inter_resVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 0) && ((operPtr[-1] == 1) || (operPtr[-1] == 11))) {
|
if ((stkPos > 0) && ((operPtr[-1] == OP_NEG) || (operPtr[-1] == OP_NOT))) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
if (*operPtr == 1) {
|
if (*operPtr == OP_NEG) {
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
valPtr[0] = -valPtr[1];
|
valPtr[0] = -valPtr[1];
|
||||||
} else if (*operPtr == 11) {
|
} else if (*operPtr == OP_NOT) {
|
||||||
if (operPtr[1] == 23)
|
if (operPtr[1] == GOB_FALSE)
|
||||||
*operPtr = 24;
|
*operPtr = GOB_TRUE;
|
||||||
else
|
else
|
||||||
*operPtr = 23;
|
*operPtr = GOB_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
|
|
||||||
switch (operPtr[-1]) {
|
switch (operPtr[-1]) {
|
||||||
case 2:
|
case 2:
|
||||||
if (operPtr[-2] == 22) {
|
if (operPtr[-2] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(valPtr[-2]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(valPtr[-2]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-2]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-2]));
|
||||||
valPtr[-2] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-2] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
@ -515,16 +515,16 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} // (op >= 19) && (op <= 29)
|
} // (op >= OP_LOAD_IMM_INT32) && (op <= OP_FUNC)
|
||||||
|
|
||||||
if ((operation == stopToken) || (operation == 30) ||
|
if ((operation == stopToken) || (operation == OP_OR) ||
|
||||||
(operation == 31) || (operation == 10)) {
|
(operation == OP_AND) || (operation == OP_END_EXPR)) {
|
||||||
while (stkPos >= 2) {
|
while (stkPos >= 2) {
|
||||||
var_1A = false;
|
var_1A = false;
|
||||||
if ((operPtr[-2] == 9) &&
|
if ((operPtr[-2] == OP_BEGIN_EXPR) &&
|
||||||
((operation == 10) || (operation == stopToken))) {
|
((operation == OP_END_EXPR) || (operation == stopToken))) {
|
||||||
operPtr[-2] = operPtr[-1];
|
operPtr[-2] = operPtr[-1];
|
||||||
if ((operPtr[-2] == 20) || (operPtr[-2] == 22))
|
if ((operPtr[-2] == OP_LOAD_IMM_INT16) || (operPtr[-2] == OP_LOAD_IMM_STR))
|
||||||
valPtr[-2] = valPtr[-1];
|
valPtr[-2] = valPtr[-1];
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
|
@ -532,17 +532,17 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
if (stkPos > 1) {
|
if (stkPos > 1) {
|
||||||
if (operPtr[-2] == 1) {
|
if (operPtr[-2] == OP_NEG) {
|
||||||
operPtr[-2] = 20;
|
operPtr[-2] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[-2] = -valPtr[-1];
|
valPtr[-2] = -valPtr[-1];
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
} else if (operPtr[-2] == 11) {
|
} else if (operPtr[-2] == OP_NOT) {
|
||||||
if (operPtr[-1] == 23)
|
if (operPtr[-1] == GOB_FALSE)
|
||||||
operPtr[-2] = 24;
|
operPtr[-2] = GOB_TRUE;
|
||||||
else
|
else
|
||||||
operPtr[-2] = 23;
|
operPtr[-2] = GOB_FALSE;
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
|
@ -583,21 +583,21 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
|
|
||||||
if (operation != stopToken)
|
if (operation != stopToken)
|
||||||
break;
|
break;
|
||||||
} // if ((operPtr[-2] == 9) && ...)
|
} // if ((operPtr[-2] == OP_BEGIN_EXPR) && ...)
|
||||||
|
|
||||||
for (brackStart = (stkPos - 2); (brackStart > 0) &&
|
for (brackStart = (stkPos - 2); (brackStart > 0) &&
|
||||||
(operStack[brackStart] < 30) && (operStack[brackStart] != 9);
|
(operStack[brackStart] < OP_OR) && (operStack[brackStart] != OP_BEGIN_EXPR);
|
||||||
brackStart--)
|
brackStart--)
|
||||||
;
|
;
|
||||||
|
|
||||||
if ((operStack[brackStart] >= 30) || (operStack[brackStart] == 9))
|
if ((operStack[brackStart] >= OP_OR) || (operStack[brackStart] == OP_BEGIN_EXPR))
|
||||||
brackStart++;
|
brackStart++;
|
||||||
|
|
||||||
switch (operPtr[-2]) {
|
switch (operPtr[-2]) {
|
||||||
case OP_ADD:
|
case OP_ADD:
|
||||||
if (operStack[brackStart] == 20) {
|
if (operStack[brackStart] == OP_LOAD_IMM_INT16) {
|
||||||
values[brackStart] += valPtr[-1];
|
values[brackStart] += valPtr[-1];
|
||||||
} else if (operStack[brackStart] == 22) {
|
} else if (operStack[brackStart] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(values[brackStart]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(values[brackStart]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[brackStart]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[brackStart]));
|
||||||
values[brackStart] =
|
values[brackStart] =
|
||||||
|
@ -652,59 +652,63 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30:
|
case OP_OR:
|
||||||
if (operPtr[-3] == 23)
|
// (x OR false) == x
|
||||||
|
// (x OR true) == true
|
||||||
|
if (operPtr[-3] == GOB_FALSE)
|
||||||
operPtr[-3] = operPtr[-1];
|
operPtr[-3] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 31:
|
case OP_AND:
|
||||||
if (operPtr[-3] == 24)
|
// (x AND false) == false
|
||||||
|
// (x AND true) == x
|
||||||
|
if (operPtr[-3] == GOB_TRUE)
|
||||||
operPtr[-3] = operPtr[-1];
|
operPtr[-3] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case OP_LESS:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) < 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) < 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 33:
|
case OP_LEQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) <= 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) <= 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 34:
|
case OP_GREATER:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) > 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) > 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 35:
|
case OP_GEQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) >= 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) >= 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36:
|
case OP_EQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) == 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) == 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37:
|
case OP_NEQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) != 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) != 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -719,17 +723,17 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
} // while (stkPos >= 2)
|
} // while (stkPos >= 2)
|
||||||
|
|
||||||
if ((operation == 30) || (operation == 31)) {
|
if ((operation == OP_OR) || (operation == OP_AND)) {
|
||||||
if (operPtr[-1] == 20) {
|
if (operPtr[-1] == OP_LOAD_IMM_INT16) {
|
||||||
if (valPtr[-1] != 0)
|
if (valPtr[-1] != 0)
|
||||||
operPtr[-1] = 24;
|
operPtr[-1] = GOB_TRUE;
|
||||||
else
|
else
|
||||||
operPtr[-1] = 23;
|
operPtr[-1] = GOB_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((operation == 30) && (operPtr[-1] == 24)) ||
|
if (((operation == OP_OR) && (operPtr[-1] == GOB_TRUE)) ||
|
||||||
((operation == 31) && (operPtr[-1] == 23))) {
|
((operation == OP_AND) && (operPtr[-1] == GOB_FALSE))) {
|
||||||
if ((stkPos > 1) && (operPtr[-2] == 9)) {
|
if ((stkPos > 1) && (operPtr[-2] == OP_BEGIN_EXPR)) {
|
||||||
skipExpr(10);
|
skipExpr(10);
|
||||||
operPtr[-2] = operPtr[-1];
|
operPtr[-2] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
|
@ -739,11 +743,11 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
skipExpr(stopToken);
|
skipExpr(stopToken);
|
||||||
|
|
||||||
operation = _vm->_global->_inter_execPtr[-1];
|
operation = _vm->_global->_inter_execPtr[-1];
|
||||||
if ((stkPos > 0) && (operPtr[-1] == 11)) {
|
if ((stkPos > 0) && (operPtr[-1] == OP_NOT)) {
|
||||||
if (operPtr[0] == 23)
|
if (operPtr[0] == GOB_FALSE)
|
||||||
operPtr[-1] = 24;
|
operPtr[-1] = GOB_TRUE;
|
||||||
else
|
else
|
||||||
operPtr[-1] = 23;
|
operPtr[-1] = GOB_FALSE;
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
|
@ -764,16 +768,16 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
*arg_2 = operStack[0];
|
*arg_2 = operStack[0];
|
||||||
|
|
||||||
switch (operStack[0]) {
|
switch (operStack[0]) {
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
_vm->_global->_inter_resVal = values[0];
|
_vm->_global->_inter_resVal = values[0];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case OP_LOAD_IMM_STR:
|
||||||
if ((char *) decodePtr(values[0]) != _vm->_global->_inter_resStr)
|
if ((char *) decodePtr(values[0]) != _vm->_global->_inter_resStr)
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[0]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[0]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case OP_NOT:
|
||||||
if (arg_2 != 0)
|
if (arg_2 != 0)
|
||||||
*arg_2 ^= 1;
|
*arg_2 ^= 1;
|
||||||
break;
|
break;
|
||||||
|
@ -785,21 +789,21 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
default:
|
default:
|
||||||
_vm->_global->_inter_resVal = 0;
|
_vm->_global->_inter_resVal = 0;
|
||||||
if (arg_2 != 0)
|
if (arg_2 != 0)
|
||||||
*arg_2 = 20;
|
*arg_2 = OP_LOAD_IMM_INT16;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} // (operation == stopToken) || (operation == 30) || (operation == 31) || (operation == 10)
|
} // (operation == stopToken) || (operation == OP_OR) || (operation == OP_AND) || (operation == OP_END_EXPR)
|
||||||
|
|
||||||
if (operation < 1 || operation > 11) {
|
if (operation < OP_NEG || operation > OP_NOT) {
|
||||||
if (operation < 32 || operation > 37)
|
if (operation < OP_LESS || operation > OP_NEQ)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (stkPos > 2) {
|
if (stkPos > 2) {
|
||||||
if (operPtr[-2] == OP_ADD) {
|
if (operPtr[-2] == OP_ADD) {
|
||||||
if (operPtr[-3] == 20) {
|
if (operPtr[-3] == OP_LOAD_IMM_INT16) {
|
||||||
valPtr[-3] += valPtr[-1];
|
valPtr[-3] += valPtr[-1];
|
||||||
} else if (operPtr[-3] == 22) {
|
} else if (operPtr[-3] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
||||||
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
|
|
@ -112,10 +112,10 @@ int16 Parse_v2::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
|
|
||||||
debugC(5, kDebugParser, "var parse = %d", operation);
|
debugC(5, kDebugParser, "var parse = %d", operation);
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 16:
|
case OP_ARRAY_UINT8:
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 27:
|
case OP_ARRAY_UINT16:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
temp = _vm->_inter->load16();
|
temp = _vm->_inter->load16();
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDesc = _vm->_global->_inter_execPtr;
|
arrDesc = _vm->_global->_inter_execPtr;
|
||||||
|
@ -125,11 +125,11 @@ int16 Parse_v2::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == OP_ARRAY_UINT8)
|
||||||
return varPos + temp + offset;
|
return varPos + temp + offset;
|
||||||
if (operation == 26)
|
if (operation == OP_ARRAY_UINT32)
|
||||||
return varPos + (temp + offset) * 4;
|
return varPos + (temp + offset) * 4;
|
||||||
if (operation == 27)
|
if (operation == OP_ARRAY_UINT16)
|
||||||
return varPos + (temp + offset) * 2;
|
return varPos + (temp + offset) * 2;
|
||||||
temp *= 4;
|
temp *= 4;
|
||||||
offset *= 4;
|
offset *= 4;
|
||||||
|
@ -147,11 +147,11 @@ int16 Parse_v2::parseVarIndex(uint16 *arg_0, uint16 *arg_4) {
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
case 24:
|
case 24:
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
debugC(5, kDebugParser, "oper = %d",
|
debugC(5, kDebugParser, "oper = %d",
|
||||||
(int16) *_vm->_global->_inter_execPtr);
|
(int16) *_vm->_global->_inter_execPtr);
|
||||||
if ((operation == 25) && (*_vm->_global->_inter_execPtr == 13)) {
|
if ((operation == OP_LOAD_VAR_STR) && (*_vm->_global->_inter_execPtr == 13)) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
val = parseValExpr(12);
|
val = parseValExpr(12);
|
||||||
temp += val;
|
temp += val;
|
||||||
|
@ -237,13 +237,13 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
operPtr++;
|
operPtr++;
|
||||||
valPtr++;
|
valPtr++;
|
||||||
|
|
||||||
if ((operation >= 16) && (operation <= 29)) {
|
if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC)) {
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 16:
|
case OP_ARRAY_UINT8:
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 27:
|
case OP_ARRAY_UINT16:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
temp = _vm->_inter->load16();
|
temp = _vm->_inter->load16();
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDesc = _vm->_global->_inter_execPtr;
|
arrDesc = _vm->_global->_inter_execPtr;
|
||||||
|
@ -253,13 +253,13 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
offset = arrDesc[dim] * offset + temp2;
|
offset = arrDesc[dim] * offset + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == OP_ARRAY_UINT8)
|
||||||
*valPtr = (int8) READ_VARO_UINT8(varPos + temp + offset);
|
*valPtr = (int8) READ_VARO_UINT8(varPos + temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == OP_ARRAY_UINT32)
|
||||||
*valPtr = (uint16) READ_VARO_UINT32(varPos + temp * 4 + offset * 4);
|
*valPtr = (uint16) READ_VARO_UINT32(varPos + temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == OP_ARRAY_UINT16)
|
||||||
*valPtr = READ_VARO_UINT16(varPos + temp * 2 + offset * 2);
|
*valPtr = READ_VARO_UINT16(varPos + temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == OP_ARRAY_STR) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*valPtr = READ_VARO_UINT8(varPos + temp * 4 +
|
*valPtr = READ_VARO_UINT8(varPos + temp * 4 +
|
||||||
|
@ -275,16 +275,16 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
*valPtr = (int8) READ_VARO_UINT8(varPos + _vm->_inter->load16());
|
*valPtr = (int8) READ_VARO_UINT8(varPos + _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case OP_LOAD_IMM_INT32:
|
||||||
*valPtr = (uint16) READ_LE_UINT32(varPos + _vm->_global->_inter_execPtr);
|
*valPtr = (uint16) READ_LE_UINT32(varPos + _vm->_global->_inter_execPtr);
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
*valPtr = _vm->_inter->load16();
|
*valPtr = _vm->_inter->load16();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case OP_LOAD_IMM_INT8:
|
||||||
*valPtr = (int8) *_vm->_global->_inter_execPtr++;
|
*valPtr = (int8) *_vm->_global->_inter_execPtr++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -296,24 +296,24 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
*valPtr = READ_VARO_UINT16(varPos + _vm->_inter->load16() * 4);
|
*valPtr = READ_VARO_UINT16(varPos + _vm->_inter->load16() * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*valPtr = READ_VARO_UINT8(varPos + temp);
|
*valPtr = READ_VARO_UINT8(varPos + temp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case OP_FUNC:
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
parseExpr(10, 0);
|
parseExpr(10, 0);
|
||||||
|
|
||||||
if (operation == 5) {
|
if (operation == FUNC_SQR) {
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
||||||
} else if (operation == 7) {
|
} else if (operation == FUNC_ABS) {
|
||||||
if (_vm->_global->_inter_resVal < 0)
|
if (_vm->_global->_inter_resVal < 0)
|
||||||
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
||||||
} else if (operation == 10) {
|
} else if (operation == FUNC_RAND) {
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
||||||
}
|
}
|
||||||
|
@ -321,15 +321,15 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} // switch
|
} // switch
|
||||||
if ((stkPos > 0) && (operPtr[-1] == 1)) {
|
if ((stkPos > 0) && (operPtr[-1] == OP_NEG)) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
operPtr[0] = 20;
|
operPtr[0] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[0] = -valPtr[1];
|
valPtr[0] = -valPtr[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 0) && (operPtr[-1] > 4) && (operPtr[-1] < 9)) {
|
if ((stkPos > 0) && (operPtr[-1] >= OP_MUL) && (operPtr[-1] <= OP_BITAND)) {
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -351,26 +351,26 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
valPtr[0] &= valPtr[2];
|
valPtr[0] &= valPtr[2];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // if ((stkPos > 0) && (cmdPtr[-1] > 4) && (cmdPtr[-1] < 9))
|
} // if ((stkPos > 0) && (cmdPtr[-1] >= OP_MUL) && (cmdPtr[-1] <= OP_BITAND))
|
||||||
varPos = 0;
|
varPos = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((operation >= 1) && (operation <= 9)) {
|
if ((operation >= OP_NEG) && (operation <= OP_BEGIN_EXPR)) {
|
||||||
*operPtr = operation;
|
*operPtr = operation;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (stkPos >= 2) {
|
while (stkPos >= 2) {
|
||||||
if (operPtr[-2] == 9) {
|
if (operPtr[-2] == OP_BEGIN_EXPR) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
operPtr[-1] = operPtr[0];
|
operPtr[-1] = operPtr[0];
|
||||||
valPtr[-1] = valPtr[0];
|
valPtr[-1] = valPtr[0];
|
||||||
if ((stkPos > 1) && (operPtr[-2] == 1)) {
|
if ((stkPos > 1) && (operPtr[-2] == OP_NEG)) {
|
||||||
operPtr[-2] = 20;
|
operPtr[-2] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[-2] = -valPtr[-1];
|
valPtr[-2] = -valPtr[-1];
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
|
@ -378,7 +378,7 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
valPtr--;
|
valPtr--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 2) && (operPtr[-2] > 4) && (operPtr[-2] < 9)) {
|
if ((stkPos > 2) && (operPtr[-2] >= OP_MUL) && (operPtr[-2] <= OP_BITAND)) {
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -400,16 +400,16 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (operation == 10)
|
if (operation == OP_END_EXPR)
|
||||||
break;
|
break;
|
||||||
} // operPtr[-2] == 9
|
} // operPtr[-2] == OP_BEGIN_EXPR
|
||||||
|
|
||||||
for (brackPos = (stkPos - 2); (brackPos > 0) &&
|
for (brackPos = (stkPos - 2); (brackPos > 0) &&
|
||||||
(operStack[brackPos] < 30) && (operStack[brackPos] != 9);
|
(operStack[brackPos] < OP_OR) && (operStack[brackPos] != OP_BEGIN_EXPR);
|
||||||
brackPos--)
|
brackPos--)
|
||||||
;
|
;
|
||||||
|
|
||||||
if ((operStack[brackPos] >= 30) || (operStack[brackPos] == 9))
|
if ((operStack[brackPos] >= OP_OR) || (operStack[brackPos] == OP_BEGIN_EXPR))
|
||||||
brackPos++;
|
brackPos++;
|
||||||
|
|
||||||
if ((operPtr[-2] < 2) || (operPtr[-2] > 8))
|
if ((operPtr[-2] < 2) || (operPtr[-2] > 8))
|
||||||
|
@ -443,7 +443,7 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (operation != 10) {
|
if (operation != OP_END_EXPR) {
|
||||||
if (operation != stopToken) {
|
if (operation != stopToken) {
|
||||||
debugC(5, kDebugParser, "stoptoken error: %d != %d",
|
debugC(5, kDebugParser, "stoptoken error: %d != %d",
|
||||||
operation, stopToken);
|
operation, stopToken);
|
||||||
|
@ -484,7 +484,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
operPtr = operStack - 1;
|
operPtr = operStack - 1;
|
||||||
valPtr = values - 1;
|
valPtr = values - 1;
|
||||||
|
|
||||||
while (1) {
|
while (true) {
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
|
|
||||||
while ((operation == 14) || (operation == 15)) {
|
while ((operation == 14) || (operation == 15)) {
|
||||||
|
@ -530,13 +530,13 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
operPtr++;
|
operPtr++;
|
||||||
valPtr++;
|
valPtr++;
|
||||||
|
|
||||||
if ((operation >= 16) && (operation <= 29)) {
|
if ((operation >= OP_ARRAY_UINT8) && (operation <= OP_FUNC)) {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 16:
|
case OP_ARRAY_UINT8:
|
||||||
case 26:
|
case OP_ARRAY_UINT32:
|
||||||
case 27:
|
case OP_ARRAY_UINT16:
|
||||||
case 28:
|
case OP_ARRAY_STR:
|
||||||
*operPtr = (operation == 28) ? 22 : 20;
|
*operPtr = (operation == OP_ARRAY_STR) ? OP_LOAD_IMM_STR : OP_LOAD_IMM_INT16;
|
||||||
temp = _vm->_inter->load16();
|
temp = _vm->_inter->load16();
|
||||||
dimCount = *_vm->_global->_inter_execPtr++;
|
dimCount = *_vm->_global->_inter_execPtr++;
|
||||||
arrDescPtr = _vm->_global->_inter_execPtr;
|
arrDescPtr = _vm->_global->_inter_execPtr;
|
||||||
|
@ -546,20 +546,20 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
offset = offset * arrDescPtr[dim] + temp2;
|
offset = offset * arrDescPtr[dim] + temp2;
|
||||||
}
|
}
|
||||||
if (operation == 16)
|
if (operation == OP_ARRAY_UINT8)
|
||||||
*valPtr = (int8) READ_VARO_UINT8(varPos + temp + offset);
|
*valPtr = (int8) READ_VARO_UINT8(varPos + temp + offset);
|
||||||
else if (operation == 26)
|
else if (operation == OP_ARRAY_UINT32)
|
||||||
*valPtr = READ_VARO_UINT32(varPos + temp * 4 + offset * 4);
|
*valPtr = READ_VARO_UINT32(varPos + temp * 4 + offset * 4);
|
||||||
else if (operation == 27)
|
else if (operation == OP_ARRAY_UINT16)
|
||||||
*valPtr = (int16) READ_VARO_UINT16(varPos + temp * 2 + offset * 2);
|
*valPtr = (int16) READ_VARO_UINT16(varPos + temp * 2 + offset * 2);
|
||||||
else if (operation == 28) {
|
else if (operation == OP_ARRAY_STR) {
|
||||||
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(
|
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(
|
||||||
varPos + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, 0),
|
varPos + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, 0),
|
||||||
kInterVar);
|
kInterVar);
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp2 = parseValExpr(12);
|
temp2 = parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_VARO_UINT8(varPos + temp * 4 +
|
*valPtr = READ_VARO_UINT8(varPos + temp * 4 +
|
||||||
offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
offset * 4 * _vm->_global->_inter_animDataSize + temp2);
|
||||||
}
|
}
|
||||||
|
@ -567,68 +567,68 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 2);
|
*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = (int8) READ_VARO_UINT8(varPos + _vm->_inter->load16());
|
*valPtr = (int8) READ_VARO_UINT8(varPos + _vm->_inter->load16());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case OP_LOAD_IMM_INT32:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_LE_UINT32(varPos + _vm->_global->_inter_execPtr);
|
*valPtr = READ_LE_UINT32(varPos + _vm->_global->_inter_execPtr);
|
||||||
_vm->_global->_inter_execPtr += 4;
|
_vm->_global->_inter_execPtr += 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = _vm->_inter->load16();
|
*valPtr = _vm->_inter->load16();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case OP_LOAD_IMM_INT8:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = (int8) *_vm->_global->_inter_execPtr++;
|
*valPtr = (int8) *_vm->_global->_inter_execPtr++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case OP_LOAD_IMM_STR:
|
||||||
*operPtr = 22;
|
*operPtr = OP_LOAD_IMM_STR;
|
||||||
*valPtr = encodePtr(_vm->_global->_inter_execPtr, kExecPtr);
|
*valPtr = encodePtr(_vm->_global->_inter_execPtr, kExecPtr);
|
||||||
_vm->_global->_inter_execPtr +=
|
_vm->_global->_inter_execPtr +=
|
||||||
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
strlen((char *) _vm->_global->_inter_execPtr) + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 23:
|
case 23:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_VARO_UINT32(varPos + _vm->_inter->load16() * 4);
|
*valPtr = READ_VARO_UINT32(varPos + _vm->_inter->load16() * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 4);
|
*valPtr = (int16) READ_VARO_UINT16(varPos + _vm->_inter->load16() * 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case OP_LOAD_VAR_STR:
|
||||||
*operPtr = 22;
|
*operPtr = OP_LOAD_IMM_STR;
|
||||||
temp = _vm->_inter->load16() * 4;
|
temp = _vm->_inter->load16() * 4;
|
||||||
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(varPos + temp, 0), kInterVar);
|
*valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(varPos + temp, 0), kInterVar);
|
||||||
if (*_vm->_global->_inter_execPtr == 13) {
|
if (*_vm->_global->_inter_execPtr == 13) {
|
||||||
_vm->_global->_inter_execPtr++;
|
_vm->_global->_inter_execPtr++;
|
||||||
temp += parseValExpr(12);
|
temp += parseValExpr(12);
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = READ_VARO_UINT8(varPos + temp);
|
*valPtr = READ_VARO_UINT8(varPos + temp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case OP_FUNC:
|
||||||
operation = *_vm->_global->_inter_execPtr++;
|
operation = *_vm->_global->_inter_execPtr++;
|
||||||
parseExpr(10, 0);
|
parseExpr(10, 0);
|
||||||
|
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case 0:
|
case FUNC_SQRT1:
|
||||||
case 1:
|
case FUNC_SQRT2:
|
||||||
case 6:
|
case FUNC_SQRT3:
|
||||||
curVal = 1;
|
curVal = 1;
|
||||||
prevVal = 1;
|
prevVal = 1;
|
||||||
|
|
||||||
|
@ -640,37 +640,37 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
_vm->_global->_inter_resVal = curVal;
|
_vm->_global->_inter_resVal = curVal;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case FUNC_SQR:
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal * _vm->_global->_inter_resVal;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case FUNC_ABS:
|
||||||
if (_vm->_global->_inter_resVal < 0)
|
if (_vm->_global->_inter_resVal < 0)
|
||||||
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
_vm->_global->_inter_resVal = -_vm->_global->_inter_resVal;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case FUNC_RAND:
|
||||||
_vm->_global->_inter_resVal =
|
_vm->_global->_inter_resVal =
|
||||||
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
_vm->_util->getRandom(_vm->_global->_inter_resVal);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
*valPtr = _vm->_global->_inter_resVal;
|
*valPtr = _vm->_global->_inter_resVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stkPos > 0) && ((operPtr[-1] == 1) || (operPtr[-1] == 11))) {
|
if ((stkPos > 0) && ((operPtr[-1] == OP_NEG) || (operPtr[-1] == OP_NOT))) {
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
if (*operPtr == 1) {
|
if (*operPtr == OP_NEG) {
|
||||||
*operPtr = 20;
|
*operPtr = OP_LOAD_IMM_INT16;
|
||||||
valPtr[0] = -valPtr[1];
|
valPtr[0] = -valPtr[1];
|
||||||
} else
|
} else
|
||||||
*operPtr = (operPtr[1] == 23) ? 24 : 23;
|
*operPtr = (operPtr[1] == GOB_FALSE) ? GOB_TRUE : GOB_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stkPos <= 0) {
|
if (stkPos <= 0) {
|
||||||
|
@ -679,8 +679,8 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (operPtr[-1]) {
|
switch (operPtr[-1]) {
|
||||||
case 2:
|
case OP_ADD:
|
||||||
if (operPtr[-2] == 22) {
|
if (operPtr[-2] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(valPtr[-2]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(valPtr[-2]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-2]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-2]));
|
||||||
valPtr[-2] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-2] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
@ -722,16 +722,16 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
}
|
}
|
||||||
varPos = 0;
|
varPos = 0;
|
||||||
continue;
|
continue;
|
||||||
} // (op >= 16) && (op <= 29)
|
} // (op >= OP_ARRAY_UINT8) && (op <= OP_FUNC)
|
||||||
|
|
||||||
if ((operation == stopToken) || (operation == 30) ||
|
if ((operation == stopToken) || (operation == OP_OR) ||
|
||||||
(operation == 31) || (operation == 10)) {
|
(operation == OP_AND) || (operation == OP_END_EXPR)) {
|
||||||
while (stkPos >= 2) {
|
while (stkPos >= 2) {
|
||||||
var_1A = false;
|
var_1A = false;
|
||||||
if ((operPtr[-2] == 9) &&
|
if ((operPtr[-2] == OP_BEGIN_EXPR) &&
|
||||||
((operation == 10) || (operation == stopToken))) {
|
((operation == OP_END_EXPR) || (operation == stopToken))) {
|
||||||
operPtr[-2] = operPtr[-1];
|
operPtr[-2] = operPtr[-1];
|
||||||
if ((operPtr[-2] == 20) || (operPtr[-2] == 22))
|
if ((operPtr[-2] == OP_LOAD_IMM_INT16) || (operPtr[-2] == OP_LOAD_IMM_STR))
|
||||||
valPtr[-2] = valPtr[-1];
|
valPtr[-2] = valPtr[-1];
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
|
@ -739,14 +739,14 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
|
||||||
if (stkPos > 1) {
|
if (stkPos > 1) {
|
||||||
if (operPtr[-2] == 1) {
|
if (operPtr[-2] == OP_NEG) {
|
||||||
operPtr[-2] = 20;
|
operPtr[-2] = OP_LOAD_IMM_INT16;
|
||||||
valPtr[-2] = -valPtr[-1];
|
valPtr[-2] = -valPtr[-1];
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
} else if (operPtr[-2] == 11) {
|
} else if (operPtr[-2] == OP_NOT) {
|
||||||
operPtr[-2] = (operPtr[-1] == 23) ? 24 : 23;
|
operPtr[-2] = (operPtr[-1] == GOB_FALSE) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
valPtr--;
|
valPtr--;
|
||||||
|
@ -787,23 +787,23 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
|
|
||||||
if (operation != stopToken)
|
if (operation != stopToken)
|
||||||
break;
|
break;
|
||||||
} // if ((operPtr[-2] == 9) && ...)
|
} // if ((operPtr[-2] == OP_BEGIN_EXPR) && ...)
|
||||||
|
|
||||||
for (brackStart = (stkPos - 2); (brackStart > 0) &&
|
for (brackStart = (stkPos - 2); (brackStart > 0) &&
|
||||||
(operStack[brackStart] < 30) && (operStack[brackStart] != 9);
|
(operStack[brackStart] < OP_OR) && (operStack[brackStart] != OP_BEGIN_EXPR);
|
||||||
brackStart--)
|
brackStart--)
|
||||||
;
|
;
|
||||||
|
|
||||||
if ((operStack[brackStart] >= 30) || (operStack[brackStart] == 9))
|
if ((operStack[brackStart] >= OP_OR) || (operStack[brackStart] == OP_BEGIN_EXPR))
|
||||||
brackStart++;
|
brackStart++;
|
||||||
|
|
||||||
int cmpTemp;
|
int cmpTemp;
|
||||||
|
|
||||||
switch (operPtr[-2]) {
|
switch (operPtr[-2]) {
|
||||||
case OP_ADD:
|
case OP_ADD:
|
||||||
if (operStack[brackStart] == 20) {
|
if (operStack[brackStart] == OP_LOAD_IMM_INT16) {
|
||||||
values[brackStart] += valPtr[-1];
|
values[brackStart] += valPtr[-1];
|
||||||
} else if (operStack[brackStart] == 22) {
|
} else if (operStack[brackStart] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(values[brackStart]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(values[brackStart]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[brackStart]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[brackStart]));
|
||||||
values[brackStart] =
|
values[brackStart] =
|
||||||
|
@ -858,61 +858,65 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 30:
|
case OP_OR:
|
||||||
if (operPtr[-3] == 23)
|
// (x OR false) == x
|
||||||
|
// (x OR true) == true
|
||||||
|
if (operPtr[-3] == GOB_FALSE)
|
||||||
operPtr[-3] = operPtr[-1];
|
operPtr[-3] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 31:
|
case OP_AND:
|
||||||
if (operPtr[-3] == 24)
|
// (x AND false) == false
|
||||||
|
// (x AND true) == x
|
||||||
|
if (operPtr[-3] == GOB_TRUE)
|
||||||
operPtr[-3] = operPtr[-1];
|
operPtr[-3] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case OP_LESS:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) < 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) < 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 33:
|
case OP_LEQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) <= 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) <= 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 34:
|
case OP_GREATER:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) > 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) > 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 35:
|
case OP_GEQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) >= 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) >= 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36:
|
case OP_EQ:
|
||||||
operPtr[-3] = (cmpHelper(operPtr, valPtr) == 0) ? 24 : 23;
|
operPtr[-3] = (cmpHelper(operPtr, valPtr) == 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37:
|
case OP_NEQ:
|
||||||
if (operPtr[-3] == 20) {
|
if (operPtr[-3] == OP_LOAD_IMM_INT16) {
|
||||||
cmpTemp = valPtr[-3] - valPtr[-1];
|
cmpTemp = valPtr[-3] - valPtr[-1];
|
||||||
} else if (operPtr[-3] == 22) {
|
} else if (operPtr[-3] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
||||||
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
@ -920,8 +924,8 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
// FIXME: Why scumm_stricmp here and strcmp everywhere else?
|
// FIXME: Why scumm_stricmp here and strcmp everywhere else?
|
||||||
cmpTemp = scumm_stricmp(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-1]));
|
cmpTemp = scumm_stricmp(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-1]));
|
||||||
}
|
}
|
||||||
operPtr[-3] = (cmpTemp != 0) ? 24 : 23;
|
operPtr[-3] = (cmpTemp != 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
//operPtr[-3] = (cmpHelper(operPtr, valPtr) != 0) ? 24 : 23;
|
//operPtr[-3] = (cmpHelper(operPtr, valPtr) != 0) ? GOB_TRUE : GOB_FALSE;
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
operPtr -= 2;
|
operPtr -= 2;
|
||||||
valPtr -= 2;
|
valPtr -= 2;
|
||||||
|
@ -936,17 +940,17 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
break;
|
break;
|
||||||
} // while (stkPos >= 2)
|
} // while (stkPos >= 2)
|
||||||
|
|
||||||
if ((operation == 30) || (operation == 31)) {
|
if ((operation == OP_OR) || (operation == OP_AND)) {
|
||||||
if (operPtr[-1] == 20) {
|
if (operPtr[-1] == OP_LOAD_IMM_INT16) {
|
||||||
if (valPtr[-1] != 0)
|
if (valPtr[-1] != 0)
|
||||||
operPtr[-1] = 24;
|
operPtr[-1] = GOB_TRUE;
|
||||||
else
|
else
|
||||||
operPtr[-1] = 23;
|
operPtr[-1] = GOB_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((operation == 30) && (operPtr[-1] == 24)) ||
|
if (((operation == OP_OR) && (operPtr[-1] == GOB_TRUE)) ||
|
||||||
((operation == 31) && (operPtr[-1] == 23))) {
|
((operation == OP_AND) && (operPtr[-1] == GOB_FALSE))) {
|
||||||
if ((stkPos > 1) && (operPtr[-2] == 9)) {
|
if ((stkPos > 1) && (operPtr[-2] == OP_BEGIN_EXPR)) {
|
||||||
skipExpr(10);
|
skipExpr(10);
|
||||||
operPtr[-2] = operPtr[-1];
|
operPtr[-2] = operPtr[-1];
|
||||||
stkPos -= 2;
|
stkPos -= 2;
|
||||||
|
@ -956,11 +960,11 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
skipExpr(stopToken);
|
skipExpr(stopToken);
|
||||||
}
|
}
|
||||||
operation = _vm->_global->_inter_execPtr[-1];
|
operation = _vm->_global->_inter_execPtr[-1];
|
||||||
if ((stkPos > 0) && (operPtr[-1] == 11)) {
|
if ((stkPos > 0) && (operPtr[-1] == OP_NOT)) {
|
||||||
if (operPtr[0] == 23)
|
if (operPtr[0] == GOB_FALSE)
|
||||||
operPtr[-1] = 24;
|
operPtr[-1] = GOB_TRUE;
|
||||||
else
|
else
|
||||||
operPtr[-1] = 23;
|
operPtr[-1] = GOB_FALSE;
|
||||||
|
|
||||||
stkPos--;
|
stkPos--;
|
||||||
operPtr--;
|
operPtr--;
|
||||||
|
@ -981,16 +985,16 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
*arg_2 = operStack[0];
|
*arg_2 = operStack[0];
|
||||||
|
|
||||||
switch (operStack[0]) {
|
switch (operStack[0]) {
|
||||||
case 11:
|
case OP_NOT:
|
||||||
if (arg_2 != 0)
|
if (arg_2 != 0)
|
||||||
*arg_2 ^= 1;
|
*arg_2 ^= 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case OP_LOAD_IMM_INT16:
|
||||||
_vm->_global->_inter_resVal = values[0];
|
_vm->_global->_inter_resVal = values[0];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 22:
|
case OP_LOAD_IMM_STR:
|
||||||
if ((char *) decodePtr(values[0]) != _vm->_global->_inter_resStr)
|
if ((char *) decodePtr(values[0]) != _vm->_global->_inter_resStr)
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[0]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(values[0]));
|
||||||
break;
|
break;
|
||||||
|
@ -1002,21 +1006,21 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||||
default:
|
default:
|
||||||
_vm->_global->_inter_resVal = 0;
|
_vm->_global->_inter_resVal = 0;
|
||||||
if (arg_2 != 0)
|
if (arg_2 != 0)
|
||||||
*arg_2 = 20;
|
*arg_2 = OP_LOAD_IMM_INT16;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} // (operation == stopToken) || (operation == 30) || (operation == 31) || (operation == 10)
|
} // (operation == stopToken) || (operation == OP_OR) || (operation == OP_AND) || (operation == OP_END_EXPR)
|
||||||
|
|
||||||
if ((operation < 1) || (operation > 11)) {
|
if ((operation < OP_NEG) || (operation > OP_NOT)) {
|
||||||
if ((operation < 32) || (operation > 37))
|
if ((operation < OP_LESS) || (operation > OP_NEQ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (stkPos > 2) {
|
if (stkPos > 2) {
|
||||||
if (operPtr[-2] == OP_ADD) {
|
if (operPtr[-2] == OP_ADD) {
|
||||||
if (operPtr[-3] == 20) {
|
if (operPtr[-3] == OP_LOAD_IMM_INT16) {
|
||||||
valPtr[-3] += valPtr[-1];
|
valPtr[-3] += valPtr[-1];
|
||||||
} else if (operPtr[-3] == 22) {
|
} else if (operPtr[-3] == OP_LOAD_IMM_STR) {
|
||||||
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
if ((char *) decodePtr(valPtr[-3]) != _vm->_global->_inter_resStr) {
|
||||||
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
strcpy(_vm->_global->_inter_resStr, (char *) decodePtr(valPtr[-3]));
|
||||||
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
valPtr[-3] = encodePtr((byte *) _vm->_global->_inter_resStr, kResStr);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue