|
@@ -285,6 +285,20 @@ static void sNot(Script* sc) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void sAnd(Script* sc) {
|
|
|
+ Object o[2];
|
|
|
+ if(!sPop(sc, o) && !sPop(sc, o + 1) && sCheckType(sc, o, OT_BOOL) && sCheckType(sc, o + 1, OT_BOOL)) {
|
|
|
+ sPushBool(sc, o[0].data.intValue && o[1].data.intValue);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void sOr(Script* sc) {
|
|
|
+ Object o[2];
|
|
|
+ if(!sPop(sc, o) && !sPop(sc, o + 1) && sCheckType(sc, o, OT_BOOL) && sCheckType(sc, o + 1, OT_BOOL)) {
|
|
|
+ sPushBool(sc, o[0].data.intValue || o[1].data.intValue);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void sPrint(Script* sc) {
|
|
|
Object o;
|
|
|
if(!sPop(sc, &o) && printer(&o)) {
|
|
@@ -342,6 +356,13 @@ static void sReturn(Script* sc) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void sDuplicate(Script* sc) {
|
|
|
+ Object* o = sPeek(sc);
|
|
|
+ if(o != NULL) {
|
|
|
+ sPush(sc, o);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void sConsumeInstruction(Script* sc) {
|
|
|
switch(sReadOperation(sc)) {
|
|
|
case OP_NOTHING: break;
|
|
@@ -364,6 +385,8 @@ static void sConsumeInstruction(Script* sc) {
|
|
|
case OP_GREATER: sBoolBinary(sc, sIntGreater, sFloatGreater); break;
|
|
|
case OP_EQUAL: sEqual(sc); break;
|
|
|
case OP_NOT: sNot(sc); break;
|
|
|
+ case OP_AND: sAnd(sc); break;
|
|
|
+ case OP_OR: sOr(sc); break;
|
|
|
case OP_PRINT: sPrint(sc); break;
|
|
|
case OP_LINE: sLine(sc); break;
|
|
|
case OP_GOTO: sGoTo(sc); break;
|
|
@@ -371,6 +394,7 @@ static void sConsumeInstruction(Script* sc) {
|
|
|
case OP_IF_GOTO: sIfGoTo(sc); break;
|
|
|
case OP_SET_RETURN: sSetReturn(sc); break;
|
|
|
case OP_RETURN: sReturn(sc); break;
|
|
|
+ case OP_DUPLICATE: sDuplicate(sc); break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -461,6 +485,8 @@ void sPrintCode(Script* sc) {
|
|
|
case OP_GREATER: puts("Greater"); break;
|
|
|
case OP_EQUAL: puts("Equal"); break;
|
|
|
case OP_NOT: puts("Not"); break;
|
|
|
+ case OP_AND: puts("And"); break;
|
|
|
+ case OP_OR: puts("And"); break;
|
|
|
case OP_PRINT: puts("Print"); break;
|
|
|
case OP_LINE: sPrintInt16(sc, "------------ Line"); break;
|
|
|
case OP_GOTO: sPrintInt(sc, "GoTo"); break;
|
|
@@ -468,6 +494,7 @@ void sPrintCode(Script* sc) {
|
|
|
case OP_IF_GOTO: sPrintInt(sc, "If GoTo"); break;
|
|
|
case OP_SET_RETURN: puts("Set Return"); break;
|
|
|
case OP_RETURN: puts("Return"); break;
|
|
|
+ case OP_DUPLICATE: puts("Duplicate"); break;
|
|
|
}
|
|
|
}
|
|
|
sc->readIndex = oldRead;
|