'------------------------------------------------------------------------------------ ' WebTiger / Ethernut 1.3F - Atmega128 and RTL8019AS - ARP - UDP - PING - HTML '------------------------------------------------------------------------------------ ' ' january 2006 - Ben Zijlstra - Netherlands - https://benshobbycorner.nl/bzijlstra ' Lockbits: ' Lockbit 54 : 11 ' Lockbit 32 : 11 ' Lockbit 10 : 11 ' Fusebits: ' Fusebit 7 : 0 ' Fusebit 6 : 0 ' Fusebit 98 : 11 ' Fusebit DCBA : 1111 ' Fusebits High ' Fusebits E : 1 ' Fusebits F : 0 ' Fusebits G : 0 ' Fusebits H : 0 ' Fusebits I : 0 ' Fusebits KL : 01 ' Fusebits M : 1 ' Fusebits Extended ' Fusebits P : 1 ' Fusebits Q : 1 $regfile "m128def.dat" $crystal = 14745600 $baud = 57600 $waitstate 'XRAM wait state $xa 'External Access enabled $default Xram 'memory map: 'The ATMEGA128 works in normal-mode (fuse-settings) 'Data Memory '$0000-$001F 32 registers '$0020-$005F 64 I/O reg. '$0060-$00FF 160 Ext I/O reg. '$0100-$10FF Internal SRAM '$1100-$7FFF External SRAM '$8300-$831F RTL8019as $hwstack = 128 $swstack = 128 $framesize = 128 Dim Regaddr As Byte Dim Regdata As Byte Dim Byte_read As Byte Dim Whulp0 As Word Dim Bhulp0 As Byte Dim Hulp1 As Byte Dim Mymac(6) As Byte Dim Data_l As Byte Dim Data_h As Byte Dim Hulp2 As Word Dim Rxlen As Word Dim I As Integer Dim T As Byte Dim Pageheader(4) As Byte Dim T_enetpacketlenl As Byte At Pageheader + 2 Overlay Dim T_enetpacketlenh As Byte At Pageheader + 3 Overlay Dim Result16 As Word Dim Result16h As Byte At Result16 + 1 Overlay Dim Result16l As Byte At Result16 Overlay Dim Packet(1500) As Byte 'Ethernet packet destination Dim T_enetpacketdest0 As Byte At Packet Overlay Dim T_enetpacketdest1 As Byte At Packet + &H01 Overlay Dim T_enetpacketdest2 As Byte At Packet + &H02 Overlay Dim T_enetpacketdest3 As Byte At Packet + &H03 Overlay Dim T_enetpacketdest4 As Byte At Packet + &H04 Overlay Dim T_enetpacketdest5 As Byte At Packet + &H05 Overlay 'Ethernet packet source Dim T_enetpacketsrc0 As Byte At Packet + &H06 Overlay Dim T_enetpacketsrc1 As Byte At Packet + &H07 Overlay Dim T_enetpacketsrc2 As Byte At Packet + &H08 Overlay Dim T_enetpacketsrc3 As Byte At Packet + &H09 Overlay Dim T_enetpacketsrc4 As Byte At Packet + &H0A Overlay Dim T_enetpacketsrc5 As Byte At Packet + &H0B Overlay 'Ethernet packet type Dim T_enetpackettype As Word At Packet + &H0C Overlay Dim T_arp_hwtype1 As Byte At Packet + &H0F Overlay 'Arp Dim T_arp_prttype1 As Byte At Packet + &H11 Overlay Dim T_arp_hwlen As Byte At Packet + &H12 Overlay Dim T_arp_prlen As Byte At Packet + &H13 Overlay Dim T_arp_op1 As Byte At Packet + &H15 Overlay 'arp source ip address Dim T_arp_sipaddr0 As Byte At Packet + &H1C Overlay Dim T_arp_sipaddr1 As Byte At Packet + &H1D Overlay Dim T_arp_sipaddr2 As Byte At Packet + &H1E Overlay Dim T_arp_sipaddr3 As Byte At Packet + &H1F Overlay 'arp target IP address Dim T_arp_tipaddr As Long At Packet + &H26 Overlay 'IP header layout IP version and header length Dim T_ip_vers_len As Byte At Packet + &H0E Overlay Dim T_arp_hwtype0 As Byte At Packet + &H0E Overlay 'Arp Dim T_arp_prttype0 As Byte At Packet + &H10 Overlay Dim T_arp_op0 As Byte At Packet + &H14 Overlay 'arp source mac address Dim T_arp_src_enetpacket0 As Byte At Packet + &H16 Overlay Dim T_arp_src_enetpacket1 As Byte At Packet + &H17 Overlay Dim T_arp_src_enetpacket2 As Byte At Packet + &H18 Overlay Dim T_arp_src_enetpacket3 As Byte At Packet + &H19 Overlay Dim T_arp_src_enetpacket4 As Byte At Packet + &H1A Overlay Dim T_arp_src_enetpacket5 As Byte At Packet + &H1B Overlay 'arp source mac address Dim T_arp_dest_enetpacket0 As Byte At Packet + &H20 Overlay Dim T_arp_dest_enetpacket1 As Byte At Packet + &H21 Overlay Dim T_arp_dest_enetpacket2 As Byte At Packet + &H22 Overlay Dim T_arp_dest_enetpacket3 As Byte At Packet + &H23 Overlay Dim T_arp_dest_enetpacket4 As Byte At Packet + &H24 Overlay Dim T_arp_dest_enetpacket5 As Byte At Packet + &H25 Overlay Dim T_tos As Byte At Packet + &H0F Overlay 'packet length Dim T_ip_pktlen0 As Byte At Packet + &H10 Overlay Dim T_ip_pktlen1 As Byte At Packet + &H11 Overlay Dim T_id0 As Byte At Packet + &H12 Overlay Dim T_id1 As Byte At Packet + &H13 Overlay Dim T_flags As Byte At Packet + &H14 Overlay Dim T_offset As Byte At Packet + &H15 Overlay Dim T_ttl As Byte At Packet + &H16 Overlay 'protocol (ICMP=1, TCP=6, UDP=11) Dim T_ip_proto As Byte At Packet + &H17 Overlay 'header checksum Dim T_ip_hdr_cksum0 As Byte At Packet + &H18 Overlay Dim T_ip_hdr_cksum1 As Byte At Packet + &H19 Overlay Dim T_ip_hdr_cksum As Word At Packet + &H18 Overlay 'IP address of source Dim T_ip_srcaddr0 As Byte At Packet + &H1A Overlay Dim T_ip_srcaddr1 As Byte At Packet + &H1B Overlay Dim T_ip_srcaddr2 As Byte At Packet + &H1C Overlay Dim T_ip_srcaddr3 As Byte At Packet + &H1D Overlay Dim T_ip_srcaddr As Long At Packet + &H1A Overlay 'IP address of destination Dim T_ip_destaddr0 As Byte At Packet + &H1E Overlay Dim T_ip_destaddr1 As Byte At Packet + &H1F Overlay Dim T_ip_destaddr2 As Byte At Packet + &H20 Overlay Dim T_ip_destaddr3 As Byte At Packet + &H21 Overlay Dim T_ip_destaddr As Long At Packet + &H1E Overlay Dim T_icmp_type As Byte At Packet + &H22 Overlay Dim T_icmp_code As Byte At Packet + &H23 Overlay Dim T_icmp_cksum0 As Byte At Packet + &H24 Overlay Dim T_icmp_cksum1 As Byte At Packet + &H25 Overlay Dim T_icmp_cksum As Word At Packet + &H24 Overlay Dim Tcp_srcporth As Byte At Packet + &H22 Overlay Dim Tcp_srcportl As Byte At Packet + &H23 Overlay Dim Tcp_destporth As Byte At Packet + &H24 Overlay Dim Tcp_destportl As Byte At Packet + &H25 Overlay Dim Tcp_seqnum3 As Byte At Packet + &H26 Overlay Dim Tcp_seqnum2 As Byte At Packet + &H27 Overlay Dim Tcp_seqnum1 As Byte At Packet + &H28 Overlay Dim Tcp_seqnum0 As Byte At Packet + &H29 Overlay Dim Tcp_acknum3 As Byte At Packet + &H2A Overlay Dim Tcp_acknum2 As Byte At Packet + &H2B Overlay Dim Tcp_acknum1 As Byte At Packet + &H2C Overlay Dim Tcp_acknum0 As Byte At Packet + &H2D Overlay Dim Tcp_hdr As Byte At Packet + &H2E Overlay Dim Tcp_flags As Byte At Packet + &H2F Overlay Dim Tcp_cksumh As Byte At Packet + &H32 Overlay Dim Tcp_cksuml As Byte At Packet + &H33 Overlay Dim Tcp_cksum As Word At Packet + &H32 Overlay 'UDP header Dim T_udp_srcport0 As Byte At Packet + &H22 Overlay Dim T_udp_srcport1 As Byte At Packet + &H23 Overlay Dim T_udp_srcport As Word At Packet + &H22 Overlay Dim T_udp_destport0 As Byte At Packet + &H24 Overlay Dim T_udp_destport1 As Byte At Packet + &H25 Overlay Dim T_udp_destport As Word At Packet + &H24 Overlay Dim T_udp_len0 As Byte At Packet + &H26 Overlay Dim T_udp_len1 As Byte At Packet + &H27 Overlay Dim T_udp_chksum0 As Byte At Packet + &H28 Overlay Dim T_udp_chksum1 As Byte At Packet + &H29 Overlay Dim T_udp_data As Byte At Packet + &H2A Overlay Dim T_udp_data1 As Byte At Packet + &H2B Overlay Dim T_udp_data2 As Byte At Packet + &H2C Overlay Dim T_udp_data3 As Byte At Packet + &H2D Overlay Dim T_udp_data4 As Byte At Packet + &H2E Overlay Dim T_udp_data5 As Byte At Packet + &H2F Overlay Dim T_udp_data6 As Byte At Packet + &H30 Overlay Dim T_udp_data7 As Byte At Packet + &H31 Overlay Dim T_udp_data8 As Byte At Packet + &H32 Overlay Dim T_udp_data9 As Byte At Packet + &H33 Overlay Dim T_udp_data10 As Byte At Packet + &H34 Overlay Dim T_udp_data11 As Byte At Packet + &H35 Overlay Dim T_udp_data12 As Byte At Packet + &H36 Overlay Dim T_udp_data13 As Byte At Packet + &H37 Overlay Dim T_udp_data14 As Byte At Packet + &H38 Overlay Dim T_udp_data15 As Byte At Packet + &H39 Overlay Dim T_udp_data16 As Byte At Packet + &H3A Overlay Dim T_udp_data17 As Byte At Packet + &H3B Overlay Dim T_udp_data18 As Byte At Packet + &H3C Overlay Dim T_udp_data19 As Byte At Packet + &H3D Overlay Dim T_udp_data20 As Byte At Packet + &H3E Overlay Dim T_udp_data21 As Byte At Packet + &H3F Overlay Dim T_udp_data22 As Byte At Packet + &H40 Overlay Dim T_udp_data23 As Byte At Packet + &H41 Overlay Dim T_udp_data24 As Byte At Packet + &H42 Overlay Dim T_udp_data25 As Byte At Packet + &H43 Overlay Dim T_udp_data26 As Byte At Packet + &H44 Overlay Dim T_udp_data27 As Byte At Packet + &H45 Overlay Dim T_udp_data28 As Byte At Packet + &H46 Overlay Dim T_udp_data29 As Byte At Packet + &H47 Overlay Dim T_udp_data30 As Byte At Packet + &H48 Overlay Dim T_udp_data31 As Byte At Packet + &H49 Overlay Dim T_udp_data32 As Byte At Packet + &H4A Overlay Dim Resend As Byte Dim Hulp3 As Word Dim Hulp4 As Byte Dim Myip(4) As Byte Dim My_ip As Long At Myip Overlay Myip(1) = 192 Myip(2) = 168 Myip(3) = 0 Myip(4) = 100 'IP Protocol types 'icmp Const Prot_icmp = &H01 'tcp Const Prot_tcp = &H06 'udp Const Prot_udp = &H11 'NIC_CR page 0/1/2/3 (ps1=x, ps0=x) x = depending on page ' Const Nic_cr = &H00 ' Const Nic_cr_stp = &B0000_0001 'stop command - Power up default Const Nic_cr_sta = &B0000_0010 'start command Const Nic_cr_txp = &B0000_0100 'transmit a packet Const Nic_cr_rd0 = &B0000_1000 'remote read Const Nic_cr_rd1 = &B0001_0000 'remote write Const Nic_cr_rd2 = &B0010_0000 'abort/complete remote DMA Const Nic_cr_ps0 = &B0100_0000 'register page 0 Const Nic_cr_ps1 = &B1000_0000 'register page 1 Const Nic_rdmaport = &H10 'all pages Const Nic_rstport = &H18 'all pages 'NIC_PSTART page 0 (ps1=0, ps0=0) ' Const Nic_pstart = &H01 ' 'NIC_PSTOP page 0 (ps1=0, ps0=0) ' Const Nic_pstop = &H02 ' 'NIC_BNRY page 0 (ps1=0, ps0=0) ' Const Nic_bnry = &H03 ' 'NIC_TPSR page 0 (ps1=0, ps0=0) ' Const Nic_tpsr = &H04 ' 'NIC_TBCR0 page 0 (ps1=0, ps0=0) ' Const Nic_tbcr0 = &H05 ' 'NIC_TBCR1 page 0 (ps1=0, ps0=0) ' Const Nic_tbcr1 = &H06 ' 'NIC_ISR page 0 (ps1=0, ps0=0) ' Const Nic_isr = &H07 ' Const Nic_rdc = &B0100_0000 'NIC_RSAR0 page 0 (ps1=0, ps0=0) ' Const Nic_rsar0 = &H08 ' 'NIC_RSAR1 page 0 (ps1=0, ps0=0) ' Const Nic_rsar1 = &H09 ' 'NIC_rbcr0 page 0 (ps1=0, ps0=0) ' Const Nic_rbcr0 = &H0A ' 'NIC_rbcr0 page 0 (ps1=0, ps0=0) ' Const Nic_rbcr1 = &H0B ' 'NIC_rcr page 0 (ps1=0, ps0=0) receive configuration register ' Const Nic_rcr = &H0C ' 'NIC_tcr page 0 (ps1=0, ps0=0) transmit configuration register ' Const Nic_tcr = &H0D ' 'NIC_DCR page 0 (ps1=0, ps0=0) ' Const Nic_dcr = &H0E ' 'NIC_IMR page 0 (ps1=0, ps0=0) interrupt mask register ' Const Nic_imr = &H0F ' 'NIC_CURR page 1 (ps1=0, ps0=1) ' Const Nic_curr = &H07 ' 'NIC_9346CR page 3 (ps1=1, ps0=1) ' Const Nic_9346cr = &H01 ' Const Nic_9346cr_eem1 = &B1000_0000 Const Nic_9346cr_eem0 = &B0100_0000 Const Nic_config2_bselb = &B0010_0000 'NIC_CONFIG2 page 3 (ps1=1, ps0=1) ' Const Nic_config2 = &H05 'NIC_CONFIG3 page 3 (ps1=1, ps0=1) ' Const Nic_config3 = &H06 Const Msg_initfail = "Init failed" Const Dcrval = &H58 Const Txstart = &H40 Const Rxstart = &H46 Const Rxstop = &H60 Const Imrval = &H11 Const Tcrval = &H00 Const Rdc = &H40 Declare Sub Write_rtl8019as(byval Regaddr As Byte , Byval Regdata As Byte) Declare Sub Read_rtl8019as(byval Regaddr As Byte) Declare Sub Init_rtl8019as 'Declare Sub Showregs Declare Sub Overrun Declare Sub Getpacket Declare Sub Arp_reply Declare Sub Icmp Declare Sub Tcp Declare Sub Udp_receive Declare Sub Arp Declare Sub Write_dest_mac Config Int5 = Falling Const Debug = 1 #if Debug = 1 Print "Hello world" #endif Mymac(1) = &H00 Mymac(2) = &H10 Mymac(3) = &H20 Mymac(4) = &H30 Mymac(5) = &H40 Mymac(6) = &H50 Call Init_rtl8019as 'Call Showregs 'Stop ' Sit and wait for an Interrupt from the RTL8019as Enable Interrupts Enable Int5 On Int5 Rtl8019as_interrupt 'start the NIC Bhulp0 = Nic_cr_rd2 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) Do Loop End ' Routine to Write to NIC Control register ' Sub Write_rtl8019as(regaddr , Regdata) Whulp0 = Regaddr + &H8300 Out Whulp0 , Regdata End Sub ' Routine to read from NIC Control register ' Sub Read_rtl8019as(regaddr) Whulp0 = Regaddr + &H8300 Byte_read = Inp(whulp0) End Sub ' Routine to initialize the RTL8019AS ethernetchip ' Sub Init_rtl8019as #if Debug = 1 Print "Sub Init_RTL8019as" #endif Call Read_rtl8019as(nic_rstport) Call Write_rtl8019as(nic_rstport , Byte_read) Waitms 10 'check for good soft reset Call Write_rtl8019as(nic_imr , 0) 'interrupt mask register Call Write_rtl8019as(nic_isr , &HFF) Call Read_rtl8019as(nic_isr) 'page 0 RST If Byte_read.7 = 0 Then Print Msg_initfail End If 'switch to page 3 Bhulp0 = Nic_cr_rd2 Or Nic_cr_stp Bhulp0 = Bhulp0 Or Nic_cr_ps0 Bhulp0 = Bhulp0 Or Nic_cr_ps1 Call Write_rtl8019as(nic_cr , Bhulp0) Bhulp0 = Nic_9346cr_eem0 Or Nic_9346cr_eem1 Call Write_rtl8019as(nic_9346cr , Bhulp0) Call Write_rtl8019as(nic_config3 , 0) Call Write_rtl8019as(nic_config2 , Nic_config2_bselb) Call Write_rtl8019as(nic_9346cr , 0) Waitms 255 Bhulp0 = Nic_cr_rd2 Or Nic_cr_stp Call Write_rtl8019as(nic_cr , Bhulp0) Waitms 2 Call Write_rtl8019as(nic_dcr , Dcrval) '58 Call Write_rtl8019as(nic_rbcr0 , &H00) Call Write_rtl8019as(nic_rbcr1 , &H00) '0000_0100 packets with broadcast destination address are accepted Call Write_rtl8019as(nic_rcr , &H04) 'receive configuration register Call Write_rtl8019as(nic_tpsr , Txstart) '&H40 '0000_0010 internal loopback Call Write_rtl8019as(nic_tcr , &H02) 'transmit configuration register Call Write_rtl8019as(nic_pstart , Rxstart) '&H46 Call Write_rtl8019as(nic_bnry , Rxstart) '&H46 Call Write_rtl8019as(nic_pstop , Rxstop) Call Write_rtl8019as(nic_isr , &HFF) Call Write_rtl8019as(nic_cr , &H61) Waitms 2 Call Write_rtl8019as(nic_curr , Rxstart) '&H46 For Hulp1 = 1 To 6 Call Write_rtl8019as(hulp1 , Mymac(hulp1)) Next Hulp1 Call Write_rtl8019as(nic_cr , &H21) Call Write_rtl8019as(nic_dcr , Dcrval) '58 Call Write_rtl8019as(nic_cr , &H22) Call Write_rtl8019as(nic_isr , &HFF) Call Write_rtl8019as(nic_imr , Imrval) 'interrupt mask register / 0001_0001 Call Write_rtl8019as(nic_tcr , Tcrval) 'transmit configuration register / 0000_0000 Bhulp0 = Nic_cr_sta Or Nic_cr_rd2 Call Write_rtl8019as(nic_cr , Bhulp0) End Sub 'Routine show the contents of the RTL8019as registers 'Sub Showregs 'Local Cntr1 As Byte 'Local Cntr2 As Byte 'Call Write_rtl8019as(nic_cr , &H21) 'Print 'Print "Realtek 8019AS Register dump" 'Print 'Print "REG Page0 Page1 Page2 Page3" 'Print 'For Cntr1 = 0 To 15 'Cntr2 = Cntr1 'Print Hex(cntr2); 'Print " "; 'Call Write_rtl8019as(nic_cr , &H21) 'Cntr2 = Cntr1 'Call Read_rtl8019as(cntr2) 'Print Hex(byte_read); 'Print " "; 'Call Write_rtl8019as(nic_cr , &H61) 'Cntr2 = Cntr1 'Call Read_rtl8019as(cntr2) 'Print Hex(byte_read); 'Print " "; 'Call Write_rtl8019as(nic_cr , &HA1) 'Cntr2 = Cntr1 'Call Read_rtl8019as(cntr2) 'Print Hex(byte_read); 'Print " "; 'Call Write_rtl8019as(nic_cr , &HE1) 'Cntr2 = Cntr1 'Call Read_rtl8019as(cntr2) 'Print Hex(byte_read) 'Next Cntr1 'End Sub ' Routine to handle an overrun ' Sub Overrun #if Debug = 1 Print "Sub Overrun" #endif Call Read_rtl8019as(nic_cr) Data_l = Byte_read Call Write_rtl8019as(nic_cr , &H21) Waitms 2 Call Write_rtl8019as(nic_rbcr0 , &H00) Call Write_rtl8019as(nic_rbcr1 , &H00) Hulp1 = Data_l And &H04 If Hulp1 <> 0 Then Resend = 0 Else If Hulp1 = 0 Then Call Read_rtl8019as(nic_isr) Data_l = Byte_read Hulp1 = Data_l And &H02 Hulp4 = Data_l And &H08 Hulp3 = Hulp1 Or Hulp4 If Hulp3 > 0 Then Resend = 0 Else Resend = 1 End If End If End If Call Write_rtl8019as(nic_tcr , &H02) 'transmit configuration register Bhulp0 = Nic_cr_rd2 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) Call Write_rtl8019as(nic_bnry , Rxstart) '&H46 Bhulp0 = Nic_cr_ps0 Or Nic_cr_rd2 Bhulp0 = Bhulp0 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) Call Write_rtl8019as(nic_curr , Rxstart) '&H46 Bhulp0 = Nic_cr_rd2 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) '0001_0000 OVW Call Write_rtl8019as(nic_isr , &H10) Call Write_rtl8019as(nic_tcr , Tcrval) 'transmit configuration register / 0000_0000 End Sub ' Routine to execute send packet command to retrieve the packet ' Routine to execute send packet command to retrieve the packet ' Sub Getpacket #if Debug = 1 Print "Sub Getpacket" #endif Call Write_rtl8019as(nic_cr , &H1A) For I = 0 To 4 Call Read_rtl8019as(nic_rdmaport) Pageheader(i + 1) = Byte_read Next I 'watch it. overlay variables Result16h = T_enetpacketlenh Result16l = T_enetpacketlenl Rxlen = Result16 Hulp2 = Rxlen + 1 For I = 1 To Hulp2 Call Read_rtl8019as(nic_rdmaport) 'dump any bytes that will overrun the receive buffer If I < 1500 Then Packet(i + 1) = Byte_read End If Next I Hulp1 = Byte_read And Nic_rdc If Hulp1 <> 64 Then Call Read_rtl8019as(nic_isr) End If Call Write_rtl8019as(nic_isr , &HFF) ' Routine to process an ARP reply/request ' If T_enetpackettype = &H0608 Then If T_arp_hwtype1 = &H01 Then If T_arp_prttype1 = &H00 Then If T_arp_hwlen = &H06 Then If T_arp_prlen = &H04 Then If My_ip = T_arp_tipaddr Then If T_arp_op1 = &H02 Then Call Arp_reply End If If T_arp_op1 = &H01 Then Call Arp End If End If End If End If End If End If End If ' Routine to go ahead with icmp or udp ' If T_enetpackettype = &H0008 Then If T_ip_destaddr = My_ip Then Select Case T_ip_proto Case Prot_icmp : Call Icmp Case Prot_tcp : Call Tcp Case Prot_udp : Call Udp_receive End Select End If End If End Sub ' Routine to handle ARP-traffic ' Sub Arp #if Debug = 1 Print "Sub Arp" #endif 'Start the NIC Call Write_rtl8019as(nic_cr , &H22) 'load beginning page for transmit buffer Call Write_rtl8019as(nic_tpsr , Txstart) '&H40 'set start address for remote DMA operation Call Write_rtl8019as(nic_rsar0 , &H00) Call Write_rtl8019as(nic_rsar1 , &H40) 'clear the interrupts Call Write_rtl8019as(nic_isr , &HFF) 'load data byte count for remote DMA Call Write_rtl8019as(nic_rbcr0 , &H3C) '60 dec Call Write_rtl8019as(nic_rbcr1 , &H00) 'do remote write operation Call Write_rtl8019as(nic_cr , &H12) 'write destination MAC address Call Write_dest_mac 'write source address For I = 1 To 6 Call Write_rtl8019as(nic_rdmaport , Mymac(i)) Next I 'arp target IP address 'arp_op1 = packet(&h16) Packet(&H16) = &H02 For I = 1 To 10 Hulp1 = &H0C + I T = Packet(hulp1) Call Write_rtl8019as(nic_rdmaport , T) Next I 'write ethernet module mac address For I = 1 To 6 Call Write_rtl8019as(nic_rdmaport , Mymac(i)) Next I 'write myip For I = 1 To 4 Call Write_rtl8019as(nic_rdmaport , Myip(i)) Next I 'write remote mac address Call Write_dest_mac 'write remote IP address Call Write_rtl8019as(nic_rdmaport , T_arp_sipaddr0) Call Write_rtl8019as(nic_rdmaport , T_arp_sipaddr1) Call Write_rtl8019as(nic_rdmaport , T_arp_sipaddr2) Call Write_rtl8019as(nic_rdmaport , T_arp_sipaddr3) 'write som pad characters to fill out the packet to the minimum length For I = 0 To &H11 Call Write_rtl8019as(nic_rdmaport , &H00) Next I 'make sure the DMA operation has succesfully completed Byte_read = 0 Do Hulp1 = Byte_read And Nic_rdc Call Read_rtl8019as(nic_isr) Loop Until Hulp1 = 0 'load numbers of bytes to be transmitted Call Write_rtl8019as(nic_tbcr0 , &H3C) Call Write_rtl8019as(nic_tbcr1 , &H00) 'send the contents of the transmit buffer onto the network Call Write_rtl8019as(nic_cr , &H24) End Sub Sub Arp_reply #if Debug = 1 Print "Arp_reply" #endif End Sub Sub Icmp #if Debug = 1 Print "ICMP" #endif End Sub Sub Tcp #if Debug = 1 Print "TCP" #endif End Sub Sub Udp_receive #if Debug = 1 Print "UDP_receive" #endif End Sub ' helper-routine ' Sub Write_dest_mac #if Debug = 1 Print "Sub Write_dest_mac" #endif Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc0) Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc1) Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc2) Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc3) Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc4) Call Write_rtl8019as(nic_rdmaport , T_enetpacketsrc5) End Sub ' Routine to handle an interrupt on the RTL8019AS ' Rtl8019as_interrupt: #if Debug = 1 Print "Interrupt from RTL8019as" #endif Disable Int5 'read the interrupt status register Call Read_rtl8019as(nic_isr) 'if the receive buffer has been overrun 'page 0 - ISR OVW (OVR - receive buffer has been exhausted) If Byte_read.4 = 1 Then Call Overrun End If 'if the receive buffer holds a good packet 'page 0 - ISR PRX (PRX - received the packet with no errors) If Byte_read.0 = 1 Then Call Getpacket End If 'make sure the receive buffer ring is empty. If BNRY = CURR, the buffer is empty Call Read_rtl8019as(nic_bnry) Data_l = Byte_read Bhulp0 = Nic_cr_ps0 Or Nic_cr_rd2 Bhulp0 = Bhulp0 Or Nic_cr_sta 'switch to page 1 Call Write_rtl8019as(nic_cr , Bhulp0) Call Read_rtl8019as(nic_curr) Data_h = Byte_read Bhulp0 = Nic_cr_rd2 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) 'buffer is not empty, get next packet If Data_l <> Data_h Then Call Getpacket End If 'reset the interrupts bits Call Write_rtl8019as(nic_isr , &HFF) Bhulp0 = Nic_cr_rd2 Or Nic_cr_sta Call Write_rtl8019as(nic_cr , Bhulp0) Enable Int5 Return