NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/telnet
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/eth.i
				.INB inc/libtcpip.i
				.INB inc/net.telnet.i
*--------------------------------------
TIMEOUT.MAX		.EQ 200					20 sec.
BUFSIZE			.EQ 256
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPIPCfgPtr		.BS 2
ZPBufPtr		.BS 2
ZPBufLen		.BS 2
hBuf			.BS 1
hSocket			.BS 1
TimeOut			.BS 1
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 Size (without Constants)
				.DA DS.END-DS.START		Data Segment Size
				.DA #64					Stack Size
				.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.MSG.USER		.DA MSG.USER
				.DA 0
*--------------------------------------
CS.INIT			>LDYA L.LIBTCPIP
				>SYSCALL LoadLib
				bcs .9
				sta hLIBTCPIP

.9				rts
*--------------------------------------
CS.RUN			>LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG	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.PS.ARGC
				lda (pPS),y
				cmp #1
				bcc .9
				ldy #S.IPCFG.IP+3
				ldx #3
.1				lda (ZPIPCfgPtr),y
				sta SA.LOCAL+S.SOCKADDR.ADDR,x
				dey
				dex
				bpl .1

				lda #TIMEOUT.MAX
				sta TimeOut

.2				>SLEEP

				>PUSHW L.SA.REMOTE.AD
				lda #1
				>SYSCALL ArgV
				>PUSHYA
				>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName
				bcc CS.RUN.HOSTOK
				lda TimeOut
				bne .2

				>PUSHW L.MSG.UNKNOWN
				lda #1
				>SYSCALL ArgV
				>PUSHYA
				>PUSHBI 2
				>SYSCALL PrintF
				bra .99

.9				>LDYA L.MSG.USAGE
				>SYSCALL PutS

.99				lda #E.SYN
				sec
				rts

CS.RUN.HOSTOK	lda #2
				>SYSCALL ArgV
				bcs CS.RUN.PORTOK
				>SYSCALL AToI
				>STYA SA.REMOTE+S.SOCKADDR.PORT

CS.RUN.PORTOK	>PUSHW L.MSG.HOSTOK
				ldx #0

.1				>PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x
				inx
				cpx #4
				bne .1

				>PUSHW SA.REMOTE+S.SOCKADDR.PORT
				lda #1
				>SYSCALL ArgV
				>PUSHYA

				>PUSHBI 8
				>SYSCALL PrintF

CS.RUN.OPENSKT	>PUSHBI S.SOCKET.T.STREAM
				>PUSHBI 0				no protocol
				>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
				bcs .9

				sta hSocket

				>PUSHA
				>PUSHW L.SA.LOCAL
				>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
				bcc .2

.9				pha
				>LDYA L.MSG.SKTKO
				>SYSCALL PutS
				pla
				sec
.99				rts

.2				lda #TIMEOUT.MAX
				sta TimeOut

.3				>SLEEP

				>PUSHB hSocket
				>PUSHW L.SA.REMOTE
				>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
				bcc .4

				cmp #ERR.SKT.NOCONN
				bne .9

				lda TimeOut
				bne .3

				lda #ERR.SKT.NOCONN
				bra .9

.4				>PUSHW L.MSG.SKTOK
				>PUSHBI 0
				>SYSCALL PrintF

				>LDYAI BUFSIZE
				>SYSCALL GetMem
				bcs .99

				>STYA ZPBufPtr
				stx hBuf

CS.RUN.LOOP		>SLEEP

				lda hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.EOF
				bcs .98

				tay
				bne .2					EOF, no char

				>PUSHB hSocket
				>PUSHW ZPBufPtr
				>PUSHWI BUFSIZE
				>LIBCALL hLIBTCPIP,LIBTCPIP.Read
.98				bcs .99

				>STYA ZPBufLen

				ldy #S.PS.hStdOut
				lda (pPS),y
				>PUSHA
				>PUSHW ZPBufPtr

				>PUSHW ZPBufLen
				>SYSCALL FWrite
				bcs .11

.2				ldy #S.PS.hStdIn
				lda (pPS),y
				>SYSCALL FEOF
				bcs .11					CS.RUN.IOERR

				tay
				bne CS.RUN.LOOP			EOF = true, no char from STDIN

				ldy #S.PS.hStdIn
				lda (pPS),y
				>PUSHA
				>PUSHW ZPBufPtr
				>PUSHWI BUFSIZE
				>SYSCALL FRead
.11				bcc .3

				bra CS.RUN.IOERR
.99				bra CS.RUN.SKTERR

.3				>STYA ZPBufLen

				lda (ZPBufPtr)
				cmp #$14				Ctrl-T
				beq CS.RUN.USER

				>PUSHB hSocket
				>PUSHW ZPBufPtr
				>PUSHW ZPBufLen
				>LIBCALL hLIBTCPIP,LIBTCPIP.Write
.9				bcs CS.RUN.SKTERR

				jmp CS.RUN.LOOP
*--------------------------------------
CS.RUN.SKTERR	pha
				>PUSHW L.MSG.SKTERR
				pla
				pha
				>PUSHA
				>PUSHBI 1
				>SYSCALL PrintF
				pla
				sec
				rts
*--------------------------------------
CS.RUN.IOERR	pha
				>PUSHW L.MSG.IOERR
				pla
				pha
				>PUSHA
				>PUSHBI 1
				>SYSCALL PrintF
				pla
				sec
				rts
*--------------------------------------
CS.RUN.USER		>LDYA L.MSG.USER
				>SYSCALL PutS
				lda #0
				sec
				rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .9					is it a TIMER event?
				lda TimeOut
				beq .9
				dec TimeOut
.9				sec						do not discard TIMER event
				rts
*--------------------------------------
CS.QUIT			lda hSocket
				beq .1

				>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown

.1				lda hBuf
				beq .2

				>SYSCALL FreeMem

.2				lda hLIBTCPIP
				beq .8

				>SYSCALL UnloadLib

.8				clc
				rts
*--------------------------------------
CS.END
LIBTCPIP		.AZ "libtcpip"
hLIBTCPIP		.BS 1
MSG.IPKO		.AZ "TCP/IP Not Loaded/Configured."
MSG.USAGE		.AZ "Usage : TELNET <ip|host> [port]"
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\r\n(Exit key is Ctrl-T)\r\n"
MSG.SKTERR		.AZ "Socket Error : $%h\r\n"
MSG.IOERR		.AZ "I/O Error : $%h\r\n"
MSG.USER		.AZ "User interrupt."
*--------------------------------------
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 TCP.PORT.TELNET
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DS.END
				.ED
*--------------------------------------
MAN
SAVE usr/src/bin/telnet.s
ASM
