NEW
  PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/ETCONFIG
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/KERNEL.I
				.INB INC/MLI.I
				.INB INC/MLI.E.I
				.INB INC/NIC.I
				.INB INC/ETH.I
				.INB INC/LIB.NET.I
				.INB INC/LIBETALK.I
*--------------------------------------
TIMEOUT.MAX		.EQ 200					20 sec.
PROBE.MAX		.EQ 10
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
pETKCFG			.BS 2
ZPFrameBase		.BS 2
ZPFramePtr		.BS 2
ZPTmpPtr1		.BS 2
ZPTmpPtr2		.BS 2
ZPTmpPtr3		.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
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #16					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.LIBETALK		.DA LIBETALK
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.NODEV		.DA MSG.NODEV
L.MSG1.DEV		.DA MSG1.DEV
L.MSG1.DEV.ARP	.DA MSG1.DEV.ARP
L.MSG1.DEV.IP	.DA MSG1.DEV.IP
L.MSG1.LINK.OK	.DA MSG1.LINK.OK
L.MSG1.LINK.KO	.DA MSG1.LINK.KO
L.MSG1.LINKSPEED .DA MSG1.LINKSPEED
L.MSG1.DPLX.FD	.DA MSG1.DPLX.FD
L.MSG1.DPLX.HD	.DA MSG1.DPLX.HD
L.MSG2			.DA MSG2
L.MSG2.C		.DA MSG2.C
L.MSG2.U		.DA MSG2.U
L.MSG2.ADDR		.DA MSG2.ADDR
L.MSG2.ROUTER	.DA MSG2.ROUTER
L.MSG2.OBJECT	.DA MSG2.OBJECT
L.MSG.CFG		.DA MSG.CFG
L.MSG.CFG.KO	.DA MSG.CFG.KO
L.MSG.CFG.OK	.DA MSG.CFG.OK
L.HOSTNAME		.DA HOSTNAME
L.CFG.DefaultHost	.DA  CFG.DefaultHost
L.ETKCFG		.DA ETKCFG
L.ETKCFG.OBJECT	.DA ETKCFG+S.ETKCFG.OBJECT+1
L.IOCTL			.DA IOCTL
*--------------------------------------
L.MSG.PROBE		.DA MSG.PROBE
L.MSG.PROBE.KO	.DA MSG.PROBE.KO
L.MSG.PROBE.OK	.DA MSG.PROBE.OK
L.AARP.PRB		.DA AARP.PRB
L.DDP.GetNetInfo .DA DDP.GetNetInfo
				.DA 0
*--------------------------------------
CS.INIT			>LDYA L.LIBETALK
				>SYSCALL LoadLib
				bcs .9
				sta hLIBETALK

.9				rts
*--------------------------------------
CS.RUN			>LIBCALL hLIBETALK,LIBETALK.GETCFG
				>STYA pETKCFG

				ldy #S.ETKCFG-1
				
.1				lda (pETKCFG),y
				sta ETKCFG,y
				dey
				bpl .1

				lda ETKCFG+S.NETCFG.DevID
				bne CS.RUN.SETUP
				
				>LDYA L.MSG.NODEV
				>SYSCALL puts
				lda #MLI.E.NODEV
				sec
				rts
				
CS.RUN.SETUP	jsr CS.RUN.PROBE

				jsr CS.RUN.DUMP

.8				lda #0
				sec
				rts
*--------------------------------------
CS.RUN.DUMP		>PUSHEA.G DIB
				lda ETKCFG+S.NETCFG.DevID
				>SYSCALL GetDevStatus
				
				>LEA.G DCB.NIC
				>STYA IOCTL+S.IOCTL.BUFPTR
				lda #S.IOCTL.STATCODE.GETDCB
				sta IOCTL+S.IOCTL.STATCODE

				>PUSHW L.IOCTL
				>PUSHBI IOCTL.STATUS
				lda ETKCFG+S.NETCFG.DevID
				>SYSCALL IOCTL
				
CS.RUN.DUMPNIC	ldy #DCB.NIC+S.DCB.NIC.MAC+5
				ldx #6
				
