PR#3 PREFIX /A2OSX.SRC LOMEM $C00 INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/UTHERNET.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/LIBTCPIP.I *-------------------------------------- ZPTmpPTR .EQ ZPDRV *-------------------------------------- DEVID .EQ $630E *-------------------------------------- * CS8900A IO Registers *-------------------------------------- RTDATA .EQ $C080 Receive/Transmit Data (DWORD) TxCMD .EQ $C084 Transmit Command TxLength .EQ $C086 Transmission Length IntStatusQueue .EQ $C088 Interrupt Status Queue PacketPagePTR .EQ $C08A PacketPage Pointer PacketPageDATA .EQ $C08C PacketPage Data (DWORD) *-------------------------------------- PP.ID .EQ $0000 Product ID code (RO) PP.RFBCNT .EQ $0050 Received Frame Byte Counter (RO) PP.RxCFG .EQ $0102 Receiver Configuration (RW) PP.RxCFG.LID .EQ %00000000.00000011 PP.RxCTL .EQ $0104 Receiver Control (RW) PP.RxCTL.LID .EQ %00000000.00000101 PP.RxCTL.IAHashA .EQ %00000000.01000000 PP.RxCTL.PromisA .EQ %00000000.10000000 PP.RxCTL.RxOKA .EQ %00000001.00000000 PP.RxCTL.MulticastA .EQ %00000010.00000000 PP.RxCTL.IA .EQ %00000100.00000000 PP.RxCTL.BroadcastA .EQ %00001000.00000000 PP.RxCTL.CRCerrorA .EQ %00010000.00000000 PP.RxCTL.RuntA .EQ %00100000.00000000 PP.RxCTL.ExtradataA .EQ %01000000.00000000 PP.TxCFG .EQ $0106 Transmit Configuration (RW) PP.TxCMD .EQ $0108 Receiver Control (RW) PP.TxCMD.LID .EQ %00000000.00001001 *PP.TxCMD.TxStart5 .EQ %00000000.00000000 *PP.TxCMD.TxStart381 .EQ %00000000.01000000 *PP.TxCMD.TxStart1021 .EQ %00000000.10000000 PP.TxCMD.TxStartFULL .EQ %00000000.11000000 *PP.TxCMD.Force .EQ %00000001.00000000 *PP.TxCMD.OneColl .EQ %00000010.00000000 *PP.TxCMD.InhibitCRC .EQ %00010000.00000000 *PP.TxCMD.TxPadDis .EQ %00100000.00000000 PP.BufCFG .EQ $010A PP.LineCTL .EQ $0112 Line Control (RW) PP.LineCTL.LID .EQ %00000000.00010011 PP.LineCTL.SerRxOn .EQ %00000000.01000000 PP.LineCTL.SerTxOn .EQ %00000000.10000000 PP.LineCTL.10BaseT .EQ %00000000.00000000 PP.LineCTL.AUIonly .EQ %00000001.00000000 PP.LineCTL.Auto .EQ %00000010.00000000 PP.SelfCTL .EQ $0114 Self Control (RW) PP.SelfCTL.LID .EQ %00000000.00010101 PP.SelfCTL.RESET .EQ %00000000.01000000 PP.SelfCTL.SWSuspnd .EQ %00000000.10000000 PP.SelfCTL.HWSleepE .EQ %00000001.00000000 PP.SelfCTL.HWStndby .EQ %00000010.00000000 PP.BufCTL .EQ $0116 PP.TestCTL .EQ $0118 PP.TestCTL.LID .EQ %00000000.00011001 PP.TestCTL.DisLT .EQ %00000000.10000000 PP.TestCTL.FDX .EQ %01000000.00000000 PP.ISQ .EQ $0120 PP.RxEvent .EQ $0124 Receiver Event (RO) PP.RxEvent.LID .EQ %00000000.00000100 PP.RxEvent.RxOK .EQ %00000001.00000000 PP.RxEvent.IA .EQ %00000100.00000000 PP.RxEvent.Brdcast .EQ %00001000.00000000 PP.RxEvent.CRCerror .EQ %00010000.00000000 PP.RxEvent.Runt .EQ %00100000.00000000 PP.RxEvent.Xtradata .EQ %01000000.00000000 PP.TxEvent .EQ $0128 Transmitter Event (RO) PP.TxEvent.LID .EQ %00000000.00001000 PP.BufEvent .EQ $012C PP.RxMISS .EQ $0130 PP.TxCOL .EQ $0132 PP.LineST .EQ $0134 Line Status (RO) PP.LineST.LID .EQ %00000000.00010100 PP.LineST.LinkOK .EQ %00000000.10000000 PP.LineST.AUI .EQ %00000001.00000000 PP.LineST.10BT .EQ %00000010.00000000 PP.LineST.PolOK .EQ %00010000.00000000 PP.LineST.CRS .EQ %01000000.00000000 PP.SelfST .EQ $0136 Self Status (RO) PP.SelfST.INITD .EQ %00000000.10000000 PP.BusST .EQ $0138 Bus Status (RO) PP.BusST.LID .EQ %00000000.00011000 PP.BusST.TxBidErr .EQ %00000000.10000000 PP.BusST.Rdy4TxNOW .EQ %00000001.00000000 PP.TDR .EQ $013C PP.MAC .EQ $0158 MAC Address (RW) PP.RxStatus .EQ $0400 PP.RxLength .EQ $0402 PP.RxFrame .EQ $0404 PP.TxFrame .EQ $0A00 *-------------------------------------- * 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 >LDYAI PP.ID >STYA PacketPagePTR,x >LDYA PacketPageDATA,x cpy #DEVID bne .2 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 sec rts .3 stx DEVSLOTx0 lda hARGS 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 >SYSCALL SYS.GetMemPtrA >STYA ZPTmpPTR jsr DecodeMac bcc .8 lda #DEVMGR.ERRICL sec rts .8 >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 "UtherNet/CS8900A Driver.\n" MSG.DETECT.OK >PSTRING "UtherNet/CS8900A 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) .HS 00 .DA #S.DEV.F.SHARE+S.DEV.F.EVENT DEV.HEADER.NAME >PSTRING "ETH1" NAME .HS 00 .HS 00.00.00.00 *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START .DA OPEN .DA GETEVENT .DA COUT .DA CLOSE .DA GETINFO .DA IRQ .DA SEND .DA SETIPCFG L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- OPEN jsr Reset >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 *-------------------------------------- GETEVENT ldx DEVSLOTx0 >LDYAI PP.RxEvent >STYA PacketPagePTR,x >LDYA PacketPageDATA,x and /PP.RxEvent.RxOK+PP.RxEvent.Brdcast+PP.RxEvent.IA bne GETEVENT.RxOK lda #ERR.DEV.NOFRAME COUT IRQ SETIPCFG GETEVENT.Err sec rts GETEVENT.RxOK and /PP.RxEvent.Brdcast beq .10 lda #$80 .10 ldy #S.EVT.DATAHI sta (pEvent),y >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 SYS.GetMem bcs GETEVENT.Err >STYA ZPTmpPTR txa ldy #S.EVT.DATALO sta (pEvent),y lda #S.EVT.F.NET+S.EVT.F.hMEM1 sta (pEvent) 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 clc rts *-------------------------------------- CLOSE jsr Reset clc rts *-------------------------------------- GETINFO lda #S.DEVINFO.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.DEVINFO.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.DEVINFO.NET.STATUS.FD sta LINK.STATUS .2 >LDYA L.DEVINFO clc rts *-------------------------------------- SEND >PULLW 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 SENDPREADY lda #0 .2 dec bne .2 dey bne .1 .9 lda #ERR.DEV.NOBUFFER sec rts SENDPREADY 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 *-------------------------------------- Reset ldx DEVSLOTx0 >LDYAI PP.SelfCTL >STYA PacketPagePTR,x >LDYAI PP.SelfCTL.LID+PP.SelfCTL.RESET >STYA PacketPageDATA,x rts DRV.CS.END *-------------------------------------- DEVSLOTx0 .BS 1 Size .BS 2 Counter .BS 2 DEVINFO .DA #S.DEVINFO.TYPE.NET DEVFLAGS .DA #0 MAC .BS 6 LINK.STATUS .BS 1 OK/DUPLEX/SPEED MAN SAVE DRV/UTHERNET.DRV.S ASM