github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/trace.go (about) 1 package mix 2 3 import "fmt" 4 5 func (c *Computer) printTrace(m, next int) { 6 var ov, ci, ctrl string 7 if c.Overflow { 8 ov = "Y" 9 } else { 10 ov = "N" 11 } 12 if c.Comparison == Less { 13 ci = "<" 14 } else if c.Comparison == Greater { 15 ci = ">" 16 } else { 17 ci = "=" 18 } 19 if c.ctrl { 20 ctrl = fmt.Sprintf("CTRL: %d", c.pending.Len()) 21 } 22 asm := Disassemble(c.Contents[mBase+next]) 23 fmt.Fprintf(c.Tracer, 24 "\014_______________________________________________________\n"+ 25 " A: %10v (%#v) OP: %4d%s %s\n"+ 26 " X: %10v (%#v) OV: %s CI: %s %s\n"+ 27 "I1: %4v (%#v) M\n", 28 c.Reg[A], c.Reg[A], next, c.lockChar(next), asm, 29 c.Reg[X], c.Reg[X], ov, ci, ctrl, 30 c.Reg[I1], c.Reg[I1]) 31 for i := 2; i <= 6; i, m = i+1, m+1 { 32 if c.validAddress(m) { 33 fmt.Fprintf(c.Tracer, 34 "I%d: %4v (%#v) %5d%s %#v\n", 35 i, c.Reg[i], c.Reg[i], m, 36 c.lockChar(m), c.Contents[mBase+m]) 37 } else { 38 fmt.Fprintf(c.Tracer, 39 "I%d: %4v (%#v) %5d: ?\n", 40 i, c.Reg[i], c.Reg[i], m) 41 } 42 } 43 if c.validAddress(m) { 44 fmt.Fprintf(c.Tracer, " J: %4v (%#v) %5d%s %#v\n", 45 c.Reg[J], c.Reg[J], m, c.lockChar(m), c.Contents[mBase+m]) 46 } else { 47 fmt.Fprintf(c.Tracer, " J: %4v (%#v) %5d: ?\n", 48 c.Reg[J], c.Reg[J], m) 49 } 50 b := make([]byte, len(c.Devices)) 51 var devMask uint 52 for i := 0; i < DeviceCount; i++ { 53 if c.isBusy(i) { 54 b[i] += c.Devices[i].Name()[0] 55 devMask |= 1 56 } else { 57 b[i] += '.' 58 } 59 devMask <<= 1 60 } 61 flipped := ":" 62 if devMask != c.lastDevMask { 63 flipped = "!" 64 c.lastDevMask = devMask 65 } 66 idled := ":" 67 if c.Idle != c.lastIdle { 68 idled = "!" 69 c.lastIdle = c.Idle 70 } 71 fmt.Fprintf(c.Tracer, 72 "Device%s %s\n Idle%s %12du Elapsed: %12du\n", 73 flipped, string(b), idled, c.Idle, c.Elapsed) 74 } 75 76 func (c *Computer) lockChar(m int) string { 77 if c.attributes[mBase+m].lockUntil > c.Elapsed { 78 return "#" 79 } else { 80 return ":" 81 } 82 }