PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF	
				.OP	65C02
				.OR	$2000
				.TF /A2OSX.BOOT/DRV/UTHERNET2.DRV
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/LIBTCPIP.I
*--------------------------------------
ZPTmpPTR		.EQ ZPDRV
*--------------------------------------
				.MA AR.SELECT
				lda /W5100.AR.]1
				sta W5100.AR,x
				lda #W5100.AR.]1
				sta W5100.AR+1,x
				.EM
*--------------------------------------
				.INB DRV/X.NET.W5100.S
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp Dev.Detect			cld,jmp abs=DRV
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					DRV Layout Version 1
				.DA 0
				.DA CS.END-CS.START			Code Length
				.DA DEV.HEADER-CS.START		Device Header Offset
				.DA DRV.CS.START-CS.START	Driver Code Offset
				.DA DRV.CS.END-DRV.CS.START	Drv Code Length
*--------------------------------------
* Relocation Table
*--------------------------------------
L.MSG.DETECT	.DA MSG.DETECT
L.MSG.DETECT.OK	.DA MSG.DETECT.OK
L.MSG.DETECT.KO	.DA MSG.DETECT.KO
L.DEV.HEADER.NAME	.DA DEV.HEADER.NAME
				.DA 0					End Of Reloc Table
*--------------------------------------
Dev.Detect		>STYA Args
				>LDYA L.MSG.DETECT
				>SYSCALL SYS.PrintFYA
				
				ldx #$10+$88
.1				lda #W5100.MR.RST
				sta W5100.MR,x

				lda #W5100.MR.AI+W5100.MR.IND
				sta W5100.MR,x
 
				lda W5100.MR,x
				cmp #W5100.MR.AI+W5100.MR.IND
				bne .2
				
				>AR.SELECT RTR			Double Check with RTR default value...
				
				lda W5100.DR,x		Get RTR HI
				cmp /2000
				bne .2
				lda W5100.DR,x		Get RTR LO 
				cmp #2000
				beq	.3
				
.2				inc DEV.HEADER.NAME+4
				txa
				clc
				adc #$10
				tax
				bcc .1				#$108 ?
				
				>LDYA L.MSG.DETECT.KO
				>SYSCALL SYS.PrintFYA

				lda #DEVMGR.ERRNOHW
				sec
				rts
				
.3				stx DEVSLOTx8
				
				>LDYA ARGS
				>STYA ZPTmpPTR
				lda (ZPTmpPTR)
				bne .4
				
				lda #$00
				sta MAC
				lda #$08
				sta MAC+1
				lda #$DC
				sta MAC+2
				lda A2osX.RANDOM16
				eor A2osX.TIMER16
				sta MAC+3
				eor A2osX.RANDOM16+1
				sta MAC+4
				eor A2osX.TIMER16+1
				sta MAC+5
				bra .8
				
.4				>SYSCALL SYS.GetMemPtrA
				>STYA ZPTmpPTR
				jsr DecodeMac
				bcc .8
				lda #DEVMGR.ERRICL
				sec
				rts
				
.8				>PUSHW L.DEV.HEADER.NAME
				>LDYA L.MSG.DETECT.OK
				>SYSCALL SYS.PrintFYA
				clc
				rts
*--------------------------------------
				.INB DRV/X.NET.DRV.S
*--------------------------------------
CS.END
MSG.DETECT		>CSTRING "UtherNet2/W5100 Driver.\n"
MSG.DETECT.OK	>CSTRING "UtherNet2/W5100 Installed As Device : %S\n"
MSG.DETECT.KO	>CSTRING "Hardware Not Found.\n"
Args			.BS 2
*--------------------------------------
*			Device Header (16 Bytes)
*--------------------------------------
DEV.HEADER		cld
				jmp (DRV.CS.START,x)
				.HS 00
				.DA #S.DEV.F.SHARE+S.DEV.F.EVENT
DEV.HEADER.NAME	>PSTRING "ETH1"			NAME			
				.HS 00
				.HS 00.00.00.00
*--------------------------------------
*			Driver Code
*--------------------------------------
DRV.CS.START	.DA OPEN
				.DA GETEVENT
				.DA COUT
				.DA CLOSE
				.DA GETINFO
				.DA IRQ
				.DA SEND
				.DA SETIPCFG
L.DEVINFO		.DA DEVINFO
				.DA 0					end or relocation
*--------------------------------------
OPEN			jsr Reset

				lda #W5100.MR.AI+W5100.MR.IND
				sta W5100.MR,x

				>AR.SELECT SHAR
				
				ldy	#0
.1				lda MAC,y
				sta W5100.DR,x
				iny
				cpy #6
				bne .1

				>AR.SELECT RMSR
				lda #3					8k,0k,0k,0k
				sta W5100.DR,x		...for Socket RX Buffers
				sta W5100.DR,x		...for Socket TX Buffers

				>AR.SELECT S0.MR
				lda #W5100.AR.S0.MR.MACRAW+W5100.AR.S0.MR.MF
				sta W5100.DR,x

				
				>AR.SELECT S0.CR
				lda #1					OPEN
				sta W5100.DR,x

				clc
				rts
*--------------------------------------
GETEVENT		ldx DEVSLOTx8

				>AR.SELECT S0.RX.RSR
				lda W5100.DR,x		get the received size HI
				ora W5100.DR,x      LO
				bne GETEVENT.RxOK
				
				lda #ERR.DEV.NOFRAME
