Пример #1
0
        public void JPnn_nc_NC()
        {
            var ob = OpcodeByte.New(x: 3, z: 2, y: 2);

            var cpu = ExecuteTest(ob, (r) => {
                return(true);
            });

            cpu.AssertRegisters(pc: JumpAddress);
        }
Пример #2
0
        protected override void OnLastCycleLastM()
        {
            base.OnLastCycleLastM();

            if (!IsWrite)
            {
                var val16 = OpcodeByte.MakeUInt16(_readInstructionLo.Data, _readInstructionHi.Data);
                Registers[AffectedRegisters] = val16;
            }
        }
        public void Ld_HL_H()
        {
            var ob = OpcodeByte.New(x: 1, z: 4, y: 6);

            var model = ExecuteTest(ob, (cpu) => {
                cpu.Registers.HL = Address;
            });

            model.Memory.Assert(Address, 0x00);
        }
Пример #4
0
        public void JPnn_z_NZ()
        {
            var ob = OpcodeByte.New(x: 3, z: 2, y: 1);

            var cpu = ExecuteTest(ob, (r) => {
                return(false);
            });

            cpu.AssertRegisters(pc: Address);
        }
        public void EI()
        {
            var ob    = OpcodeByte.New(x: 3, z: 3, y: 7);
            var model = ExecuteTest(ob);

            model.Cpu.Registers.Interrupt.IFF1.Should().BeTrue("IFF1");
            model.Cpu.Registers.Interrupt.IFF2.Should().BeTrue("IFF2");
            model.Cpu.Registers.Interrupt.IsEnabled.Should().BeFalse("IsEnabled");
            model.Cpu.Registers.Interrupt.IsSuspended.Should().BeTrue("IsSuspended");
        }
Пример #6
0
        public void PushIY()
        {
            var push  = OpcodeByte.New(x: 3, z: 5, p: 2);
            var model = ExecuteTest(push,
                                    (m) => m.Cpu.FillRegisters(sp: Stack, iy: Value), 0xFD);

            model.Cpu.AssertRegisters(sp: Stack - 2, iy: Value);
            model.Memory.Assert(Stack - 1, ValueMsb);
            model.Memory.Assert(Stack - 2, ValueLsb);
        }
Пример #7
0
        public void Ex_SP_HL()
        {
            var ob = OpcodeByte.New(x: 3, z: 3, y: 4);

            var model = ExecuteTest(ob);

            model.Cpu.AssertRegisters(hl: 0);
            model.Memory.Assert(Stack, ExpectedLo);
            model.Memory.Assert(Stack + 1, ExpectedHi);
        }
        public void DAA_NoFlags_NoOverflow()
        {
            var ob  = OpcodeByte.New(z: 7, y: 4);
            var cpu = ExecuteTest(ob, (cpuZ80) =>
            {
                cpuZ80.Registers.A = Value1;
            });

            cpu.Registers.A.Should().Be(Value1);
        }
        public void JP_IY()
        {
            var ob = OpcodeByte.New(x: 3, z: 1, q: 1, p: 2);

            var cpu = ExecuteTest(ob, (r) => {
                r.IY = JumpAddress;
            }, 0xFD);

            cpu.AssertRegisters(pc: JumpAddress, iy: JumpAddress);
        }
        public void JP_HL()
        {
            var ob = OpcodeByte.New(x: 3, z: 1, q: 1, p: 2);

            var cpu = ExecuteTest(ob, (r) => {
                r.HL = JumpAddress;
            });

            cpu.AssertRegisters(pc: JumpAddress, hl: JumpAddress);
        }
Пример #11
0
        private static SimulationModel CreateModel()
        {
            var ob     = OpcodeByte.New(x: 1, z: 6, y: 6);
            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { ob.Value });

            cpuZ80.FillRegisters();

            return(model);
        }
        public void CPL()
        {
            var ob  = OpcodeByte.New(z: 7, y: 5);
            var cpu = ExecuteTest(ob, (cpuZ80) =>
            {
                cpuZ80.Registers.A = Value1;
            });

            cpu.Registers.A.Should().Be(unchecked ((byte)~Value1));
        }
Пример #13
0
        public void LdRA()
        {
            var ob = OpcodeByte.New(x: 1, z: 7, y: 1);

            var cpu = ExecuteTest(ob, (z80) =>
            {
                z80.Registers.A = Value;
            });

            cpu.AssertRegisters(a: Value, r: Value);
        }
Пример #14
0
        public bool AddOpcodeByte(OpcodeByte opcodeByte)
        {
            var valid = _opcodeBuilder.Add(opcodeByte);

            if (valid)
            {
                _cycles.OpcodeDefinition = _opcodeBuilder.Opcode.Definition;
            }

            return(valid);
        }
Пример #15
0
        private ushort GetAddress()
        {
            if (IsIndirect)
            {
                return(OpcodeByte.MakeUInt16(
                           _readIndirectPart.Data,
                           new OpcodeByte(Registers.A)));
            }

            return(Registers.BC);
        }
Пример #16
0
        public void Ld_HL_E()
        {
            var ob = OpcodeByte.New(x: 1, z: 3, y: 6);

            var model = ExecuteTest(ob, (cpu) => {
                cpu.Registers.HL = Address;
                cpu.Registers.E  = Value;
            });

            model.Memory.Assert(Address, Value);
        }
