github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/inc.go (about)

     1  package mix
     2  
     3  func (c *Computer) inca(aa Word, i, f, op, m int) (int64, error) {
     4  	switch f {
     5  	case 0: // INC
     6  		if op == INCA || op == INCX {
     7  			c.addReg(op-INCA, m)
     8  		} else {
     9  			c.addIndex(op-INCA, m)
    10  		}
    11  	case 1: // DEC
    12  		if op == INCA || op == INCX {
    13  			c.addReg(op-INCA, -m)
    14  		} else {
    15  			c.addIndex(op-INCA, -m)
    16  		}
    17  	case 2: // ENT
    18  		c.Reg[op-INCA] = NewWord(m)
    19  		if m == 0 {
    20  			c.Reg[op-INCA].SetField(Spec(0, 0), aa)
    21  		}
    22  	case 3: // ENN
    23  		c.Reg[op-INCA] = NewWord(-m)
    24  		if m == 0 {
    25  			c.Reg[op-INCA].
    26  				SetField(Spec(0, 0), aa.Negate())
    27  		}
    28  	default:
    29  		panic(ErrInvalidOp)
    30  	}
    31  	return 1, nil
    32  }
    33  
    34  func (c *Computer) addIndex(reg, v int) {
    35  	v += c.Reg[reg].Int()
    36  	if v < MinIndex || v > MaxIndex {
    37  		panic(ErrInvalidIndex)
    38  	}
    39  	if v == 0 {
    40  		c.Reg[reg].SetField(Spec(1, 5), 0)
    41  	} else {
    42  		c.Reg[reg] = NewWord(v)
    43  	}
    44  }