NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/DEV/ADT
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/MLI.E.I
				.INB INC/ETH.I
				.INB INC/LIBTCPIP.I
*--------------------------------------
RESP.BUFSIZE	.EQ 1024
TIMEOUT.MAX		.EQ 100					10 sec.
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPIPCfgPtr		.BS 2
ZPHostPtr		.BS 2
ZPPtr			.BS 2
ZPCnt			.BS 2
ZPReqBufPtr		.BS 2
ZPReqBufLen		.BS 2
ZPRespBufPtr	.BS 2
ZPPayloadPtr	.BS 2
ZPPayloadLen	.BS 2
ZS.END
				.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		Code Length To Relocate
				.DA DS.END-DS.START		Data Segment to Allocate
				.DA #16					SS
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.LIBTCPIP		.DA LIBTCPIP
L.SA.LOCAL		.DA SA.LOCAL
L.SA.REMOTE		.DA SA.REMOTE
L.SA.REMOTE.AD	.DA SA.REMOTE+S.SOCKADDR.ADDR
L.MSG.IPKO		.DA MSG.IPKO
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.UNKNOWN	.DA MSG.UNKNOWN
L.MSG.HOSTOK	.DA MSG.HOSTOK
L.MSG.SKTKO		.DA MSG.SKTKO
L.MSG.SKTOK		.DA MSG.SKTOK
L.MSG.SKTERR	.DA MSG.SKTERR
L.MSG.IOERR		.DA MSG.IOERR
L.ADT.DIR		.DA ADT.DIR
				.DA 0
*--------------------------------------
CS.INIT			>LDYA L.LIBTCPIP
				>SYSCALL LoadLib
				bcs .9
				sta hLIBTCPIP

.9				rts
*--------------------------------------
CS.RUN			>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG	is TCPIP loaded ?
				>STYA ZPIPCfgPtr
				lda (ZPIPCfgPtr)		Configured ?
				bmi CS.RUN.IPOK
				>LDYA L.MSG.IPKO
				>SYSCALL puts
				lda #E.SYN
				sec
				rts
CS.RUN.IPOK		ldy #S.IPCFG.IP+3
				ldx #3
.1				lda (ZPIPCfgPtr),y
				sta SA.LOCAL+S.SOCKADDR.ADDR,x
				dey
				dex
				bpl .1
				>INC.G ArgIndex
				>SYSCALL ArgV
				bcs .9

				>STYA ZPHostPtr
				jsr Init.Timeout

.2				>PUSHW L.SA.REMOTE.AD
				>PUSHW ZPHostPtr
				>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
				bcc CS.RUN.HOSTOK
				>SLEEP
				jsr Wait.Timeout
				bcc .2

				>PUSHW ZPHostPtr
				>PUSHBI 2
				>LDYA L.MSG.UNKNOWN
				>SYSCALL printf
				bra CS.RUN.ESYN
.9				>PUSHBI 0
				>LDYA L.MSG.USAGE
				>SYSCALL printf

CS.RUN.ESYN		lda #E.SYN
				secCS.RUN.RTS
				rts

CS.RUN.HOSTOK	>INC.G ArgIndex
				>SYSCALL ArgV
				bcc .10
				jmp CS.RUN.PORTOK
.10				>STYA ZPPtr
				lda (ZPPtr)
				cmp #'-'
				beq .1
				>LDYA ZPPtr
				>SYSCALL atoi
				bcs CS.RUN.RTS
				>STYA SA.REMOTE+S.SOCKADDR.PORT
				>INC.G ArgIndex
				>SYSCALL ArgV
				bcs .8
				>STYA ZPPtr
				lda (ZPPtr)
				cmp #'-'
				bne CS.RUN.ESYN
.1				ldy #1
				lda (ZPPtr),y
				cmp #'U'
				bne .2
				>INC.G ArgIndex
				>SYSCALL ArgV
.9				bcs CS.RUN.ESYN

				>STYA ZPReqBufPtr
				>SYSCALL strlen
				>STYA ZPReqBufLen
.8				bra CS.RUN.PORTOK
.2				cmp #'F'
				bne CS.RUN.ESYN
				>INC.G ArgIndex
				>SYSCALL ArgV
				bcs CS.RUN.RTS
CS.RUN.PORTOK	>PUSHW ZPHostPtr			
				>PUSHW SA.REMOTE+S.SOCKADDR.PORT

				ldx #3
.1				>PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x
				dex
				bpl .1
				>PUSHBI 8
				>LDYA L.MSG.HOSTOK
				>SYSCALL printf
		
CS.RUN.OPENSKT	>PUSHBI 0				no protocol
				lda #S.SOCKET.T.DGRAM
				>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
				bcs .9

				>STA.G hSocket
				pha
				>PUSHW L.SA.LOCAL
				pla
				>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
				bcc .2
.9				>LDYA L.MSG.SKTKO
				>SYSCALL puts
				lda #E.SYN
				sec
