Beispiel #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);
        }
        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);
        }
        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);
        }
Beispiel #4
0
 public InputPort()
 {
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster("InputPort Output");
     _buffer = new BusDataBuffer();
 }
Beispiel #5
0
        public InvertorGate()
        {
            _input  = new DigitalSignalConsumer("Invertor Input");
            _output = new DigitalSignalProvider("Invertor Output");

            _input.OnChanged += Input_OnChanged;
        }
Beispiel #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();
        }
Beispiel #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();
        }
Beispiel #10
0
 public InputPort(string name)
 {
     Name                   = name;
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster(name + "-Output");
     _buffer                = new BusDataBuffer();
 }
 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);
        }
Beispiel #13
0
        public DigitalSignalConsumer AddInput(string name = null)
        {
            var consumer = new DigitalSignalConsumer(name);

            _inputs.Add(consumer);

            consumer.OnChanged += Input_OnChanged;
            return(consumer);
        }
Beispiel #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);
        }
Beispiel #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);
        }
Beispiel #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");
        }
        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);
        }
        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);
        }
        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);
        }
Beispiel #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();
        }
Beispiel #24
0
 protected override void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
     Output.Write(InvertorGate.Invert(OrFunction()));
 }
Beispiel #25
0
        protected void WriteOutputFor(DigitalSignalConsumer input)
        {
            var index = _inputs.IndexOf(input);

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