summaryrefslogtreecommitdiff
path: root/Q1.tests/Core/Instructions/DataInstructionTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Q1.tests/Core/Instructions/DataInstructionTests.cs')
-rw-r--r--Q1.tests/Core/Instructions/DataInstructionTests.cs166
1 files changed, 166 insertions, 0 deletions
diff --git a/Q1.tests/Core/Instructions/DataInstructionTests.cs b/Q1.tests/Core/Instructions/DataInstructionTests.cs
new file mode 100644
index 0000000..08bc8cc
--- /dev/null
+++ b/Q1.tests/Core/Instructions/DataInstructionTests.cs
@@ -0,0 +1,166 @@
+namespace Q1.tests.Core.Instructions;
+
+using core.Arch;
+using core.Arch.Lookups;
+using core.Components;
+
+[TestFixture]
+public class DataInstructionTests : InstructionTestBase
+{
+ [TestCase(0x0000)]
+ [TestCase(0xFFFF)]
+ [TestCase(0x1234)]
+ [TestCase(0xABCD)]
+ [TestCase(0x5555)]
+ [TestCase(0b1010101010101010)]
+ public void InverseDxInstruction_ShouldCorrectlyInvertBits(int value)
+ {
+ // Arrange
+ u16 value16 = (u16) value;
+
+ var chip = this.CreateChip();
+ chip.Dx = value16;
+
+ var instruction = InstructionEncoding
+ .Encode(
+ InstructionSet.GetOpcode("INV(DX)"),
+ 0,
+ 0,
+ true);
+
+ chip.Bus.WriteWord(chip.Pc, instruction);
+
+ // Act
+ chip.Clock();
+
+ // Assert
+ u16 expected = (u16) ~value16;
+ Assert.That(chip.Dx, Is.EqualTo(expected));
+ }
+
+ [TestCase(0x0000)]
+ [TestCase(0xFFFF)]
+ [TestCase(0x1234)]
+ [TestCase(0xABCD)]
+ [TestCase(0x5555)]
+ [TestCase(0b1010101010101010)]
+ public void InverseInstruction_ShouldCorrectlyInvertBits(int value)
+ {
+ // Arrange
+ u16 value16 = (u16) value;
+
+ var chip = this.CreateChip();
+
+ var instruction = InstructionEncoding
+ .Encode(
+ InstructionSet.GetOpcode("INV"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ 0,
+ true);
+
+ chip.Bus.WriteWord(chip.Pc, instruction);
+ chip.Bus.WriteWord((u16) (chip.Pc + 2), value16);
+
+ // Act
+ chip.Clock();
+
+ // Assert
+ u16 expected = (u16) ~value16;
+ Assert.That(chip.Dx, Is.EqualTo(expected));
+ }
+
+ [TestCase(0b01, 0b10)]
+ [TestCase(0b1111, 0b0000)]
+ [TestCase(0b1010, 0b0101)]
+ [TestCase(0x1234, 0x5678)]
+ public void AndInstruction_ShouldCorrectlyAndBits(int value1, int value2)
+ {
+ // Arrange
+ u16 value16_1 = (u16) value1;
+ u16 value16_2 = (u16) value2;
+
+ var chip = this.CreateChip();
+
+ var instruction = InstructionEncoding
+ .Encode(
+ InstructionSet.GetOpcode("AND"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ true);
+
+ chip.Bus.WriteWord(chip.Pc, instruction);
+ chip.Bus.WriteWord((u16) (chip.Pc + 2), value16_1);
+ chip.Bus.WriteWord((u16) (chip.Pc + 4), value16_2);
+
+ // Act
+ chip.Clock();
+
+ // Assert
+ u16 expected = (u16) (value16_1 & value16_2);
+ Assert.That(chip.Dx, Is.EqualTo(expected));
+ }
+
+ [TestCase(0b01, 0b10)]
+ [TestCase(0b1111, 0b0000)]
+ [TestCase(0b1010, 0b0101)]
+ [TestCase(0x1234, 0x5678)]
+ public void OrInstruction_ShouldCorrectlyOrBits(int value1, int value2)
+ {
+ // Arrange
+ u16 value16_1 = (u16) value1;
+ u16 value16_2 = (u16) value2;
+
+ var chip = this.CreateChip();
+
+ var instruction = InstructionEncoding
+ .Encode(
+ InstructionSet.GetOpcode("OR"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ true);
+
+ chip.Bus.WriteWord(chip.Pc, instruction);
+ chip.Bus.WriteWord((u16) (chip.Pc + 2), value16_1);
+ chip.Bus.WriteWord((u16) (chip.Pc + 4), value16_2);
+
+ // Act
+ chip.Clock();
+
+ // Assert
+ u16 expected = (u16) (value16_1 | value16_2);
+ Assert.That(chip.Dx, Is.EqualTo(expected));
+ }
+
+ [TestCase(0b01, 0b10)]
+ [TestCase(0b1111, 0b0000)]
+ [TestCase(0b1010, 0b0101)]
+ [TestCase(0x1234, 0x5678)]
+ public void XorInstruction_ShouldCorrectlyXorBits(int value1, int value2)
+ {
+ // Arrange
+ u16 value16_1 = (u16) value1;
+ u16 value16_2 = (u16) value2;
+
+ var chip = this.CreateChip();
+
+ var instruction = InstructionEncoding
+ .Encode(
+ InstructionSet.GetOpcode("XOR"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ AddressingModes.GetAddressingMode("Immediate"),
+ true);
+
+ chip.Bus.WriteWord(chip.Pc, instruction);
+ chip.Bus.WriteWord((u16) (chip.Pc + 2), value16_1);
+ chip.Bus.WriteWord((u16) (chip.Pc + 4), value16_2);
+
+ // Act
+ chip.Clock();
+
+ // Assert
+ u16 expected = (u16) (value16_1 ^ value16_2);
+ Assert.That(chip.Dx, Is.EqualTo(expected));
+ }
+
+
+} \ No newline at end of file