From 72103d06b5f2ef5670c029ed50a99525375dd62f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 28 May 2017 14:42:11 +0200 Subject: ... --- eval.go | 32 ++++++++++++++++++++------------ main.go | 8 +++----- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/eval.go b/eval.go index 9044f53..739cc1e 100644 --- a/eval.go +++ b/eval.go @@ -24,7 +24,7 @@ func (vm *J1) String() string { return s } -func (vm *J1) ReadFile(fname string) error { +func (vm *J1) LoadFile(fname string) error { fd, err := os.Open(fname) if err != nil { return err @@ -44,43 +44,51 @@ func (vm *J1) ReadFile(fname string) error { func (vm *J1) Eval() { ins := Decode(vm.memory[vm.pc]) + next := vm.pc + 1 switch v := ins.(type) { case Lit: + vm.st0 = uint16(v) vm.dstack[vm.dsp] = vm.st0 vm.dsp += 1 - vm.st0 = uint16(v) - vm.pc += 1 fmt.Println(v) case Jump: - vm.pc = uint16(v) + next = uint16(v) fmt.Println(v) case Cond: - vm.pc = uint16(v) + if vm.st0 == 0 { + next = uint16(v) + } + vm.dsp -= 1 fmt.Println(v) case Call: - vm.rstack[vm.rsp] = vm.pc + 1 + vm.rstack[vm.rsp] = next vm.rsp += 1 - vm.pc = uint16(v) + next = uint16(v) fmt.Println(v) case ALU: - vm.st0 = vm.ST0(v) + vm.st0 = vm.newST0(v) vm.dsp = uint16(int8(vm.dsp) + v.Ddir) vm.rsp = uint16(int8(vm.rsp) + v.Rdir) if v.RtoPC { - vm.pc = vm.R() - } else { - vm.pc += 1 + next = vm.R() + } + if v.NtoAtT { + vm.memory[vm.T()] = vm.N() + } + if v.TtoR { + vm.rstack[vm.rsp] = vm.T() } fmt.Println(v) } fmt.Println(vm) + vm.pc = next } 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) ST0(v ALU) uint16 { +func (vm *J1) newST0(v ALU) uint16 { T := vm.T() N := vm.N() R := vm.R() diff --git a/main.go b/main.go index cf41fd4..be6d1d8 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,13 @@ package main -import ( - "fmt" -) +import "fmt" func main() { vm := new(J1) - if err := vm.ReadFile("testdata/j1.bin"); err != nil { + if err := vm.LoadFile("testdata/j1.bin"); err != nil { panic(err) } - for i := 0; i < 10; i++ { + for i := 0; i < 100; i++ { vm.Eval() } } -- cgit v1.2.3