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(); }
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(); }