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  }