NEW
  AUTO 3,1
*--------------------------------------
U2.Init			lda CONF.SLOT
				asl
				asl
				asl
				asl
				clc
				adc #$88
				sta Slotn0
				tax
	
				lda #W5100.MR.RST
				sta W5100.MR,x

				lda #0

.1				dec						give some time....
				bne .1

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

				pha
				pla

				lda W5100.MR,x
				cmp #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND
				bne .9

				>AR.SELECT RTR
				lda W5100.DR,x		Get RTR HI
				cmp /2000
				bne .9

				lda W5100.DR,x		Get RTR LO 
				cmp #2000
				beq	.3

.9				sec
				rts

.3				lda CONF.SLOT
				pha

				lda #0
				pha
				pha

				lda #U2.Name
				pha
				lda /U2.Name
				pha
				
				>LDYAI VEDRIVE.NICOK
				jsr PrintFYA
				
				ldx Slotn0
				
				lda #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND
				sta W5100.MR,x

				>AR.SELECT SHAR
				ldy	#0

.4				lda CONF.SRCMAC,y
				sta W5100.DR,x
				iny
				cpy #6
				bne .4

				>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.Sn.MR.MACRAW+W5100.AR.Sn.MR.MF
				sta W5100.DR,x

				>AR.SELECT S0.CR
				lda #W5100.AR.Sn.CR.OPEN
				sta W5100.DR,x				
				
				clc
				rts
*--------------------------------------
U2.Read			php
				sei

				ldx Slotn0

				>AR.SELECT S0.RX.RSR
				lda W5100.DR,x			get the received size HI
				nop
				nop
				ora W5100.DR,x      	LO
				bne .1

				jmp U2.READWRITE.9

.1				>AR.SELECT S0.RX.RD
				lda W5100.DR,x			get the received ptr HI
				sta Offset+1
				ldy W5100.DR,x			get the received ptr LO
				sty Offset

				and /RXTX.MASK
				ora /RX.BASE
				sta W5100.AR,x
				tya
				sta W5100.AR+1,x

				lda W5100.DR,x			get RX.Size HI (Frame size + 2)
				sta TotalSize+1
				lda W5100.DR,x			get RX.Size LO
				sta TotalSize

				sec
				sbc #2					MACRAW:strip 2 bytes Header from Size 
				sta ZPBufCnt
				eor #$ff
				sta ZPnCnt

				lda TotalSize+1
				sbc #0
				sta ZPBufCnt+1
				eor #$ff
				sta ZPnCnt+1

				lda ZPBufPtr+1
				pha
				
				ldy #0

.2				inc ZPnCnt
				bne .3

				inc ZPnCnt+1
				beq .8

.3				lda W5100.DR,x
				sta (ZPBufPtr),y
				iny
				bne .2

				inc ZPBufPtr+1
				bra .2

.8				>AR.SELECT S0.RX.RD

				lda Offset
				clc
				adc TotalSize
				pha						save LO

				lda Offset+1
				adc TotalSize+1
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO

				>AR.SELECT S0.CR
				lda #W5100.AR.Sn.CR.RCVD
				sta W5100.DR,x
				
				pla
				sta ZPBufPtr+1
				
				plp
				clc
				rts			
*--------------------------------------
U2.READWRITE.9	plp
				sec
				rts
*--------------------------------------
U2.Write		php
				sei

				ldx Slotn0

				lda ZPBufCnt
				eor #$ff
				sta ZPnCnt

				lda ZPBufCnt+1
				eor #$ff
				sta ZPnCnt+1

				>AR.SELECT S0.TX.FSR
				lda W5100.DR,x			get send size HI
				nop
				nop
				ldy W5100.DR,x			LO
				cpy ZPBufCnt
				sbc ZPBufCnt+1
				bcc U2.READWRITE.9

				>AR.SELECT S0.TX.WR
				lda W5100.DR,x			Get HI
				nop
				nop
				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 #0

.2				inc ZPnCnt
				bne .3

				inc ZPnCnt+1
				beq .8

.3				lda (ZPBufPtr),y
				sta W5100.DR,x
				iny
				bne .2

				inc ZPBufPtr+1
				bra .2

.8				>AR.SELECT S0.TX.WR
				lda Offset
				clc
				adc ZPBufCnt
				pha						save LO
				lda Offset+1
				adc ZPBufCnt+1
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO

				>AR.SELECT S0.CR
				lda #W5100.AR.Sn.CR.SEND
				sta W5100.DR,x

				plp
				clc
				rts
