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  }