[bench] bugfixes, more to come ...
[calu.git] / 8_benchs / src / vm.s
index bd8a316920a67026ee2db7a30404571e4eff03f3..3d17099d81be8c54e3856009d1403c592c75b70e 100644 (file)
@@ -1,61 +1,39 @@
 .data
 .org 0x10
 inputdata:
-.fill 
+;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
-jumptable:
-;0
-.fill 0, vm_eof
-.fill 40, vm_default
-;42
-.fill 1, vm_mul
-;43
-.fill 1, vm_add
-;44
-.fill 1, vm_default
-;45
-.fill 1, vm_sub
-;46-47
-.fill 2, vm_default
-;48-57
-.fill 10, vm_consts
-;58-59
-.fill 2, vm_default
-;60
-.fill 1, vm_lessthan
-;61-67
-.fill 7, vm_default
-;68
-.fill 1, vm_dup
-;69-72
-.fill 4, vm_default
-;73
-.fill 1, vm_imm
-;74
-.fill 1, vm_jmp
-;75-79
-.fill 5, vm_default
-;80
-.fill 1, vm_pop
-;81-87
-.fill 7, vm_default
-;88
-.fill 1, vm_xch
-;88-125
-.fill 40, vm_default
-;126
-.fill 1, vm_not
-;127-255
-.fill 129, vm_default
 
 .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
@@ -74,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]
@@ -86,6 +68,36 @@ vm_eof:
 ;case *
 ;42
 vm_mul:
+       ;decrement sp
+       subi r3, r3, 4
+       ;load sp
+       ldw r6, 0(r3)
+       ;load sp-1
+       ldw r7, 0-4(r3)
+
+       ;return init
+       ldis r8, 0  
+       ;save of sp-1
+       mov r0, r7
+       ;check if sp-1 is even or odd
+       andx r0, 1
+       ;add sp to result
+       adddnz r8, r8, r6
+       ;if odd decrement sp-1
+       subinz r7, r7, 1
+       ;just to get zero flag unset
+       addizs r7, r7, 0
+loop:
+       ;if last was not zero
+       ;add to sp-1 to result
+       adddnz r8, r8, r6
+       adddnz r8, r8, r6
+       ;decrement sp-1 by 2
+       subi r7, r7, 2
+       ;jump if not zero
+       brnz+ loop
+       ;save result
+       stw r8, 0-4(r3)
        br+ vm_loop
 
 ;case +
@@ -118,7 +130,7 @@ vm_sub:
        stw r7, 0-4(r3)
        br+ vm_loop
 
-;case 0 1 2 3 4 5 6 7 8 9 
+;case 0 1 2 3 4 5 6 7 8 9
 ;48-57
 vm_consts:
        ;input minus offset
@@ -147,7 +159,6 @@ vm_lessthan:
        ;store r8 to sp-1
        stw r8, 0-4(r3)
        br+ vm_loop
-       
 
 ;case D
 ;68
@@ -164,23 +175,23 @@ vm_dup:
 ;73
 vm_imm:
        ;load new high byte
-       ldb r6, 4(pc)
+       ldb r6, 4(r2)
        ;shift high byte
        lls r6, r6, 8
        ;load 2nd byte
-       ldb r7, 3(pc)
+       ldb r7, 3(r2)
        ;add to high byte
        add r6, r6, r7
        ;shift
        lls r6, r6, 8
        ;load
-       ldb r7, 2(pc)
+       ldb r7, 2(r2)
        ;add
        add r6, r6, r7
        ;shift
        lls r6, r6, 8
        ;load
-       ldb r7, 1(pc)
+       ldb r7, 1(r2)
        ;add
        add r6, r6, r7
        ;store result to stack
@@ -193,14 +204,14 @@ vm_imm:
 ;74
 vm_jmp:
        ;decrement sp
-       sub r3, r3, 4
+       subi r3, r3, 4
        ;load sp
        ldw r6, 0(r3)
        ;compare to 0
        cmpi r6,0
        ;increment pc if == 0
-       addieqD r2, r2, 4
-       brnq+ vm_loop
+       addideq r2, r2, 1
+       breq+ vm_loop
        ;if != 0
        ;load pc+1 input
        ldb r6, 1(r4)
@@ -236,3 +247,48 @@ vm_not:
        stw r6, 0-4(r3)
        br+ vm_loop
 
+.data
+jumptable:
+;0
+.fill 1, vm_eof
+.fill 41, vm_default
+;42
+.fill 1, vm_mul
+;43
+.fill 1, vm_add
+;44
+.fill 1, vm_default
+;45
+.fill 1, vm_sub
+;46-47
+.fill 2, vm_default
+;48-57
+.fill 10, vm_consts
+;58-59
+.fill 2, vm_default
+;60
+.fill 1, vm_lessthan
+;61-67
+.fill 7, vm_default
+;68
+.fill 1, vm_dup
+;69-72
+.fill 4, vm_default
+;73
+.fill 1, vm_imm
+;74
+.fill 1, vm_jmp
+;75-79
+.fill 5, vm_default
+;80
+.fill 1, vm_pop
+;81-87
+.fill 7, vm_default
+;88
+.fill 1, vm_xch
+;89-125
+.fill 37, vm_default
+;126
+.fill 1, vm_not
+;127-255
+.fill 129, vm_default