public void SubtractLogical() { m_operationMethodToTest = Alu.SubtractLogical; CheckLogicalOp(0x0001, 0x0001, 0x0000, false, "引いて 0 => 結果は計算通り, オーバーフローなし"); CheckLogicalOp(0x0001, 0x0002, 0xffff, true, "引いたらマイナス => 結果は反転, オーバーフローあり"); }
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); }
public void And() { m_operationMethodToTest = Alu.And; CheckLogicalOp( 0x5a5a, 0x5555, 0x5050, false, "両方のビットが 1 なら 1、どちらかのビットが 0 なら 0, オーバーフローしない"); }
public void AddLogical() { m_operationMethodToTest = Alu.AddLogical; CheckLogicalOp(0x7fff, 0x0001, 0x8000, false, "足して 0x8000 => 結果は計算通り, オーバーフローなし"); CheckLogicalOp(0x8000, 0x7fff, 0xffff, false, "ちょうど最大 => 結果は計算通り, オーバーフローなし"); CheckLogicalOp(0x8000, 0x8000, 0, true, "最大より大きい => 結果は反転, オーバーフローあり"); }
public void Xor() { m_operationMethodToTest = Alu.Xor; CheckLogicalOp( 0x3636, 0x6363, 0x5555, false, "両方のビットが同じなら 0、異なっていれば 1, オーバーフローしない"); }
public void Or() { m_operationMethodToTest = Alu.Or; CheckLogicalOp( 0x5a5a, 0x5555, 0x5f5f, false, "両方のビットが 0 なら 0、どちらかのビットが 1 なら 1, オーバーフローしない"); }
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, "最小より小さい => 結果は反転、オーバーフローあり"); }
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); }