PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/BIN/PING *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/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.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 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 ldx #3 .1 lda (pData),y sta Socket.Dst.Addr,x >PUSHA dey dex bpl .1 >LDYA L.MSG.HOSTOK >SYSCALL CPrintFYA 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 CPrintFYA lda #SYSMGR.ERRSYN 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.Write bcs CS.RUN.ERR jsr Init.Timeout CS.RUN.WAIT.REPLY >SYSCALL Sleep >SYSCALL GetC bcs .1 cmp #3 Ctrl-C beq .9 .1 ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.ReadA bcs .2 ldy #hFrame sta (pData),y >SYSCALL GetMemPtrA >STYA ZPFrameBase jsr CS.Print.REPLY bcs CS.RUN.ERR ldy #hFrame lda (pData),y >SYSCALL FreeMemA 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 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.UNREACH >SYSCALL CPrintFYA 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.MSG.REPLY >SYSCALL CPrintFYA rts *-------------------------------------- CS.QUIT ldy #hFrame lda (pData),y beq .1 >SYSCALL FreeMemA .1 ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA 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.\r\n" MSG.USAGE >CSTR "Usage : PING \r\n" MSG.UNKNOWN >CSTR "%S: Unknown host\r\n" MSG.HOSTOK >CSTR "PING %d.%d.%d.%d (%S)\r\n" MSG.SKTKO >CSTR "Failed to Open Socket.\r\n" MSG.UNREACH >CSTR "%d.%d.%d.%d: TimeOut/Host unreachable\r\n" MSG.REPLY >CSTR "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\r\n" hLIBTCPIP .BS 1 TimeOut.ms .BS 2 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 DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.SRC/BIN/PING.S ASM