NEW
  AUTO 3,1								Enable MASM3 auto line num
				.LIST OFF
				.OP	65C02				Target CPU, must match CPU level in header
				.OR	$2000				usualy $2000, but any value > $100 allowed
				.TF SBIN/CIFSD
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/ETH.I
				.INB INC/LIBTCPIP.I	
				.INB INC/NET.SMB.I
*--------------------------------------
TIMEOUT.MAX		.EQ 100					10 sec.
*--------------------------------------
* Zero Page Segment, up to 32 bytes
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPIPCfgPtr		.BS 2
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
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #64					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.LIBTCPIP		.DA LIBTCPIP
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.UNKNOWN	.DA MSG.UNKNOWN
L.SMB.Negotiate	.DA SMB.Negotiate
				.DA 0
*--------------------------------------
* Called once at process creation
* Put code for loading LIB here
*--------------------------------------
CS.INIT			>LDYA L.LIBTCPIP
				>SYSCALL LoadLib
				bcs .9
				sta hLIBTCPIP
				>LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG	is TCPIP loaded ?
				bcs .9
				>STYA ZPIPCfgPtr
				lda (ZPIPCfgPtr)		Configured ?
				bmi .8
				lda #E.SYN
				sec
				rts

.8				clc
.9				rts
*--------------------------------------
* Called until exit with CS
* if RUN exits with CC, RUN entered again
*--------------------------------------
CS.RUN			jsr CS.RUN.CheckArgs
				bcs .90

				jsr CS.RUN.Connect
				>DEBUG
				bcs .9
				jsr CS.RUN.Negotiate
				lda #0
				sec
.9				rts
.90				>LDYA L.MSG.USAGE
				>SYSCALL puts
				lda #E.SYN
				sec
				rts
*--------------------------------------
CS.RUN.CheckArgs
				ldy #S.PS.ARGC
				lda (pPs),y
				cmp #3
				bcc .9

				lda #TIMEOUT.MAX
				sta TimeOut
.1				>PUSHEA.G SA.REMOTE+S.SOCKADDR.ADDR
				lda #1
				>SYSCALL ArgV
				>PUSHYA
				>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
				bcc .2
				>SLEEP
				lda TimeOut
				bne .1
				lda #1
				>SYSCALL ArgV
				>PUSHYA
				>PUSHBI 2
				>LDYA L.MSG.UNKNOWN
				>SYSCALL printf
				sec
.9				rts
.2				lda #AF.INET
				>STA.G SA.LOCAL
				>STA.G SA.REMOTE
				ldy #S.IPCFG.IP+3
.3				lda (ZPIPCfgPtr),y
				pha
				dey
				cpy #S.IPCFG.IP-1
				bne .3
				ldy #SA.REMOTE+S.SOCKADDR.PORT
.4				pla
				sta (pData),y
				iny
				cpy #SA.REMOTE+S.SOCKADDR.PORT+4
				bne .4
				lda #TCP.PORT.CIFS
				>STA.G SA.REMOTE+S.SOCKADDR.PORT
				iny
				lda /TCP.PORT.CIFS
				sta (pData),y


				clc
				rts
*--------------------------------------
CS.RUN.Connect	>PUSHBI 0				no protocol
				lda #S.SOCKET.T.SEQPACKET
				>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
				bcs .9

				>STA.G hSocket

				>PUSHEA.G SA.LOCAL
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
				bcs .9
				>PUSHEA.G SA.REMOTE
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
.9				rts
*--------------------------------------
CS.RUN.Negotiate
				>PUSHWI SMB.Negotiate.end-SMB.Negotiate
				>PUSHW L.SMB.Negotiate
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Send
				rts
*--------------------------------------
* Called if option S.PS.F.EVENT enabled in Header
* Timer Event : every 10th seconds
*--------------------------------------
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
*--------------------------------------
* Called once, when RUN exited with CS
* Put code for unloading LIB here
*--------------------------------------
CS.QUIT			lda hLIBTCPIP
				beq .8
				>SYSCALL UnloadLib

.8				clc
				rts
*--------------------------------------
CS.END
*--------------------------------------
* Initialized DATA
*--------------------------------------
LIBTCPIP		.AZ "LIBTCPIP"
hLIBTCPIP		.BS 1
MSG.USAGE		.AZ "Usage : CIFSD <ip|host> sharename mountpoint"
MSG.UNKNOWN		.AZ "%s: Unknown host\r\n"
*--------------------------------------
SMB.Negotiate	.DA #$FF
				.AS "SMB"
				.DA #S.SMB.HEADER.CMD.NEGOTIATE
				.HS 00000000
				.DA #0					S.SMB.HEADER.FLAGS
				.DA /S.SMB.HEADER.FLAGS2.LONGNAMES
				.DA #S.SMB.HEADER.FLAGS2.LONGNAMES
				.DA 0					PIDHI
				.HS 0000000000000000	SECFEAT
				.DA 0					RSVD
				.DA $FFFF				TID
				.DA $FEFF				PIDLO
				.DA 0					UID
				.DA 0					MID
				.DA #0					WORD COUNT
				.DA /SMB.Negotiate.end-*
				.DA #SMB.Negotiate.end-*
				.DA #2
				.AZ "NT LM 0.12"
SMB.Negotiate.end	.EQ *
*--------------------------------------
* Per Process DATA segement (0 filled before INIT)
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
SA.LOCAL		.BS 1					S.SOCKADDR.AF
				.BS 1
				.BS 4					S.SOCKADDR.ADDR
				.BS 2					S.SOCKADDR.PORT
SA.REMOTE		.BS 1					S.SOCKADDR.AF
				.BS 1
				.BS 4					S.SOCKADDR.ADDR
				.BS 2					S.SOCKADDR.PORT
hSocket			.BS 1
DS.END
				.ED
*--------------------------------------
MAN
SAVE USR/SRC/SBIN/CIFSD
ASM