NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/netstat
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/eth.i
				.INB inc/net.tcpip.i
				.INB inc/libtcpip.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPTR1			.BS 2
FDIndex			.BS 1
ZS.END			.ED
*--------------------------------------
*			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 Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #64					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.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.MSG1.T		.DA MSG1.T.RAW
				.DA MSG1.T.DGRAM
				.DA MSG1.T.SEQPKT
				.DA MSG1.T.STREAM
				.DA MSG1.T.INV
L.MSG1.P		.DA MSG1.P.ICMP
				.DA MSG1.P.TCP
				.DA MSG1.P.UDP
				.DA MSG1.P.INV
L.MSG1.S		.DA MSG1.S.0
				.DA MSG1.S.1
				.DA MSG1.S.2
				.DA MSG1.S.3
				.DA MSG1.S.4
				.DA MSG1.S.5
				.DA MSG1.S.6
				.DA MSG1.S.7
				.DA MSG1.S.8
				.DA MSG1.S.9
				.DA MSG1.S.10
				.DA MSG1.S.11
				.DA MSG1.S.INV
				.DA 0
*--------------------------------------
CS.INIT			>LDYA L.LIBTCPIP
				>SYSCALL LoadLib
				bcs .9

				sta hLIBTCPIP

.9				rts
*--------------------------------------
CS.RUN			>LDYA L.MSG0
				>SYSCALL PutS
			
				inc FDIndex
				ldx FDIndex

.1				lda FDs.pHI-1,x
				beq .7

				ldy FDs.pLO-1,x
				>STYA ZPPTR1

				lda (ZPPTR1)
				cmp #S.FD.T.DSOCK
				beq .2
				
				cmp #S.FD.T.SSOCK
				bne .7

.2				ldy #S.SOCKET.AF
				lda (ZPPTR1),y
				cmp #AF.INET
				bne .7

				>PUSHW L.MSG1

				jsr CS.RUN.TP

				ldy	#S.SOCKET.LOC.ADDR
				jsr CS.RUN.A

				ldy	#S.SOCKET.REM.ADDR
				jsr CS.RUN.A
				
				ldy #S.SOCKET.O
				>PUSHB (ZPPTR1),y
				
				jsr CS.RUN.S			2 bytes
				>PUSHBI 19

				>SYSCALL PrintF
				bcs .9
				
.7				inc FDIndex
				ldx FDIndex
				cpx #K.FD.MAX+1
				bcc .1

				lda #0					tell TSKMGR that all done ok, but 
*				sec						we do not want to stay in memory
.9				rts
*--------------------------------------
CS.RUN.TP		ldy #S.SOCKET.T
				lda (ZPPTR1),y
				tax
				cpx #S.SOCKET.T.STREAM+1
				bcc .1

				ldx #S.SOCKET.T.STREAM+1
				
.1				>PUSHB L.MSG1.T+1,x
				>PUSHB L.MSG1.T,x

				ldy #S.SOCKET.PROTO
				lda (ZPPTR1),y

				ldx #0
				
.3				cmp PROTO,x
				beq .4

				inx
				cpx #PROTO.Cnt
				bne .3
				
.4				txa
				asl
				tax
				>PUSHB L.MSG1.P+1,x
				>PUSHB L.MSG1.P,x
				rts
*--------------------------------------
CS.RUN.A		ldx #4

.2				>PUSHB (ZPPTR1),y
				iny
				dex
				bne .2

				iny
				>PUSHB (ZPPTR1),y
				dey
				>PUSHB (ZPPTR1),y

				rts
*--------------------------------------
CS.RUN.S		ldy #S.SOCKET.TCP.S
				lda (ZPPTR1),y

				cmp #S.SOCKET.TCP.S.TIMEWT+1
				bcc .1

				lda #S.SOCKET.TCP.S.TIMEWT+1
	
.1				asl
				tax
				>PUSHB L.MSG1.S+1,x
				>PUSHB L.MSG1.S,x
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			lda hLIBTCPIP
				beq .8

				>SYSCALL UnloadLib
.8				clc
				rts
*--------------------------------------
CS.END
LIBTCPIP		.AZ "libtcpip"
hLIBTCPIP		.BS	1
MSG0			.AZ "Type   Prot Local                 Remote                Options  Status"
MSG1			.CZ "%s %s %3d.%3d.%3d.%3d:%5D %3d.%3d.%3d.%3d:%5D %b %s\r\n"
MSG1.T.RAW		.AZ "RAW   "
MSG1.T.DGRAM	.AZ "DGRAM "
MSG1.T.SEQPKT	.AZ "SEQPKT"
MSG1.T.STREAM	.AZ "STREAM"
MSG1.T.INV		.AZ "???   "
PROTO			.DA #S.IP.PROTOCOL.ICMP,#S.IP.PROTOCOL.TCP,#S.IP.PROTOCOL.UDP
PROTO.Cnt		.EQ *-PROTO
MSG1.P.ICMP		.AZ "ICMP"
MSG1.P.TCP		.AZ "TCP "
MSG1.P.UDP		.AZ "UDP "
MSG1.P.INV		.AZ "??? "
MSG1.S.0		.AZ "*"
MSG1.S.1		.AZ "OPENED"
MSG1.S.2		.AZ "LISTENING"
MSG1.S.3		.AZ "SYN-SENT"
MSG1.S.4		.AZ "SYN-RECEIVED"
MSG1.S.5		.AZ "ESTABLISHED"
MSG1.S.6		.AZ "CLOSE-WAIT"
MSG1.S.7		.AZ "LAST-ACK"
MSG1.S.8		.AZ "FIN-WAIT-1"
MSG1.S.9		.AZ "FIN-WAIT-2"
MSG1.S.10		.AZ "CLOSING"
MSG1.S.11		.AZ "TIME-WAIT"
MSG1.S.INV		.AZ "???"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/netstat.s
ASM
