aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-06-10 22:20:29 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-06-10 22:20:29 +0200
commite4d7ac43458f9f96a15041d35feddecca20ddbba (patch)
tree6a53aae985fb4274313a0d44d979bace275b4373
parent808a9e6159cd9dcd501f8256430fe55d6e2de6ce (diff)
kiss
-rw-r--r--eval.go59
-rw-r--r--parse.go19
2 files changed, 48 insertions, 30 deletions
diff --git a/eval.go b/eval.go
index 6049d4d..387e993 100644
--- a/eval.go
+++ b/eval.go
@@ -56,7 +56,7 @@ func (vm *J1) LoadFile(fname string) error {
// Eval evaluates content of memory
func (vm *J1) Eval() {
- ticker := time.NewTicker(time.Second / 5)
+ ticker := time.NewTicker(time.Second / 10)
defer ticker.Stop()
for range ticker.C {
ins := Decode(vm.memory[vm.pc])
@@ -64,57 +64,56 @@ func (vm *J1) Eval() {
break
}
vm.eval(ins)
- fmt.Printf("%-30s%s\n", ins, vm)
+ var rstack [32]uint16
+ for i, v := range vm.rstack {
+ rstack[i] = v << 1
+ }
+ fmt.Printf("%v\n", ins)
+ fmt.Printf("\tPC=%0.4X ST=%0.4X\n", vm.pc<<1, vm.st0)
+ fmt.Printf("\tD=%0.4X\n", vm.dstack[:vm.dsp+1])
+ fmt.Printf("\tR=%0.4X\n", rstack[:vm.rsp+1])
}
}
func (vm *J1) eval(ins Instruction) {
- dsp := vm.dsp
- pc := vm.pc + 1
- st0 := vm.st0
- rsp := vm.rsp
-
switch v := ins.(type) {
case Lit:
- st0 = uint16(v)
- dsp = vm.dsp + 1
- vm.dstack[dsp] = vm.st0
+ vm.pc++
+ vm.dsp++
+ vm.dstack[vm.dsp] = vm.st0
+ vm.st0 = uint16(v)
case Jump:
- st0 = vm.st0 // T
- pc = uint16(v)
+ vm.pc = uint16(v)
case Call:
- st0 = vm.st0 // T
- rsp = vm.rsp + 1
- vm.rstack[rsp] = pc
- pc = uint16(v)
+ vm.rsp++
+ vm.rstack[vm.rsp] = vm.pc + 1
+ vm.pc = uint16(v)
case Cond:
- st0 = vm.dstack[vm.dsp] // N
- dsp = vm.dsp - 1
+ vm.pc++
if vm.st0 == 0 {
- pc = uint16(v)
+ vm.pc = uint16(v)
}
+ vm.st0 = vm.dstack[vm.dsp] // N
+ vm.dsp--
case ALU:
- st0 = vm.newST0(v)
+ st0 := vm.newST0(v)
+ vm.pc++
if v.RtoPC {
- pc = vm.rstack[vm.rsp]
+ vm.pc = vm.rstack[vm.rsp]
}
if v.NtoAtT {
vm.memory[vm.st0] = vm.dstack[vm.dsp]
}
- dsp = uint16(int8(vm.dsp) + v.Ddir)
- rsp = uint16(int8(vm.rsp) + v.Rdir)
+ vm.dsp = uint16(int8(vm.dsp) + v.Ddir)
+ vm.rsp = uint16(int8(vm.rsp) + v.Rdir)
if v.TtoR {
- vm.rstack[rsp] = vm.st0
+ vm.rstack[vm.rsp] = vm.st0
}
if v.TtoN {
- vm.dstack[dsp] = vm.st0
+ vm.dstack[vm.dsp] = vm.st0
}
+ vm.st0 = st0
}
-
- vm.dsp = dsp
- vm.pc = pc
- vm.st0 = st0
- vm.rsp = rsp
}
func (vm *J1) newST0(v ALU) uint16 {
diff --git a/parse.go b/parse.go
index 97d1c24..2e66b26 100644
--- a/parse.go
+++ b/parse.go
@@ -84,6 +84,25 @@ func expand(v uint16) int8 {
return int8(v)
}
+const (
+ opT = iota
+ opN
+ opTplusN
+ opTandN
+ opTorN
+ opTxorN
+ opNotT
+ opNeqT
+ opNleT
+ opNrshiftT
+ opTminus1
+ opR
+ opAtT
+ opNlshiftT
+ opDepth
+ opNuleT
+)
+
var opcodes = []string{
"T", "N", "T+N", "T&N", "T|N", "T^N", "~T", "N==T",
"N<T", "N>>T", "T-1", "R", "[T]", "N<<T", "depth", "Nu<T",