private void transmitFrame()
        {
            var td = new transmitDescriptor(machine.SystemBus);

            td.Fetch(transmitDescriptorBase | transmitDescriptorOffset);

            if (!td.Enable)
            {
                return; //if decriptor is disabled there is nothing to send (just return)
            }

            var packetBytes = machine.SystemBus.ReadBytes(td.PacketAddress, (int)td.Length);

            if (!Misc.TryCreateFrameOrLogWarning(this, packetBytes, out var packet, addCrc: true))
            {
                return;
            }

            this.Log(LogLevel.Info, "Sending packet length {0}", packet.Bytes.Length);
            this.Log(LogLevel.Info, "Packet address = 0x{0:X}", td.PacketAddress);
            FrameReady?.Invoke(packet);

            registers.Status |= 1u << 3;

            if (td.Wrap)
            {
                transmitDescriptorOffset = 0;
            }
            else
            {
                if (transmitDescriptorOffset != 0x3f8)
                {
                    transmitDescriptorOffset += 8;
                }
                else
                {
                    transmitDescriptorOffset = 0;
                }
            }

            if (td.InterruptEnable && ((registers.Control & (1u << 2)) != 0))
            {
                //if interrupts enabled
                registers.Status |= 1u << 3; //transmitter interrupt bit
                this.IRQ.Set();
                this.IRQ.Unset();
            }

            td.Enable            = false;
            td.Wrap              = false;
            td.InterruptEnable   = false;
            td.Length            = 0;
            td.UnderrunError     = false;
            td.AttemptLimitError = false;
            td.WriteBack();
        }
        private void transmitFrame()
        {
            var td = new transmitDescriptor(machine.SystemBus);

            td.Fetch(transmitDescriptorBase | transmitDescriptorOffset);

            if (!td.Enable)
            {
                return; //if decriptor is disabled there is nothing to send (just return)
            }

            var packetBytes = machine.SystemBus.ReadBytes((long)td.PacketAddress, (int)td.Length);
            var packet      = EthernetFrame.CreateEthernetFrameWithCRC(packetBytes);

            if (Link.IsConnected)
            {
                this.Log(LogLevel.Info, "Sending packet length {0}", packet.Bytes.Length);
                this.Log(LogLevel.Info, "Packet address = 0x{0:X}", td.PacketAddress);
                Link.TransmitFrameFromInterface(packet);
            }

            registers.Status |= 1u << 3;

            if (td.Wrap)
            {
                transmitDescriptorOffset = 0;
            }
            else
            {
                if (transmitDescriptorOffset != 0x3f8)
                {
                    transmitDescriptorOffset += 8;
                }
                else
                {
                    transmitDescriptorOffset = 0;
                }
            }

            if (td.InterruptEnable && ((registers.Control & (1u << 2)) != 0))
            {
                //if interrupts enabled
                registers.Status |= 1u << 3; //transmitter interrupt bit
                this.IRQ.Set();
                this.IRQ.Unset();
            }

            td.Enable            = false;
            td.Wrap              = false;
            td.InterruptEnable   = false;
            td.Length            = 0;
            td.UnderrunError     = false;
            td.AttemptLimitError = false;
            td.WriteBack();
        }
示例#3
0
        private void transmitFrame()
        {
            var td = new transmitDescriptor(machine.SystemBus);
            td.Fetch(transmitDescriptorBase | transmitDescriptorOffset);

            if(!td.Enable)
            {
                return; //if decriptor is disabled there is nothing to send (just return)
            }

            var packet = new EthernetFrame(machine.SystemBus.ReadBytes((long)td.PacketAddress, (int)td.Length));

            if(Link.IsConnected)
            {
                this.Log(LogLevel.Info, "Sending packet length {0}", packet.Length);
                this.Log(LogLevel.Info, "Packet address = 0x{0:X}", td.PacketAddress);
                Link.TransmitFrameFromInterface(packet);
            }

            registers.Status |= 1u << 3;

            if(td.Wrap)
            {
                transmitDescriptorOffset = 0;
            }
            else
            {
                if(transmitDescriptorOffset != 0x3f8)
                {
                    transmitDescriptorOffset += 8;
                }
                else
                {
                    transmitDescriptorOffset = 0;
                }
            }

            if(td.InterruptEnable && ((registers.Control & (1u << 2)) != 0))
            {
                //if interrupts enabled
                registers.Status |= 1u << 3; //transmitter interrupt bit 
                this.IRQ.Set();
                this.IRQ.Unset();
            }

            td.Enable = false;
            td.Wrap = false;
            td.InterruptEnable = false;
            td.Length = 0;
            td.UnderrunError = false;
            td.AttemptLimitError = false;
            td.WriteBack();
           
        }