A2osX/DRV/UTHERNET2.DRV.S.txt

532 lines
9.4 KiB
Plaintext
Raw Permalink 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.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF drv/uthernet2.drv
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/kernel.i
.INB inc/mli.e.i
.INB inc/nic.i
.INB inc/nic.w5100.i
.INB inc/eth.i
*--------------------------------------
ZPArgPtr .EQ ZPBIN
DEVSLOT0x .EQ ZPBIN+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 0
.DA 0
.DA 0
*--------------------------------------
* 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.DRV.CS.START .DA DRV.CS.START
L.FD.DEV .DA FD.DEV
L.FD.DEV.NAME .DA FD.DEV.NAME
L.SSCANF.MAC .DA SSCANF.MAC
L.MAC0 .DA DCB+S.DCB.NIC.MAC
L.MAC1 .DA DCB+S.DCB.NIC.MAC+1
L.MAC2 .DA DCB+S.DCB.NIC.MAC+2
L.MAC3 .DA DCB+S.DCB.NIC.MAC+3
L.MAC4 .DA DCB+S.DCB.NIC.MAC+4
L.MAC5 .DA DCB+S.DCB.NIC.MAC+5
.DA 0 End Of Reloc Table
*--------------------------------------
Dev.Detect >STYA ZPArgPtr
>LDYA L.MSG.DETECT
>SYSCALL PutS
ldx #$70+$88
ldy #7
.1 lda A2osX.S-1,y IO based detection, avoid scanning in Disk Controller IO!!!!
bne .2
lda #W5100.MR.RST
sta W5100.MR,x
lda #0
.10 dec give some time....
bne .10
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 .2
>AR.SELECT RTR
lda W5100.DR,x Get RTR HI
cmp /2000
bne .2
lda W5100.DR,x Get RTR LO
cmp #2000
beq .3
.2 dec FD.DEV.NAME+3
txa
sec
sbc #$10
tax
dey
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL PutS
lda #MLI.E.NODEV
sec
rts
.3 stx DEVSLOTx0
sty DEVSLOT0x
jsr Dev.ParseArgs
bcs .99
>PUSHW L.MSG.DETECT.OK
>PUSHW L.FD.DEV.NAME
>PUSHBI 2
>SYSCALL PrintF
>PUSHWI DRV.END
>PUSHWI DRV.CS.END-DRV.CS.START
>PUSHWI DRV.CS.START
>LDYA L.DRV.CS.START
>SYSCALL InsDrv
.99 bcs .9
>STYA FD.DEV+S.FD.DEV.DRVPTR
>PUSHW L.FD.DEV
>PUSHW L.FD.DEV.NAME
>SYSCALL MKDev
bcs .9
ldx DEVSLOT0x
lda #A2osX.S.NIC
sta A2osX.S-1,x
* clc
.9 rts
*--------------------------------------
Dev.ParseArgs lda (ZPArgPtr)
bne .1
lda A2osX.R16
eor A2osX.T16
sta DCB+S.DCB.NIC.MAC+3
eor A2osX.R16+1
sta DCB+S.DCB.NIC.MAC+4
eor A2osX.T16+1
sta DCB+S.DCB.NIC.MAC+5
clc
rts
.1 >PUSHW ZPArgPtr
>PUSHW L.SSCANF.MAC
ldx #0
.2 >PUSHW L.MAC0,x
inx
inx
cpx #12
bne .2
>PUSHBI 12 6 x byte PTRs
>SYSCALL SScanF
bcc .8
lda #E.SYN
* sec
.8 rts
*--------------------------------------
CS.END
MSG.DETECT .CZ "UtherNet2/W5100 Driver."
MSG.DETECT.OK .CZ "UtherNet2/W5100 Installed As Device : %s\r\n"
MSG.DETECT.KO .CZ "Hardware Not Found."
SSCANF.MAC .CZ "%h:%h:%h:%h:%h:%h"
*--------------------------------------
FD.DEV .DA #S.FD.T.CDEV
.DA #0 HANDLER
.DA #0 BUSID
.DA #0 DEVID
.DA 0 BUSPTR
.BS 2 DRVPTR
.DA 0 DCBPTR
.DA 0 BUFPTR
FD.DEV.NAME .AZ "eth7"
*--------------------------------------
* Driver Code
*--------------------------------------
ZPIOCTL .EQ ZPDRV
ZPBufPtr .EQ ZPDRV+2
Counter .EQ ZPDRV+4
Offset .EQ ZPDRV+6
RXTX.Size .EQ ZPDRV+8
BUF.Size .EQ ZPDRV+10
*--------------------------------------
DRV.CS.START cld
jmp (.1,x)
.1 .DA STATUS
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA A2osX.BADCALL
.DA OPEN
.DA CLOSE
.DA READ
.DA WRITE
.DA 0 end or relocation
*--------------------------------------
STATUS jsr GET.IOCTLBUFPTR
ldy #S.IOCTL.S
lda (ZPIOCTL),y
beq .1
cmp #S.IOCTL.S.GETDIB
bne STATUS.DCB
ldy #S.DIB-1
.HS 2C bit abs
.1 ldy #3
.2 lda DIB,y
sta (ZPBufPtr),y
dey
bpl .2
clc
rts
STATUS.DCB cmp #S.IOCTL.S.GETDCB
bne STATUS.9
ldy #S.DCB.NIC-1
.1 lda DCB,y
sta (ZPBufPtr),y
dey
bpl .1
clc
rts
STATUS.9 lda #MLI.E.BADCTL
sec
rts
*--------------------------------------
OPEN lda #S.DIB.S.OPENED
bit DIB+S.DIB.S
beq OPEN.I
lda #MLI.E.OPEN
sec
rts
OPEN.I jsr CLOSE
* ldx DEVSLOTx0 Done by CLOSE
lda #W5100.MR.PB+W5100.MR.AI+W5100.MR.IND
sta W5100.MR,x
>AR.SELECT SHAR
ldy #0
.1 lda DCB+S.DCB.NIC.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.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
lda #S.DIB.S.OPENED
tsb DIB+S.DIB.S
clc
rts
*--------------------------------------
CLOSE ldx DEVSLOTx0
lda #W5100.MR.RST
sta W5100.MR,x
lda $C019 we can use VBL as we are not on //c
.1 eor $C019
bpl .1
lda $C019
.2 eor $C019
bpl .2
lda #S.DIB.S.OPENED
trb DIB+S.DIB.S
clc
rts
*--------------------------------------
READ php
sei
>STYA ZPIOCTL
ldx DEVSLOTx0
>AR.SELECT S0.RX.RSR
lda W5100.DR,x get the received size HI
nop
nop
ora W5100.DR,x LO
bne .1
jmp READWRITE.NODATA
.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 RXTX.Size+1
lda W5100.DR,x get RX.Size LO
sta RXTX.Size
ldy #S.IOCTL.BYTECNT
sec
sbc #2 MACRAW:strip 2 bytes Header from Size
sta (ZPIOCTL),y
sta BUF.Size
eor #$ff
sta Counter
iny
lda RXTX.Size+1
sbc #0
sta (ZPIOCTL),y
sta BUF.Size+1
eor #$ff
sta Counter+1
>LDYA BUF.Size
>SYSCALL2 GetMem
bcs READWRITE.9
>STYA ZPBufPtr
phx
phy
ldy #S.IOCTL.BUFPTR+1
sta (ZPIOCTL),y
dey
pla
sta (ZPIOCTL),y
ldy #0
ldx DEVSLOTx0
.2 inc Counter
bne .3
inc Counter+1
beq .4
.3 lda W5100.DR,x
sta (ZPBufPtr),y
iny
bne .2
inc ZPBufPtr+1
bra .2
.4 >AR.SELECT S0.RX.RD
lda Offset
clc
adc RXTX.Size
pha save LO
lda Offset+1
adc RXTX.Size+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 hMem
plp
clc
rts
*--------------------------------------
READWRITE.NODATA
lda #E.NODATA
READWRITE.9 plp
sec
rts
*--------------------------------------
WRITE php
sei
jsr GET.IOCTLBUFPTR
ldy #S.IOCTL.BYTECNT
lda (ZPIOCTL),y
sta RXTX.Size
eor #$ff
sta Counter
iny
lda (ZPIOCTL),y
sta RXTX.Size+1
eor #$ff
sta Counter+1
ldx DEVSLOTx0
>AR.SELECT S0.TX.FSR
lda W5100.DR,x get send size HI
nop
nop
ldy W5100.DR,x LO
cpy RXTX.Size
sbc RXTX.Size+1
bcc READWRITE.NODATA
ldy #S.ETH.SRCMAC+5
ldx #5
.1 lda DCB+S.DCB.NIC.MAC,x
sta (ZPBufPtr),y
dey
dex
bpl .1
ldx DEVSLOTx0
>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 Counter
bne .3
inc Counter+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 RXTX.Size
pha save LO
lda Offset+1
adc RXTX.Size+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
*--------------------------------------
GET.IOCTLBUFPTR >STYA ZPIOCTL
ldy #S.IOCTL.BUFPTR
lda (ZPIOCTL),y
sta ZPBufPtr
iny
lda (ZPIOCTL),y
sta ZPBufPtr+1
rts
*--------------------------------------
DRV.CS.END
DEVSLOTx0 .BS 1
*--------------------------------------
DIB .DA #0
.DA #0,#0,#0 size
.PS "UtherNetII/W5100"
.DA #S.DIB.T.NIC
.BS 1 Subtype
.DA K.VER Version
*--------------------------------------
DCB .DA #S.DCB.T.NIC
.DA #0 FLAGS
.DA #S.DCB.NIC.LINK.OK+S.DCB.NIC.LINK.FD
.DA #S.DCB.NIC.SPEED.100
.HS 0008DC123456 MAC
.BS 12 IP/MASK/GW
*--------------------------------------
DRV.END
MAN
SAVE usr/src/drv/uthernet2.drv.s
ASM