Exemple #1
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);
        }
Exemple #2
0
        private static CpuZ80 ExecuteTest(OpcodeByte ob, Action <CpuZ80> preTest)
        {
            var cpuZ80 = new CpuZ80();

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

            var model = cpuZ80.Initialize(buffer);

            cpuZ80.FillRegisters();
            preTest(cpuZ80);

            model.ClockGen.SquareWave(9);

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

            return(cpuZ80);
        }
        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);
        }
Exemple #4
0
        private static SimulationModel ExecuteTest(OpcodeByte push,
                                                   Action <SimulationModel> preTest, byte extension = 0)
        {
            var cpuZ80 = new CpuZ80();
            var buffer = (extension == 0) ?
                         new byte[] { push.Value, 0, 0, 0, 0, 0 } :
            new byte[] { extension, push.Value, 0, 0, 0, 0 };
            var model = cpuZ80.Initialize(buffer);

            preTest(model);

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

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

            return(model);
        }
        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);
        }
Exemple #6
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);
        }
Exemple #7
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);
        }
Exemple #8
0
        public void InterruptIsLatched()
        {
            var cpu = new CpuZ80();

            cpu.Registers.Interrupt.IFF1 = true;
            var interruptProvider = cpu.NonMaskableInterrupt.CreateConnection();
            var model             = cpu.Initialize(new byte[] { 0 });

            model.ClockGen.SquareWave(2);
            interruptProvider.Write(DigitalLevel.NegEdge);
            model.ClockGen.SquareWave(2);

            // into nmi
            model.ClockGen.SquareWave(11);

            // nmi turns off interrupts
            cpu.Registers.Interrupt.IFF1.Should().BeFalse();
        }
        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);
        }
Exemple #10
0
        public void IntEI_AcceptInterrupt_TurnsOffIFF1()
        {
            var cpu = new CpuZ80();

            cpu.Registers.Interrupt.IFF1 = true;
            var interruptProvider = cpu.Interrupt.CreateConnection();
            var model             = cpu.Initialize(new byte[] { 0 });

            // nop
            model.ClockGen.SquareWave(2);
            interruptProvider.Write(DigitalLevel.Low);
            model.ClockGen.SquareWave(2);
            // start interrupt
            model.ClockGen.SquareWave(2);

            // interrupt accepted turns off IFF1
            cpu.Registers.Interrupt.IFF1.Should().BeFalse();
        }
Exemple #11
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);
        }
Exemple #12
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);
        }
Exemple #13
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);
        }
        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);
        }
Exemple #15
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);
        }
        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, Value1, Value2, 0, 0, 0, 0, 0 });

            cpu.FillRegisters();
            preTest(cpu);

            long cycles = 16;

            if (!isConditionMet)
            {
                cycles += 21;
            }
            model.ClockGen.SquareWave(cycles);

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

            return(model);
        }
        private static SimulationModel ExecuteTest(OpcodeByte ret,
                                                   Action <SimulationModel> preTest, bool conditionMet,
                                                   byte extension = 0)
        {
            var cpuZ80 = new CpuZ80();

            var buffer = (extension == 0) ?
                         new byte[] { ret.Value, 0, 0, 0, 0x55, 0xAA } :
            new byte[] { extension, ret.Value, 0, 0, 0x55, 0xAA };
            var model = cpuZ80.Initialize(buffer);

            model.Cpu.FillRegisters(sp: Stack);

            preTest(model);

            var def = OpcodeDefinition.Find(ret, extension == 0 ? null : new OpcodeByte(extension));

            model.ClockGen.SquareWave(conditionMet ? def.Cycles.Sum() : def.AltCycles.Sum());

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

            return(model);
        }
Exemple #19
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);
        }