.1				lda (pData),y
				>PUSHA
				dey
				dex 
				bne .1

				>PUSHEA.G DIB+S.DIB.IDS 

				ldx ETKCFG+S.NETCFG.DevID
				lda Dev.Table-1,x
				clc
				adc #S.FD.DEV
				tay
				lda Dev.Table,x
				adc /S.FD.DEV

				>PUSHYA
				
				lda ETKCFG+S.NETCFG.DevID
				>PUSHA
				>PUSHBI 11
				>LDYA L.MSG1.DEV
				>SYSCALL printf
				
				>LDA.G DCB.NIC+S.DCB.NIC.FLAGS
				and #S.DCB.NIC.FLAGS.ARPOFFLOAD
				beq .2
				
				lda #1
				
.2				>PUSHA
				>PUSHBI 1	
				>LDYA L.MSG1.DEV.ARP
				>SYSCALL printf
				
				>LDA.G DCB.NIC+S.DCB.NIC.FLAGS
				and #S.DCB.NIC.FLAGS.IPOFFLOAD

				beq .3

				lda #1
.3
				>PUSHA		
				>PUSHBI 1	
				>LDYA L.MSG1.DEV.IP
				>SYSCALL printf

				>LDA.G DCB.NIC+S.DCB.NIC.LINK
				and #S.DCB.NIC.LINK.OK
				bne CS.RUN.LINK
				
				>LDYA L.MSG1.LINK.KO
				>SYSCALL puts
				bra CS.RUN.DUMPNET
				
CS.RUN.LINK		>LDYA L.MSG1.LINK.OK
				>SYSCALL puts
				
				>PUSHBI 0
				>LDYA L.MSG1.LINKSPEED
				>SYSCALL printf
				
				>LDA.G DCB.NIC+S.DCB.NIC.SPEED
				and #$0F
				tax
				
.4				phx
				lda #'0'
				>SYSCALL PutChar
				plx
				dex
				bne .4
				
				>LDA.G DCB.NIC+S.DCB.NIC.LINK
				and #S.DCB.NIC.LINK.FD
				bne .5
				
				>LDYA L.MSG1.DPLX.HD
				bra .6
				
.5				>LDYA L.MSG1.DPLX.FD
.6				>SYSCALL puts

CS.RUN.DUMPNET	>PUSHBI 0
				>LDYA L.MSG2
				>SYSCALL printf
				lda ETKCFG+S.ETKCFG.NodID
				beq .11
				
				>LDYA L.MSG2.C
				bra .10
				
.11				>LDYA L.MSG2.U
				
.10				>SYSCALL puts

				>PUSHB ETKCFG+S.ETKCFG.NodID
				>PUSHW ETKCFG+S.ETKCFG.NetID

				>PUSHBI 3
				>LDYA L.MSG2.ADDR
				>SYSCALL printf
				
				>PUSHB ETKCFG+S.ETKCFG.Router
				>PUSHW ETKCFG+S.ETKCFG.NetID
				
				>PUSHBI 3
				>LDYA L.MSG2.ROUTER
				>SYSCALL printf
				
				>PUSHW L.ETKCFG.OBJECT

				>PUSHBI 2
				>LDYA L.MSG2.OBJECT
				>SYSCALL printf
				
				lda #0					tell TSKMGR that all done ok, but 
				sec						we do not want to stay in memory
				rts
*--------------------------------------
CS.RUN.PROBE	>PUSHBI 0
				>LDYA L.MSG.PROBE
				>SYSCALL printf

				ldx #5

.20				lda ETKCFG+S.NETCFG.MAC,x
				sta AARP.PRB.SHA,x
				dex
				bpl .20
				
				lda #$58
				sta AARP.PRB.SPA+2
				sta AARP.PRB.TPA+2
				sta ETKCFG+S.ETKCFG.NetID

				lda A2osX.RANDOM16+1
				lda #$06
				sta AARP.PRB.SPA+1
				sta AARP.PRB.TPA+1
				sta ETKCFG+S.ETKCFG.NetID+1

				lda A2osX.RANDOM16
				lda #$3A
				bne .1
				inc
				
.1				cmp #$FE
				bcc .2
	
				eor #$80
				bne .2
				inc
				
.2				sta AARP.PRB.SPA+3
				sta AARP.PRB.TPA+3
				sta ETKCFG+S.ETKCFG.NodID
				
				lda #PROBE.MAX
				>STA.G PROBE.CNT
				
