PR#3
NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF SBIN/NFSD
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/LIBTCPIP.I
*--------------------------------------
TIMEOUT.MAX		.EQ 30					30 sec.
*--------------------------------------
ZPIPCfgPtr		.EQ ZPBIN
ZPSktPtr		.EQ ZPBIN+2
*--------------------------------------
*			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		Code Length To Relocate
				.DA DS.END-DS.START		Data Segment to Allocate
				.DA 0
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT
				.DA	CS.QUIT
				.DA CS.HOOK
L.LIBTCPIP		.DA LIBTCPIP
L.Socket		.DA Socket
L.MSG.TCPWAIT	.DA MSG.TCPWAIT
L.MSG.INITOK	.DA MSG.INITOK
L.MSG.TCPIPERR	.DA MSG.TCPIPERR
L.MSG.SKTERR	.DA MSG.SKTERR
L.MSG.ABORT		.DA MSG.ABORT
L.MSG.INCOMING	.DA MSG.INCOMING
				.DA 0
*--------------------------------------
CS.INIT			>LDYA L.LIBTCPIP
				>SYSCALL LoadLibYA
				sta hLIBTCPIP

				lda (pPs)
				ora #S.PS.F.EVENT		Now accept events
				sta (pPs)
				clc
				rts
*--------------------------------------
CS.RUN			jsr Init.Timeout

				>LDYA L.MSG.TCPWAIT
				>SYSCALL printf
.1				>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG	is TCPIP loaded ?
				bcs .99
				>STYA ZPIPCfgPtr
				lda (ZPIPCfgPtr)		Configured ?
				bmi CS.RUN.INIT
				>SLEEP
				jsr Wait.Timeout
				bcc .1
.99				>LDYA L.MSG.TCPIPERR
				>SYSCALL printf
				lda #E.SYN
				sec	
				rts
CS.RUN.INIT		ldx #3
				ldy #S.IPCFG.IP+3
.1				lda (ZPIPCfgPtr),y
				sta Socket.Src.Addr,x
				dey
				dex
				bpl .1
				>PUSHW L.Socket
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New
				bcs .9

				>STA.G hSocket
				>LDYA L.MSG.INITOK
				>SYSCALL printf

.11				>SLEEP
				ldy #bCTRLC
				lda (pData),y
				bmi .99
				bra .11
				ldy #hSocket
				lda (pData),y
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.AcceptA
				bcs .11
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.GETA
				>STYA ZPSktPtr
				ldx #3
				ldy #S.SOCKET.DST.ADDR+3
.2				>PUSHB (ZPSktPtr),y
				dey
				dex
				bpl .2
				>LDYA L.MSG.INCOMING
				>SYSCALL printf
				bra .11
.9				>LDYA L.MSG.SKTERR
				>SYSCALL printf
				lda #E.SYN
				sec	
				rts
.99				>LDYA L.MSG.ABORT
				>SYSCALL printf
				lda #0
				sec	
				rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .1					is it a TIMER event?

				asl						One second ?
				bpl .9
				ldy #TimeOut
				lda (pData),y
				beq .9
				dec
				sta (pData),y
				sec						do not discard TIMER event
				rts

.1				bit #S.EVT.F.KEY		is it a KEY event?
				beq .9

				ldy #S.EVT.DATAHI		is it an O or SAPPLE key ?
				lda (pEvent),y
				bne	.9

				ldy #S.EVT.DATALO	
				lda (pEvent),y
				cmp #$03				Ctrl-C
				bne .9

				lda #$FF
				ldy #bCTRLC
				sta (pData),y
				clc
				rts
.9				sec
				rts
*--------------------------------------
CS.QUIT			ldy #hSocket
				lda (pData),y
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
				lda hLIBTCPIP
				>SYSCALL UnloadLibA
				clc
				rts
*--------------------------------------
CS.HOOK			
*--------------------------------------
Init.Timeout	ldy #TimeOut
				lda #TIMEOUT.MAX
				sta (pData),y
				rts
*--------------------------------------
Wait.TimeOut	sec
				ldy #TimeOut
				lda (pData),y
				beq .9
				ldy #bCTRLC
				lda (pData),y
				bmi .9
				clc
.9				rts
*--------------------------------------
CS.END
*--------------------------------------
LIBTCPIP		>PSTR "libtcpip.o"
MSG.TCPWAIT		.AZ "NFSD:Waiting for TCP/IP initializing...\n"
MSG.INITOK		.AZ "NFSD:Init Ok, Listening.\n"
MSG.TCPIPERR	.AZ "NFSD:TCP/IP Not initialized properly\n"
MSG.SKTERR		.AZ "NFSD:Listen Error\n"
MSG.ABORT		.AZ "NFSD:User Aborted\n"
MSG.INCOMING	.AZ "NFSD:Incoming Connection From : %d.%d.%d.%d\n"	
hLIBTCPIP		.BS 1
*--------------------------------------
Socket			.DA #S.SOCKET.T.DGRAM
				.DA #S.SOCKET.O.ACCEPTCONN
				.DA #S.SOCKET.TCP.S.LISTEN
				.BS 1
Socket.Src.Addr	.BS 4
Socket.Src.Port	.DA 2049
Socket.Dst.Addr	.BS 4
Socket.Dst.Port	.BS 2
				.BS 16
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
TimeOut			.BS 1
bCTRLC			.BS 1
hSocket			.BS 1
DS.END
				.ED
*--------------------------------------
MAN
SAVE USR/SRC/SBIN/NFSD.S
ASM
