A2osX/DRV/UTHERNET.DRV.S.txt

395 lines
7.8 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 $A00
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/DRV/UTHERNET.DRV
*--------------------------------------
.INB /A2OSX.DEV/INC/MACROS.I
.INB /A2OSX.DEV/INC/A2OSX.I
.INB /A2OSX.DEV/INC/LIBTCPIP.I
.INB /A2OSX.DEV/INC/PRODOS.I
*--------------------------------------
ZPTmpPTR .EQ ZPDRV
*--------------------------------------
.INB DRV/X.NET.8900A.S
*--------------------------------------
* 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 >STYA ARGS
>LDYA L.MSG.DETECT
>SYSCALL CPrintFYA
ldx #$70
.1 txa IO based detection, avoid scanning in Disk Controller IO!!!!
lsr
lsr
lsr
lsr
tay
lda A2osX.SLOTS,y
bne .2
>LDYAI PP.ID
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
cpy #DEVID
bne .2
cmp /DEVID
beq .3
.2 dec DEV.HEADER.NAME+4
txa
sec
sbc #$10
tax
bne .1
>LDYA L.MSG.DETECT.KO
>SYSCALL CPrintFYA
lda #MLI.ERR.NODEV
sec
rts
.3 stx DEVSLOTx0
txa
lsr
lsr
lsr
lsr
tay
lda #A2osX.SLOTS.NET
sta A2osX.SLOTS,y
>LDYAI PP.ID+2 Get Revision# of ths chip...
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
>STYA DEVSTAT+S.DEVSTAT.VERSION set Hardware version
>LDYA ARGS
>STYA ZPTmpPTR
lda (ZPTmpPTR)
bne .4
lda #$00
sta MAC
lda #$0E
sta MAC+1
lda #$3A
sta MAC+2
lda A2osX.RANDOM16
eor A2osX.TIMER16
sta MAC+3
eor A2osX.RANDOM16+1
sta MAC+4
eor A2osX.TIMER16+1
sta MAC+5
bra .8
.4 jsr DecodeMac
bcc .8
lda #DEVMGR.ERRICL
sec
rts
.8 >PUSHW L.DEV.HEADER.NAME
>LDYA L.MSG.DETECT.OK
>SYSCALL CPrintFYA
clc
rts
*--------------------------------------
.INB DRV/X.NET.DRV.S
*--------------------------------------
CS.END
MSG.DETECT >CSTR "UtherNet/CS8900A Driver.\n"
MSG.DETECT.OK >CSTR "UtherNet/CS8900A Installed As Device : %S\n"
MSG.DETECT.KO >CSTR "Hardware Not Found.\n"
ARGS .BS 2
*--------------------------------------
* Device Header (16 Bytes)
*--------------------------------------
DEV.HEADER .DA DRV.CS.START
.DA #S.DEV.S.BLOCK+S.DEV.S.WRITE+S.DEV.S.READ
DEV.HEADER.NAME .DA #4
.AS "ETH7" NAME
*--------------------------------------
* Driver Code
*--------------------------------------
DRV.CS.START cld
jmp (.1,x)
.1 .DA STATUS
.DA READBLOCK
.DA WRITEBLOCK
.DA BADCALL
.DA BADCALL
.DA BADCALL
.DA OPEN
.DA CLOSE
.DA BADCALL
.DA BADCALL
L.DEVSTAT .DA DEVSTAT
.DA 0 end or relocation
*--------------------------------------
BADCALL lda #MLI.ERR.BADCALL
sec
rts
*--------------------------------------
STATUS lda #S.DEVSTAT.NET.STATUS.10
sta LINK.STATUS
ldx DEVSLOTx0
>LDYAI PP.LineST
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
tya
and #PP.LineST.LinkOK
bne .1
lda LINK.STATUS
ora #S.DEVSTAT.NET.STATUS.OK
sta LINK.STATUS
.1 >LDYAI PP.TestCTL
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
and /PP.TestCTL.FDX
bne .2
lda LINK.STATUS
ora #S.DEVSTAT.NET.STATUS.FD
sta LINK.STATUS
.2 >LDYA L.DEVSTAT
clc
rts
*--------------------------------------
READBLOCK ldx DEVSLOTx0
>LDYAI PP.RxEvent
>STYA PacketPagePTR,x
>LDYA PacketPageDATA,x
and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA
bne READBLOCK.RxOK
lda #ERR.DEV.NOFRAME
READBLOCK.Err sec
rts
READBLOCK.RxOK and /PP.RxEvent.Brdcast
beq .10
lda #$80
.10 sta .8+3
>LDYA RTDATA,x discard RxStatus
lda RTDATA+1,x get RxLength
sta Size+1
pha
lda RTDATA,x
sta Size
clc
adc #2
tay
pla
bcc .11
inc
.11 >PUSHYA Size+2
>PUSHBI 0
>SYSCALL GetMem
bcs READBLOCK.Err
>STYA ZPTmpPTR
stx .8+1
lda Size
sta (ZPTmpPTR)
eor #$ff
sta Counter
ldy #1
lda Size+1
sta (ZPTmpPTR),y
eor #$ff
sta Counter+1
iny
ldx DEVSLOTx0
.1 inc Counter
bne .12
inc Counter+1
beq .8
.12 lda RTDATA,x
sta (ZPTmpPTR),y
iny
bne .2
inc ZPTmpPTR+1
.2 inc Counter
bne .21
inc Counter+1
beq .8
.21 lda RTDATA+1,x
sta (ZPTmpPTR),y
iny
bne .1
inc ZPTmpPTR+1
bne .1
.8 lda #$ff hMem
ldy #$00 Flags
clc
rts
*--------------------------------------
WRITEBLOCK >STYA ZPTmpPTR
lda (ZPTmpPTR)
sta Size
eor #$ff
sta Counter
ldy #1
lda (ZPTmpPTR),y
sta Size+1
eor #$ff
sta Counter+1
ldx DEVSLOTx0
>LDYAI PP.TxCMD.LID+PP.TxCMD.TxStartFULL
>STYA TxCMD,x
>LDYA Size
>STYA TxLength,x
>LDYAI PP.BusST
>STYA PacketPagePTR,x
ldy #16
.1 lda PacketPageDATA,x
and #PP.BusST.TxBidErr
bne .9
lda PacketPageDATA+1,x
and /PP.BusST.Rdy4TxNOW
bne WRITEBLOCK.1
lda #0
.2 dec
bne .2
dey
bne .1
.9 lda #ERR.DEV.NOBUFFER
sec
rts
WRITEBLOCK.1 ldy #S.ETH.SRCMAC+5
ldx #5
.10 lda MAC,x
sta (ZPTmpPTR),y
dey
dex
bpl .10
ldx DEVSLOTx0
ldy #2
.1 inc Counter
bne .11
inc Counter+1
beq .8
.11 lda (ZPTmpPTR),y
sta RTDATA,x
iny
bne .2
inc ZPTmpPTR+1
.2 inc Counter
bne .21
inc Counter+1
beq .8
.21 lda (ZPTmpPTR),y
sta RTDATA+1,x
iny
bne .1
inc ZPTmpPTR+1
bne .1
.8 clc
rts
*--------------------------------------
OPEN jsr CLOSE
>LDYAI PP.RxCTL
>STYA PacketPagePTR,x
>LDYAI PP.RxCTL.LID+PP.RxCTL.RxOKA+PP.RxCTL.IA+PP.RxCTL.BroadcastA
>STYA PacketPageDATA,x
>LDYAI PP.MAC
>STYA PacketPagePTR,x
>LDYA MAC
>STYA PacketPageDATA,x
>LDYAI PP.MAC+2
>STYA PacketPagePTR,x
>LDYA MAC+2
>STYA PacketPageDATA,x
>LDYAI PP.MAC+4
>STYA PacketPagePTR,x
>LDYA MAC+4
>STYA PacketPageDATA,x
>LDYAI PP.LineCTL
>STYA PacketPagePTR,x
>LDYAI PP.LineCTL.LID+PP.LineCTL.SerRxOn+PP.LineCTL.SerTxOn+PP.LineCTL.Auto
>STYA PacketPageDATA,x
clc
rts
*--------------------------------------
CLOSE ldx DEVSLOTx0
>LDYAI PP.SelfCTL
>STYA PacketPagePTR,x
>LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET
>STYA PacketPageDATA,x
clc
rts
*--------------------------------------
DRV.CS.END
DEVSLOTx0 .BS 1
Size .BS 2
Counter .BS 2
*--------------------------------------
DEVSTAT .DA #S.DEV.S.BLOCK+S.DEV.S.WRITE+S.DEV.S.READ
.BS 3 size
>PSTR "Uthernet/CS8900A"
.DA #S.DEVSTAT.TYPE.NET
.BS 1 Subtype
.BS 2 Version
*--------------------------------------
FLAGS .DA #0
LINK.STATUS .BS 1 OK/DUPLEX/SPEED
MAC .BS 6
MAN
SAVE DRV/UTHERNET.DRV.S
ASM