*--------------------------------------
U2.Name			.PS "Uthernet II"
Offset			.BS 2
TotalSize		.BS 2
*--------------------------------------
DRV.U2			.PH	DRV.NIC.START

				jmp DRV.U2.SendARP
				jmp DRV.U2.SendUDP

DRV.U2.Rcvd		php
				sei

				ldx DRV.BLK.Slotn0

				>AR.SELECT S0.RX.RSR
				lda W5100.DR,x			get the received size HI
				nop
				nop
				ora W5100.DR,x      	LO
				bne .1

				jmp DRV.U2.9

.1				>AR.SELECT S0.RX.RD
				lda W5100.DR,x			get the received ptr HI
				sta DRV.Offset+1
				ldy W5100.DR,x			get the received ptr LO
				sty DRV.Offset

				and /RXTX.MASK
				ora /RX.BASE
				sta W5100.AR,x
				tya
				sta W5100.AR+1,x

				lda W5100.DR,x			get RX.Size HI (Frame size + 2)
				sta DRV.TotalSize+1
				lda W5100.DR,x			get RX.Size LO
				sta DRV.TotalSize

*				lda DRV.TotalSize
				sec
				sbc #2					MACRAW:strip 2 bytes Header from Size 
				sta DRV.FrameSize
				eor #$ff
				sta DRV.nCnt

				lda DRV.TotalSize+1
				sbc #0
				sta DRV.FrameSize+1
				eor #$ff
				sta DRV.nCnt+1

				>LDYAI DRV.InBuf
				>STYA DRV.A1L

				ldy #0

.2				inc DRV.nCnt
				bne .3

				inc DRV.nCnt+1
				beq .8

.3				lda W5100.DR,x

				sta (DRV.A1L),y
				iny
				bne .2

				inc DRV.A1H
				bra .2

.8				>AR.SELECT S0.RX.RD

				lda DRV.Offset
				clc
				adc DRV.TotalSize
				pha						save LO

				lda DRV.Offset+1
				adc DRV.TotalSize+1
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO

				>AR.SELECT S0.CR
				lda #W5100.AR.Sn.CR.RCVD
				sta W5100.DR,x
				
				plp
				clc
				rts			
*--------------------------------------
DRV.U2.9		plp
				sec
				rts
*--------------------------------------
DRV.U2.SendARP	>LDYAI S.ARP
				>STYA DRV.FrameSize
				>LDYAI DRV.ARPBuf
				bra DRV.U2.Send
*--------------------------------------
DRV.U2.SendUDP	>STYA DRV.FrameSize

				jsr DRV.BLK.IPUDPCheksum

				>LDYAI DRV.UDPBuf
				
DRV.U2.Send		>STYA DRV.A1L

				lda DRV.FrameSize+1
				eor #$ff
				sta DRV.nCnt+1

				lda DRV.FrameSize
				eor #$ff
				sta DRV.nCnt

				php
				sei

				ldx DRV.BLK.Slotn0

				>AR.SELECT S0.TX.FSR
				lda W5100.DR,x			get send size HI
				nop
				nop
				ldy W5100.DR,x			LO
				cpy DRV.FrameSize
				sbc DRV.FrameSize+1
				bcc DRV.U2.9

				>AR.SELECT S0.TX.WR
				lda W5100.DR,x			Get HI
				nop
				nop
				ldy W5100.DR,x			Get LO
				and /RXTX.MASK
				ora /TX.BASE
				sta W5100.AR,x			Write HI
				sta DRV.Offset+1
				tya
				sta W5100.AR+1,x		Write LO
				sta DRV.Offset

				ldy #0

.2				inc DRV.nCnt
				bne .3

				inc DRV.nCnt+1
				beq .8

.3				lda (DRV.A1L),y
				sta W5100.DR,x
				iny
				bne .2

				inc DRV.A1H
				bra .2

.8				>AR.SELECT S0.TX.WR
				lda DRV.Offset
				clc
				adc DRV.FrameSize
				pha						save LO
				lda DRV.Offset+1
				adc DRV.FrameSize+1
				sta W5100.DR,x			write HI
				pla
				sta W5100.DR,x			write LO

				>AR.SELECT S0.CR
				lda #W5100.AR.Sn.CR.SEND
				sta W5100.DR,x

				plp
				clc
				rts
*--------------------------------------
DRV.Offset		.BS 2
DRV.TotalSize	.BS 2
*--------------------------------------
				.EP

				.LIST ON
DRV.U2.SIZE		.EQ *-DRV.U2
				.LIST OFF
*--------------------------------------
MAN
SAVE usr/src/sys/pm.vedrive.s.u2
LOAD usr/src/sys/pm.vedrive.s
ASM
