@@ -35,9 +35,9 @@ #define NOS vm->data[vm->sp-1] #define TORS vm->address[vm->rsp] enum vm_opcode {VM_NOP, VM_LIT, VM_DUP, VM_DROP, VM_SWAP, VM_PUSH, VM_POP, - VM_CALL, VM_JUMP, VM_RETURN, VM_GT_JUMP, VM_LT_JUMP, + VM_LOOP, VM_JUMP, VM_RETURN, VM_GT_JUMP, VM_LT_JUMP, VM_NE_JUMP,VM_EQ_JUMP, VM_FETCH, VM_STORE, VM_ADD, VM_SUB, VM_MUL, VM_DIVMOD, VM_AND, VM_OR, VM_XOR, VM_SHL, VM_SHR, VM_ZERO_EXIT, VM_INC, VM_DEC, VM_IN, VM_OUT, VM_WAIT }; @@ -341,20 +341,19 @@ vm->sp++; TOS = TORS; vm->rsp--; break; - case VM_CALL: - vm->ip++; - vm->rsp++; - TORS = vm->ip; - vm->ip = vm->image[vm->ip] - 1; - if (vm->ip < 0) - vm->ip = IMAGE_SIZE; - else { - if (vm->image[vm->ip+1] == 0) - vm->ip++; - if (vm->image[vm->ip+1] == 0) - vm->ip++; + case VM_LOOP: + TOS--; + if (TOS != 0) + { + vm->ip++; + vm->ip = vm->image[vm->ip] - 1; + } + else + { + vm->ip++; + DROP; } break; case VM_JUMP: vm->ip++;