COUT
IRQ
SETIPCFG
GETEVENT.Err	sec
				rts
				
GETEVENT.RxOK	>AR.SELECT S0.RX.RD
				lda W5100.DR,x		get the received ptr HI
				ldy W5100.DR,x		get the received ptr LO
				and /RXTX.MASK
				ora /RX.BASE
				sta W5100.AR,x
				tya
				sta W5100.AR+1,x
				
				lda W5100.DR,x		get RX.Size HI
				sta Offset+1
				>PUSHA				for SYS.GetMem
				tay
				lda W5100.DR,x		get RX.Size LO
				sta Offset
				>PUSHA				for SYS.GetMem
				
				sec
				sbc #2
				sta RXTX.Size
				bcs .1
				dey
.1				sty RXTX.Size+1
			
*				>PUSHYA				Already pushed....
				>PUSHBI 0
				>SYSCALL SYS.GetMem
				bcs GETEVENT.Err
				>STYA ZPTmpPTR
				txa
				ldy #S.EVT.DATALO
				sta (pEvent),y
				
				lda #S.EVT.F.NET+S.EVT.F.hMEM1
				sta (pEvent)

				lda RXTX.Size
				sta (ZPTmpPTR)
				eor #$ff
				sta Counter
				
				ldy #1
				
				lda RXTX.Size+1
				sta (ZPTmpPTR),y
				eor #$ff
				sta Counter+1
				
				ldx DEVSLOTx8

				iny
				
.2				inc Counter
				bne .3
				inc Counter+1
				beq .8
				
.3				lda W5100.DR,x
				sta (ZPTmpPTR),y
				iny
				bne .2
				inc ZPTmpPTR+1
				bne .2
				
.8				>AR.SELECT S0.RX.RD
				ldy W5100.DR,x			Get HI
				lda W5100.DR,x			Get LO
				clc
				adc Offset
				pha						save LO
				tya
				adc Offset+1
				pha
				>AR.SELECT S0.RX.RD
				pla
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO
				
				>AR.SELECT S0.CR
				lda #$40				RECV
				sta W5100.DR,x
				
				ldy #S.ETH.DSTMAC
				lda (ZPTmpPTR),y
				
.81				iny
				and (ZPTmpPTR),y
				cpy #S.ETH.DSTMAC+5
				bne .81					if EQ, CS

				inc						$ff = Broadcast ??
				beq .82
				clc						not a broadcast
				
.82				lda #$00
				ror
				ldy #S.EVT.DATAHI
				sta (pEvent),y		
				
*				clc						cleared by ROR
				rts
*--------------------------------------
CLOSE			jsr Reset
				clc
				rts
*--------------------------------------				
GETINFO			>LDYA L.DEVINFO
				clc
				rts
*--------------------------------------				
SEND			>PULLW ZPTmpPTR
				
				lda (ZPTmpPTR)
				sta RXTX.Size
				eor #$ff
				sta Counter

				ldy #1
				lda (ZPTmpPTR),y
				sta RXTX.Size+1
				eor #$ff
				sta Counter+1
				
				ldx DEVSLOTx8
				>AR.SELECT S0.TX.FSR
				
				lda W5100.DR,x		get send size HI
				ldy W5100.DR,x      LO
				cpy RXTX.Size
				sbc RXTX.Size+1
				bcs SEND.READY

				lda #ERR.DEV.NOBUFFER
				sec
				rts
				
SEND.READY		ldy #S.ETH.SRCMAC+5
				ldx #5
.1				lda MAC,x
				sta (ZPTmpPTR),y
				dey
				dex
				bpl .1

				ldx DEVSLOTx8
				
				>AR.SELECT S0.TX.WR
				lda W5100.DR,x			Get HI
				ldy W5100.DR,x			Get LO
				and /RXTX.MASK
				ora /TX.BASE
				sta W5100.AR,x			Write HI
				sta Offset+1
				tya
				sta W5100.AR+1,x		Write LO
				sta Offset
				
				ldy #2
				
.2				inc Counter
				bne .3

				inc Counter+1
				beq .8
				
.3				lda (ZPTmpPTR),y
				sta W5100.DR,x
				iny
				bne .2
				inc ZPTmpPTR+1
				bne .2
				
.8				>AR.SELECT S0.TX.WR
				
				clc
				lda Offset
				adc RXTX.Size
				pha						save LO
				
				lda Offset+1
				adc RXTX.Size+1
*				and /RXTX.MASK
*				ora /TX.BASE
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO
				
				>AR.SELECT S0.CR
				lda #$20				SEND
				sta W5100.DR,x
				clc
				rts
*--------------------------------------
Reset			ldx DEVSLOTx8
				lda #W5100.MR.RST
				sta W5100.MR,x
				rts
*--------------------------------------
DRV.CS.END
DEVSLOTx8		.BS 1
RXTX.Size		.BS 2
Counter			.BS 2
Offset			.BS 2
*--------------------------------------
DEVINFO			.DA #S.DEVINFO.TYPE.NET
DEVFLAGS		.DA #0
MAC				.BS 6
LINK.STATUS		.DA #S.DEVINFO.NET.STATUS.OK+S.DEVINFO.NET.STATUS.FD+S.DEVINFO.NET.STATUS.100
MAN
SAVE DRV/UTHERNET2.DRV.S
ASM
