public void Execute_WhenFlagTrue_ShouldSetProgramCounterToValue()
    {
        ushort expectedProgramCounter = 0x3141;

        FlagsMock.SetupGet(f => f.LessThan).Returns(true);
        var sut = CreateSut(expectedProgramCounter);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(reg => reg.ProgramCounter = expectedProgramCounter);
    }
Beispiel #2
0
    public void Execute_WhenFlagFalse_ShouldNotSetProgramCounter()
    {
        ushort expectedProgramCounter = 0x3141;

        FlagsMock.SetupGet(f => f.Equal).Returns(false);
        var sut = CreateSut(expectedProgramCounter);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(reg => reg.ProgramCounter = expectedProgramCounter, Times.Never);
    }
    public void Execute_WhenInvoked_ShouldStoreTheValueInMemory()
    {
        RegistersMock.SetupGet(r => r.StackPointer).Returns(0xFFFC);
        MemoryMock.Setup(m => m.GetWord(0xFFFC)).Returns(1234);

        var sut = CreateSut(3);

        sut.Execute(CpuMock.Object);

        RegistersMock.VerifySet(r => r[3] = 1234);
    }
Beispiel #4
0
    public void Execute_WhenInvoked_ShouldAddTheConstantToTheRigister()
    {
        byte   expectedRegister     = 7;
        ushort constValue           = 0x3456;
        ushort initialRegisterValue = 0x1234;

        var sut = CreateSut(expectedRegister, constValue);

        RegistersMock.SetupGet(r => r[expectedRegister]).Returns(initialRegisterValue);
        sut.Execute(CpuMock.Object);

        RegistersMock.VerifySet(reg => reg[expectedRegister] = (ushort)(constValue + initialRegisterValue));
    }
Beispiel #5
0
    public void Execute_WhenInvoked_ShouldStoreTheValueInTheRegister()
    {
        // LD R4, R2
        byte   targetRegister = 4;
        byte   sourceRegister = 2;
        ushort expectedValue  = 0x3456;

        RegistersMock.SetupGet(r => r[sourceRegister]).Returns(expectedValue);
        var sut = CreateSut(targetRegister, sourceRegister);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(r => r[targetRegister] = expectedValue);
    }
    public void Execute_WhenCalled_ShouldSetProgramCounterToValueOnStack()
    {
        ushort expectedStackPointer = 0xFFFC;
        ushort extepedReturnAddress = 0xA020;

        RegistersMock.SetupGet(r => r.StackPointer).Returns(expectedStackPointer);
        MemoryMock.Setup(mm => mm.GetWord(expectedStackPointer)).Returns(extepedReturnAddress);
        var sut = CreateSut(expectedStackPointer);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(reg => reg.ProgramCounter = extepedReturnAddress);
        RegistersMock.VerifySet(r => r.StackPointer       = (ushort)(expectedStackPointer + 4));
    }
Beispiel #7
0
    public void Execute_WhenInvoked_ShouldStoreTheValueInTheRegister()
    {
        // LD R4, R2
        byte   targetRegister  = 2;
        ushort expectedValue   = 0x3456;
        ushort expectedAddress = 0x0034;

        MemoryMock.Setup(m => m.GetWord(expectedAddress)).Returns(expectedValue);

        var sut = CreateSut(targetRegister, expectedAddress);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(r => r[targetRegister] = expectedValue);
    }
Beispiel #8
0
    public void Execute_WhenInvoked_ShouldStoreTheValueInMemory()
    {
        byte   targetRegister       = 6;
        ushort expectedValue        = 0x3456;
        ushort expectedStackPointer = 0xFFFF;

        RegistersMock.SetupGet(r => r.StackPointer).Returns(expectedStackPointer);
        RegistersMock.SetupGet(r => r[targetRegister]).Returns(expectedValue);

        var sut = CreateSut(targetRegister);

        sut.Execute(CpuMock.Object);
        RegistersMock.VerifySet(r => r.StackPointer = (ushort)(expectedStackPointer - 4), Times.Once());
        MemoryMock.Verify(m => m.SetWord(It.IsAny <ushort>(), expectedValue));
    }
