From d5e9062437bf59d2142061280024c695c770ec48 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 24 May 2017 09:47:56 +0200 Subject: Parse bin --- main.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 main.go (limited to 'main.go') diff --git a/main.go b/main.go new file mode 100644 index 0000000..bc4c40a --- /dev/null +++ b/main.go @@ -0,0 +1,97 @@ +package main + +import ( + "encoding/binary" + "fmt" + "os" +) + +func main() { + fd, err := os.Open("testdata/j1.bin") + if err != nil { + panic(err) + } + defer fd.Close() + stat, err := fd.Stat() + if err != nil { + panic(err) + } + sz := stat.Size() + body := make([]uint16, int(sz)/2) + if err := binary.Read(fd, binary.BigEndian, &body); err != nil { + panic(err) + } + for i, v := range body { + op := Decode(v) + fmt.Printf("%0.4x %0.16b %s\n", i, v, op) + } +} + +var opcodes = []string{ + "T", + "N", + "T+N", + "TandN", + "TorN", + "TxorN", + "~T", + "N=T", + "N> 8 + s := "ALU " + opcodes[op] + if v&(1<<12) != 0 { + s += " R→PC" + } + if v&(1<<7) != 0 { + s += " T→N" + } + if v&(1<<6) != 0 { + s += " T→R" + } + if v&(1<<5) != 0 { + s += " N→[T]" + } + switch expand(v & (3 << 2) >> 2) { + case -1: + s += " rstack-" + case 1: + s += " rstack+" + } + switch expand(v & (3 << 0) >> 0) { + case -1: + s += " dstack-" + case 1: + s += " dstack+" + } + return s + } + return "" +} + +func expand(v uint16) int8 { + x := v >> 1 + for i := 7; i > 0; i-- { + v |= x << uint(i) + } + return int8(v) +} -- cgit v1.2.3