aboutsummaryrefslogtreecommitdiff
path: root/eval.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-06-03 10:00:53 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-06-03 10:00:53 +0200
commitf03df4c2d32b34a2f1ed65ce554995cb35f5b9ef (patch)
treeaa2e9e90b593ec4118a28f48f19c2d7af40188e7 /eval.go
parent391a4ce2abbfee2a429ff23836ad66d084f20030 (diff)
...
Diffstat (limited to 'eval.go')
-rw-r--r--eval.go48
1 files changed, 24 insertions, 24 deletions
diff --git a/eval.go b/eval.go
index d0f88c5..dea1094 100644
--- a/eval.go
+++ b/eval.go
@@ -43,58 +43,58 @@ func (vm *J1) LoadFile(fname string) error {
}
func (vm *J1) Eval() {
- ins := Decode(vm.memory[vm.pc])
+ for {
+ ins := Decode(vm.memory[vm.pc])
+ if ins == Jump(0) {
+ break
+ }
+ vm.eval(ins)
+ }
+}
+
+func (vm *J1) eval(ins Instruction) {
next := vm.pc + 1
switch v := ins.(type) {
case Lit:
vm.st0 = uint16(v)
vm.dstack[vm.dsp] = vm.st0
vm.dsp += 1
- fmt.Println(v)
case Jump:
- vm.st0 = vm.T()
next = uint16(v)
- fmt.Println(v)
case Cond:
if vm.st0 == 0 {
next = uint16(v)
}
- vm.st0 = vm.N()
+ vm.st0 = vm.dstack[vm.dsp]
vm.dsp -= 1
- fmt.Println(v)
case Call:
- vm.st0 = vm.T()
vm.rstack[vm.rsp] = next
vm.rsp += 1
next = uint16(v)
- fmt.Println(v)
case ALU:
vm.st0 = vm.newST0(v)
- vm.dsp = uint16(int8(vm.dsp) + v.Ddir)
- vm.rsp = uint16(int8(vm.rsp) + v.Rdir)
- if v.RtoPC {
- next = vm.R()
- }
if v.NtoAtT {
- vm.memory[vm.T()] = vm.N()
+ vm.memory[vm.st0] = vm.dstack[vm.dsp]
}
if v.TtoR {
- vm.rstack[vm.rsp] = vm.T()
+ vm.rstack[vm.rsp] = vm.st0
+ }
+ if v.TtoN {
+ vm.dstack[vm.dsp] = vm.st0
+ }
+ vm.dsp = uint16(int8(vm.dsp) + v.Ddir)
+ vm.rsp = uint16(int8(vm.rsp) + v.Rdir)
+ if v.RtoPC {
+ next = vm.rstack[vm.rsp]
}
- fmt.Println(v)
}
- fmt.Println(vm)
vm.pc = next
+ fmt.Println(ins)
+ fmt.Println(vm)
}
-func (vm *J1) T() uint16 { return vm.st0 }
-func (vm *J1) N() uint16 { return vm.dstack[vm.dsp] }
-func (vm *J1) R() uint16 { return vm.rstack[vm.rsp] }
-
func (vm *J1) newST0(v ALU) uint16 {
- T := vm.T()
- N := vm.N()
- R := vm.R()
+ T, N, R := vm.st0, vm.dstack[vm.dsp], vm.rstack[vm.rsp]
switch v.Opcode {
case 0: // T
return T