diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2026-03-20 06:04:13 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2026-03-20 06:04:13 +1000 |
| commit | 571e44a12d2a52e92c1165ec294469d3d384faef (patch) | |
| tree | d278303fe080322a7a4aeb122c09b6cc4bafaee7 /Q1.tests/Core | |
| parent | 6f8356eca832e2350424b417cdea2d8d8eb6b1e3 (diff) | |
change: Split addressable and bus device
Diffstat (limited to 'Q1.tests/Core')
| -rw-r--r-- | Q1.tests/Core/Instructions/DataInstructionTests.cs | 166 |
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 |
