github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/io.go (about) 1 package mix 2 3 func (c *Computer) jbus(aa Word, i, f, op, m int) (duration int64, err error) { 4 defer func() { 5 err = wrapUnitError(f, err) 6 }() 7 if err = c.bindDevice(f); err != nil { 8 return 9 } 10 c.jump(m, c.isBusy(f)) 11 return 1, nil 12 } 13 14 func (c *Computer) ioc(aa Word, i, f, op, m int) (duration int64, err error) { 15 defer func() { 16 err = wrapUnitError(f, err) 17 }() 18 if err = c.bindDevice(f); err != nil { 19 return 20 } 21 c.waitIfBusy(f) 22 dur, err := c.Devices[f].Control(m) 23 return 1, c.interlock(f, dur, 0, 0, err) 24 } 25 26 func (c *Computer) in(aa Word, i, f, op, m int) (duration int64, err error) { 27 defer func() { 28 err = wrapUnitError(f, err) 29 }() 30 if err = c.bindDevice(f); err != nil { 31 return 32 } 33 c.waitIfBusy(f) 34 n := m + c.Devices[f].BlockSize() 35 c.checkAddress(m) 36 c.checkAddress(n) 37 c.checkInterlock(m, n) 38 dur, err := c.Devices[f].Read(c.Contents[mBase+m : mBase+n]) 39 return 1, c.interlock(f, dur, mBase+m, mBase+n, err) 40 } 41 42 func (c *Computer) out(aa Word, i, f, op, m int) (duration int64, err error) { 43 defer func() { 44 err = wrapUnitError(f, err) 45 }() 46 if err = c.bindDevice(f); err != nil { 47 return 48 } 49 c.waitIfBusy(f) 50 n := m + c.Devices[f].BlockSize() 51 c.checkAddress(m) 52 c.checkAddress(n) 53 c.checkInterlock(m, n) 54 dur, err := c.Devices[f].Write(c.Contents[mBase+m : mBase+n]) 55 return 1, c.interlock(f, dur, mBase+m, mBase+n, err) 56 } 57 58 func (c *Computer) jred(aa Word, i, f, op, m int) (duration int64, err error) { 59 defer func() { 60 err = wrapUnitError(f, err) 61 }() 62 if err = c.bindDevice(f); err != nil { 63 return 64 } 65 c.jump(m, !c.isBusy(f)) 66 return 1, nil 67 }