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

     1  package mix
     2  
     3  func (c *Computer) jump(address int, cond bool) {
     4  	if !cond {
     5  		return
     6  	}
     7  	c.checkAddress(address)
     8  	c.Reg[J] = NewWord(c.next + 1)
     9  	c.next = address - 1
    10  }
    11  
    12  func (c *Computer) jmp(aa Word, i, f, op, m int) (int64, error) {
    13  	switch f {
    14  	case 0: // JMP
    15  		c.jump(m, true)
    16  	case 1: // JSJ
    17  		c.checkAddress(m)
    18  		c.next = m - 1
    19  	case 2: // JOV
    20  		c.jump(m, c.Overflow)
    21  		c.Overflow = false
    22  	case 3: // JNV
    23  		c.jump(m, !c.Overflow)
    24  		c.Overflow = false
    25  	case 4: // JL
    26  		c.jump(m, c.Comparison == Less)
    27  	case 5: // JE
    28  		c.jump(m, c.Comparison == Equal)
    29  	case 6: // JG
    30  		c.jump(m, c.Comparison == Greater)
    31  	case 7: // JGE
    32  		c.jump(m, c.Comparison != Less)
    33  	case 8: // JNE
    34  		c.jump(m, c.Comparison != Equal)
    35  	case 9: // JLE
    36  		c.jump(m, c.Comparison != Greater)
    37  	default:
    38  		panic(ErrInvalidOp)
    39  	}
    40  	return 1, nil
    41  }
    42  func (c *Computer) ja(aa Word, i, f, op, m int) (int64, error) {
    43  	r := c.Reg[op-JA].Int()
    44  	switch f {
    45  	case 0: // N
    46  		c.jump(m, r < 0)
    47  	case 1: // Z
    48  		c.jump(m, r == 0)
    49  	case 2: // P
    50  		c.jump(m, r > 0)
    51  	case 3: // NN
    52  		c.jump(m, r >= 0)
    53  	case 4: // NE
    54  		c.jump(m, r != 0)
    55  	case 5: // NP
    56  		c.jump(m, r <= 0)
    57  	case 6: // E (see Section 4.5.2)
    58  		if op != JA && op != JX {
    59  			panic(ErrInvalidOp)
    60  		}
    61  		c.jump(m, r&1 == 0)
    62  	case 7: // O (see Section 4.5.2)
    63  		if op != JA && op != JX {
    64  			panic(ErrInvalidOp)
    65  		}
    66  		c.jump(m, r&1 == 1)
    67  	default:
    68  		panic(ErrInvalidOp)
    69  	}
    70  	return 1, nil
    71  }