.3				>LDYA L.AARP.PRB
				>STYA IOCTL+S.IOCTL.BUFPTR
				>LDYAI AARP.PRB.LEN
				>STYA IOCTL+S.IOCTL.BYTECNT
				>PUSHW L.IOCTL
				>PUSHBI IOCTL.WRITE
				lda ETKCFG+S.NETCFG.DevID
				>SYSCALL IOCTL
				
				>SLEEP
				
				>DEC.G PROBE.CNT
*				bne .3
				
				>LDYA L.DDP.GetNetInfo
				>STYA IOCTL+S.IOCTL.BUFPTR
				>LDYAI DDP.GetNetInfo.LEN
				>STYA IOCTL+S.IOCTL.BYTECNT
				>PUSHW L.IOCTL
				>PUSHBI IOCTL.WRITE
				lda ETKCFG+S.NETCFG.DevID
				>SYSCALL IOCTL
				
				>LDYA L.MSG.PROBE.OK
				>SYSCALL puts
				
				clc
				rts
*--------------------------------------
CFG.EtcFiles	>LDYAI 256
				>SYSCALL GetMem
				bcc .1
				rts
				
.1				>STYA ZPTmpPtr1
				stx CFG.hBuf1
				
				>LDYA L.HOSTNAME
				jsr CFG.Read.PrintF
				jsr CFG.Read.HOSTNAME

				lda ETKCFG+S.ETKCFG.OBJECT
				bne .4

				>PUSHW A2osX.TIMER16
				>PUSHBI 2
				>PUSHW L.CFG.DefaultHost
				>LDYA L.ETKCFG.OBJECT
				>SYSCALL sprintf
				lda #11
				sta ETKCFG+S.ETKCFG.OBJECT
				
.4				>PUSHW L.ETKCFG
				>LIBCALL hLIBETALK,LIBETALK.SETCFG

				lda CFG.hBuf1
				>SYSCALL freemem
								
.9				rts				
*--------------------------------------
CFG.Read.PrintF >PUSHYA
				>PUSHBI 2
				>LDYA L.MSG.CFG
				>SYSCALL printf
				rts
*--------------------------------------
CFG.Read.HOSTNAME
				>LDYA L.HOSTNAME
				jsr CFG.Read.Open
				jsr CFG.Read.Result
				bcs .9
				
.1				jsr CFG.Read.GetS
				bcs .8
				
				lda (ZPTmpPtr1)
				beq .1					empty line...
				cmp #'#
				beq .1					comment...
				
				ldy #0

.2				lda (ZPTmpPtr1),y
				beq .8					end of name
				sta ETKCFG+S.ETKCFG.OBJECT,y
				
				iny
				cpy #32
				bne .2
				
.8				tya
				sta ETKCFG+S.ETKCFG.OBJECT
				
				clc
				.HS B0					BCS
.9				sec
				jmp CFG.Read.Close
*--------------------------------------
CFG.Read.Result	bcc .1
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.CFG.KO
				>SYSCALL printf
				sec
				rts
				
.1				>LDYA L.MSG.CFG.OK
				>SYSCALL puts
				rts
*--------------------------------------
CFG.Read.Open	stz CFG.hCfgFile
				
				pha
				
				>PUSHWI 0
				>PUSHBI S.FI.T.TXT
				>PUSHBI	O.RDONLY
				
				pla
				>SYSCALL fopen
				bcs .9
				
				sta CFG.hCfgFile
*				clc				
.9				rts				
*--------------------------------------
CFG.Read.Close	php
				pha
				
CFG.Read.Close2				
				lda CFG.hCfgFile
				beq .8
				>SYSCALL fclose
				
.8				pla
				plp
				rts
*--------------------------------------
CFG.Read.GetS	>PUSHWI 255
				>PUSHW ZPTmpPtr1
				lda CFG.hCfgFile
				>SYSCALL fgets
				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 hLIBETALK
				beq .8
				>SYSCALL UnloadLib
				
.8				clc
				rts
*--------------------------------------
Init.Timeout	ldy #TimeOut
				lda #TIMEOUT.MAX
				sta (pData),y
				rts
*--------------------------------------
Wait.TimeOut	ldy #TimeOut
				lda (pData),y
				rts
