Ejemplo n.º 1
0
        public void SubtractLogical()
        {
            m_operationMethodToTest = Alu.SubtractLogical;

            CheckLogicalOp(0x0001, 0x0001, 0x0000, false, "引いて 0 => 結果は計算通り, オーバーフローなし");
            CheckLogicalOp(0x0001, 0x0002, 0xffff, true, "引いたらマイナス => 結果は反転, オーバーフローあり");
        }
Ejemplo n.º 2
0
        private static void DoOperation(
            Alu.OperationMethod operationMethod, CpuRegister r, Word operand, FlagRegister fr, Memory memory)
        {
            Boolean overflowFlag;

            r.Value = operationMethod(r.Value, operand, out overflowFlag);
            fr.SetFlags(r, overflowFlag);
        }
Ejemplo n.º 3
0
        public void And()
        {
            m_operationMethodToTest = Alu.And;

            CheckLogicalOp(
                0x5a5a, 0x5555, 0x5050, false,
                "両方のビットが 1 なら 1、どちらかのビットが 0 なら 0, オーバーフローしない");
        }
Ejemplo n.º 4
0
        public void AddLogical()
        {
            m_operationMethodToTest = Alu.AddLogical;

            CheckLogicalOp(0x7fff, 0x0001, 0x8000, false, "足して 0x8000 => 結果は計算通り, オーバーフローなし");
            CheckLogicalOp(0x8000, 0x7fff, 0xffff, false, "ちょうど最大 => 結果は計算通り, オーバーフローなし");
            CheckLogicalOp(0x8000, 0x8000, 0, true, "最大より大きい => 結果は反転, オーバーフローあり");
        }
Ejemplo n.º 5
0
        public void Xor()
        {
            m_operationMethodToTest = Alu.Xor;

            CheckLogicalOp(
                0x3636, 0x6363, 0x5555, false,
                "両方のビットが同じなら 0、異なっていれば 1, オーバーフローしない");
        }
Ejemplo n.º 6
0
        public void Or()
        {
            m_operationMethodToTest = Alu.Or;

            CheckLogicalOp(
                0x5a5a, 0x5555, 0x5f5f, false,
                "両方のビットが 0 なら 0、どちらかのビットが 1 なら 1, オーバーフローしない");
        }
Ejemplo n.º 7
0
        public void SubtractArithmetic()
        {
            m_operationMethodToTest = Alu.SubtractArithmetic;

            CheckArithmeticOp(20000, -12767, 32767, false, "ちょうど最大 => 結果は計算通り, オーバーフローなし");
            CheckArithmeticOp(20001, -12767, -32768, true, "最大より大きい => 結果は反転、オーバーフローあり");
            CheckArithmeticOp(-10000, 22768, -32768, false, "ちょうど最小 => 結果は計算通り、オーバーフローなし");
            CheckArithmeticOp(-10001, 22768, 32767, true, "最小より小さい => 結果は反転、オーバーフローあり");
        }
Ejemplo n.º 8
0
        private static void DoLogic(
            Alu.OperationMethod operationMethod, CpuRegister r, Word operand, FlagRegister fr, Memory memory)
        {
            Boolean notUsed;

            r.Value = operationMethod(r.Value, operand, out notUsed);

            const Boolean OverflowFlag = false;

            fr.SetFlags(r, OverflowFlag);
        }