ETH Drivers:Work In Progress

This commit is contained in:
Rémy GIBERT 2016-01-10 23:16:07 +01:00
parent 0be72d9cf7
commit 08fd332336
3 changed files with 418 additions and 19 deletions

281
DRV/LANCEGS.DRV.S.txt Normal file
View File

@ -0,0 +1,281 @@
PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/DRV/LANCEGS.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
*--------------------------------------
ZPTmpPTR .EQ ZPDRV
*--------------------------------------
DEVID .EQ $33
*--------------------------------------
* SMSC L91C96 IO Registers
*--------------------------------------
L91C96.0.TCR .EQ $C080
L91C96.0.EPHSR .EQ $C082
L91C96.0.RCR .EQ $C084
L91C96.0.ECR .EQ $C086
L91C96.0.MIR .EQ $C088
L91C96.0.MCR .EQ $C08A
L91C96.1.CR .EQ $C080
L91C96.1.BAR .EQ $C082
L91C96.1.IAR .EQ $C084
L91C96.1.GPR .EQ $C08A
L91C96.1.CTR .EQ $C08C
L91C96.2.MMUCR .EQ $C080
L91C96.2.PNR .EQ $C082
L91C96.2.AAR .EQ $C083
L91C96.2.FIFO .EQ $C084
L91C96.2.PTR .EQ $C086
L91C96.2.DATA .EQ $C088
L91C96.2.IST .EQ $C08C
L91C96.2.ACK .EQ $C08C
L91C96.2.MSK .EQ $C08D
L91C96.3.MT .EQ $C080
L91C96.3.MGMT .EQ $C088
L91C96.3.REV .EQ $C08A
L91C96.3.RCV .EQ $C08C
L91C96.BSR .EQ $C08E
*--------------------------------------
ERRTNOFRAME .EQ 0
ERRNOBUFFER .EQ 1
ERRTIMEOUT .EQ 2
*--------------------------------------
* 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 sta hArgs
>LDYA L.MSG.DETECT
>SYSCALL SYS.PSTROutYA
ldx #$10
.1 lda L91C96.BSR+1,x
cmp #DEVID
bne .2
lda #3
sta L91C96.BSR,x
lda L91C96.3.REV,x
cmp #DEVID
beq .3
.2 inc DEV.HEADER.NAME+4
txa
clc
adc #$10
tax
cpx #$80
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL SYS.PSTROutYA
lda #DEVMGR.ERRNOHW Not Found in any slot, exiting
sec
rts
.3 stx DEVSLOTx0
lda hARGS
beq .4
>SYSCALL SYS.GetMemPtrA
>STYA ZPTmpPTR
jsr DecodeMac
bcc .4
lda #DEVMGR.ERRICL
sec
rts
.4 >LDYA L.MSG.DETECT.OK
>SYSCALL SYS.PSTROutYA
>LDYA L.DEV.HEADER.NAME
>SYSCALL SYS.PSTROutYA
lda #13
>SYSCALL SYS.COutA
clc
rts
*--------------------------------------
DecodeMac lda (ZPTmpPTR)
cmp #12
bne .9
ldy #1
ldx #0
.1 lda (ZPTmpPTR),y
jsr Asc2NibbleA
bcs .9
asl
asl
asl
asl
sta MAC,x
iny
lda (ZPTmpPTR),y
jsr Asc2NibbleA
bcs .9
ora MAC,x
sta MAC,x
inx
iny
cpy #13
bne .1
clc
rts
.9 sec
rts
*--------------------------------------
Asc2NibbleA cmp #$30
bcc .9
cmp #$3A
bcs .1
and #$0F
clc
rts
.1 cmp #$41
bcc .9
cmp #$47
bcs .9
sbc #$36
clc
rts
.9 sec
rts
*--------------------------------------
CS.END
MSG.DETECT >PSTRING "LanCeGS/L91c96 Driver.\n"
MSG.DETECT.OK >PSTRING "LanCeGS/L91c96 Installed As Device : "
MSG.DETECT.KO >PSTRING "Hardware Not Found.\n"
hArgs .BS 1
*--------------------------------------
* Device Header (16 Bytes)
*--------------------------------------
DEV.HEADER cld
jmp (DRV.CS.START,x)
.DA #S.DEV.F.SHARE+S.DEV.F.EVENT
DEV.HEADER.NAME >PSTRING "ETH1" NAME
.HS 00.00
.HS 00.00.00.00
*--------------------------------------
* Driver Code
*--------------------------------------
DRV.CS.START .DA OPEN
.DA GETEVENT
.DA $FFFF no COUT
.DA CLOSE
.DA GETINFO
.DA $FFFF no IRQ
.DA SEND
.DA $FFFF no SETIPCFG
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
*--------------------------------------
* input :
* none
* output :
* CC on success
* CS on error
*--------------------------------------
OPEN
clc
rts
*--------------------------------------
* input :
* pEvent
* output :
* CC no event
* CS event
*--------------------------------------
GETEVENT
.8 clc
rts
.99 sec
rts
*--------------------------------------
CLOSE jsr Reset
clc
rts
*--------------------------------------
* in:
* out:
* Y,A = BUFFER PTR
* CC on success
* CS on error
*--------------------------------------
GETINFO >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* in:
* PULLW = FRAME PTR
* PULLW = FRAME LEN
* out:
* CC on success
* CS on error
*--------------------------------------
SEND
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
Reset ldx DEVSLOTx0
rts
*--------------------------------------
DecFrameLen lda FRAMELEN
bne .1
lda FRAMELEN+1
beq .8
dec FRAMELEN+1
.1 dec FRAMELEN
lda #1 Make something NZ
.8 rts
*--------------------------------------
DRV.CS.END
*--------------------------------------
DEVSLOTx0 .BS 1
FRAMELEN .BS 2
*--------------------------------------
DEVINFO .DA #S.DEVINFO.TYPE.NET
DEVFLAGS .DA #0
MAC .BS 6
LINK.STATUS .BS 1
LINK.SPEED .BS 1 SPEED/DUPLEX
*--------------------------------------
MAN
SAVE DRV/LANCEGS.DRV.S
ASM

