A2osX/DRV/UTHERNET2.DRV.S.txt
2016-01-10 23:16:07 +01:00

515 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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-$81,x
lda #W5100.AR.]1
sta W5100.AR-$80,x
.EM
*--------------------------------------
* WIZnet W5100 IO Registers
*--------------------------------------
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 $C085 Memory Pointer
W5100.AR.GAR .EQ $0001
W5100.AR.SUBR .EQ $0005
W5100.AR.SHAR .EQ $0009
W5100.AR.SIPR .EQ $000F
W5100.AR.IR .EQ $0015
W5100.AR.IMR .EQ $0016
W5100.AR.RTR .EQ $0017
W5100.AR.RCR .EQ $0019
W5100.AR.RMSR .EQ $001A
W5100.AR.TMSR .EQ $001B
W5100.AR.PATR .EQ $001C
W5100.AR.PTIMER .EQ $0028
W5100.AR.PMAGIC .EQ $0029
W5100.AR.UIPR .EQ $002A
W5100.AR.UPORT .EQ $002E
W5100.AR.S0.MR .EQ $0400
W5100.AR.S0.CR .EQ $0401
W5100.AR.S0.IR .EQ $0402
W5100.AR.S0.SR .EQ $0403
W5100.AR.S0.PORT .EQ $0404
W5100.AR.S0.DHAR .EQ $0406
W5100.AR.S0.DIPR .EQ $040C
W5100.AR.S0.DPORT .EQ $0410
W5100.AR.S0.MSSR .EQ $0412
W5100.AR.S0.PROTO .EQ $0414
W5100.AR.S0.TOS .EQ $0415
W5100.AR.S0.TTL .EQ $0416
W5100.AR.S0.TX.FSR .EQ $0420
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 $C087
*--------------------------------------
RX.BASE .EQ $4000
TX.BASE .EQ $6000
RXTX.MASK .EQ $1FFF
*--------------------------------------
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+$81
.1 lda #W5100.MR.RST
sta W5100.MR-$81,x
lda #W5100.MR.AI+W5100.MR.IND
sta W5100.MR-$81,x
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
.2 inc DEV.HEADER.NAME+4
txa
clc
adc #$10
tax
cpx #$80+$81
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL SYS.PSTROutYA
lda #DEVMGR.ERRNOHW
sec
rts
.3 stx DEVSLOTxF
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 "UtherNetII/W5100 Driver.\n"
MSG.DETECT.OK >PSTRING "UtherNetII/W5100 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 SETIPCFG
L.DEVINFO .DA DEVINFO
.DA 0 end or relocation
*--------------------------------------
* input :
* none
* output :
* CC on success
* CS on error
*--------------------------------------
OPEN jsr Reset
>AR.SELECT SHAR
ldy #0
.1 lda MAC,y
sta W5100.DR-$81,x
iny
cpy #6
bne .1
>AR.SELECT RMSR
lda #3 8k
sta W5100.DR-$81,x ...for Socket0 RX Buffer
sta W5100.DR-$81,x ...for Socket0 TX Buffer
>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
rts
*--------------------------------------
* input :
* pEvent
* output :
* CC no event
* 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 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
>STYA ZPTmpPTR
txa
ldy #S.EVT.DATALO
sta (pEvent),y
ldy #S.EVT.DATAW1
lda FRAMELEN
sta (pEvent),y
iny
lda FRAMELEN+1
sta (pEvent),y
lda #S.EVT.F.NET+S.EVT.F.hMEM1
sta (pEvent)
ldy #0
ldx DEVSLOTxF
ldy #S.IP.DST
.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
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 >PULLW ZPTmpPTR
>PULLW FRAMELEN
ldx DEVSLOTxF
bra *
lda #ERRTIMEOUT
sec
rts
.9 bra *
lda #ERRNOBUFFER
sec
rts
SENDPREADY ldy #0
.1 lda (ZPTmpPTR),y
iny
bne .2
inc ZPTmpPTR+1
.2 jsr DecFrameLen
beq .8
.3 lda (ZPTmpPTR),y
iny
bne .5
inc ZPTmpPTR+1
.5 jsr DecFrameLen
bne .1
.8 clc
rts
*--------------------------------------
SETIPCFG >PULLW ZPTmpPTR
>AR.SELECT GAR
ldx DEVSLOTxF
ldy #S.IPCFG.GW
.1 lda (ZPTmpPTR),y
sta W5100.DR-$81,x
iny
cpy #S.IPCFG.GW+4
bne .1
* >AR.SELECT SUBR Implicit, next to GAR
ldy #S.IPCFG.MASK
.2 lda (ZPTmpPTR),y
sta W5100.DR-$81,x
iny
cpy #S.IPCFG.MASK+4
bne .2
>AR.SELECT SIPR
ldy #S.IPCFG.IP
.3 lda (ZPTmpPTR),y
sta W5100.DR-$81,x
iny
cpy #S.IPCFG.IP+4
bne .3
clc
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
Reset ldx DEVSLOTxF
lda #W5100.MR.RST
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
beq .8
dec FRAMELEN+1
.1 dec FRAMELEN
lda #1 Make something NZ
.8 rts
*--------------------------------------
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 #S.DEVINFO.FLAGS.ARPOFFLOAD
MAC .BS 6
LINK.STATUS .BS 1
LINK.SPEED .BS 1 SPEED/DUPLEX
*--------------------------------------
MAN
SAVE DRV/UTHERNET2.DRV.S
ASM