A2osX/BIN/PING.S.txt
2017-01-29 22:47:19 +01:00

397 lines
7.0 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.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.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
.DA 0
*--------------------------------------
CS.INIT >SYSCALL GetArgC
cmp #1
bne .1
lda #SYSMGR.ERRSYN
sec
rts
.1 >LDYA L.LIBTCPIP
>SYSCALL LoadLibYA
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ?
bcs .9
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bpl .9
ldy #S.IPCFG.HDEV
lda (ZPIPCfgPtr),y
sta hDev
lda A2OSX.RANDOM16
ldy #Identifier
sta (pData),y
lda A2OSX.RANDOM16+1
iny
sta (pData),y
lda #0
ldy #Sequence
sta (pData),y
iny
sta (pData),y
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
.9 sec
rts
*--------------------------------------
CS.RUN jsr Init.Timeout
.1 >PUSHW pData DST.IP
lda #1
>SYSCALL GetArgA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
bcc .2
>SYSCALL Sleep
jsr Wait.Timeout
bcc .1
lda #1
>SYSCALL GetArgA
>PUSHYA
>LDYA L.MSG0
>SYSCALL CPrintFYA
lda #1
sec
rts
.2 lda #1
>SYSCALL GetArgA
>PUSHYA
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.MSG1
>SYSCALL CPrintFYA
CS.RUN.ECHO >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.ICMP.FRAME
>STYA ZPFrameBase
txa
ldy #hFrame
sta (pData),y
lda #S.ICMP+32-2
sta (ZPFrameBase)
lda /S.ICMP+32-2
ldy #1
sta (ZPFrameBase),y
ldx #3
ldy #0
.10 lda (pData),y
pha
iny
dex
bpl .10
ldx #3
ldy #S.IP.DST+3
.1 pla
sta (ZPFrameBase),y
dey
dex
bpl .1
ldy #S.ICMP.TYPE
lda #S.ICMP.TYPE.ECHOREQ
sta (ZPFrameBase),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
*--------------------------------------
ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL GetMemPtrA
>STYA ZPFrameBase
ldy #S.IP.PROTOCOL
lda (ZPFrameBase),y
cmp #S.IP.PROTOCOL.ICMP
bne .9
ldy #S.ICMP.TYPE
lda (ZPFrameBase),y
cmp #S.ICMP.TYPE.ECHOREP
bne .9
ldy #S.ICMP.IDENTIFIER
lda (ZPFrameBase),y
tax
iny
lda (ZPFrameBase),y
ldy #Identifier+1
cmp (pData),y
bne .9
dey
txa
cmp (pData),y
bne .9
jsr CS.EVENT.REPLY
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.EVENT.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"
MSG0 >CSTR "%S: Unknown host\n"
MSG1 >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
hDev .BS 1
TimeOut.ms .BS 2
*--------------------------------------
.DUMMY
.OR 0
DS.START
DST.IP .BS 4
hFrame .BS 1
TimeOut .BS 1
Identifier .BS 2
Sequence .BS 2
bReply .BS 1
DS.END
.ED
*--------------------------------------
MAN
SAVE BIN/PING.S
ASM