vm_eof:
;load stack[sp-1]
- ldw r0, 0-4(r3);
+ ;ldw r0, 0-4(r3);
+ pop r0
ret+;
;case *
;42
vm_mul:
;decrement sp
- subi r3, r3, 4
+ ;subi r3, r3, 4
;load sp
- ldw r6, 0(r3)
+ ;ldw r6, 0(r3)
+ pop r6
;load sp-1
- ldw r7, 0-4(r3)
+ ;ldw r7, 0-4(r3)
+ pop r7
;return init
ldis r8, 0
;jump if not zero
brnz+ loop
;save result
- stw r8, 0-4(r3)
+ ;stw r8, 0-4(r3)
+ push r8
br+ vm_loop
;case +
;43
vm_add:
;decrement sp
- subi r3, r3, 4
+ ;subi r3, r3, 4
;load sp
- ldw r6, 0(r3)
+ ;ldw r6, 0(r3)
+ pop r6
;load sp-1
- ldw r7, 0-4(r3)
+ ;ldw r7, 0-4(r3)
+ pop r7
;sp-1 = sp-1 + sp
add r7, r7, r6
;store sp-1
- stw r7, 0-4(r3)
+ ;stw r7, 0-4(r3)
+ push r7
br+ vm_loop
;case -
;45
vm_sub:
;decrement sp
- subi r3, r3, 4
+ ;subi r3, r3, 4
;load sp
- ldw r6, 0(r3)
+ ;ldw r6, 0(r3)
+ pop r6
;load sp-1
- ldw r7, 0-4(r3)
+ ;ldw r7, 0-4(r3)
+ pop r7
;sp-1 = sp-1 - sp
sub r7, r7, r6
;store sp-1
- stw r7, 0-4(r3)
+ ;stw r7, 0-4(r3)
+ push r7
br+ vm_loop
;case 0 1 2 3 4 5 6 7 8 9
;input minus offset
subi r6, r5, 48
;store onto stack
- stw r6, 0(r3)
+ ;stw r6, 0(r3)
+ push r6
;increment stack addr
- addi r3, r3, 4
+ ;addi r3, r3, 4
br+ vm_loop
;case <
;60
vm_lessthan:
;decrement sp
- subi r3, r3, 4
+ ;subi r3, r3, 4
;load sp
- ldw r6, 0(r3)
+ ;ldw r6, 0(r3)
+ pop r6
;load sp-1
- ldw r7, 0-4(r3)
+ ;ldw r7, 0-4(r3)
+ pop r7
;load r8 with 0
ldis r8, 0
;compare sp-1 with sp
;set r8 to -1 if less than
ldislt r8, 0xFF
;store r8 to sp-1
- stw r8, 0-4(r3)
+ ;stw r8, 0-4(r3)
+ push r8
br+ vm_loop
;case D
;68
vm_dup:
;load sp-1
- ldw r6, 0-4(r3)
+ ;ldw r6, 0-4(r3)
+ fetch r6
;store to sp
- stw r6, 0(r3)
+ ;stw r6, 0(r3)
+ push r6
;increment stack addr
- addi r3, r3, 4
+ ;addi r3, r3, 4
br+ vm_loop
;case I
;add
add r6, r6, r7
;store result to stack
- stw r6, 0(r3)
+ ;stw r6, 0(r3)
+ push r6
;pc+4
addi r1, r1, 4
;increment sp
- addi r3, r3, 4
+ ;addi r3, r3, 4
br+ vm_loop
;case J
;74
vm_jmp:
;decrement sp
- subi r3, r3, 4
+ ;subi r3, r3, 4
;load sp
- ldw r6, 0(r3)
+ ;ldw r6, 0(r3)
+ pop r6
;compare to 0
cmpi r6,0
;increment pc if == 0
;80
vm_pop:
;decrement stack addr
- subi r3, r3, 4
+ ;subi r3, r3, 4
+ disc r0
br+ vm_loop
;case X
;88
vm_xch:
;load sp-1
- ldw r6, 0-4(r3)
+ ;ldw r6, 0-4(r3)
+ pop r6
;load sp-2
- ldw r7, 0-8(r3)
+ ;ldw r7, 0-8(r3)
+ pop r7
;store sp-1 to sp-2
- stw r6, 0-8(r3)
+ ;stw r6, 0-8(r3)
+ push r6
;store sp-2 to sp-1
- stw r7, 0-4(r3)
+ ;stw r7, 0-4(r3)
+ push r7
br+ vm_loop
;case ~
;126
vm_not:
- ldw r6, 0-4(r3)
+ ;ldw r6, 0-4(r3)
+ pop r6
not r6
- stw r6, 0-4(r3)
+ ;stw r6, 0-4(r3)
+ push r6
br+ vm_loop
.data