Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }