aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-05-28 14:42:11 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-05-28 14:42:11 +0200
commit72103d06b5f2ef5670c029ed50a99525375dd62f (patch)
tree369383a131662e252a3ccf17db19b8a444dafb68
parente39bff71cb353c0cc02b9dc054f0cdfcbad4d526 (diff)
...
-rw-r--r--eval.go32
-rw-r--r--main.go8
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()
}
}