public void addUnsigned(UnivacWord bWord) { int i; Boolean carry; overflow = false; for (i = 0; i < 12; i++) { regA[i] = val[i]; regB[i] = bWord.Val[i]; } regB[0] = 0x03; carry = false; for (i = 11; i >= 0; i--) { if (regA[i] < 3 || regA[i] > 12) { val[i] = regA[i]; carry = false; } else if (regB[i] < 3 || regB[i] > 12) { val[i] = regB[i]; carry = false; } else { val[i] = regA[i] + regB[i] + ((carry) ? 1 : 0); carry = (val[i] > 15) ? true : false; val[i] -= (carry) ? 13 : 3; } } }
public void extract(UnivacWord selector, UnivacWord source) { int i; for (i = 0; i < 12; i++) { val[i] = ((selector.Val[i] & 1) == 1) ? val[i] : source.Val[i]; } }
public void or(UnivacWord v) { int i; for (i = 0; i < 12; i++) { val[i] |= v.Val[i]; } }
public Boolean greaterNonSigned(UnivacWord bword) { int i; for (i = 1; i < 12; i++) { if (val[i] > bword.Val[i]) { return(true); } } return(false); }
public Boolean equals(UnivacWord bword) { int i; for (i = 0; i < 12; i++) { if (val[i] != bword.Val[i]) { return(false); } } return(true); }
public int add(UnivacWord bWord) { int i; Boolean carry; UnivacWord ret; Boolean aLarger; Boolean signA, signB; ret = new UnivacWord(); overflow = false; for (i = 0; i < 12; i++) { regA[i] = val[i]; regB[i] = bWord.Val[i]; } aLarger = this.greaterNonSigned(bWord); signA = (regA[0] == 0x02) ? true : false; signB = (regB[0] == 0x02) ? true : false; if (signA != signB) { if (aLarger) { for (i = 1; i < 12; i++) { if (regB[i] < 0x10) { regB[i] = (~regB[i]) & 0xf; } } i = 11; regB[11] += 1; while (i > 1 && regB[i] > 0xf) { regB[i] -= 0xf; regB[i - 1]++; i--; } } else { for (i = 1; i < 12; i++) { if (regA[i] < 0x10) { regA[i] = (~regA[i]) & 0xf; } } i = 11; regA[11] += 1; while (i > 1 && regA[i] > 0xf) { regA[i] -= 0xf; regA[i - 1]++; i--; } } } carry = false; val[0] = (aLarger) ? regA[0] : regB[0]; for (i = 11; i > 0; i--) { if (regA[i] > 15 && regB[i] > 15) { return(CPU.STOP_ADD_ALPHA); } if (regA[i] > 15) { val[i] = regA[i]; carry = false; } else if (regB[i] > 15) { val[i] = regB[i]; carry = false; } else { val[i] = regA[i] + regB[i] + ((carry) ? 1 : 0); carry = (val[i] > 15) ? true : false; val[i] -= (carry) ? 13 : 3; } } overflow = (signA != signB) ? false : carry; return(0); }