Not logged in

Differences From Artifact [98aa4733b0a955b6]:

File retro.c part of check-in [720ed8205b] - Updated VM w/support for console dimensions backport from rx.fossil by charleschilders on 2010-08-22 16:20:47. [annotate] [view]

To Artifact [7967054eb32b59b0]:

File retro.c part of check-in [a9a3dd29b3] - Bump image to .19; add VM with updated instruction set. Please rebuild vm! by charleschilders on 2010-09-19 23:08:43. [annotate] [view]


@@ -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++;