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.IOH
				sta FD.SSOCK+S.FD.SSOCK.IOH

				>LDYAI K.ARPCACHE.SIZE*S.ARPCACHE 
				>SYSCALL2 GetMem
				bcs .9

				>STYA ZPCachePtr
				stx hARPCache
				
				jsr ARP.Clear.I
				
				>PUSHBI S.SOCKET.T.DGRAM
				>PUSHBI 0				no protocol
				jsr SKT.Socket
				bcs .9

				sta hDNSSocket
				
				>PUSHA
				>PUSHW L.SA.LOCAL		IP/PORT=All ZERO
				jsr SKT.Bind
				
				>LDYAI UDP.PORT.DNS
				>STYA SA.REMOTE+S.SOCKADDR.PORT

				>PUSHB hDNSSocket
				>PUSHW L.SA.REMOTE		IP=All ZERO
				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
				bne .2

				jmp	ARP.IN

.2				cmp #S.ETH.EII.TYPE.IP
				bne .9

				jmp IP.IN

.9				lda #MLI.E.EOF
				sec
				rts
*--------------------------------------
* 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.PFT
				.BS 1					S.FD.DSOCK.IOH
				.DA #0					S.FD.DSOCK.OPEN
				.DA #LIBTCPIP.shutdown
				.DA #LIBTCPIP.Recv
				.DA #LIBTCPIP.Send
				.DA #0					S.FD.DSOCK.EOF
*--------------------------------------
				.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.PFT
				.BS 1					S.FD.SSOCK.IOH
				.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
