public void TestLd_Rr_D16(ChangeType register, byte opCode) { //setup var prog = new byte[] { opCode, 0xFE, 0xEF }; //LD rr,nn, rr = 0xEFFE var mmu = new SimpleMmu(prog); var cpu = new Cpu(mmu); //expected outcome var cpuExpected = cpu.CopyState(); cpuExpected.Cycles = 12; cpuExpected.ProgramCounter = 3; CpuHelpers.SetValue(cpuExpected, register, 0xEFFE); //execute & validate cpu.Step(); CpuHelpers.ValidateState(cpuExpected, cpu); }
public void TestLd_R_D8(ChangeType register, OpCode opCode) { //setup var prog = new byte[] { (byte)opCode, 0xFE }; //LD r,n var mmu = new SimpleMmu(prog); var cpu = new Cpu(mmu); //expected outcome var cpuExpected = cpu.CopyState(); cpuExpected.Cycles = 8; cpuExpected.ProgramCounter = 2; CpuHelpers.SetValue(cpuExpected, register, 0xFE); //execute & validate cpu.Step(); CpuHelpers.ValidateState(cpuExpected, cpu); }
public void TestLd_addrHL_R(ChangeType sourceRegister, OpCode opCode) { //setup byte testValue = 0x0E; //H/L are special cases as they hold the address AND the value if (sourceRegister == ChangeType.H) { testValue = 0x01; } if (sourceRegister == ChangeType.L) { testValue = 0xF1; } ushort testAddress = 0x01F1; var prog = new byte[512]; prog[0] = (byte)opCode; //LD r,(HL) var mmu = new SimpleMmu(prog); var cpu = new Cpu(mmu); //put nonsense in target address mmu.WriteByte(testAddress, 0xFF); //set value in register to be copied CpuHelpers.SetValue(cpu, sourceRegister, testValue); //set HL to address to be copied to cpu.HL = testAddress; //expected outcome var cpuExpected = cpu.CopyState(); cpuExpected.Cycles = 8; cpuExpected.ProgramCounter = 1; cpuExpected.Mmu.WriteByte(testAddress, testValue); //execute & validate cpu.Step(); CpuHelpers.ValidateState(cpuExpected, cpu); }
public void TestLd_R_R(ChangeType targetRegister, ChangeType sourceRegister, OpCode opCode) { //setup byte testValue = 0xFE; var prog = new byte[] { (byte)opCode }; //LD r,r var mmu = new SimpleMmu(prog); var cpu = new Cpu(mmu); CpuHelpers.SetValue(cpu, targetRegister, 0xFF); CpuHelpers.SetValue(cpu, sourceRegister, testValue); //expected outcome var cpuExpected = cpu.CopyState(); cpuExpected.Cycles = 4; cpuExpected.ProgramCounter = 1; CpuHelpers.SetValue(cpuExpected, targetRegister, testValue); //execute & validate cpu.Step(); CpuHelpers.ValidateState(cpuExpected, cpu); }
public void TestBit(ChangeType register, byte registerVal, byte bitToCheck, bool expectedZeroFlag) { //build opcode - 0b01<reg><bit> var opCode = 0b0100_0000 | (bitToCheck << 3) | (byte)register; //setup var mem = new byte[256]; mem[0] = 0xCB; mem[1] = (byte)opCode; var aHL = (byte)0xF1; var mmu = new SimpleMmu(mem); var cpu = new Cpu(mmu); cpu.F = 0; if (register == ChangeType.aHL) { cpu.HL = aHL; mmu.WriteByte(aHL, registerVal); } else { CpuHelpers.SetValue(cpu, register, registerVal); } //expected outcome var cpuExpected = cpu.CopyState(); cpuExpected.Cycles = (uint)(register == ChangeType.aHL ? 12 : 8); cpuExpected.ProgramCounter = 2; cpuExpected.ZeroFlag = expectedZeroFlag; cpuExpected.HalfCarryFlag = true; cpuExpected.SubFlag = false; cpuExpected.CarryFlag = false; //execute & validate cpu.Step(); CpuHelpers.ValidateState(cpuExpected, cpu); }