Beispiel #9
0
    public void Execute_WhenInvoked_ShouldStoreTheValueInMemory()
    {
        // LD R6, 0x3456
        // STL R6, (0x2234)
        byte   targetRegister  = 6;
        ushort expectedValue   = 0x3456;
        ushort expectedAddress = 0x2234;

        RegistersMock.SetupGet(r => r[targetRegister]).Returns(expectedValue);

        var sut = CreateSut(targetRegister, expectedAddress);

        sut.Execute(CpuMock.Object);
        MemoryMock.VerifySet(m => m[expectedAddress] = LowByte(expectedValue));
    }
    public void Execute_WhenInvoked_ShouldSetFlagsCorrectly(int lvalue, int rvalue, bool eq, bool lt, bool gt)
    {
        // CMP r1, 0xNNNN
        byte leftRegister = 1;

        RegistersMock.SetupGet(r => r[leftRegister]).Returns((ushort)lvalue);

        var sut = CreateSut(leftRegister, (ushort)rvalue);

        sut.Execute(CpuMock.Object);

        FlagsMock.VerifySet(f => f.Equal       = eq);
        FlagsMock.VerifySet(f => f.GreaterThan = gt);
        FlagsMock.VerifySet(f => f.LessThan    = lt);
    }
Beispiel #11
0
    public void Execute_WhenInvoked_ShouldAddTheConstantToTheRigister()
    {
        // SUB R7, R4
        byte firstRegister  = 7;
        byte secondRegister = 4;

        ushort firstRegisterValue  = 0x3456;
        ushort secondRegisterValue = 0x1234;

        RegistersMock.SetupGet(r => r[firstRegister]).Returns(firstRegisterValue);
        RegistersMock.SetupGet(r => r[secondRegister]).Returns(secondRegisterValue);

        var sut = CreateSut(firstRegister, secondRegister);

        sut.Execute(CpuMock.Object);

        RegistersMock.VerifySet(reg => reg[firstRegister] = (ushort)(firstRegisterValue - secondRegisterValue));
    }
Beispiel #12
0
    public void Execute_WhenInvoked_ShouldSetProgramCounterToValueAndPushReturnAddress()
    {
        ushort stackPointer            = 0xFFFC;
        ushort callAddress             = 0x3141;
        ushort currentProgramCounter   = 0x00F0;
        var    decrementedStackPointer = (ushort)(stackPointer - 4);

        RegistersMock.SetupGet(r => r.StackPointer).Returns(stackPointer);
        RegistersMock.SetupGet(r => r.ProgramCounter).Returns(currentProgramCounter);
        var sut = CreateSut(callAddress);

        sut.Execute(CpuMock.Object);

        RegistersMock.VerifySet(r => r.StackPointer = decrementedStackPointer);

        // since its a mock the pre-decrement isn't real, so ignore the address
        MemoryMock.Verify(m => m.SetWord(It.IsAny <ushort>(), currentProgramCounter));
        RegistersMock.VerifySet(r => r.ProgramCounter = callAddress);
    }
    public void Execute_WhenInvoked_ShouldStoreTheValueInMemory()
    {
        // LD R3, 0x2234
        // LD R6, 0x3456
        // ST R6, (R3)
        byte   targetRegister          = 6;
        byte   expectedAddressRegister = 3;
        ushort expectedValue           = 0x3456;
        ushort expectedAddress         = 0x2234;

        RegistersMock.SetupGet(r => r[targetRegister]).Returns(expectedValue);
        RegistersMock.SetupGet(r => r[expectedAddressRegister]).Returns(expectedAddress);


        var sut = CreateSut(targetRegister, expectedAddressRegister);

        sut.Execute(CpuMock.Object);
        MemoryMock.Verify(m => m.SetWord(expectedAddress, expectedValue));
    }