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.4X\t%s\n", 2*i, v, op) } } var opcodes = []string{ "T", "N", "T+N", "T&N", "T|N", "T^N", "~T", "N==T", "N>T", "T-1", "rT", "[T]", "N<> 8) & 15 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 >> 2) & 3) { case -1: s += " r-1" case -2: s += " r-2" // ??? case 1: s += " r+1" } switch expand(v & 3) { case -1: s += " d-1" case 1: s += " d+1" } return s } return "" } func expand(v uint16) int8 { if v&2 != 0 { v |= 0xfc } return int8(v) }