PR#3 PREFIX /A2OSX.SRC LOMEM $A00 INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/SBIN/DHCPCLNT *-------------------------------------- .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/LIBTCPIP.I .INB /A2OSX.DEV/INC/DHCP.I *-------------------------------------- TIMEOUT.MAX .EQ 100 10 sec. *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPFrameBase .EQ ZPBIN+2 ZPFramePtr .EQ ZPBIN+4 *-------------------------------------- * 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.Socket .DA Socket 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 L.DHCP.DISC .DA DHCP.DISC L.DHCP.REQ .DA DHCP.REQ .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLibYA sta hLIBTCPIP >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG bcs .9 >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) and #S.IPCFG.STATUS.OK bne .99 Already Configured, exit ldy #S.IPCFG.HDEV lda (ZPIPCfgPtr),y beq .98 ldy #S.IPCFG-1 .1 lda (ZPIPCfgPtr),y sta IPCFG,y dey bne .1 stz IPCFG >LDYA A2OSX.TIMER16 >STYA DHCP.DISC.XID >STYA DHCP.REQ.XID >LDYA A2OSX.RANDOM16 >STYA DHCP.DISC.XID+2 >STYA DHCP.REQ.XID+2 ldx #5 .2 lda IPCFG+S.IPCFG.MAC,x sta DHCP.DISC.CHADDR,x sta DHCP.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 CPrintFYA lda #0 sec rts *-------------------------------------- CS.RUN >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcc .1 jmp CS.RUN.KO .1 txa ldy #hSocket sta (pData),y >LDYA L.MSG.CFG1 >SYSCALL CPrintFYA jsr Init.Timeout CS.RUN.SDISC ldy #hSocket >PUSHB (pData),y >PUSHW L.DHCP.DISC >PUSHWI DHCP.DISC.LEN >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcc .1 jmp CS.RUN.KO .1 lda #S.IPCFG.STATUS.SDISC sta IPCFG CS.RUN.ROFFER >SYSCALL Sleep jsr CS.RUN.SKT.RCVD bcc .1 jsr Wait.Timeout bcc CS.RUN.ROFFER lda #1 jmp CS.RUN.KO .1 jsr CheckDHCPOffer bcs CS.RUN.ROFFER lda #S.IPCFG.STATUS.ROFFER sta IPCFG CS.RUN.SREQ ldx #3 .1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x dex bpl .1 >LDYA L.MSG.CFG2 >SYSCALL CPrintFYA ldy #hSocket >PUSHB (pData),y >PUSHW L.DHCP.REQ >PUSHWI DHCP.REQ.LEN >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Write bcs CS.RUN.KO lda #S.IPCFG.STATUS.SREQ sta IPCFG CS.RUN.RACK >SYSCALL Sleep jsr CS.RUN.SKT.RCVD bcc .1 jsr Wait.Timeout bcc CS.RUN.RACK lda #2 bra CS.RUN.KO .1 jsr CheckDHCPAck bcs CS.RUN.RACK 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 CPrintFYA lda #0 Leave with NO ERROR sec rts CS.RUN.KO pha >PUSHA >LDYA L.MSG.CFG.KO >SYSCALL CPrintFYA pla sec rts *-------------------------------------- CS.RUN.SKT.RCVD ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcs .9 ldy #hFrame sta (pData),y >SYSCALL GetMemPtrA >STYA ZPFrameBase .9 rts *-------------------------------------- CS.RUN.DISCARD ldy #hFrame lda (pData),y >SYSCALL FreeMemA rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? ldy #TimeOut lda (pData),y beq .9 dec sta (pData),y .9 sec do not discard TIMER event rts *-------------------------------------- CS.QUIT ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA lda hLIBTCPIP >SYSCALL UnloadLibA clc rts *-------------------------------------- CheckDHCPOffer jsr CheckDHCPXID bcs .9 >LDAXI S.DHCP.OPTIONS jsr SetFramePtr1AX ldy #2 DHCPOffer ? lda (ZPFramePtr),y cmp #S.DHCP.OPTIONS.DHCPOffer bne .9 ldy #S.DHCP.YIADDR+3 ldx #3 .1 lda (ZPFrameBase),y sta DHCP.REQ.OPT.REQIP,x dey dex bpl .1 ldx #3 ldy #S.IPCFG.IP+3 .2 lda DHCP.REQ.OPT.REQIP,x sta IPCFG,y dey dex bpl .2 ldy #S.IP.SRC+3 ldx #3 .3 lda (ZPFrameBase),y sta DHCP.REQ.OPT.SVRIP,x dey dex bpl .3 ldx #3 ldy #S.IPCFG.DHCPSRVR+3 .4 lda DHCP.REQ.OPT.SVRIP,x sta IPCFG,y dey dex bpl .4 .5 inc ZPFramePtr skip Option 53 (DHCPOffer:530102) bne .6 inc ZPFramePtr+1 .6 lda (ZPFramePtr) sec adc ZPFramePtr add option len + 1 sta ZPFramePtr bcc .7 inc ZPFramePtr+1 .7 lda (ZPFramePtr) cmp #S.DHCP.OPTIONS.END beq .8 jsr GetDHCPOption bra .5 .8 jsr CS.RUN.DISCARD clc rts .9 jsr CS.RUN.DISCARD sec rts *-------------------------------------- GetDHCPOption cmp #S.DHCP.OPTIONS.MASK bne .1 ldx #S.IPCFG.MASK bra GetDHCPOption.CopyIP .1 cmp #S.DHCP.OPTIONS.GW bne .2 ldx #S.IPCFG.GW bra GetDHCPOption.CopyIP .2 cmp #S.DHCP.OPTIONS.DNS bne .3 ldx #S.IPCFG.DNS1 bra GetDHCPOption.CopyIP .3 cmp #S.DHCP.OPTIONS.DOMAIN bne .9 ldy #1 lda (ZPFramePtr),y Get String len cmp #80 bcc .4 lda #79 .4 sta IPCFG+S.IPCFG.DOMAIN store len tax .5 iny lda (ZPFramePtr),y sta IPCFG+S.IPCFG.DOMAIN-1,y dex bne .5 .9 rts *-------------------------------------- GetDHCPOption.CopyIP ldy #1 lda (ZPFramePtr),y Get Byte count cmp #9 bcc .1 lda #8 max 8 bytes (2 DNS) .1 iny .2 pha lda (ZPFramePtr),y sta IPCFG,x iny inx pla dec bne .2 rts *-------------------------------------- CheckDHCPAck jsr CheckDHCPXID bcs .9 >LDAXI S.DHCP.OPTIONS jsr SetFramePtr1AX ldy #2 DHCPAck ? lda (ZPFramePtr),y cmp #S.DHCP.OPTIONS.DHCPAck bne .9 jsr CS.RUN.DISCARD clc rts .9 jsr CS.RUN.DISCARD sec rts *-------------------------------------- CheckDHCPXID ldy #S.DHCP.XID+3 ldx #3 .1 lda (ZPFrameBase),y cmp DHCP.DISC.XID,x same XID ? bne .9 dey dex bpl .1 clc rts .9 sec rts *-------------------------------------- SetFramePtr1AX clc adc ZPFrameBase sta ZPFramePtr txa adc ZPFrameBase+1 sta ZPFramePtr+1 rts *-------------------------------------- Init.Timeout ldy #TimeOut lda #TIMEOUT.MAX sta (pData),y rts *-------------------------------------- Wait.TimeOut sec ldy #TimeOut lda (pData),y beq .9 clc .9 rts *-------------------------------------- CS.END LIBTCPIP >PSTR "libtcpip.o" MSG.CFG1 >CSTR "DHCPCLNT:Searching for DHCP servers...\n" MSG.CFG2 >CSTR "DHCPCLNT:Reply from DHCP Server at %d.%d.%d.%d, requesting...\n" MSG.CFG.KO >CSTR "DHCPCLNT:Time Out [%h].\n" MSG.CFG.OK >CSTR "DHCPCLNT:Success:[IP=%d.%d.%d.%d/%d.%d.%d.%d]\n" MSG.CFG.ND >CSTR "DHCPCLNT:No Device, exiting.\n" MSG.CFG.NA >CSTR "DHCPCLNT:TCPIP Already configured, exiting.\n" hLIBTCPIP .BS 1 IPCFG .BS S.IPCFG FrameLen .BS 2 *-------------------------------------- Socket .DA #S.SOCKET.SOCK.DGRAM .BS 3 .HS 00.00.00.00 Socket.Src.Addr .DA UDP.PORT.DHCPC Socket.Src.Port .HS FF.FF.FF.FF Socket.Dst.Addr .DA UDP.PORT.DHCPS Socket.Dst.Port *-------------------------------------- DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS DHCP.DISC.XID .BS 4 .HS 0000 SECS .HS 0000 FLAGS .HS 00000000 CIADDR DHCP.DISC.YIADDR .HS 00000000 .HS 00000000 SIADDR .HS 00000000 GIADDR DHCP.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 DHCP.DISC.LEN .EQ *-DHCP.DISC *-------------------------------------- DHCP.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS DHCP.REQ.XID .BS 4 .HS 0000 SECS .HS 0000 FLAGS .HS 00000000 CIADDR DHCP.REQ.YIADDR .HS 00000000 .HS 00000000 SIADDR .HS 00000000 GIADDR DHCP.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 DHCP.REQ.OPT.REQIP .BS 4 .HS 3604 DHCP.REQ.OPT.SVRIP .BS 4 .HS FF DHCP.REQ.LEN .EQ *-DHCP.REQ *-------------------------------------- DS.START TimeOut .BS 1 hSocket .BS 1 hFrame .BS 1 DS.END MAN SAVE SBIN/DHCPCLNT.S ASM