PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/BIN/PING *-------------------------------------- .INB /A2OSX.DEV/INC/MACROS.I .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/LIBTCPIP.I *-------------------------------------- TIMEOUT.MAX .EQ 20 2 sec. *-------------------------------------- ZPFrameBase .EQ ZPBIN ZPFrameLen .EQ ZPBIN+2 ZPFramePtr1 .EQ ZPBIN+4 ZPIPCfgPtr .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 Code Length To Relocate .DA DS.END-DS.START Data Segment to Allocate .DA 0 .DA 0 *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.Socket .DA Socket L.MSG.IPKO .DA MSG.IPKO L.MSG.USAGE .DA MSG.USAGE L.MSG.UNKNOWN .DA MSG.UNKNOWN L.MSG.HOSTOK .DA MSG.HOSTOK L.MSG2 .DA MSG2 L.MSG3 .DA MSG3 .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLibYA bcs .9 sta hLIBTCPIP lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc .9 rts *-------------------------------------- CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.IPOK >LDYA L.MSG.IPKO >SYSCALL CPrintFYA lda #SYSMGR.ERRSYN sec rts *-------------------------------------- CS.RUN.IPOK >SYSCALL GetArgC cmp #1 beq .9 jsr Init.Timeout .2 >PUSHW pData DST.IP lda #1 >SYSCALL GetArgA >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc CS.RUN.HOSTOK >SYSCALL Sleep jsr Wait.Timeout bcc .2 lda #1 >SYSCALL GetArgA >PUSHYA >LDYA L.MSG.UNKNOWN bra .99 .9 >LDYA L.MSG.USAGE .99 >SYSCALL CPrintFYA lda #SYSMGR.ERRSYN sec rts *-------------------------------------- CS.RUN.HOSTOK lda #1 >SYSCALL GetArgA >PUSHYA ldy #DST.IP+3 >PUSHB (pData),y DST.IP+3 dey >PUSHB (pData),y DST.IP+2 dey >PUSHB (pData),y DST.IP+1 dey >PUSHB (pData),y DST.IP >LDYA L.MSG.HOSTOK >SYSCALL CPrintFYA CS.RUN.ECHO ldx #3 ldy #S.IPCFG.IP+3 .1 lda (ZPIPCfgPtr),y sta Socket.Src.Addr,x dey dex bpl .1 lda A2OSX.RANDOM16 sta Socket.Src.Port lda A2OSX.RANDOM16+1 sta Socket.Src.Port+1 lda #0 ldy #Sequence sta (pData),y iny sta (pData),y ldy #S.ICMP.SEQUENCE sta (ZPFrameBase),y iny txa sta (ZPFrameBase),y >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW bcs .99 txa ldy #hSocket sta (pData),y ldy #Identifier lda (pData),y tax iny lda (pData),y ldy #S.ICMP.IDENTIFIER+1 sta (ZPFrameBase),y dey txa sta (ZPFrameBase),y ldy #Sequence+1 lda (pData),y tax dey lda (pData),y inc sta (pData),y bne .2 pha inx txa sta (pData),y pla .2 ldy #S.ICMP.SEQUENCE sta (ZPFrameBase),y iny txa sta (ZPFrameBase),y ldx #31 ldy #S.ICMP+31 .21 txa and #$0f ora #$60 sta (ZPFrameBase),y dey dex bpl .21 jsr Init.Timeout .3 ldy #hFrame lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.SEND.ICMP.FRAME bcc .4 >SYSCALL Sleep jsr Wait.Timeout bcc .3 .4 ldy #hFrame lda (pData),y >SYSCALL FreeMemA ldy #bReply lda #0 sta (pData),y jsr Init.Timeout CS.RUN.WAIT >SYSCALL Sleep ldy #bReply lda (pData),y bne .1 ldy #bCTRLC lda (pData),y bne CS.RUN.ERROR jsr Wait.Timeout bcc CS.RUN.WAIT ldy #3 >PUSHB (pData),y DST.IP+3 dey >PUSHB (pData),y DST.IP+2 dey >PUSHB (pData),y DST.IP+1 >PUSHB (pData) DST.IP >LDYA L.MSG2 >SYSCALL CPrintFYA .1 ldy #bCTRLC lda (pData),y bne CS.RUN.ERROR ldy #TimeOut lda (pData),y beq .2 >SYSCALL Sleep bra .1 .2 jmp CS.RUN.ECHO CS.RUN.ERROR sec rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .1 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.Print.REPLY lda #TIMEOUT.MAX sec ldy #TimeOut sbc (pData),y stz TimeOut.ms stz TimeOut.ms+1 tay beq .3 .1 lda TimeOut.ms clc adc #100 sta TimeOut.ms bcc .2 inc TimeOut .2 dey bne .1 .3 >PUSHW TimeOut.ms ldy #S.IP.TTL >PUSHB (ZPFrameBase),y ldy #S.ICMP.SEQUENCE+1 >PUSHB (ZPFrameBase),y dey >PUSHB (ZPFrameBase),y ldy #S.IP.SRC+3 >PUSHB (ZPFrameBase),y dey >PUSHB (ZPFrameBase),y dey >PUSHB (ZPFrameBase),y dey >PUSHB (ZPFrameBase),y >LDYA L.MSG3 >SYSCALL CPrintFYA ldy #bReply lda (pData),y inc sta (pData),y rts *-------------------------------------- CS.QUIT lda hLIBTCPIP >SYSCALL UnloadLibA clc 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.IPKO >CSTR "TCP/IP Not Loaded/Configured.\n" MSG.USAGE >CSTR "Usage : PING \n" MSG.UNKNOWN >CSTR "%S: Unknown host\n" MSG.HOSTOK >CSTR "PING %d.%d.%d.%d (%S)\n" MSG2 >CSTR "%d.%d.%d.%d: TimeOut/Host unreachable\n" MSG3 >CSTR "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n" hLIBTCPIP .BS 1 TimeOut.ms .BS 2 Socket .DA #S.SOCKET.SOCK.RAW .BS 2 .BS #S.IP.PROTOCOL.ICMP Socket.Src.Addr .BS 4 Socket.Src.Port .BS 2 Identifier Socket.Dst.Addr .BS 4 Socket.Dst.Port .DA 0 not used .BS 16 *-------------------------------------- ICMP.Request .DA #S.ICMP.TYPE.ECHOREQ .DA #0 CODE .DA 0 CHECKSUM ICMP.Request.ID .BS 2 ICMP.Request.SQ .BS 2 .AS "ABCDEFGHIJKLMNOP" .AS "QRSTUVWXYZ012345" *-------------------------------------- .DUMMY .OR 0 DS.START DST.IP .BS 4 Sequence .BS 2 TimeOut .BS 1 DS.END .ED *-------------------------------------- MAN SAVE BIN/PING.S ASM