A2osX/DRV/LANCEGS.DRV.S.txt
2016-03-31 22:07:47 +02:00

509 lines
11 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
LOMEM $C00
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/DRV/LANCEGS.DRV
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBTCPIP.I
*--------------------------------------
ZPTmpPTR .EQ ZPDRV
*--------------------------------------
DEVID .EQ $33
*--------------------------------------
* SMSC L91C96 IO Registers
*--------------------------------------
L91C96.0.TCR .EQ $C080
L91C96.0.TCR.FDSE .EQ %10000000.00000000
L91C96.0.TCR.FUDPLX .EQ %00001000.00000000
L91C96.0.TCR.PADEN .EQ %00000000.10000000
L91C96.0.TCR.TXENA .EQ %00000000.00000001
L91C96.0.EPHSR .EQ $C082
L91C96.0.EPHSR.LINK .EQ %01000000.00000000
L91C96.0.RCR .EQ $C084
L91C96.0.RCR.RESET .EQ %10000000.00000000
L91C96.0.RCR.NOCRC .EQ %00000010.00000000
L91C96.0.RCR.RXENA .EQ %00000001.00000000
L91C96.0.RCR.ALLMUL .EQ %00000000.00000100
L91C96.0.RCR.PRMS .EQ %00000000.00000010
L91C96.0.RCR.RXABRT .EQ %00000000.00000001
L91C96.0.ECR .EQ $C086
L91C96.0.MIR .EQ $C088
L91C96.0.MCR .EQ $C08A
L91C96.1.CR .EQ $C080
L91C96.1.CR.NOWAIT .EQ %00010000.00000000
L91C96.1.BAR .EQ $C082
L91C96.1.IAR .EQ $C084
L91C96.1.GPR .EQ $C08A
L91C96.1.CTR .EQ $C08C
L91C96.1.CTR.DEFAULT .EQ %00000000.00000001
L91C96.1.CTR.AUTOREL .EQ %00000000.00001000
L91C96.2.MMUCR .EQ $C080
L91C96.2.MMUCR.ALLOC .EQ %00100000
L91C96.2.MMUCR.RESET .EQ %01000000
L91C96.2.MMUCR.REMREL .EQ %10000000
L91C96.2.MMUCR.NQPKT .EQ %11000000
L91C96.2.PNR .EQ $C082
L91C96.2.AAR .EQ $C083
L91C96.2.FIFO .EQ $C084
L91C96.2.PTR .EQ $C086
L91C96.2.PTR.RCVD .EQ %10000000.00000000
L91C96.2.PTR.AUTOI .EQ %01000000.00000000
L91C96.2.PTR.READ .EQ %00100000.00000000
L91C96.2.DATA .EQ $C088
L91C96.2.IST .EQ $C08C
L91C96.2.IST.ALLOC .EQ %00001000
L91C96.2.IST.RCV .EQ %00000001
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
*--------------------------------------
* 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
beq .3
inc DEV.HEADER.NAME+4
txa
clc
adc #$10
tax
bpl .1 not yat at $80
>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
sec
ror USERMAC
>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
*--------------------------------------
.INB DRV/X.NET.DRV.S
*--------------------------------------
CS.END
MSG.DETECT >PSTRING "LanCeGS/SMSC91C96 Driver.\n"
MSG.DETECT.OK >PSTRING "LanCeGS/SMSC91C96 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 jsr Reset will select L91C96.0
lda #L91C96.0.TCR.FDSE+L91C96.0.TCR.FUDPLX+L91C96.0.TCR.PADEN+L91C96.0.TCR.TXENA
sta L91C96.0.TCR,x
lda /L91C96.0.TCR.FDSE+L91C96.0.TCR.FUDPLX+L91C96.0.TCR.PADEN+L91C96.0.TCR.TXENA
sta L91C96.0.TCR+1,x
lda #L91C96.0.RCR.NOCRC+L91C96.0.RCR.RXENA+L91C96.0.RCR.ALLMUL
sta L91C96.0.RCR,x
lda /L91C96.0.RCR.NOCRC+L91C96.0.RCR.RXENA+L91C96.0.RCR.ALLMUL
sta L91C96.0.RCR+1,x
lda #1
sta L91C96.BSR,x
lda #L91C96.1.CR.NOWAIT
sta L91C96.1.CR,x
lda /L91C96.1.CR.NOWAIT
sta L91C96.1.CR+1,x
ldy #0
bit USERMAC
bmi .2
.1 lda L91C96.1.IAR,x
sta MAC,y
inx
iny
cpy #6
bne .1
bra .3
.2 lda MAC,y
sta L91C96.1.IAR,x
inx
iny
cpy #6
bne .2
.3 ldx DEVSLOTx0
lda #L91C96.1.CTR.DEFAULT+L91C96.1.CTR.AUTOREL
sta L91C96.1.CTR,x
lda /L91C96.1.CTR.DEFAULT+L91C96.1.CTR.AUTOREL
sta L91C96.1.CTR+1,x
clc
rts
*--------------------------------------
* input :
* pEvent
* output :
* CC no event
* CS event
*--------------------------------------
GETEVENT ldx DEVSLOTx0
lda #2
sta L91C96.BSR,x
lda L91C96.2.IST,x
and #L91C96.2.IST.RCV
bne GETEVENT.RxOK
lda #ERR.DEV.NOFRAME
sec
rts
GETEVENT.RxOK lda #L91C96.2.PTR.RCVD+L91C96.2.PTR.AUTOI+L91C96.2.PTR.READ
sta L91C96.2.PTR,x
lda /L91C96.2.PTR.RCVD+L91C96.2.PTR.AUTOI+L91C96.2.PTR.READ
sta L91C96.2.PTR+1,x
lda L91C96.2.DATA,x Get Frame Status Word (lo)
lda L91C96.2.DATA,x Get Frame Status Word (HI)
asl #$60 = Broadcast?
ldy #S.EVT.DATAHI
sta (pEvent),y
asl
asl #$10 = odd?
asl if odd, CS
lda L91C96.2.DATA,x get lo byte count
sbc #5 compute FRAMELEN
sta FRAMELEN
tay
lda L91C96.2.DATA,x get hi byte count
sbc #0
sta FRAMELEN+1
iny
bne .1
inc
.1 iny
bne .11
inc
.11 >PUSHYA FRAMLEN+2
>PUSHBI 0
>SYSCALL SYS.GetMem
bcs .99
>STYA ZPTmpPTR
txa
ldy #S.EVT.DATALO
sta (pEvent),y
lda #S.EVT.F.NET+S.EVT.F.hMEM1
sta (pEvent)
lda FRAMELEN
sta (ZPTmpPTR)
ldy #1
lda FRAMELEN+1
sta (ZPTmpPTR),y
iny
ldx DEVSLOTx0
.2 jsr DecFrameLen
beq .8
lda L91C96.2.DATA,x
sta (ZPTmpPTR),y
iny
bne .3
inc ZPTmpPTR+1
.3 jsr DecFrameLen
beq .8
lda L91C96.2.DATA,x
sta (ZPTmpPTR),y
iny
bne .2
inc ZPTmpPTR+1
bra .2
.8 lda #L91C96.2.MMUCR.REMREL
sta L91C96.2.MMUCR,x
clc
rts
.99 sec
rts
*--------------------------------------
CLOSE jsr Reset
clc
rts
*--------------------------------------
* in:
* out:
* Y,A = BUFFER PTR
* CC on success
* CS on error
*--------------------------------------
GETINFO lda #S.DEVINFO.NET.STATUS.10
sta LINK.STATUS
ldx DEVSLOTx0
stz L91C96.BSR,x
lda L91C96.0.EPHSR,x
lda L91C96.0.EPHSR+1,x
and /L91C96.0.EPHSR.LINK
beq .1
lda LINK.STATUS
ora #S.DEVINFO.NET.STATUS.OK
sta LINK.STATUS
.1 lda L91C96.0.TCR,x
lda L91C96.0.TCR+1,x
and /L91C96.0.TCR.FDSE
bne .2
lda LINK.STATUS
ora #S.DEVINFO.NET.STATUS.FD
sta LINK.STATUS
.2 >LDYA L.DEVINFO
clc
rts
*--------------------------------------
* in:
* PULLW = FRAME PTR
* PULLW = FRAME LEN
* out:
* CC on success
* CS on error
*--------------------------------------
SEND >PULLW ZPTmpPTR
ldx DEVSLOTx0
lda #2
sta L91C96.BSR,x
lda (ZPTmpPTR)
sta FRAMELEN
clc
adc #6 3 WORDs more Status, len & Control
bne .10
clc LO byte is 0, no need for an extra empty page
.10 ldy #1
lda (ZPTmpPTR),y
sta FRAMELEN+1
adc #0
.1 ora #L91C96.2.MMUCR.ALLOC
sta L91C96.2.MMUCR,x
ldy #0
.2 lda L91C96.2.IST,x
and #L91C96.2.IST.ALLOC
bne .3
dey
bne .2
lda #ERR.DEV.NOBUFFER
sec
rts
.3 lda L91C96.2.AAR,x
sta L91C96.2.PNR,x
lda #L91C96.2.PTR.AUTOI
sta L91C96.2.PTR,x
lda /L91C96.2.PTR.AUTOI
sta L91C96.2.PTR+1,x
ldy #S.ETH.SRCMAC+5 Add Src MAC Address
ldx #5
.4 lda MAC,x
sta (ZPTmpPTR),y
dey
dex
bpl .4
ldx DEVSLOTx0
stz L91C96.2.DATA,x write fake status word
stz L91C96.2.DATA,x
lda FRAMELEN
pha
eor #$01
lsr
pla
adc #$05 add 5 if odd, 6 if even
sta L91C96.2.DATA,x
lda FRAMELEN+1
adc #$00
sta L91C96.2.DATA,x
ldy #2
.5 jsr DecFrameLen
beq .70
lda (ZPTmpPTR),y
iny
bne .6
inc ZPTmpPTR+1
.6 pha
jsr DecFrameLen
beq .71
pla
sta L91C96.2.DATA,x
lda (ZPTmpPTR),y
sta L91C96.2.DATA,x
iny
bne .5
inc ZPTmpPTR+1
bra .5
.70 lda #0
sta L91C96.2.DATA,x
sta L91C96.2.DATA,x
bra .8
.71 pla
sta L91C96.2.DATA,x
lda #%00100000 signal an extra (odd) byte
sta L91C96.2.DATA,x
.8 lda #L91C96.2.MMUCR.NQPKT
sta L91C96.2.MMUCR,x
clc
rts
.9 sec
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
Reset ldx DEVSLOTx0
stz L91C96.BSR,x
lda #L91C96.0.RCR.RESET
sta L91C96.0.RCR,x
lda /L91C96.0.RCR.RESET
sta L91C96.0.RCR+1,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
stz L91C96.0.RCR,x
stz L91C96.0.RCR+1,x
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
USERMAC .BS 1
FRAMELEN .BS 2
*--------------------------------------
DEVINFO .DA #S.DEVINFO.TYPE.NET
DEVFLAGS .DA #0
MAC .BS 6
LINK.STATUS .BS 1 OK/DUPLEX/SPEED
*--------------------------------------
MAN
SAVE DRV/LANCEGS.DRV.S
ASM