private SimulationModel ExecuteTest(Register16Table reg, bool write)
        {
            var ob = OpcodeByte.New(x: 1, z: 3,
                                    q: (byte)(write ? 0: 1), p: (byte)reg);

            var cpuZ80 = new CpuZ80();
            var buffer = write ?
                         new byte[] { 0xED, ob.Value, AddressLo, AddressHi, 0, 0, 0 }:
            new byte[] { 0xED, ob.Value, AddressLo, AddressHi, 0, ExpectedLo, ExpectedHi };
            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            if (write)
            {
                if (reg == Register16Table.SP)
                {
                    cpuZ80.Registers.SP = Expected;
                }
                else
                {
                    cpuZ80.Registers[reg] = Expected;
                }
            }

            model.ClockGen.SquareWave(20);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
        private SimulationModel ExecuteTest(OpcodeByte ob, byte extension = 0)
        {
            var cpuZ80 = new CpuZ80();
            var buffer = extension == 0 ?
                         new byte[] { ob.Value, 0, 0, 0, 0, 0 } :
            new byte[] { extension, ob.Value, 0, 0, 0, 0 };
            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters(sp: Stack);

            if (extension == 0xDD)
            {
                cpuZ80.Registers.IX = Expected;
            }
            else if (extension == 0xFD)
            {
                cpuZ80.Registers.IY = Expected;
            }
            else
            {
                cpuZ80.Registers.HL = Expected;
            }

            model.ClockGen.SquareWave(extension == 0 ? 19 : 23);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #3
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);
        }
예제 #4
0
        public void ExAFAF()
        {
            var ob = OpcodeByte.New(x: 0, z: 0, y: 1);

            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { ob.Value });

            cpuZ80.FillRegisters(a: 0x55, a_a: 0xAA);

            model.ClockGen.SquareWave(4);

            cpuZ80.AssertRegisters(a: 0xAA, a_a: 0x55);
        }
예제 #5
0
        public void ExDE_HL()
        {
            var ob = OpcodeByte.New(x: 3, z: 3, y: 5);

            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { ob.Value });

            cpuZ80.FillRegisters(de: 0x1234, hl: 0x9876);

            model.ClockGen.SquareWave(4);

            cpuZ80.AssertRegisters(hl: 0x1234, de: 0x9876);
        }
예제 #6
0
        public void Nop()
        {
            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { 0x00 });

            cpuZ80.FillRegisters(pc: 0);

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            cpuZ80.AssertRegisters(pc: 1);
        }
예제 #7
0
        private CpuZ80 ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest)
        {
            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new[] { ob.Value });

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #8
0
        private static SimulationModel ExecuteTest(OpcodeByte ob, byte value)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { 0xCB, ob.Value, 0, 0, 0, value };
            var    model  = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters(hl: AddressHL);

            model.ClockGen.SquareWave(ob.X == 1 ? 12 : 15);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #9
0
        private void FillRegister(CpuZ80 cpu, Register8Table reg, ushort value)
        {
            switch (reg)
            {
            case Register8Table.B:
            case Register8Table.C:
                cpu.FillRegisters(bc: value);
                break;

            case Register8Table.D:
            case Register8Table.E:
                cpu.FillRegisters(de: value);
                break;

            case Register8Table.H:
            case Register8Table.L:
                cpu.FillRegisters(hl: value);
                break;

            case Register8Table.A:
                cpu.FillRegisters(a: (byte)value);
                break;
            }
        }
예제 #10
0
        private SimulationModel ExecuteTest(OpcodeByte ob)
        {
            var cpu   = new CpuZ80();
            var model = cpu.Initialize(new byte[] { ob.Value });

            cpu.FillRegisters();

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            cpu.AssertRegisters();

            return(model);
        }
