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 }