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 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 #64 SS .DA #8 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 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 puts lda #K.E.SYN sec rts CS.RUN.IPOK ldy #S.PS.ARGC lda (pPs),y beq .9 jsr Init.Timeout .2 >PUSHW pData DST.IP lda #1 >SYSCALL GetArg >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME bcc CS.RUN.HOSTOK >SLEEP jsr Wait.Timeout bcc .2 lda #1 >SYSCALL GetArg >PUSHYA >PUSHBI 2 >LDYA L.MSG.UNKNOWN >SYSCALL printf bra .99 .9 >LDYA L.MSG.USAGE >SYSCALL puts .99 lda #K.E.SYN sec rts CS.RUN.HOSTOK lda #1 >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 txa ldy #hSocket sta (pData),y 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 ldy #hSocket >PUSHB (pData),y >PUSHW L.ICMP.Request >PUSHWI ICMP.RequestLen >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 .9 .1 ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Rcvd bcs .2 ldy #hFrame sta (pData),y >SYSCALL GetMemPtr >STYA ZPFrameBase jsr CS.Print.REPLY bcs CS.RUN.ERR ldy #hFrame lda (pData),y >SYSCALL FreeMem ldy #hFrame lda #0 sta (pData),y jmp CS.RUN.SEND.ECHO .2 jsr Wait.Timeout bcc CS.RUN.WAIT.REPLY jsr CS.Print.UNREACH bcs CS.RUN.ERR jmp CS.RUN.SEND.ECHO .9 lda #0 sec CS.RUN.ERR 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.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 tay beq .3 .1 >LDA.G TimeOut.ms clc adc #100 >STA.G TimeOut.ms bcc .2 >INC.G TimeOut.ms+1 .2 dey bne .1 .3 >PUSHW.G TimeOut.ms ldy #S.IP.TTL >PUSHB (ZPFrameBase),y ldy #S.ICMP.SEQUENCE+1 >PUSHB (ZPFrameBase),y dey >PUSHB (ZPFrameBase),y ldx #4 ldy #S.IP.SRC+3 .4 >PUSHB (ZPFrameBase),y dey dex bne .4 >PUSHBI 9 >LDYA L.MSG.REPLY >SYSCALL printf rts *-------------------------------------- CS.QUIT ldy #hFrame lda (pData),y beq .1 >SYSCALL FreeMem .1 ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.Close lda hLIBTCPIP >SYSCALL UnloadLib 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 .AZ "libtcpip.o" MSG.IPKO .AZ "TCP/IP Not Loaded/Configured." MSG.USAGE .AZ "Usage : PING " 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.SOCK.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 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