c				rts
.2				>PUSHW L.SA.REMOTE
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
				bcs .9
				>LDYA L.MSG.SKTOK
				>SYSCALL puts
				>LDYAI RESP.BUFSIZE
				>SYSCALL getmem
				bcs .9
				>STYA ZPRespBufPtr
				txa
				>STA.G hRespBuf

CS.RUN.GET		jsr CS.RUN.DIR
				bcs .99

				jsr CS.RUN.DIRDECODE
				bcs .99
.9				lda #0
				sec
.99				rts
*--------------------------------------
CS.RUN.SKTERR	pha
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.SKTERR
				>SYSCALL printf
				pla
				sec
				rts
*--------------------------------------
CS.RUN.IOERR	pha
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.IOERR
				>SYSCALL printf
				pla
				sec
				rts
*--------------------------------------
CS.RUN.DIR		jsr Init.Timeout
.10				>PUSHWI ADT.DIR.LEN
				>PUSHW L.ADT.DIR

				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Send
				bcc .8
				tay
				bne .99
				>SLEEP
				jsr Wait.TimeOut
				bcc .10
.99				lda #MLI.E.IO
				sec
				rts

.8				clc
				rts
*--------------------------------------
CS.RUN.DIRDECODE
				jsr Init.Timeout

.1				>SLEEP
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
				bcc .2

				tay
				bne .8
				>LDA.G bResponse
				bne .81
				jsr Wait.Timeout
				bcs .99
				bra .1
.2				>STA.G hFrame
				>SYSCALL GetMemPtr
				>STYA ZPRespBufPtr

				ldy #S.UDP+1
				lda (ZPRespBufPtr),y
				cmp #$C1
				bne .99
				iny
				lda (ZPRespBufPtr),y
				sta ZPPayloadLen
				iny
				lda (ZPRespBufPtr),y
				sta ZPPayloadLen+1
				iny
				lda (ZPRespBufPtr),y
				cmp #$D3
				bne .99
				>DEBUG
				jsr CS.RUN.UNRLE

				>PUSHW ZPPayloadLen
				>PUSHW ZPPayloadPtr
				ldy #S.PS.hStdOut
				lda (pPs),y
				>SYSCALL fwrite
				>INC.G bResponse
				bra .1
.8				cmp #MLI.E.IO			SKT Close ?
				bne .9
.80				>LDA.G bResponse
				beq .99
.81				clc
				rts
.99				lda #MLI.E.IO
.9				sec

				rts
*--------------------------------------
CS.RUN.UNRLE	>LDYA ZPPayloadLen
				>SYSCALL getmem
				bcs .9
				>STYA ZPPayloadPtr
				>STYA ZPPtr
				txa
				>STA.G hPayloadBuf
				lda ZPPayloadLen
				eor #$ff
				sta ZPCnt

				lda ZPPayloadLen+1
				eor #$ff
				sta ZPCnt+1
				ldx #0
				ldy #S.UDP+8
.1				inc ZPCnt
				bne .2
				inc ZPCnt+1
				beq .8
.2				txa
				clc
				adc (ZPRespBufPtr),y
				tax
				jsr .80
				iny
				bne .3
				inc ZPRespBufPtr+1
.3				bra .1
.8				clc.9
				rts

.80				sta (ZPPtr)
				inc ZPPtr
				bne .81
				inc ZPPtr+1
.81				rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .9					is it a TIMER event?
				>LDA.G TimeOut
				beq .9
				dec
				sta (pData),y
.9				sec						do not discard TIMER event
				rts
*--------------------------------------
CS.QUIT			>LDA.G hSocket
				beq .1

				>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.1				lda hLIBTCPIP
				beq .8
				>SYSCALL UnloadLib
.8				clc
				rts
*--------------------------------------
Init.Timeout	lda #TIMEOUT.MAX
				>STA.G TimeOut
				rts
*--------------------------------------
Wait.TimeOut	sec
				>LDA.G TimeOut
				beq .9

				clc
.9				rts
*--------------------------------------
CS.END
LIBTCPIP		.AZ "libtcpip"
hLIBTCPIP		.BS 1
MSG.IPKO		.AZ "TCP/IP Not Loaded/Configured."
MSG.USAGE		.AS "Usage : ADT <ip|host> [port]\r\n"
				.AS "        -U Url\r\n" 
				.AZ "        -F UrlFile\r\n" 
MSG.UNKNOWN		.AZ "%s: Unknown host\r\n"
MSG.HOSTOK		.AZ "Connecting to %d.%d.%d.%d:%D (%s)..."
MSG.SKTKO		.AZ "Failed to Open Socket."
MSG.SKTOK		.AZ "Connected."
MSG.SKTERR		.AZ "Socket Error : $%h\r\n"
MSG.IOERR		.AZ "I/O Error : $%h\r\n"
*--------------------------------------
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
				.DA 6502
*--------------------------------------
ADT.DIR			.HS C10100C4040101
ADT.DIR.LEN		.EQ *-ADT.DIR
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
ArgIndex		.BS 1
hSocket			.BS 1
hFrame			.BS 1
hPayloadBuf		.BS 1
hRespBuf		.BS 1
bResponse		.BS 1
TimeOut			.BS 1
DS.END
				.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/ADT.S
ASM
