Пример #1
0
        public CpuZ80()
        {
            Clock = new DigitalSignalConsumer("CLK");

            Reset                = new DigitalSignalConsumer("RST");
            Interrupt            = new DigitalSignalConsumer("INT");
            NonMaskableInterrupt = new DigitalSignalConsumer("NMI");
            Wait = new DigitalSignalConsumer("WAIT");

            BusRequest     = new DigitalSignalConsumer("BREQ");
            BusAcknowledge = new DigitalSignalProvider("BACK");

            MemoryRequest = new DigitalSignalProvider("MREQ");
            IoRequest     = new DigitalSignalProvider("IORQ");
            Read          = new DigitalSignalProvider("RD");
            Write         = new DigitalSignalProvider("WR");

            MachineCycle1 = new DigitalSignalProvider("M1");
            Refresh       = new DigitalSignalProvider("RFSH");
            Halt          = new DigitalSignalProvider("HALT");

            Address = new BusMaster <BusData16>("Address");
            Data    = new BusMasterSlave <BusData8>("Data");

            // bond wires
            _die = new Die(
                Clock, Reset, Interrupt, NonMaskableInterrupt,
                Wait, BusRequest, BusAcknowledge,
                MemoryRequest, IoRequest, Read, Write,
                MachineCycle1, Refresh, Halt, Address, Data);
        }
Пример #2
0
        private static DigitalSignal Connect(DigitalSignalProvider provider, DigitalSignalConsumer consumer)
        {
            if (consumer.IsConnected && provider.IsConnected)
            {
                if (consumer.DigitalSignal != provider.DigitalSignal)
                {
                    throw new InvalidOperationException("Both Consumer and Provider are already connected to different signals.");
                }

                return(consumer.DigitalSignal);
            }

            DigitalSignal signal = null;

            if (consumer.IsConnected)
            {
                signal = consumer.DigitalSignal;
                provider.ConnectTo(signal);
            }
            else if (provider.IsConnected)
            {
                signal = provider.DigitalSignal;
                consumer.ConnectTo(signal);
            }

            return(signal);
        }
Пример #3
0
        public DirectedGraphNode Add(DigitalSignalConsumer consumer, string ownerName = null)
        {
            if (!Visit(consumer) ||
                (!consumer.IsConnected && !DisplayUnconnected))
            {
                return(FindNode(consumer));
            }

            var node = AddNode <DigitalSignalConsumer>(consumer.Name, ownerName, SafeNetName(consumer));

            SetNodeMap(consumer, node);

            if (DisplayValues)
            {
                node.Description = consumer.Level.ToString();
            }

            if (consumer.IsConnected)
            {
                Add(consumer.DigitalSignal);

                var dsid = _idBuilder.NewId <DigitalSignal>(consumer.DigitalSignal.Name);
                _dgmlBuilder.AddLink(node.Id, dsid);
            }

            return(node);
        }
Пример #4
0
 public InputPort()
 {
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster("InputPort Output");
     _buffer = new BusDataBuffer();
 }
Пример #5
0
        public InvertorGate()
        {
            _input  = new DigitalSignalConsumer("Invertor Input");
            _output = new DigitalSignalProvider("Invertor Output");

            _input.OnChanged += Input_OnChanged;
        }
Пример #6
0
        public CpuZ80()
        {
            Clock = new DigitalSignalConsumer("CLK");

            Reset                = new DigitalSignalConsumer("RST");
            Interrupt            = new DigitalSignalConsumer("INT");
            NonMaskableInterrupt = new DigitalSignalConsumer("NMI");
            Wait = new DigitalSignalConsumer("WAIT");

            BusRequest     = new DigitalSignalConsumer("BREQ");
            BusAcknowledge = new DigitalSignalProvider("BACK");

            MemoryRequest = new DigitalSignalProvider("MREQ");
            IoRequest     = new DigitalSignalProvider("IORQ");
            Read          = new DigitalSignalProvider("RD");
            Write         = new DigitalSignalProvider("WR");

            MachineCycle1 = new DigitalSignalProvider("M1");
            Refresh       = new DigitalSignalProvider("RFSH");
            Halt          = new DigitalSignalProvider("HALT");

            Address = new BusMaster <BusData16>("Address");
            Data    = new BusMasterSlave <BusData8>("Data");

            _execEngine = new ExecutionEngine(this);
            _registers  = new Registers();
            _alu        = new Alu(_registers);

            Initialize();
        }
