Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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];
            }
        }
Beispiel #3
0
        public void or(UnivacWord v)
        {
            int i;

            for (i = 0; i < 12; i++)
            {
                val[i] |= v.Val[i];
            }
        }
Beispiel #4
0
        public Boolean greaterNonSigned(UnivacWord bword)
        {
            int i;

            for (i = 1; i < 12; i++)
            {
                if (val[i] > bword.Val[i])
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #5
0
        public Boolean equals(UnivacWord bword)
        {
            int i;

            for (i = 0; i < 12; i++)
            {
                if (val[i] != bword.Val[i])
                {
                    return(false);
                }
            }
            return(true);
        }
Beispiel #6
0
        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);
        }