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 }