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

     1  package mix
     2  
     3  func (c *Computer) add(aa Word, i, f, op, m int) (int64, error) {
     4  	if f == 6 {
     5  		c.callWithOvCheck2(AddFloatWord, m)
     6  		return 4, nil
     7  	}
     8  	c.checkInterlock(m, m)
     9  	c.addReg(A, c.Contents[mBase+m].Field(f).Int())
    10  	return 2, nil
    11  }
    12  
    13  func (c *Computer) sub(aa Word, i, f, op, m int) (int64, error) {
    14  	if f == 6 {
    15  		c.callWithOvCheck2(SubFloatWord, m)
    16  		return 4, nil
    17  	}
    18  	c.checkInterlock(m, m)
    19  	c.addReg(A, -c.Contents[mBase+m].Field(f).Int())
    20  	return 2, nil
    21  }
    22  
    23  func (c *Computer) mul(aa Word, i, f, op, m int) (int64, error) {
    24  	if f == 6 {
    25  		c.callWithOvCheck2(MulFloatWord, m)
    26  		return 9, nil
    27  	}
    28  	c.checkInterlock(m, m)
    29  	c.Reg[A], c.Reg[X] = MulWord(c.Reg[A],
    30  		c.Contents[mBase+m].Field(f).Int())
    31  	return 10, nil
    32  }
    33  
    34  func (c *Computer) div(aa Word, i, f, op, m int) (int64, error) {
    35  	if f == 6 {
    36  		c.callWithOvCheck2(DivFloatWord, m)
    37  		return 11, nil
    38  	}
    39  	var ov bool
    40  	c.checkInterlock(m, m)
    41  	c.Reg[A], c.Reg[X], ov =
    42  		DivWord(c.Reg[A], c.Reg[X], c.Contents[mBase+m].Int())
    43  	c.Overflow = c.Overflow || ov
    44  	return 12, nil
    45  }
    46  
    47  func (c *Computer) addReg(reg, v int) {
    48  	var ov bool
    49  	c.Reg[reg], ov = AddWord(c.Reg[reg], v)
    50  	c.Overflow = c.Overflow || ov
    51  }
    52  
    53  func (c *Computer) callWithOvCheck2(f func(Word, Word) (Word, bool), m int) {
    54  	var ov bool
    55  	c.checkInterlock(m, m)
    56  	c.Reg[A], ov = f(c.Reg[A], c.Contents[mBase+m])
    57  	c.Overflow = c.Overflow || ov
    58  }