From 6ec387bc871d1d1e274ee2b2c2fd11abb26bef0a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 28 May 2017 10:34:53 +0200 Subject: Eval draft --- eval.go | 172 ++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 96 insertions(+), 76 deletions(-) (limited to 'eval.go') 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 - _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 + 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<