PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/UTHERNET2.DRV *-------------------------------------- .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/LIBTCPIP.I *-------------------------------------- ZPTmpPTR .EQ ZPDRV *-------------------------------------- .INB DRV/X.NET.W5100.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 #$10+$88 .1 lda #W5100.MR.RST sta W5100.MR,x lda #W5100.MR.AI+W5100.MR.IND sta W5100.MR,x lda W5100.MR,x cmp #W5100.MR.AI+W5100.MR.IND bne .2 >AR.SELECT RTR Double Check with RTR default value... lda W5100.DR,x Get RTR HI cmp /2000 bne .2 lda W5100.DR,x Get RTR LO cmp #2000 beq .3 .2 inc DEV.HEADER.NAME+4 txa clc adc #$10 tax bcc .1 #$108 ? >LDYA L.MSG.DETECT.KO >SYSCALL CPrintFYA lda #DEVMGR.ERRNOHW sec rts .3 stx DEVSLOTx8 >LDYA ARGS >STYA ZPTmpPTR lda (ZPTmpPTR) bne .4 lda #$00 sta MAC lda #$08 sta MAC+1 lda #$DC 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 GetMemPtrA >STYA ZPTmpPTR 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 "UtherNet2/W5100 Driver.\n" MSG.DETECT.OK >CSTR "UtherNet2/W5100 Installed As Device : %S\n" MSG.DETECT.KO >CSTR "Hardware Not Found.\n" Args .BS 2 *-------------------------------------- * 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 >PSTR "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 lda #W5100.MR.AI+W5100.MR.IND sta W5100.MR,x >AR.SELECT SHAR ldy #0 .1 lda 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.S0.MR.MACRAW+W5100.AR.S0.MR.MF sta W5100.DR,x >AR.SELECT S0.CR lda #1 OPEN sta W5100.DR,x clc rts *-------------------------------------- GETEVENT ldx DEVSLOTx8 >AR.SELECT S0.RX.RSR lda W5100.DR,x get the received size HI ora W5100.DR,x LO bne GETEVENT.RxOK lda #ERR.DEV.NOFRAME COUT IRQ SETIPCFG GETEVENT.Err sec rts GETEVENT.RxOK >AR.SELECT S0.RX.RD lda W5100.DR,x get the received ptr HI ldy W5100.DR,x get the received ptr LO and /RXTX.MASK ora /RX.BASE sta W5100.AR,x tya sta W5100.AR+1,x lda W5100.DR,x get RX.Size HI sta Offset+1 >PUSHA for SYS.GetMem tay lda W5100.DR,x get RX.Size LO sta Offset >PUSHA for SYS.GetMem sec sbc #2 sta RXTX.Size bcs .1 dey .1 sty RXTX.Size+1 * >PUSHYA Already pushed.... >PUSHBI 0 >SYSCALL 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 RXTX.Size sta (ZPTmpPTR) eor #$ff sta Counter ldy #1 lda RXTX.Size+1 sta (ZPTmpPTR),y eor #$ff sta Counter+1 ldx DEVSLOTx8 iny .2 inc Counter bne .3 inc Counter+1 beq .8 .3 lda W5100.DR,x sta (ZPTmpPTR),y iny bne .2 inc ZPTmpPTR+1 bne .2 .8 >AR.SELECT S0.RX.RD ldy W5100.DR,x Get HI lda W5100.DR,x Get LO clc adc Offset pha save LO tya adc Offset+1 pha >AR.SELECT S0.RX.RD pla sta W5100.DR,x write HI pla sta W5100.DR,x write LO >AR.SELECT S0.CR lda #$40 RECV sta W5100.DR,x ldy #S.ETH.DSTMAC lda (ZPTmpPTR),y .81 iny and (ZPTmpPTR),y cpy #S.ETH.DSTMAC+5 bne .81 if EQ, CS inc $ff = Broadcast ?? beq .82 clc not a broadcast .82 lda #$00 ror ldy #S.EVT.DATAHI sta (pEvent),y * clc cleared by ROR rts *-------------------------------------- CLOSE jsr Reset clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO clc rts *-------------------------------------- SEND >PULLW ZPTmpPTR lda (ZPTmpPTR) sta RXTX.Size eor #$ff sta Counter ldy #1 lda (ZPTmpPTR),y sta RXTX.Size+1 eor #$ff sta Counter+1 ldx DEVSLOTx8 >AR.SELECT S0.TX.FSR lda W5100.DR,x get send size HI ldy W5100.DR,x LO cpy RXTX.Size sbc RXTX.Size+1 bcs SEND.READY lda #ERR.DEV.NOBUFFER sec rts SEND.READY ldy #S.ETH.SRCMAC+5 ldx #5 .1 lda MAC,x sta (ZPTmpPTR),y dey dex bpl .1 ldx DEVSLOTx8 >AR.SELECT S0.TX.WR lda W5100.DR,x Get HI 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 #2 .2 inc Counter bne .3 inc Counter+1 beq .8 .3 lda (ZPTmpPTR),y sta W5100.DR,x iny bne .2 inc ZPTmpPTR+1 bne .2 .8 >AR.SELECT S0.TX.WR clc lda Offset adc RXTX.Size pha save LO lda Offset+1 adc RXTX.Size+1 * and /RXTX.MASK * ora /TX.BASE sta W5100.DR,x write HI pla sta W5100.DR,x write LO >AR.SELECT S0.CR lda #$20 SEND sta W5100.DR,x clc rts *-------------------------------------- Reset ldx DEVSLOTx8 lda #W5100.MR.RST sta W5100.MR,x rts *-------------------------------------- DRV.CS.END DEVSLOTx8 .BS 1 RXTX.Size .BS 2 Counter .BS 2 Offset .BS 2 *-------------------------------------- DEVINFO .DA #S.DEVINFO.TYPE.NET DEVFLAGS .DA #0 MAC .BS 6 LINK.STATUS .DA #S.DEVINFO.NET.STATUS.OK+S.DEVINFO.NET.STATUS.FD+S.DEVINFO.NET.STATUS.100 MAN SAVE DRV/UTHERNET2.DRV.S ASM