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", "TandN", "TorN", "TxorN", "~T", "N=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 += " rstack-" case 1: s += " rstack+" } switch expand(v & 3) { case -1: s += " dstack-" case 1: s += " dstack+" } return s } return "" } func expand(v uint16) int8 { switch v { case 0: // 00 → 00000000 return 0 case 1: // 01 → 00000001 return 1 case 3: // 11 → 11111111 return -1 } return 0 }