NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF lib/libtcpip *-------------------------------------- AUXPIPE .EQ 1 *-------------------------------------- .MA ADC16 clc lda ]1 adc ]2 sta ]1 lda ]1+1 adc ]2+1 sta ]1+1 .EM *-------------------------------------- .MA SBC16 sec lda ]1 sbc ]2 sta ]1 lda ]1+1 sbc ]2+1 sta ]1+1 .EM *-------------------------------------- .INB inc/macros.i .DO AUXPIPE=1 .INB inc/io.i .FIN .INB inc/a2osx.i .INB inc/mli.e.i .INB inc/nic.i .INB inc/eth.i .INB inc/lib.net.i .INB inc/libtcpip.i *-------------------------------------- ZPFrameInPtr .EQ ZPLIB ZPFrameInLen .EQ ZPLIB+2 ZPDataInPtr .EQ ZPLIB+4 ZPDataInLen .EQ ZPLIB+6 ZPFrameOutPtr .EQ ZPLIB+8 ZPFrameOutLen .EQ ZPLIB+10 ZPDataOutPtr .EQ ZPLIB+12 ZPDataOutLen .EQ ZPLIB+14 ZPTmpPtr1 .EQ ZPLIB+16 ZPPtrSKT .EQ ZPLIB+18 ZPCode .EQ ZPLIB+20 12 bytes ZPPtrIP .EQ ZPLIB+20 ZPPtrMAC .EQ ZPLIB+22 ZPPtrDNS .EQ ZPLIB+24 ZPCachePtr .EQ ZPLIB+26 IP.CHECKSUM .EQ ZPLIB+28 IP.CHECKSUM.TMP .EQ ZPLIB+30 TmpDWord .EQ ZPLIB+28 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START .DA 0 .DA 0 .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA CFG.SET .DA CFG.GET .DA INCOMING .DA PULSE .DA ARP.CLEAR .DA ARP.QUERY .DA ARP.ADD .DA ARP.GetCACHE .DA DNS.CLEAR .DA DNS.QUERY .DA DNS.ADD .DA DNS.GetCACHE .DA HST.GETBYNAME .DA HST.GETBYADDR .DA SKT.Socket .DA SKT.Bind .DA SKT.Connect .DA SKT.Listen .DA SKT.Accept .DA SKT.Shutdown .DA SKT.Read .DA SKT.Write .DA SKT.Recv .DA SKT.Send .DA SKT.RecvFrom .DA SKT.SendTo .DA SKT.getsockopt .DA SKT.setsockopt .DA SKT.EOF .DA SKT.GetTable *-------------------------------------- L.IPCFG .DA IPCFG L.ARP.REQ .DA ARP.REQ L.ARP.REP .DA ARP.REP L.SA.LOCAL .DA SA.LOCAL L.SA.REMOTE .DA SA.REMOTE L.DNS.MSG .DA DNS.MSG L.DNS.CACHE .DA DNS.CACHE L.SKT.Table .DA SKT.Table L.HST.SScanF .DA HST.SScanF L.IOCTL .DA IOCTL L.DCB.NIC .DA DCB.NIC J.TCP.IN .DA TCP.IN.JMP.CLOSED .DA TCP.IN.JMP.OPENED .DA TCP.IN.JMP.LISTEN .DA TCP.IN.JMP.SYNSENT .DA TCP.IN.JMP.SYNRCVD .DA TCP.IN.JMP.ESTBLSH .DA TCP.IN.JMP.CLWAIT .DA TCP.IN.JMP.LASTACK .DA TCP.IN.JMP.FINWT1 .DA TCP.IN.JMP.FINWT2 .DA TCP.IN.JMP.CLOSING .DA TCP.IN.JMP.TIMEWT J.SKT.Socket .DA SKT.Socket.RAW .DA SKT.Socket.DGRAM .DA SKT.Socket.SEQPKT .DA SKT.Socket.STREAM J.SKT.connect .DA SKT.connect.RAW .DA SKT.connect.DGRAM .DA SKT.connect.SEQPKT .DA SKT.connect.STREAM J.SKT.send .DA SKT.send.RAW .DA SKT.send.DGRAM .DA SKT.send.SEQPKT .DA SKT.send.STREAM .DA 0 *-------------------------------------- LIB.LOAD ldx RefCount bne .8 sta FD.DSOCK+S.FD.DSOCK.IOHANDLER sta FD.SSOCK+S.FD.SSOCK.IOHANDLER >LDYAI K.ARPCACHE.SIZE*S.ARPCACHE >SYSCALL2 GetMem bcs .9 >STYA ZPCachePtr stx hARPCache jsr ARP.Clear.I >PUSHBI 0 no protocol lda #S.SOCKET.T.DGRAM jsr SKT.Socket bcs .9 sta hDNSSocket >PUSHW L.SA.LOCAL IP/PORT=All ZERO lda hDNSSocket jsr SKT.Bind >LDYAI UDP.PORT.DNS >STYA SA.REMOTE+S.SOCKADDR.PORT >PUSHW L.SA.REMOTE IP=All ZERO lda hDNSSocket jsr SKT.Connect jsr DNS.CLEAR .8 inc RefCount clc .9 rts *-------------------------------------- LIB.UNLOAD dec RefCount bne .8 lda hDNSSocket beq .1 jsr SKT.Shutdown .1 lda hARPCache beq .8 >SYSCALL2 freemem .8 clc rts *-------------------------------------- INCOMING sta hFrameIn >PULLW ZPTmpPtr1 ldy #S.IOCTL.BUFPTR+3 ldx #3 .1 lda (ZPTmpPtr1),y Get Frame Ptr & Len sta ZPFrameInPtr,x dey dex bpl .1 ldy #S.ETH.EII.TYPE lda (ZPFrameInPtr),y cmp /S.ETH.EII.TYPE.IP bne .9 iny lda (ZPFrameInPtr),y cmp #S.ETH.EII.TYPE.ARP beq .2 cmp #S.ETH.EII.TYPE.IP beq .3 .9 sec rts .2 jmp ARP.IN .3 jmp IP.IN *-------------------------------------- * A = S.EVT.F * Expire = every sec * Retry = every 100 msec *-------------------------------------- PULSE and #S.EVT.F.T1SEC beq .1 jsr ARP.EXPIRE every sec jsr DNS.EXPIRE .1 jsr FRM.RETRY every 100ms jsr DNS.POLL jmp TCP.SENDCLOSE *-------------------------------------- GetDynPort inc DYNPORT.LAST bne .1 inc DYNPORT.LAST+1 lda DYNPORT.LAST cmp #K.DYNPORT.END lda DYNPORT.LAST+1 sbc /K.DYNPORT.END bcs .1 lda #K.DYNPORT.START ldx /K.DYNPORT.START sta DYNPORT.LAST stx DYNPORT.LAST+1 rts CC .1 lda DYNPORT.LAST ldx DYNPORT.LAST+1 clc rts *-------------------------------------- .INB usr/src/lib/libtcpip.s.arp .INB usr/src/lib/libtcpip.s.cfg .INB usr/src/lib/libtcpip.s.dns .INB usr/src/lib/libtcpip.s.frm .INB usr/src/lib/libtcpip.s.hst .INB usr/src/lib/libtcpip.s.icmp .INB usr/src/lib/libtcpip.s.ip .INB usr/src/lib/libtcpip.s.skt .INB usr/src/lib/libtcpip.s.tcp *-------------------------------------- CS.END *-------------------------------------- .DO AUXPIPE=1 ZP.CODE sta SETREADAUX lda (ZPTmpPtr1),y sta CLRREADAUX rts ZP.CODE.Len .EQ *-ZP.CODE .FIN *-------------------------------------- SA.LOCAL .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .BS 2 S.SOCKADDR.PORT *-------------------------------------- SA.REMOTE .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .BS 2 S.SOCKADDR.PORT *-------------------------------------- FD.DSOCK .DA #S.FD.T.DSOCK .DA #0 S.FD.HANDLER .BS 1 S.FD.DSOCK.IOHANDLER .DA #0 S.FD.DSOCK.OPEN .DA #LIBTCPIP.shutdown .DA #LIBTCPIP.Recv .DA #LIBTCPIP.Send .DA #0 S.FD.DSOCK.STATUS *-------------------------------------- .DA #AF.INET S.SOCKET.AF .BS 1 S.SOCKET.T .BS 1 S.SOCKET.PROTO FD.DSOCK.SIZE .EQ *-FD.DSOCK *-------------------------------------- FD.SSOCK .DA #S.FD.T.SSOCK .DA #0 S.FD.HANDLER .BS 1 S.FD.SSOCK.IOHANDLER .DA #0 S.FD.SSOCK.OPEN .DA #LIBTCPIP.shutdown .DA #LIBTCPIP.Read .DA #LIBTCPIP.Write .DA #LIBTCPIP.EOF *-------------------------------------- .DA #AF.INET S.SOCKET.AF .DA #S.SOCKET.T.STREAM .DA #S.IP.PROTOCOL.TCP FD.SSOCK.SIZE .EQ *-FD.SSOCK *-------------------------------------- IOCTL .BS S.IOCTL DCB.NIC .BS S.DCB.NIC IPCFG .BS S.IPCFG DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE *-------------------------------------- ARP.REQ .HS FFFFFFFFFFFF S.ETH.DSTMAC ARP.REQ.SRCMAC .BS 6 ARP.REQ.ETYPE .DA /S.ETH.EII.TYPE.ARP .DA #S.ETH.EII.TYPE.ARP .HS 0001.0800.06.04 ARP.REQ.OP .DA /S.ARP.OPERATION.REQ .DA #S.ARP.OPERATION.REQ ARP.REQ.SHA .BS 6 ARP.REQ.SPA .BS 4 ARP.REQ.THA .BS 6 ARP.REQ.TPA .BS 4 *-------------------------------------- ARP.REP .EQ * ARP.REP.DSTMAC .BS 6 ARP.REP.SRCMAC .BS 6 ARP.REP.ETYPE .DA /S.ETH.EII.TYPE.ARP .DA #S.ETH.EII.TYPE.ARP .HS 0001.0800.06.04 ARP.REP.OP .DA /S.ARP.OPERATION.REP .DA #S.ARP.OPERATION.REP ARP.REP.SHA .BS 6 ARP.REP.SPA .BS 4 ARP.REP.THA .BS 6 ARP.REP.TPA .BS 4 *-------------------------------------- DNS.MSG DNS.MSG.ID .BS 2 .DA /S.DNS.F.RD Flags=query .DA #S.DNS.F.RD .DA $100 QDCOUNT .BS 6 ANCOUNT,NSCOUNT,ARCOUNT DNS.MSG.NAME .BS K.DNS.MAXLEN+6 *-------------------------------------- DNS.MSG.LEN .BS 2 *-------------------------------------- FRM.QUEUE.Tail .BS 1 FRM.QUEUE.Head .BS 1 FRM.QUEUE.hMem .BS K.FRMQUEUE.SIZE FRM.QUEUE.State .BS K.FRMQUEUE.SIZE FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE FRM.QUEUE.LenL .BS K.FRMQUEUE.SIZE FRM.QUEUE.LenH .BS K.FRMQUEUE.SIZE *-------------------------------------- RefCount .DA #0 hARPCache .DA #0 DYNPORT.LAST .DA K.DYNPORT.START hDNSSocket .BS 1 DNS.TmpCache .BS S.DNSCACHE ARP.TmpCache .BS S.ARPCACHE *-------------------------------------- SKT.Index .BS 1 SKT.TABLE .BS K.SKTTABLE.SIZE SKT.LOC.ADDR .BS S.SOCKADDR SKT.REM.ADDR .BS S.SOCKADDR SKT.Cache .EQ *-S.SOCKET.TCP.INTAIL .BS S.SOCKET.TCP-S.SOCKET.TCP.INTAIL hFrameIn .BS 1 hFrameOut .BS 1 HST.SScanF .AZ "%d.%d.%d.%d" IP.ID .DA $A205 *-------------------------------------- MAN SAVE usr/src/lib/libtcpip.s ASM