NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF BIN/PING *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/ETH.I .INB INC/LIBTCPIP.I *-------------------------------------- TIMEOUT.MAX .EQ 40 4 sec. *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPTmpPtr .EQ ZPBIN+2 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT S.PS.F .DA #0 .DA CS.END-CS.START Code Length To Relocate .DA DS.END-DS.START Data Segment to Allocate .DA #64 SS .DA #4 ZP .DA 0 *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.Socket .DA Socket L.ICMP.Request .DA ICMP.Request 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.MSG.SKTKO .DA MSG.SKTKO L.MSG.REPLY .DA MSG.REPLY L.MSG.UNREACH .DA MSG.UNREACH .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib bcs .9 sta hLIBTCPIP 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 puts lda #K.E.SYN sec rts CS.RUN.IPOK .1 >INC.G ArgIndex >SYSCALL GetArg bcs .8 >STYA ZPTmpPtr lda (ZPTmpPtr) cmp #'-' bne .2 ldy #1 lda (ZPTmpPtr),y beq .9 cmp #'0' bcc .9 cmp #'9'+1 bcs .9 and #$0F >STA.G PingCount bra .1 jsr Init.Timeout .2 >PUSHEA.G DST.IP >PUSHW ZPTmpPtr >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc .3 >SLEEP jsr Wait.Timeout bcc .2 >PUSHW ZPTmpPtr >PUSHBI 2 >LDYA L.MSG.UNKNOWN bra .99 .3 >LDA.G ArgIndex >STA.G ArgHostName jmp .1 .8 >LDA.G DST.IP bne CS.RUN.ARGSOK .9 >PUSHBI 0 >LDYA L.MSG.USAGE .99 >SYSCALL printf lda #K.E.SYN sec rts CS.RUN.ARGSOK >LDA.G ArgHostName >SYSCALL GetArg >PUSHYA ldy #DST.IP+3 ldx #3 .1 lda (pData),y sta Socket.Dst.Addr,x >PUSHA dey dex bpl .1 >PUSHBI 6 >LDYA L.MSG.HOSTOK >SYSCALL printf CS.RUN.OPENSKT ldx #3 ldy #S.IPCFG.IP+3 .1 lda (ZPIPCfgPtr),y sta Socket.Src.Addr,x dey dex bpl .1 ldy #Identifier lda A2OSX.RANDOM16 sta Socket.Dst.Port sta (pData),y iny lda A2OSX.RANDOM16+1 sta Socket.Dst.Port+1 sta (pData),y >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.New bcc .2 >LDYA L.MSG.SKTKO >SYSCALL puts lda #K.E.SYN sec rts .2 >STA.G hSocket CS.RUN.SEND.ECHO ldy #Identifier lda (pData),y sta ICMP.Request.ID iny lda (pData),y sta ICMP.Request.ID+1 ldy #Sequence sec lda (pData),y adc #0 sta (pData),y sta ICMP.Request.SQ iny lda (pData),y adc #0 sta (pData),y sta ICMP.Request.SQ+1 jsr Init.Timeout >PUSHWI ICMP.RequestLen >PUSHW L.ICMP.Request >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Send bcs CS.RUN.ERR jsr Init.Timeout CS.RUN.WAIT.REPLY >SLEEP >SYSCALL GetChar bcs .1 cmp #3 Ctrl-C beq CS.RUN.ERR CS .1 >LDA.G hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Rcvd bcc .2 jsr Wait.Timeout bcc CS.RUN.WAIT.REPLY jsr CS.Print.UNREACH bcs CS.RUN.ERR bra .7 .2 >STA.G hFrame >SYSCALL GetMemPtr >STYA ZPTmpPtr jsr CS.Print.REPLY bcs CS.RUN.ERR >LDA.G hFrame >SYSCALL FreeMem >STZ.G hFrame .7 >LDA.G PingCount beq .8 dec beq .9 A=0 sta (pData),y .8 jmp CS.RUN.SEND.ECHO .9 sec CS.RUN.ERR rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? >LDA.G TimeOut beq .9 dec sta (pData),y .9 sec do not discard TIMER event rts *-------------------------------------- CS.Print.UNREACH ldx #4 ldy #DST.IP+3 .1 >PUSHB (pData),y dey dex bne .1 >PUSHBI 4 >LDYA L.MSG.UNREACH >SYSCALL printf rts *-------------------------------------- CS.Print.REPLY lda #TIMEOUT.MAX sec ldy #TimeOut sbc (pData),y >STZ.G TimeOut.ms >STA.G TimeOut.ms+1 tax beq .3 .1 >LDA.G TimeOut.ms clc adc #100 >STA.G TimeOut.ms bcc .2 >INC.G TimeOut.ms+1 .2 dex bne .1 .3 >PUSHW.G TimeOut.ms ldy #S.IP.TTL >PUSHB (ZPTmpPtr),y ldy #S.ICMP.SEQUENCE+1 >PUSHB (ZPTmpPtr),y dey >PUSHB (ZPTmpPtr),y ldx #4 ldy #S.IP.SRC+3 .4 >PUSHB (ZPTmpPtr),y dey dex bne .4 >PUSHBI 9 >LDYA L.MSG.REPLY >SYSCALL printf rts *-------------------------------------- CS.QUIT >LDA.G hFrame beq .1 >SYSCALL FreeMem .1 >LDA.G hSocket beq .2 >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Close .2 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- Init.Timeout lda #TIMEOUT.MAX >STA.G TimeOut rts *-------------------------------------- Wait.TimeOut sec >LDA.G TimeOut beq .9 clc .9 rts *-------------------------------------- CS.END LIBTCPIP .AZ "libtcpip.o" MSG.IPKO .AZ "TCP/IP Not Loaded/Configured." MSG.USAGE .AS "Usage : PING \r\n" .AZ " -1-9 : Ping Count\r\n" MSG.UNKNOWN .AZ "%s: Unknown host\r\n" MSG.HOSTOK .AZ "PING %d.%d.%d.%d (%s)\r\n" MSG.SKTKO .AZ "Failed to Open Socket." MSG.UNREACH .AZ "%d.%d.%d.%d: TimeOut/Host unreachable\r\n" MSG.REPLY .AZ "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\r\n" hLIBTCPIP .BS 1 *-------------------------------------- Socket .DA #S.SOCKET.T.RAW .BS 1 .DA #S.IP.PROTOCOL.ICMP .BS 1 Socket.Src.Addr .BS 4 Socket.Src.Port .DA 0 Dynamic Socket.Dst.Addr .BS 4 Socket.Dst.Port .DA 0 Identifier *-------------------------------------- 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" ICMP.RequestLen .EQ *-ICMP.Request *-------------------------------------- .DUMMY .OR 0 DS.START ArgIndex .BS 1 PingCount .BS 1 ArgHostName .BS 1 DST.IP .BS 4 hSocket .BS 1 hFrame .BS 1 Identifier .BS 2 Sequence .BS 2 TimeOut .BS 1 TimeOut.ms .BS 2 DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.SRC/BIN/PING.S ASM