Пример #1
0
        public void AddToSp_WithNegativeOffset_SpCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(CpuUtil.SP) = InternalWramRegion.REGION_START;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xB0FF // ADD SP, #-0x1FC
            }, true);

            Assert.Equal(InternalWramRegion.REGION_START - 0x1FC, cpu.CurrentRegisterSet.GetRegister(CpuUtil.SP));
        }
Пример #2
0
        public void Subtract_SubtractImmediateFromRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0x0000F000;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xff38 // SUB r0, #0xff
            });

            Assert.Equal((uint)0x0000EF01, cpu.CurrentRegisterSet.GetRegister(0));
        }
Пример #3
0
        public void Add_AddImmediateToRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0x0000F000;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xff30 // ADD r0, #0xff
            });

            Assert.Equal((uint)0x0000F0FF, cpu.CurrentRegisterSet.GetRegister(0));
        }
Пример #4
0
        public void Branch_BranchWithNegativeOffsetAndPassingCondition_PcCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentStatus.Zero = true;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xD080 // B{cond} #0xFF
            }, true);

            Assert.Equal(InternalWramRegion.REGION_START + 0x4 - 256, cpu.CurrentRegisterSet.GetRegister(CpuUtil.PC));
        }
        public void Move_MoveImmediateToRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE3A00EFF // MOV r0, #0x0FF0
            });

            Assert.Equal((uint)0x00000FF0, cpu.CurrentRegisterSet.GetRegister(0));
        }
        public void Branch_BranchWithNoLoadedBits_PcCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(CpuUtil.LR) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xF800
            }, true);

            Assert.Equal(InternalWramRegion.REGION_START + 0x2 + 0x1, cpu.CurrentRegisterSet.GetRegister(CpuUtil.LR));
            Assert.Equal(0xDEADBEEF, cpu.CurrentRegisterSet.GetRegister(CpuUtil.PC));
        }
Пример #7
0
        public void MoveNegative_MvnWithRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x000000FF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xc843 // MVN r0, r1
            });

            Assert.Equal((uint)0xFFFFFF00, cpu.CurrentRegisterSet.GetRegister(0));
        }
Пример #8
0
        public void Msr_SetCpsrFlagsByImmediate_FlagsCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE328F20F // MSR CPSR, #0xF0000000
            });

            Assert.True(cpu.CurrentStatus.Negative);
            Assert.True(cpu.CurrentStatus.Zero);
            Assert.True(cpu.CurrentStatus.Carry);
            Assert.True(cpu.CurrentStatus.Overflow);
        }
Пример #9
0
        public void Msr_MoveRegZeroToCpsr_CpsrCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0b11111000000000000000000011110000;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE129F000 // MSR CPSR, r0
            });

            Assert.Equal((uint)0b11111000000000000000000011110000, cpu.CurrentStatus.RegisterValue);
            Assert.Equal((uint)0b11111000000000000000000011110000, cpu.CurrentRegisterSet.GetRegister(0));
        }
        public void And_AndRegOneAndImmediate_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xCAFEBABE;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE2010CFF // AND r1, #0xFF00
            });

            Assert.Equal((uint)0x0000BA00, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal(0xCAFEBABE, cpu.CurrentRegisterSet.GetRegister(1));
        }
Пример #11
0
        public void BranchAndExchange_BranchToRegZero_PcCorrect()
        {
            const uint targetAddress = InternalWramRegion.REGION_START + 0x1000;

            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = targetAddress;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE12FFF10 // BX r0
            });

            Assert.Equal(targetAddress, cpu.CurrentRegisterSet.GetRegister(CpuUtil.PC));
        }
        public void Move_MoveRegOneToRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xCAFEBABE;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE1A00001 // MOV r0, r1
            });

            Assert.Equal(0xCAFEBABE, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal(0xCAFEBABE, cpu.CurrentRegisterSet.GetRegister(1));
        }
        public void GetRelativeAddress_LoadRegSevenWithPcRelativeAddress_RegSevenCorrect()
        {
            const uint targetAddress = InternalWramRegion.REGION_START + 0x4 + 0x3FC;

            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(7) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xA7FF // ADD r7, PC, #0x3FC
            }, true);

            Assert.Equal(targetAddress, cpu.CurrentRegisterSet.GetRegister(7));
        }
Пример #14
0
        public void Multiply_RegOneAndRegTwo_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xFFFFFFF6;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x00000014;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x4843, // MUL r0, r1
            });

            Assert.Equal((uint)0xFFFFFF38, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x00000014, cpu.CurrentRegisterSet.GetRegister(1));
        }
Пример #15
0
        public void Eor_RegOneWithRegTwo_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xCAFEBABE;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x4840 // EOR r0, r1
            });

            Assert.Equal((uint)0x14530451, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0xDEADBEEF, cpu.CurrentRegisterSet.GetRegister(1));
        }
Пример #16
0
        public void BitClear_BicWithRegZeroAndRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0x000000FF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xFFFFFF00;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x8843 // BIC r0, r1
            });

            Assert.Equal((uint)0x000000FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0xFFFFFF00, cpu.CurrentRegisterSet.GetRegister(1));
        }