Пример #7
0
 public OutputPort(string name)
 {
     Name                   = name;
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busSlave              = new BusSlave(name + "-Input");
 }
        public void Connected_Level_Floating()
        {
            var uut = new DigitalSignalConsumer();

            uut.ConnectTo(new DigitalSignal());

            uut.Level.Should().Be(DigitalLevel.Floating);
        }
        public void Unconnected_Level_DoesNotThrow()
        {
            var uut = new DigitalSignalConsumer();

            Action test = () => { var l = uut.Level; };

            test.ShouldNotThrow();
        }
Пример #10
0
 public InputPort(string name)
 {
     Name                   = name;
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster(name + "-Output");
     _buffer                = new BusDataBuffer();
 }
Пример #11
0
 private string SafeNetName(DigitalSignalConsumer consumer)
 {
     if (consumer == null || !consumer.IsConnected)
     {
         return(null);
     }
     return(consumer.DigitalSignal.Name);
 }
        public void Connected_WithName_BuildName()
        {
            var name = "Test";
            var uut  = new DigitalSignalConsumer();

            uut.ConnectTo(new DigitalSignal(name));

            uut.Name.Should().StartWith(name);
        }
Пример #13
0
        public DigitalSignalConsumer AddInput(string name = null)
        {
            var consumer = new DigitalSignalConsumer(name);

            _inputs.Add(consumer);

            consumer.OnChanged += Input_OnChanged;
            return(consumer);
        }
Пример #14
0
        public void TestInitialize()
        {
            _uut    = new BusDecoder();
            _output = _uut.Output.CreateConnection();

            var inputBus = new Bus(16);

            _uut.Input.ConnectTo(inputBus);
            _input           = new BusMaster(inputBus);
            _input.IsEnabled = true;
        }
        public void Connect_WriteProvider_ConsumerSeesChanges()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer.Level.Should().Be(DigitalLevel.High);
        }
Пример #16
0
        // returns index (always added to the end)
        public int Add(out DigitalSignalConsumer input, out DigitalSignalProvider output, string name = null)
        {
            var index = _inputs.Count;

            input            = new DigitalSignalConsumer(name);
            input.OnChanged += Input_OnChanged;
            _inputs.Add(input);

            output = new DigitalSignalProvider(name);
            _outputs.Add(output);

            return(index);
        }
Пример #17
0
        public Memory()
        {
            ChipEnable = new DigitalSignalConsumer("CE");
            Address    = new BusSlave <AddressT>("Address");
            Data       = new BusMasterSlave <DataT>("Data");

            ChipEnable.OnChanged += ChipEnable_OnChanged;
            Address.OnChanged    += Address_OnChanged;
            Data.Slave.OnChanged += DataIn_OnChanged;

            long length = (long)Math.Pow(2, Address.Value.Width);

            _memory = new DataT[length];
        }
        public void Connect_WriteProvider_EventTriggered()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);
            consumer.MonitorEvents();

            provider.Write(DigitalLevel.High);

            consumer.ShouldRaise("OnChanged");
        }
