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