Пример #17
0
        public void Negate_SubtractZeroFromRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x00001000;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x4842 // NEG r0, r1
            });

            Assert.Equal((uint)0xFFFFF000, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x00001000, cpu.CurrentRegisterSet.GetRegister(1));
        }
Пример #18
0
        public void Orr_OrRegZeroAndRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xCAFE0000;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x0000BABE;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x0843 // AND r0, r1
            });

            Assert.Equal((uint)0xCAFEBABE, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x0000BABE, cpu.CurrentRegisterSet.GetRegister(1));
        }
        public void Sub_ImmediateToRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x0000F000;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xC81F // SUB r0, r1, #7
            });

            Assert.Equal((uint)0x0000F000 - 0x7, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x0000F000, cpu.CurrentRegisterSet.GetRegister(1));
        }
        public void Branch_BranchWithLoadedHiBits_PcCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(CpuUtil.LR) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xF3FF,
                0xFBFF
            }, true);

            Assert.Equal(InternalWramRegion.REGION_START + 0x4 + 0x1, cpu.CurrentRegisterSet.GetRegister(CpuUtil.LR));
            Assert.Equal((uint)0x33FF802, cpu.CurrentRegisterSet.GetRegister(CpuUtil.PC)); // TODO: is this correct?
        }
Пример #21
0
        public void BranchExchange_BranchToRegEight_PcCorrectAndInThumbMode()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(8) = InternalWramRegion.REGION_START + 1;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xc747 // BX r8
            });

            Assert.Equal(InternalWramRegion.REGION_START, cpu.CurrentRegisterSet.GetRegister(CpuUtil.PC));
            Assert.Equal(InternalWramRegion.REGION_START + 1, cpu.CurrentRegisterSet.GetRegister(8));
            Assert.True(cpu.CurrentStatus.Thumb);
        }
Пример #22
0
        public void Move_MoveRegNineToRegEight_RegEightCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(8) = 0xCAFEBABE;
            cpu.CurrentRegisterSet.GetRegister(9) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xC846 // MOV r8, r9
            });

            Assert.Equal((uint)0xDEADBEEF, cpu.CurrentRegisterSet.GetRegister(8));
            Assert.Equal((uint)0xDEADBEEF, cpu.CurrentRegisterSet.GetRegister(9));
        }
Пример #23
0
        public void Mrs_MoveCpsrToRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentStatus.RegisterValue = (uint)0b11111000000000000000000011011111;

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE10F0000 // MRS r0, CPSR
            });

            Assert.Equal((uint)0b11111000000000000000000011011111, cpu.CurrentStatus.RegisterValue);
            Assert.Equal((uint)0b11111000000000000000000011011111, cpu.CurrentRegisterSet.GetRegister(0));
        }
        public void Move_MoveRegOneToRegZeroWithRorZeroImmediate_RegZeroCorrectAndCarrySet()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x0000FFFF;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE1B00061 // MOVS r0, r1, ROR#0
            });

            Assert.Equal((uint)0x00007FFF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x0000FFFF, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
Пример #25
0
        public void Asr_ArithmaticShiftRegZeroRightByRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0x801FF000;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xFEFEFE0D;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x0841 // ASR r0, r1
            });

            Assert.Equal((uint)0xFFFC00FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0xFEFEFE0D, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
        public void ShiftedRegister_AsrRegOneWithResultInRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x801FF000;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x4813 // ASR r0, r1, #8
            });

            Assert.Equal((uint)0xFFFC00FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x801FF000, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
        public void ShiftedRegister_LslRegOneWithResultInRegZero_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x000001FF;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0x0806 // LSL r0, r1, #24
            });

            Assert.Equal((uint)0xFF000000, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x000001FF, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
Пример #28
0
        public void Lsr_ShiftRegZeroRightByRegOne_RegZeroCorrect()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xFF800000;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xFEFEFE18;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xc840 // LSR r0, r1
            });

            Assert.Equal((uint)0x000000FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0xFEFEFE18, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
Пример #29
0
        public void Move_MoveRegOneToRegZeroWithRor_RegZeroCorrectAndCarrySet()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0x0000FFFF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0xFEFEFE08;

            CpuUtil.RunCpu(cpu, new ushort[]
            {
                0xc841 // ROR r0, r1
            });

            Assert.Equal((uint)0xFF0000FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0xFEFEFE08, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }
        public void Move_MoveRegOneToRegZeroWithAsr_RegZeroCorrectAndCarrySet()
        {
            AgbCpu cpu = CpuUtil.CreateCpu();

            cpu.CurrentRegisterSet.GetRegister(0) = 0xDEADBEEF;
            cpu.CurrentRegisterSet.GetRegister(1) = 0x801FF000;

            CpuUtil.RunCpu(cpu, new uint[]
            {
                0xE1B006C1 // MOVS r0, r1, ASR#13
            });

            Assert.Equal((uint)0xFFFC00FF, cpu.CurrentRegisterSet.GetRegister(0));
            Assert.Equal((uint)0x801FF000, cpu.CurrentRegisterSet.GetRegister(1));
            Assert.True(cpu.CurrentStatus.Carry);
        }