Пример #17
0
        public void Ld_IYd_A()
        {
            var ob = OpcodeByte.New(x: 1, z: 7, y: 6);

            var model = ExecuteTest(ob, (cpu) => {
                cpu.Registers.IY = Address;
                cpu.Registers.A  = Value;
            }, 0xFD);

            model.Memory.Assert(Address + Offset, Value);
        }
Пример #18
0
        public void Ld_DE_A()
        {
            var ob = OpcodeByte.New(z: 2, q: 0, p: 1);

            var model = ExecuteTest(ob, (cpu) => {
                cpu.Registers.DE = Address;
                cpu.Registers.A  = Value;
            });

            model.Memory.Assert(Address, Value);
        }
        public void LdSpIy()
        {
            var ob = OpcodeByte.New(x: 3, z: 1, q: 1, p: 3);

            var cpu = ExecuteTest(ob, (z80) =>
            {
                z80.Registers.HL = 0;
            }, 0xFD);

            cpu.AssertRegisters(sp: 0, hl: 0);
        }
Пример #20
0
        public void Ld_IXd_L()
        {
            var ob = OpcodeByte.New(x: 1, z: 5, y: 6);

            var model = ExecuteTest(ob, (cpu) => {
                cpu.Registers.IX = Address;
                cpu.Registers.L  = Value;
            }, 0xDD);

            model.Memory.Assert(Address + Offset, Value);
        }
Пример #21
0
        public void Out_C_0()
        {
            var ob    = OpcodeByte.New(x: 1, z: 1, y: 6);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.BC = IoAddress;
            }, 0xED);

            model.Cpu.AssertRegisters(bc: IoAddress);
            model.IoSpace.Assert(IoAddress, 0);
        }
Пример #22
0
        public void JPnn_nc_C()
        {
            var ob = OpcodeByte.New(x: 3, z: 2, y: 2);

            var cpu = ExecuteTest(ob, (r) => {
                r.Flags.C = true;
                return(false);
            });

            cpu.AssertRegisters(pc: Address);
        }
Пример #23
0
        public void JPnn_z_Z()
        {
            var ob = OpcodeByte.New(x: 3, z: 2, y: 1);

            var cpu = ExecuteTest(ob, (r) => {
                r.Flags.Z = true;
                return(true);
            });

            cpu.AssertRegisters(pc: JumpAddress);
        }
Пример #24
0
        public void DecHL()
        {
            var ob = OpcodeByte.New(z: 5, y: 6);

            var model = ExecuteTest(ob, (m) => {
                m.Cpu.FillRegisters(hl: Address2);
                m.Memory.Set(Address2, Value2);
            });

            model.Cpu.AssertRegisters(hl: Address2);
            model.Memory.Assert(Address2, Value2 - 1);
        }
Пример #25
0
        public void OUTDR()
        {
            var ob    = OpcodeByte.New(x: 2, z: 3, y: 7);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.HL = Address;
                cpu.Registers.BC = IoAddress;
            }, true);

            model.Cpu.AssertRegisters(hl: Address - 1, bc: 0xFF00 | IoAddress);
            model.IoSpace.Assert(IoAddress, Value);
        }
Пример #26
0
        public void Out_C_L()
        {
            var ob    = OpcodeByte.New(x: 1, z: 1, y: 5);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.BC = IoAddress;
                cpu.Registers.HL = 0xAA55;
            }, 0xED);

            model.Cpu.AssertRegisters(bc: IoAddress, hl: 0xAA55);
            model.IoSpace.Assert(IoAddress, 0x55);
        }
Пример #27
0
        public void OUTI()
        {
            var ob    = OpcodeByte.New(x: 2, z: 3, y: 4);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.HL = Address;
                cpu.Registers.BC = 0x01 << 8 | IoAddress;
            }, true);

            model.Cpu.AssertRegisters(hl: Address + 1, bc: IoAddress);
            model.IoSpace.Assert(IoAddress, Value);
        }
Пример #28
0
        public void INIR()
        {
            var ob    = OpcodeByte.New(x: 2, z: 2, y: 6);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.HL = Address;
                cpu.Registers.BC = 0x0100 | IoAddress;
            }, true);

            model.Cpu.AssertRegisters(hl: Address + 1, bc: IoAddress);
            model.Memory.Assert(Address, Value);
        }
Пример #29
0
        public void INDR()
        {
            var ob    = OpcodeByte.New(x: 2, z: 2, y: 7);
            var model = ExecuteTest(ob, (cpu) =>
            {
                cpu.Registers.HL = Address;
                cpu.Registers.BC = IoAddress;
            }, true);

            model.Cpu.AssertRegisters(hl: Address - 1, bc: 0xFF02);
            model.Memory.Assert(Address, Value);
        }
        public void AddCarryHL_SP_c()
        {
            var ob = OpcodeByte.New(x: 1, z: 2, q: 1, p: 3);

            var cpuZ80 = ExecuteTest(ob, (cpu) =>
            {
                cpu.FillRegisters(sp: Value);
                cpu.Registers.Flags.C = true;
            }, extension: 0xED);

            cpuZ80.AssertRegisters(hl: ExpectedValue + 1, sp: Value);
            cpuZ80.Registers.Flags.C.Should().BeFalse();
        }