A2osX/BIN/PING.S.txt
2017-08-25 17:02:16 +02:00

367 lines
7.2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 PrintF.YA
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 GetArg.A
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
bcc CS.RUN.HOSTOK
>SYSCALL Sleep
jsr Wait.Timeout
bcc .2
lda #1
>SYSCALL GetArg.A
>PUSHYA
>LDYA L.MSG.UNKNOWN
bra .99
.9 >LDYA L.MSG.USAGE
.99 >SYSCALL PrintF.YA
lda #SYSMGR.ERRSYN
sec
rts
CS.RUN.HOSTOK lda #1
>SYSCALL GetArg.A
>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 PrintF.YA
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 PrintF.YA
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 GetMemPtr.A
>STYA ZPFrameBase
jsr CS.Print.REPLY
bcs CS.RUN.ERR
ldy #hFrame
lda (pData),y
>SYSCALL FreeMem.A
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 PrintF.YA
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 PrintF.YA
rts
*--------------------------------------
CS.QUIT ldy #hFrame
lda (pData),y
beq .1
>SYSCALL FreeMem.A
.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 <ip|host>\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