aboutsummaryrefslogtreecommitdiff
path: root/eval.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-05-28 10:34:53 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-05-28 10:34:53 +0200
commit6ec387bc871d1d1e274ee2b2c2fd11abb26bef0a (patch)
treea9ef37a2cf2698f5a904e49ca517765e316e9e79 /eval.go
parent659bf1b7963aab64b4d667104ecb6c33521cb72a (diff)
Eval draft
Diffstat (limited to 'eval.go')
-rw-r--r--eval.go172
1 files changed, 96 insertions, 76 deletions
diff --git a/eval.go b/eval.go
index 670a13f..4df2e1f 100644
--- a/eval.go
+++ b/eval.go
@@ -1,5 +1,12 @@
package main
+import (
+ "encoding/binary"
+ "fmt"
+ "io"
+ "os"
+)
+
type J1 struct {
dsp uint16 // 5 bit Data stack pointer
st0 uint16 // 5 bit Return stack pointer
@@ -10,85 +17,98 @@ type J1 struct {
memory [0x8000]uint16
}
-func (vm *J1) Eval() {
- insn := vm.memory[vm.pc]
- immediate := insn & 0x7fff // 0,insn[14:0]
-
- var st0sel uint16
-
- switch insn & 0x6000 { // insn[14:13]
- case 0x0000: // ubranch
- st0sel = 0
- case 0x4000: // call
- st0sel = 0
- case 0x2000: // 0branch
- st0sel = 1
- case 0x6000: // ALU
- st0sel = (insn >> 8) & 0x0f
+func (vm *J1) ReadFile(fname string) error {
+ fd, err := os.Open(fname)
+ if err != nil {
+ return err
}
+ defer fd.Close()
+ stat, err := fd.Stat()
+ if err != nil {
+ return err
+ }
+ size := stat.Size() >> 1
+ err = binary.Read(fd, binary.BigEndian, vm.memory[:size])
+ if err != io.ErrUnexpectedEOF {
+ return err
+ }
+ return nil
+}
- st0 := vm.st0
- st1 := vm.dstack[vm.dsp&0x001f]
- rst0 := vm.rstack[vm.rsp&0x001f]
-
- //is_alu := insn&0xe000 == 0x6000
- is_lit := insn&0x8000 != 0
+func (vm *J1) Eval() {
+ fmt.Printf("PC: %0.4X\n", vm.pc<<1)
+ ins := Decode(vm.memory[vm.pc])
+ switch v := ins.(type) {
+ case Lit:
+ vm.dsp += 1
+ vm.pc += 1
+ fmt.Println(v)
+ case Jump:
+ vm.pc = uint16(v)
+ fmt.Println(v)
+ case Cond:
+ vm.pc = uint16(v)
+ fmt.Println(v)
+ case Call:
+ vm.rstack[vm.rsp] = vm.pc + 1
+ vm.rsp += 1
+ vm.pc = uint16(v)
+ fmt.Println(v)
+ case ALU:
+ vm.st0 = vm.ST0(v)
+ vm.dsp = uint16(int8(vm.dsp) + v.Ddir)
+ vm.rsp = uint16(int8(vm.rsp) + v.Rdir)
+ vm.pc += 1
+ fmt.Println(v)
+ }
+}
- var _st0 uint16
- if is_lit {
- _st0 = immediate
- } else {
- switch st0sel {
- case 0x00: // T
- _st0 = st0
- case 0x01: // N
- _st0 = st1
- case 0x02: // T+N
- _st0 = st0 + st1
- case 0x03: // T&N
- _st0 = st0 & st1
- case 0x04: // T|N
- _st0 = st0 | st1
- case 0x05: // T^N
- _st0 = st0 ^ st1
- case 0x06: // ~T
- _st0 = ^st0
- case 0x07: // N==T
- if st1 == st0 {
- _st0 = 1
- } else {
- _st0 = 0
- }
- case 0x08: // N<T
- if int16(st1) < int16(st0) {
- _st0 = 1
- } else {
- _st0 = 0
- }
- case 0x09: // N>>T
- _st0 = st1 >> (st0 & 0xf)
- case 0x0a: // T-1
- _st0 = st0 - 1
- case 0x0b: // R (rT)
- _st0 = rst0
- case 0x0c: // [T] TODO
- if st0&0xc000 != 0 {
- // io_din
- } else {
- // ramrd
- }
- case 0x0d: // N<<T
- _st0 = st1 << (st0 & 0xf)
- case 0x0e: // depth (dsp)
- _st0 = (vm.rsp << 8) | vm.dsp
- case 0x0f: // Nu<T
- if st1 < st0 {
- _st0 = 1
- } else {
- _st0 = 0
- }
+func (vm *J1) ST0(v ALU) uint16 {
+ T := vm.st0
+ N := vm.dstack[vm.dsp]
+ R := vm.rstack[vm.rsp]
+ switch v.Opcode {
+ case 0: // T
+ return T
+ case 1: // N
+ return N
+ case 2: // T+N
+ return T + N
+ case 3: // T&N
+ return T & N
+ case 4: // T|N
+ return T | N
+ case 5: // T^N
+ return T ^ N
+ case 6: // ~T
+ return ^T
+ case 7: // N==T
+ if N == T {
+ return 1
}
+ return 0
+ case 8: // N<T
+ if int16(N) < int16(T) {
+ return 1
+ }
+ return 0
+ case 9: // N>>T
+ return N >> (T & 0xf)
+ case 10: // T-1
+ return T - 1
+ case 11: // R (rT)
+ return R
+ case 12: // [T]
+ return vm.memory[T]
+ case 13: // N<<T
+ return N << (T & 0xf)
+ case 14: // depth (dsp)
+ return (vm.rsp << 8) | vm.dsp
+ case 15: // Nu<T
+ if N < T {
+ return 1
+ }
+ return 0
}
-
- vm.st0 = _st0
+ return 0
}