|
@@ -285,6 +285,20 @@ static void sIntArray(Script* sc) {
|
|
(void)sc;
|
|
(void)sc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void sVarRef(Script* sc) {
|
|
|
|
+ int address = 0;
|
|
|
|
+ if(sReadInt(sc, &address)) {
|
|
|
|
+ sPushInt(sc, address + sc->stackVarIndex);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void sLoadIntRef(Script* sc) {
|
|
|
|
+ int address = 0;
|
|
|
|
+ if(sPopInt(sc, &address) && sCheckAddress(sc, address, sizeof(int))) {
|
|
|
|
+ sPush(sc, sc->stack + address, sizeof(int));
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#define CASE_NUMBER_OP(name, op) \
|
|
#define CASE_NUMBER_OP(name, op) \
|
|
case OP_##name##_INT: NUMBER_OP(int, Int, op); break; \
|
|
case OP_##name##_INT: NUMBER_OP(int, Int, op); break; \
|
|
case OP_##name##_FLOAT: \
|
|
case OP_##name##_FLOAT: \
|
|
@@ -312,6 +326,7 @@ static void sConsumeInstruction(Script* sc) {
|
|
CASE_TYPE(INT, Int, int);
|
|
CASE_TYPE(INT, Int, int);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(BOOL, Bool, bool);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
CASE_TYPE(FLOAT, Float, float);
|
|
|
|
+ case OP_LOAD_INT_REF: sLoadIntRef(sc); break;
|
|
case OP_NOTHING: break;
|
|
case OP_NOTHING: break;
|
|
case OP_PUSH_INT: PUSH_CONSTANT(int, Int); break;
|
|
case OP_PUSH_INT: PUSH_CONSTANT(int, Int); break;
|
|
case OP_PUSH_FLOAT: PUSH_CONSTANT(float, Float); break;
|
|
case OP_PUSH_FLOAT: PUSH_CONSTANT(float, Float); break;
|
|
@@ -339,6 +354,7 @@ static void sConsumeInstruction(Script* sc) {
|
|
case OP_GOSUB: sGoSub(sc); break;
|
|
case OP_GOSUB: sGoSub(sc); break;
|
|
case OP_RETURN: sReturn(sc); break;
|
|
case OP_RETURN: sReturn(sc); break;
|
|
case OP_RESERVE: sReserveBytes(sc); break;
|
|
case OP_RESERVE: sReserveBytes(sc); break;
|
|
|
|
+ case OP_VAR_REF: sVarRef(sc); break;
|
|
case OP_INT_ARRAY: sIntArray(sc); break;
|
|
case OP_INT_ARRAY: sIntArray(sc); break;
|
|
case OP_STORE_ARRAY: sStore(sc, sizeof(int)); break;
|
|
case OP_STORE_ARRAY: sStore(sc, sizeof(int)); break;
|
|
}
|
|
}
|