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 }