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)); }
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)); }
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)); }
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)); }
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)); }
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); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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? }
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); }
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)); }
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); }
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); }
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); }
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); }