예제 #11
0
        // TODO: make OUTIR/OUTDR tests that actually repeat.

        private SimulationModel ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest, bool isConditionMet)
        {
            var cpu   = new CpuZ80();
            var model = cpu.Initialize(
                new byte[] { 0xED, ob.Value, 0, 0, Value, 0, 0 },
                new byte[] { 0, 0, 0, 0, 0, 0, 0 });

            cpu.FillRegisters();
            preTest(cpu);

            model.ClockGen.SquareWave(isConditionMet ? 16 : 21);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #12
0
        private static SimulationModel ExecuteTest(OpcodeByte ob, byte value, Action <CpuZ80> preTest, byte extension)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { extension, 0xCB, Offset, ob.Value, value };
            var    model  = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            model.ClockGen.SquareWave(ob.X == 1 ? 20 : 23);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #13
0
        private static CpuZ80 ExecuteTest(OpcodeByte ob, bool carry)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { ob.Value };
            var    model  = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            cpuZ80.Registers.Flags.C = carry;

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #14
0
        private static CpuZ80 ExecuteTest(OpcodeByte ob, Action <SimulationModel> fnPreTest)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { ob.Value };
            var    model  = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            fnPreTest(model);

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #15
0
        public void Exx()
        {
            var ob = OpcodeByte.New(x: 3, z: 1, q: 1, p: 1);

            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { ob.Value });

            cpuZ80.FillRegisters(bc: 0x1234, de: 0x5678, hl: 0x9ABC,
                                 a_bc: 0x4321, a_de: 8765, a_hl: 0xCBA9);

            model.ClockGen.SquareWave(4);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            cpuZ80.AssertRegisters(a_bc: 0x1234, a_de: 0x5678, a_hl: 0x9ABC,
                                   bc: 0x4321, de: 8765, hl: 0xCBA9);
        }
        private static CpuZ80 ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest, byte extension = 0)
        {
            var cpuZ80 = new CpuZ80();
            var buffer = extension == 0 ?
                         new byte[] { ob.Value, 0, 0, 0, 0, Value } :
            new byte[] { extension, ob.Value, Offset, 0, Value, 0 };
            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            model.ClockGen.SquareWave(extension == 0 ? 7 : 19);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #17
0
        private static CpuZ80 ExecuteTest(OpcodeByte ob, byte extension = 0)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = (extension == 0) ?
                            new byte[] { ob.Value } :
            new byte[] { extension, ob.Value };

            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();

            model.ClockGen.SquareWave(extension == 0 ? 4 : 8);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
        private static SimulationModel ExecuteTest(Action <SimulationModel> preTest, byte extension = 0)
        {
            var ob     = OpcodeByte.New(z: 6, y: 6);
            var cpuZ80 = new CpuZ80();
            var buffer = extension == 0 ?
                         new byte[] { ob.Value, Value, 0, 0, 0, 0 } :
            new byte[] { extension, ob.Value, unchecked ((byte)Offset), Value, 0, 0, 0 };
            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(model);

            model.ClockGen.SquareWave(extension == 0 ? 10 : 19);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #19
0
        private static CpuZ80 ExecuteTest(OpcodeByte rst)
        {
            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(null);

            var writer = new MemoryWriter <BusData16, BusData8>(model.Memory);

            writer.Fill(0x48, new BusData8(0));
            writer[new BusData16(0)] = new BusData8(rst.Value);

            cpuZ80.FillRegisters();

            model.ClockGen.SquareWave(11);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #20
0
        private static CpuZ80 ExecuteTest(byte b, long cycles)
        {
            var djnz = OpcodeByte.New(y: 2);
            var d    = unchecked ((byte)-2);

            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { djnz.Value, d });

            var bc = (ushort)((b << 8) | CpuZ80TestExtensions.MagicValue);

            cpuZ80.FillRegisters(bc: bc);

            model.ClockGen.SquareWave(cycles);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #21
0
        private CpuZ80 ExecuteTest(byte value)
        {
            var ob = OpcodeByte.New(x: 1, z: 4, y: 0);

            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { 0xED, ob.Value };

            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            cpuZ80.Registers.A = value;

            model.ClockGen.SquareWave(8);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #22
0
        private static CpuZ80 ExecuteTest(OpcodeByte ob,
                                          bool c = false, bool z = false)
        {
            var d = unchecked ((byte)-2);

            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new byte[] { ob.Value, d });

            cpuZ80.Registers.Flags.Z = z;
            cpuZ80.Registers.Flags.C = c;

            cpuZ80.FillRegisters();

            model.ClockGen.SquareWave(12);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #23
0
        private SimulationModel ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest, byte extension = 0)
        {
            var cpu = new CpuZ80();

            var buffer = extension == 0 ?
                         new byte[] { ob.Value, IoAddress } :
            new byte[] { extension, ob.Value };

            var model = cpu.Initialize(buffer, new byte[] { 0, 0, 0, 0, 0 });

            cpu.FillRegisters();
            preTest(cpu);

            model.ClockGen.SquareWave(extension == 0 ? 11 : 12);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
        private static CpuZ80 ExecuteTest(Register16Table reg16, bool carry)
        {
            var ob = OpcodeByte.New(x: 1, z: 2, q: 0, p: (byte)reg16);

            var cpuZ80 = new CpuZ80();

            byte[] buffer = new byte[] { 0xED, ob.Value };

            var model = cpuZ80.Initialize(buffer);

            cpuZ80.Registers.Flags.C = carry;
            cpuZ80.FillRegisters(hl: Value);
            cpuZ80.Registers[reg16] = ValueToSub;

            model.ClockGen.SquareWave(15);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
예제 #25
0
        private static CpuZ80 ExecuteTest(OpcodeByte call,
                                          Action <Registers> preTest,
                                          bool alt = false)
        {
            var cpuZ80 = new CpuZ80();
            var model  = cpuZ80.Initialize(new[] { call.Value, AddresssLSB, AddresssMSB });

            cpuZ80.FillRegisters();

            if (preTest != null)
            {
                preTest(cpuZ80.Registers);
            }

            model.ClockGen.SquareWave(alt ? 11 : 17);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(cpuZ80);
        }
        private static SimulationModel ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest, byte extension = 0)
        {
            var regA = ob.Q == 3;

            var cpuZ80 = new CpuZ80();

            byte[] buffer = (extension == 0) ?
                            new byte[] { ob.Value, AddressLo, 0, 0, 0, 0, 0 } :
            new byte[] { extension, ob.Value, AddressLo, 0, 0, 0, 0 };

            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            model.ClockGen.SquareWave(extension == 0 ? regA ? 13 : 16 : 20);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }
예제 #27
0
        private static SimulationModel ExecuteTest(OpcodeByte ob, byte value, Action <CpuZ80> preTest, byte extension = 0, byte group = 0xCB)
        {
            var cpuZ80 = new CpuZ80();

            byte[] buffer = extension == 0 ?
                            new byte[] { group, ob.Value, 0, 0, 0, value }:
            new byte[] { extension, group, ob.Value, Offset, 0, 0, value };
            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            long clocks = group == 0xCB ? 15 : 18;

            if (extension != 0)
            {
                clocks += 8;
            }
            model.ClockGen.SquareWave(clocks);

            Console.WriteLine(model.LogicAnalyzer.ToWaveJson());

            return(model);
        }