NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/ps
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPSPtr			.BS 2
ZPSessionPtr	.BS 2
ZPArgV			.BS 2
Index			.BS 1
hSession		.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					S.PS.F.EVENT
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #32					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.MSG0			.DA MSG0
L.MSG1			.DA MSG1
L.MSG2			.DA MSG2
L.MSG3			.DA MSG3
L.STATUS		.DA MSG.INIT
				.DA MSG.RUN
				.DA MSG.EVENT
				.DA MSG.QUIT
				.DA 0
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			lda #1
				>SYSCALL ArgV
				bcs .10

				>SYSCALL AToI
				bcs .90

				tax
				bne .90

				tya

*				ldx #0

.11				cmp PS.Table.PID,x	
				beq .12

				inx
				cpx #K.PS.MAX
				bne .11

				lda #E.NSP
*				sec
				rts

.12				lda PS.Table.hPS,x
				jsr CS.RUN.DUMP
				bcs .9

				lda #0
				sec
				rts

.10				>LDYA L.MSG0
				>SYSCALL Puts
				ldx Index

.1				lda PS.Table.hPS,x
				beq .7

				jsr CS.RUN.DUMP
				>SLEEP

.7				inc Index
				ldx Index
				cpx #K.PS.MAX
				bne .1

.8				lda #0					tell Kernel that all done ok, but 
				sec						we do not want to stay in memory
.9				rts

.90				lda #E.SYN
				sec
				rts
*--------------------------------------
CS.RUN.DUMP		>SYSCALL GetMemPtr
				>STYA ZPPSPtr

				>PUSHW L.MSG1
				
				ldx Index
				lda PS.Table.hPS,x
				>PUSHA

				ldy #S.PS.PPID

.1				lda (ZPPSPtr),y
				>PUSHA
				iny
				cpy #S.PS.CPID+1
				bne .1
				
				lda PS.Table.Stats,x
				>PUSHA					CPU%

				ldy #S.PS.S
				lda (ZPPSPtr),y
				tax

				>PUSHW L.STATUS,x

				jsr CS.RUN.DecodeFlags
				>PUSHEA.G PS.FLAGS

				ldy #S.PS.hSession
				lda (ZPPSPtr),y
				tax
				lda S.Table.hSID-1,x
				>SYSCALL GetStkObj
				bcs .9
				
				>STYA ZPSessionPtr
				stx hSession
				
				ldy #S.SESSION.UID
				lda (ZPSessionPtr),y
				>PUSHA
				
				>PUSHBI 10
			
				>SYSCALL PrintF

				lda hSession
				>SYSCALL FreeMem

				jmp CS.RUN.PrintArgs
.9				rts
*--------------------------------------
CS.RUN.DecodeFlags
				lda (ZPPSPtr)			Get flags
				ldy #PS.FLAGS+7
				ldx #7

.2				lsr
				pha
				lda #'-'
				bcc .3

				lda MSG.FLAGS,x

.3				sta (pData),y
				pla
				dey
				dex
				bpl .2	

				rts
*--------------------------------------
CS.RUN.PrintArgs
				ldy #S.PS.hARGV
				lda (ZPPSPtr),y
				beq .8					NO ARGV in PS0

				>SYSCALL GetMemPtr
				>STYA ZPArgV

.1				lda (ZPArgV)
				beq .8

				>PUSHW L.MSG2
				>PUSHW ZPArgV
				>PUSHBI 2
				>SYSCALL PrintF
				bcs .9

.2				inc ZPArgV
				bne .3

				inc ZPArgV+1
.3				lda (ZPArgV)
				bne .2

				inc ZPArgV
				bne .1

				inc ZPArgV+1
				bra .1

.8				>LDYA L.MSG3
				>SYSCALL Puts
.9				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			clc
				rts
*--------------------------------------
CS.END			
MSG0			.DA #C.ESC
				.AZ "[?7lhPS pPID  PID cPID CPU% Status Flags    UID Args"
MSG1			.AZ "%3d  %3d  %3d  %3d %3d\% %6s %s %3d"
MSG2			.AS " %s"
MSG3			.DA #0
MSG.FLAGS		.AS "HS???XEN"
MSG.INIT		.AZ "Init"
MSG.RUN			.AZ "Run"
MSG.EVENT		.AZ "Event"
MSG.QUIT		.AZ "Quit"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
PS.FLAGS		.BS 9
DS.END
				.ED
*--------------------------------------
MAN
SAVE usr/src/bin/ps.s
ASM