*--------------------------------------
CS.END
LIBETALK		.AZ "libetalk"
hLIBETALK		.BS	1
*--------------------------------------
MSG.USAGE		.AZ "Usage : ETCONFIG\r\n"
*--------------------------------------
MSG.NODEV		.AZ "EtherTalk not bound to any device."
*--------------------------------------
MSG1.DEV		.AS "NIC Device Configuration :\r\n"
				.AS	" Device ID   : $%h\r\n"
				.AS " Device Name : %s\r\n"
				.AS " Device Type : %S\r\n"
				.AZ " HW Address  : %02h:%02h:%02h:%02h:%02h:%02h\r\n"
MSG1.DEV.ARP	.AZ " ARP Offload : %d\r\n"
MSG1.DEV.IP		.AS " IP Offload  : %d\r\n"
				.AZ " Link Status : "
MSG1.LINK.OK	.AZ "OK"
MSG1.LINK.KO	.AZ "Media Disconnected"
MSG1.LINKSPEED	.AZ " Link Speed  : 1"
MSG1.DPLX.FD	.AZ " Mbit/s,Full Duplex"
MSG1.DPLX.HD	.AZ " Mbit/s,Half Duplex"
*--------------------------------------
MSG2			.AZ "EtherTalk Configuration : "
MSG2.C			.AZ "Configured"
MSG2.U			.AZ "Not Configured"
MSG2.ADDR		.AZ " Network/Node : %D/%d\r\n"
MSG2.ROUTER		.AZ " Router       : %D/%d\r\n"
MSG2.OBJECT		.AZ " Object Name  : %S\r\n"
*--------------------------------------
MSG.CFG			.AZ "ETCONFIG:Reading %s..."
MSG.CFG.KO		.AZ "Not Found. [%h]\r\n"
MSG.CFG.OK		.AZ "OK."
*--------------------------------------
HOSTNAME		.AZ "${ROOT}ETC/HOSTNAME"
*--------------------------------------
CFG.DefaultHost	.AZ "a2osx-%H"
*--------------------------------------
MSG.PROBE		.AZ "ETCONFIG:Acquiring NODE..."
MSG.PROBE.KO	.AZ "ETCONFIG:Time Out [%h].\r\n"
MSG.PROBE.OK	.AZ "ETCONFIG:Success\n"
*--------------------------------------
ETKCFG			.BS S.ETKCFG
CFG.hCfgFile	.BS 1
CFG.hBuf1		.BS 1
*--------------------------------------
AARP.PRB		.HS 090007FFFFFF		S.ETH.DSTMAC
AARP.PRB.SRCMAC	.BS 6
				.DA #0,#36				S.ETH.802.3.LENGTH
				.HS AA					S.ETH.802.2.DSTSAP
				.HS AA					S.ETH.802.2.SRCSAP
				.HS 03					S.ETH.802.2.CTRL
				.HS 00.00.00.80.F3		S.ETH.SNAP.PROTO
				.HS 00.01.80.9B.06.04
				.HS 0003				Probe
AARP.PRB.SHA	.BS 6
AARP.PRB.SPA	.BS 4
AARP.PRB.THA	.BS 6
AARP.PRB.TPA	.BS 4
				.BS AARP.PRB+60-*
AARP.PRB.LEN	.EQ 60
*--------------------------------------
DDP.GetNetInfo	.HS 090007FFFFFF		S.ETH.DSTMAC
				.BS 6
				.DA #0,#36
				.HS AA
				.HS AA
				.HS 03
				.HS 08.00.07.80.9B
				.DA #0,#6				S.DDP2.DATALEN
				.DA	0					S.DDP2.CHECKSUM
				.DA $FF00
				.DA $1234
				.DA #$FF
				.DA #$FF
				.DA #6					S.DDP2.DST.SKT
				.DA #0
				.DA #6					S.DDP2.TYPE
*--------------------------------------
				.DA #5					ZIP.GetNetInfoReg
				.HS 00.00.00.00
				.HS 00					Zone Len
				.BS DDP.GetNetInfo+60-*
DDP.GetNetInfo.LEN	.EQ 60				
*--------------------------------------
IOCTL			.BS S.IOCTL
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DIB				.BS S.DIB
DCB.NIC			.BS S.DCB.NIC
PROBE.CNT		.BS 1
TimeOut			.BS 1
DS.END			.ED
*--------------------------------------
MAN
SAVE USR/SRC/SBIN/ETCONFIG.S
ASM
