Ejemplo n.º 1
0
        private void ReceiveFrameInner(EthernetFrame frame)
        {
            if ((registers.Control & (1u << 1)) == 0)
            {
                //if receiving is disabled discard packet
                return;
            }

            var rd = new receiveDescriptor(machine.SystemBus);

            if (!EthernetFrame.CheckCRC(frame.Bytes))
            {
                rd.CRCError = true;
                this.Log(LogLevel.Info, "Invalid CRC, packet discarded");
                return;
            }

            rd.Fetch(receiveDescriptorBase | receiveDescriptorOffset);
            if (!rd.Enable)
            {
                //if receive descritptor disabled discard packet
                return;
            }

            machine.SystemBus.WriteBytes(frame.Bytes, (long)rd.PacketAddress);
            registers.Status = 1u << 2;
            if (rd.Wrap)
            {
                receiveDescriptorOffset = 0;
            }
            else
            {
                if (receiveDescriptorOffset != 0x3f8)
                {
                    receiveDescriptorOffset += 8;
                }
                else
                {
                    receiveDescriptorOffset = 0;
                }
            }
            if (rd.InterruptEnable && ((registers.Control & (1u << 3)) != 0))
            {
                registers.Status |= 1u << 2;
                this.IRQ.Set();
                this.IRQ.Unset();
            }
            rd.Length = (uint)frame.Bytes.Length;
            rd.Enable = false;
            rd.Wrap   = false;
            rd.WriteBack();
        }
Ejemplo n.º 2
0
 private void ReceiveFrameInner(EthernetFrame frame)
 {
     if((registers.Control & (1u << 1)) == 0)
     {
         //if receiving is disabled discard packet
         return;
     }
     var rd = new receiveDescriptor(machine.SystemBus);
     rd.Fetch(receiveDescriptorBase | receiveDescriptorOffset);
     if(!rd.Enable)
     {
         //if receive descritptor disabled discard packet
         return;
     }
     machine.SystemBus.WriteBytes(frame.Bytes, (long)rd.PacketAddress);
     registers.Status = 1u << 2;
     if(rd.Wrap)
     {
         receiveDescriptorOffset = 0;
     }
     else
     {
         if(receiveDescriptorOffset != 0x3f8)
         {
             receiveDescriptorOffset += 8;
         }
         else
         {
             receiveDescriptorOffset = 0;
         }
     }
     if(rd.InterruptEnable && ((registers.Control & (1u << 3)) != 0))
     {
         registers.Status |= 1u << 2;
         this.IRQ.Set();
         this.IRQ.Unset();
     }
     rd.Length = (uint)frame.Length;
     rd.Enable = false;
     rd.Wrap = false;
     rd.WriteBack();
 }