Пример #19
0
        public static DigitalSignal GetOrAddSignal(this DigitalSignalConsumer consumer, string signalName = null)
        {
            DigitalSignal signal = null;

            if (!consumer.IsConnected)
            {
                signal = new DigitalSignal(signalName);
                consumer.ConnectTo(signal);
            }
            else
            {
                signal = consumer.DigitalSignal;
            }

            return(signal);
        }
        public void Write_MultipleConsumers_AllSeeChangedLevel()
        {
            var provider  = new DigitalSignalProvider();
            var consumer1 = new DigitalSignalConsumer();
            var consumer2 = new DigitalSignalConsumer();
            var signal    = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer1.ConnectTo(signal);
            consumer2.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer1.Level.Should().Be(DigitalLevel.High);
            consumer2.Level.Should().Be(DigitalLevel.High);
        }
Пример #21
0
        public static DigitalSignal ConnectTo(this DigitalSignalConsumer consumer, DigitalSignalProvider provider, string signalName = null)
        {
            DigitalSignal signal = Connect(provider, consumer);

            if (signal == null)
            {
                if (signalName == null)
                {
                    signalName = consumer.Name;
                }
                signal = consumer.GetOrAddSignal(signalName);
                provider.ConnectTo(signal);
            }

            return(signal);
        }
Пример #22
0
        public static DigitalSignalProvider CreateConnection(this DigitalSignalConsumer consumer, DigitalSignalProvider provider = null, string signalName = null)
        {
            if (signalName == null && consumer.Name != null)
            {
                signalName = consumer.Name;
            }

            var signal = new DigitalSignal(signalName);

            if (provider == null)
            {
                provider = new DigitalSignalProvider();
            }

            consumer.ConnectTo(signal);
            provider.ConnectTo(signal);
            return(provider);
        }
Пример #23
0
        public Die(
            DigitalSignalConsumer clock,
            DigitalSignalConsumer reset,
            DigitalSignalConsumer interrupt,
            DigitalSignalConsumer nonMaskableInterrupt,
            DigitalSignalConsumer wait,
            DigitalSignalConsumer busRequest,
            DigitalSignalProvider busAcknowledge,
            DigitalSignalProvider memoryRequest,
            DigitalSignalProvider ioRequest,
            DigitalSignalProvider read,
            DigitalSignalProvider write,
            DigitalSignalProvider machineCycle1,
            DigitalSignalProvider refresh,
            DigitalSignalProvider halt,
            BusMaster <BusData16> addressBus,
            BusMasterSlave <BusData8> dataBus)
        {
            _clock                = clock;
            _reset                = reset;
            _interrupt            = interrupt;
            _nonMaskableInterrupt = nonMaskableInterrupt;
            _wait           = wait;
            _busRequest     = busRequest;
            _busAcknowledge = busAcknowledge;
            _memoryRequest  = memoryRequest;
            _ioRequest      = ioRequest;
            _read           = read;
            _write          = write;
            _machineCycle1  = machineCycle1;
            _refresh        = refresh;
            _halt           = halt;
            _addressBus     = addressBus;
            _dataBus        = dataBus;

            _execEngine = new ExecutionEngine(this);
            _registers  = new Registers();
            _alu        = new Alu(_registers);

            Initialize();
        }
Пример #24
0
 protected override void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
     Output.Write(InvertorGate.Invert(OrFunction()));
 }
Пример #25
0
        protected void WriteOutputFor(DigitalSignalConsumer input)
        {
            var index = _inputs.IndexOf(input);

            _outputs[index].Write(input.Level);
        }
Пример #26
0
 public MemoryRam()
 {
     WriteEnable            = new DigitalSignalConsumer("WE");
     WriteEnable.OnChanged += WriteEnable_OnChanged;
 }
Пример #27
0
 public Buffer()
 {
     _outputEnable            = new Zim80.DigitalSignalConsumer("/OE");
     _outputEnable.OnChanged += OutputEnable_OnChanged;
 }
Пример #28
0
 protected override void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
     Output.Write(AndFunction());
 }
Пример #29
0
 protected virtual void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
 }
Пример #30
0
 public OutputPort()
 {
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busSlave              = new BusSlave("OutputPort Input");
 }