[bench] vm: now working correct
[calu.git] / 8_benchs / src / vm.s
index a16b5b947810436e8b85eb46d1c811209f308a35..bcb2a03a7ab1c1c7e479ad9717ff95e39e05b2f4 100644 (file)
@@ -1,24 +1,24 @@
 .data
 .org 0x10
 inputdata:
-;4 8 * 8
-.fill 1, 0x34382A38
-;8 * X 1
-.fill 1, 0x382A5831
-;- X D +
-.fill 1, 0x2D58442B
-;D J \xF8 P
-.fill 1, 0x444AF850
-;6 8 * +
-.fill 1, 0x36382A2B
-;D I \020 \000
-.fill 1, 0x44492000
-;\000 \000 < ~
-.fill 1, 0x00003C7E
-;J \005 P 8
-.fill 1, 0x4A055038
-;8 *
-.fill 1, 0x382A
+;8 * 8 4
+.fill 1, 0x382A3834
+;1 X * 8
+.fill 1, 0x31582A38
+;+ D X -
+.fill 1, 0x2B44582D
+;P \xF8 J D
+.fill 1, 0x50F84A44
+;+ * 8 6
+.fill 1, 0x2B2A3836
+;\000 \020 I D
+.fill 1, 0x00204944
+;~ < \000 \000
+.fill 1, 0x7E3C0000
+;8 P \005 J
+.fill 1, 0x3850054A
+;* 8
+.fill 1, 0x2A38
 
 stack:
 .fill 256, 0
@@ -26,10 +26,14 @@ stack:
 .text
 main:
        ldi r1, inputdata
+
+       ldw r0, 0(r2)
+
        call+ vm
        br+ main
 
 vm:
+       ;r0 ... lut address (can be overwritten)
        ;r1 ... addr to input
        ;r2 ... pc
        ;r3 ... effective stack address
@@ -48,9 +52,13 @@ vm_loop:
        ;generate effective input addr
        add r4, r1, r2
        ;load input
-       ldw r5, 0(r4)
+       ldb r5, 0(r4)
+       ;we need to multiply input by 4 to get correct address offset
+       lls r0, r5, 2
+       ;calc position in jumptable
+       ldw r0, jumptable(r0)
        ;jump to instr
-       brr r5
+       brr r0
 
 vm_eof:
        ;load stack[sp-1]
@@ -70,7 +78,7 @@ vm_mul:
        ;return init
        ldis r8, 0  
        ;save of sp-1
-       mov r7, r0
+       mov r0, r7
        ;check if sp-1 is even or odd
        andx r0, 1
        ;add sp to result
@@ -167,29 +175,31 @@ vm_dup:
 ;73
 vm_imm:
        ;load new high byte
-       ldb r6, 4(r2)
+       ldb r6, 4(r4)
        ;shift high byte
        lls r6, r6, 8
        ;load 2nd byte
-       ldb r7, 3(r2)
+       ldb r7, 3(r4)
        ;add to high byte
        add r6, r6, r7
        ;shift
        lls r6, r6, 8
        ;load
-       ldb r7, 2(r2)
+       ldb r7, 2(r4)
        ;add
        add r6, r6, r7
        ;shift
        lls r6, r6, 8
        ;load
-       ldb r7, 1(r2)
+       ldb r7, 1(r4)
        ;add
        add r6, r6, r7
        ;store result to stack
        stw r6, 0(r3)
        ;pc+4
        addi r2, r2, 4
+       ;increment sp
+       addi r3, r3, 4
        br+ vm_loop
 
 ;case J
@@ -202,11 +212,19 @@ vm_jmp:
        ;compare to 0
        cmpi r6,0
        ;increment pc if == 0
-       addideq r2, r2, 4
-       brnq+ vm_loop
+       addideq r2, r2, 1
+       breq+ vm_loop
        ;if != 0
+       ;set r6 to 0 (to clear upper bytes)
+       ldis r6, 0
        ;load pc+1 input
        ldb r6, 1(r4)
+       ;compare input with neg. max of 8 bit
+       cmpi r6, 0x80
+       brlt- vm_possign
+       ldis r7, 0xFF00
+       add r6, r6, r7
+vm_possign:
        ;pc += data
        add r2, r2, r6
        br+ vm_loop
@@ -242,8 +260,8 @@ vm_not:
 .data
 jumptable:
 ;0
-.fill 0, vm_eof
-.fill 40, vm_default
+.fill 1, vm_eof
+.fill 41, vm_default
 ;42
 .fill 1, vm_mul
 ;43
@@ -278,8 +296,8 @@ jumptable:
 .fill 7, vm_default
 ;88
 .fill 1, vm_xch
-;88-125
-.fill 40, vm_default
+;89-125
+.fill 37, vm_default
 ;126
 .fill 1, vm_not
 ;127-255