PR#3 PREFIX /A2OSX.SRC LOMEM $C00 INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/UTHERNET2.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/LIBTCPIP.I *-------------------------------------- ZPTmpPTR .EQ ZPDRV *-------------------------------------- .MA AR.SELECT lda /W5100.AR.]1 sta W5100.AR,x lda #W5100.AR.]1 sta W5100.AR+1,x .EM *-------------------------------------- * WIZnet W5100 IO Registers *-------------------------------------- W5100.MR .EQ $C084 Mode Register W5100.MR.RST .EQ %10000000 W5100.MR.PB .EQ %00010000 W5100.MR.PPPOE .EQ %00001000 W5100.MR.AI .EQ %00000010 W5100.MR.IND .EQ %00000001 W5100.AR .EQ $C085 Memory Pointer W5100.AR.GAR .EQ $0001 W5100.AR.SUBR .EQ $0005 W5100.AR.SHAR .EQ $0009 W5100.AR.SIPR .EQ $000F W5100.AR.IR .EQ $0015 W5100.AR.IMR .EQ $0016 W5100.AR.RTR .EQ $0017 W5100.AR.RCR .EQ $0019 W5100.AR.RMSR .EQ $001A W5100.AR.TMSR .EQ $001B W5100.AR.PATR .EQ $001C W5100.AR.PTIMER .EQ $0028 W5100.AR.PMAGIC .EQ $0029 W5100.AR.UIPR .EQ $002A W5100.AR.UPORT .EQ $002E W5100.AR.S0.MR .EQ $0400 W5100.AR.S0.CR .EQ $0401 W5100.AR.S0.IR .EQ $0402 W5100.AR.S0.SR .EQ $0403 W5100.AR.S0.PORT .EQ $0404 W5100.AR.S0.DHAR .EQ $0406 W5100.AR.S0.DIPR .EQ $040C W5100.AR.S0.DPORT .EQ $0410 W5100.AR.S0.MSSR .EQ $0412 W5100.AR.S0.PROTO .EQ $0414 W5100.AR.S0.TOS .EQ $0415 W5100.AR.S0.TTL .EQ $0416 W5100.AR.S0.TX.FSR .EQ $0420 W5100.AR.S0.TX.RD .EQ $0422 W5100.AR.S0.TX.WR .EQ $0424 W5100.AR.S0.RX.RSR .EQ $0426 W5100.AR.S0.RX.RD .EQ $0428 W5100.DR .EQ $C087 *-------------------------------------- RX.BASE .EQ $4000 TX.BASE .EQ $6000 RXTX.MASK .EQ $1FFF *-------------------------------------- ERRTNOFRAME .EQ 0 ERRNOBUFFER .EQ 1 ERRTIMEOUT .EQ 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 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 #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 cpx #$80 bne .1 >LDYA L.MSG.DETECT.KO >SYSCALL SYS.PSTROutYA lda #DEVMGR.ERRNOHW sec rts .3 stx DEVSLOTx0 lda hARGS beq .4 >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 *-------------------------------------- DecodeMac lda (ZPTmpPTR) cmp #12 bne .9 ldy #1 ldx #0 .1 lda (ZPTmpPTR),y jsr Asc2NibbleA bcs .9 asl asl asl asl sta MAC,x iny lda (ZPTmpPTR),y jsr Asc2NibbleA bcs .9 ora MAC,x sta MAC,x inx iny cpy #13 bne .1 clc rts .9 sec rts *-------------------------------------- Asc2NibbleA cmp #$30 bcc .9 cmp #$3A bcs .1 and #$0F clc rts .1 cmp #$41 bcc .9 cmp #$47 bcs .9 sbc #$36 clc rts .9 sec rts *-------------------------------------- CS.END MSG.DETECT >PSTRING "UtherNetII/W5100 Driver.\n" MSG.DETECT.OK >PSTRING "UtherNetII/W5100 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 SETIPCFG L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- OPEN jsr Reset >AR.SELECT SHAR ldy #0 .1 lda MAC,y sta W5100.DR,x iny cpy #6 bne .1 >AR.SELECT RMSR lda #3 8k sta W5100.DR,x ...for Socket0 RX Buffer sta W5100.DR,x ...for Socket0 TX Buffer >AR.SELECT S0.MR lda #3 IPRAW sta W5100.DR,x for S0.MR * >AR.SELECT S0.CR lda #1 OPEN sta W5100.DR,x for S0.CR clc rts *-------------------------------------- GETEVENT ldx DEVSLOTx0 >AR.SELECT S0.CR lda W5100.DR,x bne .9 >AR.SELECT S0.RX.RSR lda W5100.DR,x get the received size HI sta RXTX.Size+1 lda W5100.DR,x LO sta RXTX.Size ora RXTX.Size+1 bne GETEVENT.RxOK .9 lda #ERRTNOFRAME sec rts GETEVENT.RxOK clc lda W5100.DR,x get the received ptr HI and /RXTX.MASK sta RXTX.Ptr+1 adc /RX.BASE tay lda W5100.DR,x LO * and #RXTX.MASK $ff sta RXTX.Ptr sta W5100.AR,x tya sta W5100.AR+1,x lda RXTX.Size clc adc #S.IP sta FRAMELEN lda RXTX.Size+1 adc /S.IP sta FRAMELEN+1 >PUSHW FRAMELEN >PUSHBI 0 >SYSCALL SYS.GetMem bcs .99 >STYA ZPTmpPTR txa ldy #S.EVT.DATALO sta (pEvent),y lda FRAMELEN sta (ZPTmpPTR) ldy #1 lda FRAMELEN+1 sta (ZPTmpPTR),y lda #S.EVT.F.NET+S.EVT.F.hMEM1 sta (pEvent) ldx DEVSLOTx0 ldy #S.IP.DST .1 jsr GetRxByte bcs .8 sta (ZPTmpPTR),y iny cpy #S.IP.DST+4 bne .1 jsr GetRxByte skip Data Size bcs .8 jsr GetRxByte bcs .8 ldy #S.IP .2 jsr GetRxByte bcs .8 sta (ZPTmpPTR),y iny bne .2 inc ZPTmpPTR+1 bra .2 .8 >AR.SELECT S0.RX.RD lda RXTX.Size clc adc #6 tay lda RXTX.Size+1 adc #0 sta W5100.DR,x tya sta W5100.DR+1,x >AR.SELECT S0.CR lda #$40 RECV sta W5100.DR,x clc rts .99 sec rts *-------------------------------------- CLOSE jsr Reset clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO clc rts *-------------------------------------- SEND >PULLW ZPTmpPTR lda (ZPTmpPTR) sec sbc #S.IP sta RXTX.Size ldy #1 lda (ZPTmpPTR),y sbc /S.IP sta RXTX.Size ldx DEVSLOTx0 >AR.SELECT S0.TX.FSR lda W5100.DR,x get send size HI pha lda W5100.DR+1,x LO sec sbc RXTX.Size pla sbc RXTX.Size+1 bcs SEND.READY lda #ERRNOBUFFER sec rts SEND.READY >AR.SELECT S0.DIPR ldy #S.IP.DST .1 lda (ZPTmpPTR),y sta W5100.DR,x iny cpy #S.IP.DST+4 bne .1 >AR.SELECT S0.TX.WR lda W5100.DR,x pha lda W5100.DR,x clc adc TX.Base sta RXTX.Ptr pla adc TX.Base+1 sta RXTX.Ptr+1 ldy #S.IP .2 lda (ZPTmpPTR),y jsr PutTxByte bcs .8 iny bne .2 inc ZPTmpPTR+1 bra .2 .8 >AR.SELECT S0.CR lda #$20 SEND sta W5100.DR,x clc rts *-------------------------------------- SETIPCFG >PULLW ZPTmpPTR >AR.SELECT GAR ldx DEVSLOTx0 ldy #S.IPCFG.GW .1 lda (ZPTmpPTR),y sta W5100.DR,x iny cpy #S.IPCFG.GW+4 bne .1 * >AR.SELECT SUBR Implicit, next to GAR ldy #S.IPCFG.MASK .2 lda (ZPTmpPTR),y sta W5100.DR,x iny cpy #S.IPCFG.MASK+4 bne .2 >AR.SELECT SIPR ldy #S.IPCFG.IP .3 lda (ZPTmpPTR),y sta W5100.DR,x iny cpy #S.IPCFG.IP+4 bne .3 clc rts *-------------------------------------- Reset ldx DEVSLOTx0 lda #W5100.MR.RST sta W5100.MR,x rts *-------------------------------------- GetRxByte lda RXTX.Size bne .1 lda RXTX.Size+1 beq .9 dec RXTX.Size+1 .1 dec RXTX.Size lda W5100.DR,x pha inc RXTX.Ptr bne .8 inc RXTX.Ptr+1 lda RXTX.Ptr+1 and /RXTX.MASK bne .8 sta RXTX.Ptr+1 lda /RX.Base sta W5100.AR,x lda #RX.Base sta W5100.AR+1,x .8 pla clc rts .9 sec rts *-------------------------------------- PutTxByte pha lda RXTX.Size bne .1 lda RXTX.Size+1 beq .9 dec RXTX.Size+1 .1 dec RXTX.Size pla sta W5100.DR,x inc RXTX.Ptr bne .8 inc RXTX.Ptr+1 lda RXTX.Ptr+1 and /RXTX.MASK bne .8 sta RXTX.Ptr+1 lda /TX.Base sta W5100.AR,x lda #TX.Base sta W5100.AR+1,x .8 clc rts .9 pla sec rts DRV.CS.END DEVSLOTx0 .BS 1 USERMAC .BS 1 FRAMELEN .BS 2 RXTX.Size .BS 2 RXTX.Ptr .BS 2 DEVINFO .DA #S.DEVINFO.TYPE.NET DEVFLAGS .DA #S.DEVINFO.NET.FLAGS.ARPOFFLOAD 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