PR#3 PREFIX /A2OSX.SRC LOMEM $C00 INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/SBIN/DHCPCLNT *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/LIBTCPIP.I *-------------------------------------- TIMEOUT.MAX .EQ 4 4 sec. *-------------------------------------- ZPFrameBase1 .EQ ZPBIN ZPFrameLen1 .EQ ZPBIN+2 ZPFramePtr1 .EQ ZPBIN+4 ZPPtr1 .EQ ZPBIN+6 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START .DA DS.END-DS.START Data Segment to Allocate .DA 0 .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.IPCFG .DA IPCFG L.MSG.CFG1 .DA MSG.CFG1 L.MSG.CFG2 .DA MSG.CFG2 L.MSG.CFG.KO .DA MSG.CFG.KO L.MSG.CFG.OK .DA MSG.CFG.OK L.MSG.CFG.ND .DA MSG.CFG.ND L.MSG.CFG.NA .DA MSG.CFG.NA .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL SYS.LoadLibYA sta hLIBTCPIP >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG bcs .9 >STYA ZPPtr1 lda (ZPPtr1) and #S.IPCFG.STATUS.OK bne .99 Already Configured, exit ldy #S.IPCFG.HDEV lda (ZPPtr1),y beq .98 ldy #0 .1 lda (ZPPtr1),y sta IPCFG,y iny cpy #S.IPCFG bne .1 >LDYA A2OSX.TIMER16 >STYA FRAME.DISC.XID >STYA FRAME.REQ.XID >LDYA A2OSX.RANDOM16 >STYA FRAME.DISC.XID+2 >STYA FRAME.REQ.XID+2 lda #0 sta IPCFG ldx #5 .2 lda IPCFG+S.IPCFG.MAC,x sta FRAME.DISC.CHADDR,x sta FRAME.REQ.CHADDR,x dex bpl .2 lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc .9 rts .98 >LDYA L.MSG.CFG.ND bra .90 .99 >LDYA L.MSG.CFG.NA .90 >SYSCALL SYS.PSTROutYA lda #0 sec rts *-------------------------------------- CS.RUN >LDYA L.MSG.CFG1 >SYSCALL SYS.PSTROutYA CS.RUN.DISC jsr SendDHCPDiscFrame bcs CS.RUN.KO lda #S.IPCFG.STATUS.SDISC sta IPCFG jsr Init.Timeout CS.RUN.OFFER >SYSCALL SYS.Sleep lda IPCFG and #S.IPCFG.STATUS.ROFFER bne CS.RUN.REQ jsr Wait.Timeout bcc CS.RUN.OFFER lda #1 bra CS.RUN.KO CS.RUN.REQ ldx #3 .1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x dex bpl .1 >LDYA L.MSG.CFG2 >SYSCALL SYS.PSTROutYA jsr SendDHCPReqFrame bcs CS.RUN.KO lda #S.IPCFG.STATUS.SREQ sta IPCFG CS.RUN.RACK >SYSCALL SYS.Sleep lda IPCFG and #S.IPCFG.STATUS.RACK bne CS.RUN.OK jsr Wait.Timeout bcc CS.RUN.RACK lda #2 CS.RUN.KO pha >PUSHA >LDYA L.MSG.CFG.KO >SYSCALL SYS.PSTROutYA pla sec rts CS.RUN.OK lda #S.IPCFG.STATUS.OK sta IPCFG >PUSHW L.IPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.SET.IPCFG ldx #3 .1 lda IPCFG+S.IPCFG.MASK,x >PUSHA dex bpl .1 ldx #3 .2 lda IPCFG+S.IPCFG.IP,x >PUSHA dex bpl .2 >LDYA L.MSG.CFG.OK >SYSCALL SYS.PSTROutYA lda #0 Leave with NO ERROR sec rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .1 is it a TIMER event? asl One second ? bpl .9 ldy #TimeOut lda (pData),y beq .9 dec sta (pData),y sec do not discard TIMER event rts .1 bit #S.EVT.F.NET beq .9 ldy #S.IPCFG.HDEV lda IPCFG,y ldy #S.EVT.hDEV cmp (pEvent),y bne .9 ldy #S.EVT.DATALO Get Frame hMem lda (pEvent),y >SYSCALL SYS.GetMemPtrA >STYA ZPFrameBase1 lda (ZPFrameBase1) sta ZPFrameLen1 ldy #1 lda (ZPFrameBase1),y sta ZPFrameLen1+1 lda IPCFG and #S.IPCFG.STATUS.SDISC beq .2 jsr CheckDHCPOfferFrame bcs .9 lda #S.IPCFG.STATUS.ROFFER sta IPCFG clc rts .2 lda IPCFG and #S.IPCFG.STATUS.SREQ beq .9 jsr CheckDHCPAckFrame bcs .9 lda #S.IPCFG.STATUS.RACK sta IPCFG clc rts .9 sec rts *-------------------------------------- CS.QUIT lda hLIBTCPIP >SYSCALL SYS.UnloadLibA clc rts *-------------------------------------- SendDHCPDiscFrame jsr NewDHCPFrame bcs .9 phx lda ZPFrameBase1 clc adc #S.UDP sta ZPPtr1 lda ZPFrameBase1+1 adc /S.UDP sta ZPPtr1+1 ldy #FRAME.DISC.LEN .1 dey lda FRAME.DISC,y sta (ZPPtr1),y tya bne .1 lda #S.UDP+FRAME.DISC.LEN-2 sta (ZPFrameBase1) ldy #1 lda /S.UDP+FRAME.DISC.LEN-2 sta (ZPFrameBase1),y >PUSHW ZPFrameBase1 >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME pla php >SYSCALL SYS.FreeMemA plp .9 rts *-------------------------------------- CheckDHCPOfferFrame jsr CheckDHCPXID bcs .9 >LDAXI S.DHCP.OPTIONS jsr SetFramePtr1AX ldy #2 DHCPOffer ? lda (ZPFramePtr1),y cmp #S.DHCP.OPTIONS.DHCPOffer bne .9 ldy #S.DHCP.YIADDR+3 ldx #3 .1 lda (ZPFrameBase1),y sta FRAME.REQ.OPT.REQIP,x dey dex bpl .1 ldx #3 ldy #S.IPCFG.IP+3 .2 lda FRAME.REQ.OPT.REQIP,x sta IPCFG,y dey dex bpl .2 ldy #S.IP.SRC+3 ldx #3 .3 lda (ZPFrameBase1),y sta FRAME.REQ.OPT.SVRIP,x dey dex bpl .3 ldx #3 ldy #S.IPCFG.DHCPSRVR+3 .4 lda FRAME.REQ.OPT.SVRIP,x sta IPCFG,y dey dex bpl .4 .5 inc ZPFramePtr1 skip Option 53 (DHCPOffer:530102) bne .6 inc ZPFramePtr1+1 .6 lda (ZPFramePtr1) sec adc ZPFramePtr1 add option len + 1 sta ZPFramePtr1 bcc .7 inc ZPFramePtr1+1 .7 lda (ZPFramePtr1) cmp #S.DHCP.OPTIONS.END beq .8 jsr GetDHCPOption bra .5 .8 clc rts .9 sec rts *-------------------------------------- GetDHCPOption cmp #S.DHCP.OPTIONS.MASK bne .1 ldy #S.IPCFG.MASK bra GetDHCPOption.CopyIP .1 cmp #S.DHCP.OPTIONS.GW bne .2 ldy #S.IPCFG.GW bra GetDHCPOption.CopyIP .2 cmp #S.DHCP.OPTIONS.DNS bne .3 ldy #S.IPCFG.DNS1 bra GetDHCPOption.CopyIP .3 cmp #S.DHCP.OPTIONS.DOMAIN bne .9 ldy #1 ldx #$FF .4 iny inx lda (ZPFramePtr1),y sta TmpBuffer256,x bne .4 ldy #S.IPCFG.DOMAIN-1 ldx #$FF .5 iny inx lda TmpBuffer256,x sta IPCFG,y bne .5 .9 rts GetDHCPOption.CopyIP phy ldy #2 ldx #0 .1 lda (ZPFramePtr1),y sta TmpBuffer256,x iny inx cpx #4 bne .1 ply ldx #0 .2 lda TmpBuffer256,x sta IPCFG,y iny inx cpx #4 bne .2 rts *-------------------------------------- SendDHCPReqFrame jsr NewDHCPFrame bcs .9 phx lda ZPFrameBase1 clc adc #S.UDP sta ZPPtr1 lda ZPFrameBase1+1 adc /S.UDP sta ZPPtr1+1 ldy #FRAME.REQ.LEN .1 dey lda FRAME.REQ,y sta (ZPPtr1),y tya bne .1 lda #S.UDP+FRAME.REQ.LEN-2 sta (ZPFrameBase1) ldy #1 lda /S.UDP+FRAME.REQ.LEN-2 sta (ZPFrameBase1),y >PUSHW ZPFrameBase1 >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME pla php >SYSCALL SYS.FreeMemA plp .9 rts *-------------------------------------- CheckDHCPAckFrame jsr CheckDHCPXID bcs .9 >LDAXI S.DHCP.OPTIONS jsr SetFramePtr1AX ldy #2 DHCPAck ? lda (ZPFramePtr1),y cmp #S.DHCP.OPTIONS.DHCPAck bne .9 clc rts .9 sec rts *-------------------------------------- CheckDHCPXID ldy #S.DHCP.XID+3 ldx #3 .1 lda (ZPFrameBase1),y cmp FRAME.DISC.XID,x same XID ? bne .9 dey dex bpl .1 clc rts .9 sec rts *-------------------------------------- NewDHCPFrame >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME bcs .9 >STYA ZPFrameBase1 ldy #S.UDP.SRCPORT lda /UDP.PORT.DHCPC sta (ZPFrameBase1),y iny lda #UDP.PORT.DHCPC sta (ZPFrameBase1),y ldy #S.UDP.DSTPORT lda /UDP.PORT.DHCPS sta (ZPFrameBase1),y iny lda #UDP.PORT.DHCPS sta (ZPFrameBase1),y lda #255 S.IP.DST = 255.255.255.255 ldy #S.IP.DST .1 sta (ZPFrameBase1),y iny cpy #S.IP.DST+4 bne .1 clc x = hMem .9 rts *-------------------------------------- SetFramePtr1AX clc adc ZPFrameBase1 sta ZPFramePtr1 txa adc ZPFrameBase1+1 sta ZPFramePtr1+1 rts *-------------------------------------- Init.Timeout ldy #TimeOut lda #TIMEOUT.MAX sta (pData),y rts *-------------------------------------- Wait.TimeOut sec ldy #TimeOut lda (pData),y beq .9 ldy #bCTRLC lda (pData),y bmi .9 clc .9 rts *-------------------------------------- CS.END LIBTCPIP >PSTRING "libtcpip.o" MSG.CFG1 >PSTRING "DHCPCLNT:Searching for DHCP servers...\n" MSG.CFG2 >PSTRING "DHCPCLNT:Reply from DHCP Server at %d.%d.%d.%d, requesting...\n" MSG.CFG.KO >PSTRING "DHCPCLNT:Time Out [%h].\n" MSG.CFG.OK >PSTRING "DHCPCLNT:Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\n" MSG.CFG.ND >PSTRING "DHCPCLNT:No Device, exiting.\n" MSG.CFG.NA >PSTRING "DHCPCLNT:TCPIP Already configured, exiting.\n" hLIBTCPIP .BS 1 IPCFG .BS S.IPCFG FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS FRAME.DISC.XID .BS 4 .HS 0000 SECS .HS 0000 FLAGS .HS 00000000 CIADDR FRAME.DISC.YIADDR .HS 00000000 .HS 00000000 SIADDR .HS 00000000 GIADDR FRAME.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 .BS 64 SNAME .BS 128 FILE .HS 63825363 COOKIE .HS 3501 OPT .DA #S.DHCP.OPTIONS.DHCPDiscover .HS 37040103060FFF FRAME.DISC.LEN .EQ *-FRAME.DISC FRAME.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS FRAME.REQ.XID .BS 4 .HS 0000 SECS .HS 0000 FLAGS .HS 00000000 CIADDR FRAME.REQ.YIADDR .HS 00000000 .HS 00000000 SIADDR .HS 00000000 GIADDR FRAME.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 .BS 64 SNAME .BS 128 FILE .HS 63825363 COOKIE .HS 3501 OPT .DA #S.DHCP.OPTIONS.DHCPRequest .HS 3204 FRAME.REQ.OPT.REQIP .BS 4 .HS 3604 FRAME.REQ.OPT.SVRIP .BS 4 .HS FF FRAME.REQ.LEN .EQ *-FRAME.REQ *-------------------------------------- DS.START TimeOut .BS 1 bCTRLC .BS 1 DS.END MAN SAVE SBIN/DHCPCLNT.S ASM