EightBitNet/MC6809/MC6809.UnitTest/AddTests.cs
Adrian Conlon 0ab5da10ef add unit tests (not complete) for 6809 processor. Fix matters arising.
Signed-off-by: Adrian Conlon <adrian.conlon@gmail.com>
2019-04-21 04:47:36 +01:00

234 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace EightBit
{
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class AddTests
{
private readonly Board board = new Board();
private readonly MC6809 cpu;
public AddTests() => this.cpu = this.board.CPU;
[TestInitialize]
public void Initialise()
{
this.board.RaisePOWER();
this.cpu.Step(); // Step over the reset
}
[TestCleanup]
public void Cleanup() => this.board.LowerPOWER();
[TestMethod]
public void TestImmediate()
{
this.board.Poke(0, 0x8b);
this.board.Poke(1, 0x8b);
this.cpu.A = 0x24;
this.cpu.Step();
Assert.AreEqual(0xaf, this.cpu.A);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.HalfCarry);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// Add 0x02 to A=0x04.
[TestMethod]
public void TestImmediateADDANoC()
{
this.board.Poke(0, 0x8b);
this.board.Poke(1, 0x02);
this.cpu.CC = 0;
this.cpu.A = 4;
this.cpu.B = 5;
this.cpu.Step();
Assert.AreEqual(6, this.cpu.A);
Assert.AreEqual(5, this.cpu.B);
Assert.AreEqual(0, this.cpu.HalfCarry);
Assert.AreEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// The overflow (V) bit indicates signed twos complement overflow, which occurs when the
// sign bit differs from the carry bit after an arithmetic operation.
// A=0x03 + 0xFF becomes 0x02
[TestMethod]
public void TestImmediateADDAWiC()
{
this.board.Poke(0, 0x8b);
this.board.Poke(1, 0xff);
this.cpu.CC = 0;
this.cpu.A = 3;
this.cpu.Step();
Assert.AreEqual(2, this.cpu.A);
Assert.AreEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// positive + positive with overflow.
// B=0x40 + 0x41 becomes 0x81 or -127
[TestMethod]
public void TestImmediateADDB1()
{
this.board.Poke(0, 0xcb);
this.board.Poke(1, 0x41);
this.cpu.B = 0x40;
this.cpu.CC = 0;
this.cpu.Step();
Assert.AreEqual(0x81, this.cpu.B);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.HalfCarry);
Assert.AreNotEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// negative + negative.
// B=0xFF + 0xFF becomes 0xFE or -2
[TestMethod]
public void TestImmediateADDB2()
{
this.board.Poke(0, 0xcb);
this.board.Poke(1, 0xff);
this.cpu.B = 0xff;
this.cpu.CC = 0;
this.cpu.Step();
Assert.AreEqual(0xfe, this.cpu.B);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreNotEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// negative + negative with overflow.
// B=0xC0 + 0xBF becomes 0x7F or 127
[TestMethod]
public void TestImmediateADDB3()
{
this.board.Poke(0, 0xcb);
this.board.Poke(1, 0xbf);
this.cpu.B = 0xc0;
this.cpu.CC = 0;
this.cpu.Step();
Assert.AreEqual(0x7f, this.cpu.B);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreNotEqual(0, this.cpu.Overflow);
Assert.AreEqual(0, this.cpu.Negative);
Assert.AreNotEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// positive + negative with negative result.
// B=0x02 + 0xFC becomes 0xFE or -2
[TestMethod]
public void TestImmediateADDB4()
{
this.board.Poke(0, 0xcb);
this.board.Poke(1, 0xfc);
this.cpu.B = 0x02;
this.cpu.CC = 0;
this.cpu.Step();
Assert.AreEqual(0xfe, this.cpu.B);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(2, this.cpu.Cycles);
}
// Add 0x02B0 to D=0x0405 becomes 0x6B5.
// positive + positive = positive
[TestMethod]
public void TestImmediateADDDNoC()
{
this.board.Poke(0, 0xc3);
this.board.Poke(1, 0x02);
this.board.Poke(2, 0xb0);
this.cpu.CC = 0;
this.cpu.A = 4;
this.cpu.B = 5;
this.cpu.Step();
Assert.AreEqual(0x06, this.cpu.A);
Assert.AreEqual(0xb5, this.cpu.B);
Assert.AreEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(4, this.cpu.Cycles);
}
// Add 0xE2B0 to D=0x8405 becomes 0x66B5.
// negative + negative = positive + overflow
[TestMethod]
public void TestImmediateADDD1()
{
this.board.Poke(0, 0xc3);
this.board.Poke(1, 0xe2);
this.board.Poke(2, 0xb0);
this.cpu.CC = 0;
this.cpu.A = 0x84;
this.cpu.B = 5;
this.cpu.Step();
Assert.AreEqual(0x66, this.cpu.A);
Assert.AreEqual(0xb5, this.cpu.B);
Assert.AreEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreNotEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Carry);
Assert.AreEqual(4, this.cpu.Cycles);
}
// negative + negative = negative.
// Add 0xE000 to D=0xD000 becomes 0xB000
[TestMethod]
public void TestImmediateADDD2()
{
this.board.Poke(0, 0xc3);
this.board.Poke(1, 0xe0);
this.board.Poke(2, 0);
this.cpu.CC = 0;
this.cpu.A = 0xd0;
this.cpu.B = 0;
this.cpu.Step();
Assert.AreEqual(0xb0, this.cpu.A);
Assert.AreEqual(0x00, this.cpu.B);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreEqual(0, this.cpu.Overflow);
Assert.AreNotEqual(0, this.cpu.Carry);
Assert.AreEqual(4, this.cpu.Cycles);
}
// positive + positive = negative + overflow.
// Add 0x7000 to D=0x7000 becomes 0xE000
[TestMethod]
public void TestImmediateADDD3()
{
this.board.Poke(0, 0xc3);
this.board.Poke(1, 0x70);
this.board.Poke(2, 0);
this.cpu.CC = 0;
this.cpu.A = 0x70;
this.cpu.B = 0;
this.cpu.Step();
Assert.AreEqual(0xe0, this.cpu.A);
Assert.AreEqual(0x00, this.cpu.B);
Assert.AreNotEqual(0, this.cpu.Negative);
Assert.AreEqual(0, this.cpu.Zero);
Assert.AreNotEqual(0, this.cpu.Overflow);
Assert.AreEqual(0, this.cpu.Carry);
Assert.AreEqual(4, this.cpu.Cycles);
}
}
}