View File

@ -134,8 +134,7 @@ Dev.Detect sta hArgs
>SYSCALL SYS.PSTROutYA
ldx #$10
.1 stx DEVSLOTx0
>LDYAI PP.ID
.1 >LDYAI PP.ID
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
cpy #DEVID
@ -158,7 +157,9 @@ Dev.Detect sta hArgs
sec
rts
.3 lda hARGS
.3 stx DEVSLOTx0
lda hARGS
beq .4
>SYSCALL SYS.GetMemPtrA
@ -254,6 +255,7 @@ DRV.CS.START .DA OPEN
.DA GETINFO
.DA $FFFF no IRQ
.DA SEND
.DA $FFFF no SETIPCFG
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
*--------------------------------------

View File

@ -23,13 +23,13 @@ ZPTmpPTR .EQ ZPDRV
*--------------------------------------
* WIZnet W5100 IO Registers
*--------------------------------------
W5100.MR .EQ $C080 Mode Register
W5100.MR .EQ $C084 Mode Register
W5100.MR.RST .EQ %10000000
W5100.MR.PB .EQ %00010000
W5100.MR.PPPOE .EQ %00001000
W5100.MR.AI .EQ %00000010
W5100.MR.IND .EQ %00000001
W5100.AR .EQ $C081 Memory Pointer
W5100.AR .EQ $C085 Memory Pointer
W5100.AR.GAR .EQ $0001
W5100.AR.SUBR .EQ $0005
W5100.AR.SHAR .EQ $0009
@ -62,7 +62,11 @@ W5100.AR.S0.TX.RD .EQ $0422
W5100.AR.S0.TX.WR .EQ $0424
W5100.AR.S0.RX.RSR .EQ $0426
W5100.AR.S0.RX.RD .EQ $0428
W5100.DR .EQ $C083
W5100.DR .EQ $C087
*--------------------------------------
RX.BASE .EQ $4000
TX.BASE .EQ $6000
RXTX.MASK .EQ $1FFF
*--------------------------------------
ERRTNOFRAME .EQ 0
ERRNOBUFFER .EQ 1
@ -93,8 +97,7 @@ Dev.Detect sta hArgs
>SYSCALL SYS.PSTROutYA
ldx #$10+$81
.1 stx DEVSLOTxF
lda #W5100.MR.RST
.1 lda #W5100.MR.RST
sta W5100.MR-$81,x
lda #W5100.MR.AI+W5100.MR.IND
@ -102,9 +105,18 @@ Dev.Detect sta hArgs
lda W5100.MR-$81,x
cmp #W5100.MR.AI+W5100.MR.IND
bne .2
>AR.SELECT RTR Double Check with RTR default value...
lda W5100.DR-$81,x Get RTR HI
cmp /2000
bne .2
lda W5100.DR-$81,x Get RTR LO
cmp #2000
beq .3
inc DEV.HEADER.NAME+4
.2 inc DEV.HEADER.NAME+4
txa
clc
adc #$10
@ -112,11 +124,16 @@ Dev.Detect sta hArgs
cpx #$80+$81
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL SYS.PSTROutYA
lda #DEVMGR.ERRNOHW
sec
rts
.3 lda hARGS
.3 stx DEVSLOTxF
lda hARGS
beq .4
>SYSCALL SYS.GetMemPtrA
@ -127,7 +144,13 @@ Dev.Detect sta hArgs
sec
rts
.4 clc
.4 >LDYA L.MSG.DETECT.OK
>SYSCALL SYS.PSTROutYA
>LDYA L.DEV.HEADER.NAME
>SYSCALL SYS.PSTROutYA
lda #13
>SYSCALL SYS.COutA
clc
rts
*--------------------------------------
DecodeMac lda (ZPTmpPTR)
@ -206,6 +229,7 @@ DRV.CS.START .DA OPEN
.DA GETINFO
.DA $FFFF no IRQ
.DA SEND
.DA SETIPCFG
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
*--------------------------------------
@ -233,6 +257,7 @@ OPEN jsr Reset
>AR.SELECT S0.MR
lda #3 IPRAW
sta W5100.DR-$81,x for S0.MR
* >AR.SELECT S0.CR
lda #1 OPEN
sta W5100.DR-$81,x for S0.CR
clc
@ -245,16 +270,41 @@ OPEN jsr Reset
* CS event
*--------------------------------------
GETEVENT ldx DEVSLOTxF
>AR.SELECT S0.RX.RSR
lda W5100.DR-$81,x get the received size HI
sta RX.Size+1
lda W5100.DR-$81,x LO
sta RX.Size
ora RX.Size+1
bne GETEVENT.RxOK
lda #ERRTNOFRAME
sec
rts
GETEVENT.RxOK
>STYA FRAMELEN
>PUSHYA
GETEVENT.RxOK clc
lda W5100.DR-$81,x get the received ptr HI
and /RXTX.MASK
sta RX.Ptr+1
adc /RX.BASE
tay
lda W5100.DR-$81,x LO
* and #RXTX.MASK $ff
sta RX.Ptr
sta W5100.AR-$81,x
tya
sta W5100.AR-$80,x
lda RX.Size
clc
adc #S.IP
sta FRAMELEN
lda RX.Size+1
adc /S.IP
sta FRAMELEN+1
>PUSHW FRAMELEN
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .99
@ -272,8 +322,45 @@ GETEVENT.RxOK
sta (pEvent)
ldy #0
ldx DEVSLOTxF
ldy #S.IP.DST
.8 clc
.1 jsr GetRxByte
bcs .8
sta (ZPTmpPTR),y
iny
cpy #S.IP.DST+4
bne .1
jsr GetRxByte skip Data Size
bcs .8
jsr GetRxByte
bcs .8
ldy #S.IP
.2 jsr GetRxByte
bcs .8
sta (ZPTmpPTR),y
iny
bne .2
inc ZPTmpPTR+1
bra .2
.8 >AR.SELECT S0.RX.RD
lda RX.Size
clc
adc #6
tay
lda RX.Size+1
adc #0
sta W5100.DR-$81,x
tya
sta W5100.DR-$80,x
>AR.SELECT S0.CR
lda #$40 RECV
sta W5100.DR-$81,x
clc
rts
.99 sec
@ -373,6 +460,33 @@ Reset ldx DEVSLOTxF
sta W5100.MR-$81,x
rts
*--------------------------------------
GetRxByte lda RX.Size
bne .1
lda RX.Size+1
beq .9
dec RX.Size+1
.1 dec RX.Size
lda W5100.DR-$81,x
inc RX.Ptr
bne .8
inc RX.Ptr+1
lda RX.Ptr+1
and /RXTX.MASK
bne .8
sta RX.Ptr+1
lda /RX.Base
sta W5100.AR-$81,x
lda #RX.Base
sta W5100.AR-$80,x
.8 clc
rts
.9 sec
rts
*--------------------------------------
DecFrameLen lda FRAMELEN
bne .1
lda FRAMELEN+1
@ -386,9 +500,11 @@ DRV.CS.END
*--------------------------------------
DEVSLOTxF .BS 1
FRAMELEN .BS 2
RX.Size .BS 2
RX.Ptr .BS 2
*--------------------------------------
DEVINFO .DA #S.DEVINFO.TYPE.NET
DEVFLAGS .DA #DEVMGR.NET.CAP.ARPOFFLOAD
DEVFLAGS .DA #S.DEVINFO.FLAGS.ARPOFFLOAD
MAC .BS 6
LINK.STATUS .BS 1
LINK.SPEED .BS 1 SPEED/DUPLEX