.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
-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
+ ;set address of input
+ ldil r1, inputdata@lo
+ ldih r1, inputdata@hi
+
call+ vm
br+ main
vm:
+ ;r0 ... lut address (can be overwritten)
;r1 ... addr to input
;r2 ... pc
;r3 ... effective stack address
;r4 ... effective input addr
;r5 ... input
- ;set pc to -4
+ ;set pc to -1
ldis r2, 0xFFFF
;load base address of stack
- ldi r3, stack
+ ldil r3, stack@lo
+ ldih r3, stack@hi
vm_default:
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]
;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
;store r8 to sp-1
stw r8, 0-4(r3)
br+ vm_loop
-
;case D
;68
;73
vm_imm:
;load new high byte
- ldb r6, 4(pc)
+ ldb r6, 4(r4)
;shift high byte
lls r6, r6, 8
;load 2nd byte
- ldb r7, 3(pc)
+ ldb r7, 3(r4)
;add to high byte
add r6, r6, r7
;shift
lls r6, r6, 8
;load
- ldb r7, 2(pc)
+ ldb r7, 2(r4)
;add
add r6, r6, r7
;shift
lls r6, r6, 8
;load
- ldb r7, 1(pc)
+ 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
;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
+ ;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
not r6
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