PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF /A2OSX.DEV/BIN/RPCDUMP
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/LIBTCPIP.I
*--------------------------------------
TIMEOUT.MAX		.EQ 40					40*100ms = 4 sec.
*--------------------------------------
ZPIPCfgPtr		.EQ ZPBIN
ZPFrameBase		.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 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.Socket.Dst.Addr	.DA Socket.Dst.Addr
L.RPC.Request	.DA RPC.Request
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.UNKNOWN	.DA MSG.UNKNOWN
L.MSG.TIMEOUT	.DA MSG.TIMEOUT
L.MSG.DUMP0		.DA MSG.DUMP0
L.MSG.DUMP1		.DA MSG.DUMP1
				.DA 0
*--------------------------------------
CS.INIT			>SYSCALL SYS.GetArgC
				cmp #1
				beq .99

				>LDYA L.LIBTCPIP
				>SYSCALL SYS.LoadLibYA
				sta hLIBTCPIP

				>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG	is TCPIP loaded ?
				bcs .99
				>STYA ZPIPCfgPtr
				
				lda (ZPIPCfgPtr)		Configured ?
				bpl .99
				
				ldx #3
				ldy #S.IPCFG.IP+3
.1				lda (ZPIPCfgPtr),y
				sta Socket.Src.Addr,x
				dey
				dex
				bpl .1
				
				lda (pPs)
				ora #S.PS.F.EVENT		Now accept events
				sta (pPs)
				clc
				rts
				
.99				>LDYA L.MSG.USAGE
				>SYSCALL SYS.PrintFYA
				lda #SYSMGR.ERRSYN
				sec
				rts
*--------------------------------------
CS.RUN			jsr Init.Timeout
				
.1				>PUSHW L.Socket.Dst.Addr
				lda #1
				>SYSCALL SYS.GetArgA
				>PUSHYA
				>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
				bcc .2

				>SYSCALL SYS.Sleep
				jsr Wait.Timeout
				bcc .1
				
				lda #1
				>SYSCALL SYS.GetArgA
				>PUSHYA
				>LDYA L.MSG.UNKNOWN
				>SYSCALL SYS.PrintFYA
				sec
				rts
				
.2				>PUSHW L.Socket
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW
				bcs .99
				
				txa
				ldy #hSocket
				sta (pData),y
				
.3				>PUSHWI RPC.Request.End-RPC.Request
				>PUSHW L.RPC.Request
				ldy #hSocket
				>PUSHB (pData),y
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
				bcc .4
				
				>SYSCALL SYS.Sleep
				jsr Wait.Timeout
				bcc .3
				bra .99
				
.4				jsr Init.Timeout

.5				ldy #hSocket
				lda (pData),y
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA
				bcc .6
				
				>SYSCALL SYS.Sleep
				jsr Wait.Timeout
				bcc .5
				bra .99
			
.6				ldy #hFrame
				sta (pData),y
				>SYSCALL SYS.GetMemPtrA
				>STYA ZPFrameBase
				
				jsr DumpRPCFrame

				ldy #hFrame
				lda (pData),y
				>SYSCALL SYS.FreeMemA
				
				lda #0
				sec
				rts
				
.99				lda #1
				>SYSCALL SYS.GetArgA
				>PUSHYA
				>LDYA L.MSG.TIMEOUT
				>SYSCALL SYS.PrintFYA
				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
				
.1				bit #S.EVT.F.KEY		is it a KEY event?
				beq .8
				
				ldy #S.EVT.hDEV			is Event from active IN device?
				lda (pEvent),y
				ldy #S.PS.hINDEV
				cmp (pPs),y
				bne .9
				
				ldy #S.EVT.DATAHI		is it an O or SAPPLE key ?
				lda (pEvent),y
				bne	.9
				
				ldy #S.EVT.DATALO	
				lda (pEvent),y
				cmp #$03				Ctrl-C
				bne .8
				
				lda #$FF
				ldy #bCTRLC
				sta (pData),y
				bra .8
				
.8				clc
				rts	
*--------------------------------------
CS.QUIT			ldy #hSocket
				lda (pData),y
				>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
				
				lda hLIBTCPIP
				beq .8
				>SYSCALL SYS.UnloadLibA
				
.8				clc
				rts
*--------------------------------------
Init.Timeout	ldy #TimeOut
				lda #TIMEOUT.MAX
				sta (pData),y
				rts
*--------------------------------------
Wait.TimeOut	sec
				ldy #TimeOut
				lda (pData),y
				beq .9
				ldy #bCTRLC
				lda (pData),y
				bmi .9
				clc
.9				rts
*--------------------------------------
DumpRPCFrame	lda #S.UDP+24
				clc
				adc ZPFrameBase
				sta ZPFrameBase
				lda /S.UDP+24
				adc ZPFrameBase+1
				sta ZPFrameBase+1

				>LDYA L.MSG.DUMP0
				>SYSCALL SYS.PrintFYA
				
.1				ldy #3
				lda (ZPFrameBase),y		Value follows?
				beq .9
				
				ldy #18					port
				>PUSHB (ZPFrameBase),y
				iny
				>PUSHB (ZPFrameBase),y

				ldy #15					proto
				>PUSHB (ZPFrameBase),y

				ldy #11					version
				>PUSHB (ZPFrameBase),y
				
				ldy #4					program
.7				>PUSHB (ZPFrameBase),y
				iny
				cpy #8
				bne .7

				>LDYA L.MSG.DUMP1
				>SYSCALL SYS.PrintFYA
				
				lda #20
				clc
				adc ZPFrameBase
				sta ZPFrameBase
				bcc .1
				inc ZPFrameBase+1
				bra .1
				
.9				rts
*--------------------------------------
CS.END
LIBTCPIP		>PSTRING "libtcpip.o"
MSG.USAGE		>CSTRING "Usage : RPCDUMP <ip|host>\n"
MSG.UNKNOWN		>CSTRING "%S: Unknown host\n"
MSG.TIMEOUT		>CSTRING "No response from %S\n"
MSG.DUMP0		>CSTRING "Program     Ver Proto:Port\n"
MSG.DUMP1		>CSTRING "%10L  %2d     %2d:%D\n"
Socket			.DA #S.SOCKET.SOCK.DGRAM
				.BS 3
Socket.Src.Addr	.BS 4
Socket.Src.Port	.DA 0					Dynamic
Socket.Dst.Addr	.BS 4
Socket.Dst.Port	.DA UDP.PORT.PMAP
				.BS 16
*--------------------------------------
RPC.Request		.HS 12345678			XID
				.HS 00000000			0=CALL
				.HS 00000002			RPCVERS
				.HS 000186A0			PROG=portmapper
				.HS 00000002			VERS
				.HS 00000004			PMAPPROC_DUMP
				.HS 00000000			CRED
				.HS 00000000	
				.HS 00000000			VERF
				.HS 00000000
RPC.Request.End	.EQ *
hLIBTCPIP		.BS 1
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
hSocket			.BS 1
hFrame			.BS 1
TimeOut			.BS 1
bCTRLC			.BS 1
DS.END
				.ED
*--------------------------------------
MAN
SAVE BIN/RPCDUMP.S
ASM
