NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF bin/memdump
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/kernel.i
				.INB inc/io.i
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPTR1			.BS 2
ZPPTR2			.BS 2
MEM.COUNT		.BS 1
USED.COUNT		.BS 1
bSTOP			.BS 1

ZPReadAux		sta SETREADAUX
				lda (ZPPTR1),y
				sta CLRREADAUX
				rts
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.INV		.DA MSG1.INV
L.MSG1			.DA MSG1
L.MSG1X			.DA MSG1X
L.MSG1.BIN		.DA MSG1.BIN
L.MSG1.STR		.DA MSG1.STR
L.MSG1.HEX		.DA MSG1.HEX
L.MSG2			.DA MSG2
L.MSG3			.DA MSG3
				.DA 0
*--------------------------------------
CS.INIT			clc
CS.INIT.RTS		rts
*--------------------------------------
CS.RUN			ldx #ZPCodeLen-1

.1				lda ZPCode,x
				sta ZPReadAux,x
				dex
				bpl .1

				>LEA.G MemStat
				>SYSCALL GetMemStat

				jsr CS.RUN.INIT

CS.RUN.LOOP		inc MEM.COUNT			skip slot 0
				
				lda bSTOP
				beq .1

.10				>SYSCALL GetChar
				bcs CS.INIT.RTS
				
				cmp #3					Ctrl-C
				beq CS.INIT.RTS

				cmp #$13				Ctrl-S
				
				stz bSTOP
.1				lda (ZPPTR1)
				bpl .2
				
				inc USED.COUNT
				
.2				jsr CS.RUN.PRINTMEM
				lda ZPPTR1
				clc
				adc #S.MEM
				sta ZPPTR1
				bcc .3
				inc ZPPTR1+1
				
.3				lda MEM.COUNT
				>CMP.G MemStat+S.MSTAT.MLast
				bne CS.RUN.LOOP
				
				jsr CS.RUN.MSTAT
				
				jsr CS.RUN.INIT
				
CS.RUN.LOOPX	inc MEM.COUNT			skip slot 0
				
				lda bSTOP
				beq .1

.10				>SYSCALL GetChar
				bcs CS.INIT.RTS
				
				cmp #3					Ctrl-C ?
				beq CS.INIT.RTS

				cmp #$13				Ctrl-S
				bne .10
				
				stz bSTOP
				
.1				ldy #S.MEM.F
				jsr ZPReadAux
				bpl .2
				
				inc USED.COUNT
				
.2				jsr CS.RUN.PRINTMEMX

				lda ZPPTR1
				clc
				adc #S.MEM
				sta ZPPTR1
				bcc .3
				inc ZPPTR1+1
				
.3				lda MEM.COUNT
				>CMP.G MemStat+S.MSTAT.XLast
				bne CS.RUN.LOOPX

CS.RUN.XSTAT	>PUSHW L.MSG2
				>PUSHB USED.COUNT
				>PUSHB MEM.COUNT
				>PUSHBI 2
				>SYSCALL PrintF

				>PUSHW L.MSG3
				>PUSHW.G MemStat+S.MSTAT.XH
				>PUSHW.G MemStat+S.MSTAT.XF
				>PUSHW.G MemStat+S.MSTAT.XL
				>LDA.G MemStat+S.MSTAT.XF
				sec
				>SBC.G MemStat+S.MSTAT.XL
				pha
				>LDA.G MemStat+S.MSTAT.XF+1
				>SBC.G MemStat+S.MSTAT.XL+1
				ply
				>PUSHYA
				>PUSHBI 8
				>SYSCALL PrintF
				
				lda #0
				sec
				rts

*--------------------------------------
CS.RUN.MSTAT	>PUSHW L.MSG2
				>PUSHB USED.COUNT
				>PUSHB MEM.COUNT
				>PUSHBI 2
				>SYSCALL PrintF

				>PUSHW L.MSG3
				>PUSHW.G MemStat+S.MSTAT.MH
				>PUSHW.G MemStat+S.MSTAT.MF
				>PUSHW.G MemStat+S.MSTAT.ML
				>LDA.G MemStat+S.MSTAT.MF
				sec
				>SBC.G MemStat+S.MSTAT.ML
				pha
				>LDA.G MemStat+S.MSTAT.MF+1
				>SBC.G MemStat+S.MSTAT.ML+1
				ply
				>PUSHYA
				>PUSHBI 8
				>SYSCALL PrintF
				
				lda #0
				sec
				rts
*--------------------------------------
CS.RUN.INIT		>LDYAI Mem.Table+S.MEM	skip slot 0
				>STYA ZPPTR1

				>LDYA L.MSG0
				>SYSCALL PutS
				
				stz MEM.COUNT
				stz USED.COUNT
				rts
*--------------------------------------
CS.RUN.PRINTMEM	>PUSHW L.MSG1
				
				>PUSHB MEM.COUNT

				lda (ZPPTR1)			Get flags
				ldy #MEM.FLAGS+7
				ldx #7
				
.20				lsr
				pha
				lda #'-'
				bcc .30
				
				lda MSG.FLAGS,x
				
.30				sta (pData),y
				pla
				dey
				dex
				bpl .20

				>PUSHEA.G MEM.FLAGS

				ldy #S.MEM.OWNERPID
				lda (ZPPTR1),y
				tax
				>PUSHA

				ldy #S.MEM.REFCNT
				lda (ZPPTR1),y
				>PUSHA
				
				ldy #S.MEM.PTR+1
				lda (ZPPTR1),y
				>PUSHA
				dey
				lda (ZPPTR1),y
				>PUSHA
				
				ldy #S.MEM.LEN+1
				lda (ZPPTR1),y
				>PUSHA
				dey
				lda (ZPPTR1),y
				>PUSHA
				
				lda (ZPPTR1)			Get flags
				bpl .12
				
				txa
				jsr CS.RUN.CHECKPS
				bcc .12
				
				>PUSHW L.MSG1.INV
				>PUSHBI 0
				>SYSCALL PrintF
	
.12				>PUSHBI 9
				>SYSCALL PrintF
	
				lda (ZPPTR1)
				and #S.MEM.F.CODE
				bne CS.RUN.PRINTMEM.BIN
				
CS.RUN.PRINTMEM.DATA

				ldy #S.MEM.PTR
				lda (ZPPTR1),y
				sta ZPPTR2
				iny
				lda (ZPPTR1),y
				sta ZPPTR2+1
				
				ldy #0
				
.1				lda (ZPPTR2),y			Check if it looks like a printable string
				beq .11
				
				bmi .2
				
				cmp #$20
				bcc .2					not printable....->hex
				
				iny
				bne .1

.11				>PUSHW L.MSG1.STR
				tya
				beq .2					Starting with 0...PrintHEX
				
				>PUSHA					len
				>PUSHW ZPPTR2			String
				>PUSHBI 3
				
				>SYSCALL PrintF
				rts

.2				>PUSHW L.MSG1.HEX
				
				ldy #0

.3				>PUSHB (ZPPTR2),y
				iny
				cpy #16
				bne .3
				
				>PUSHBI 16
				
				>SYSCALL PrintF
				rts
				
CS.RUN.PRINTMEM.BIN
				>PUSHW L.MSG1.BIN

				ldy #S.MEM.BIN
				lda (ZPPTR1),y
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI 2
				>SYSCALL PrintF
				rts
*--------------------------------------
CS.RUN.PRINTMEMX
				>PUSHW L.MSG1X
				
				>PUSHB MEM.COUNT

				ldy #S.MEM.F			Get flags
				jsr ZPReadAux
				
				ldy #MEM.FLAGS+7
				ldx #7
				
.20				lsr
				pha
				lda #'-'
				bcc .30
				
				lda MSG.FLAGSX,x
				
.30				sta (pData),y
				pla
				dey
				dex
				bpl .20

				>PUSHEA.G MEM.FLAGS

				ldy #S.MEM.OWNERPID
				jsr ZPReadAux
				tax
				>PUSHA

				ldy #S.MEM.REFCNT
				jsr ZPReadAux
				>PUSHA
				
				ldy #S.MEM.PTR+1
				jsr ZPReadAux
				>PUSHA
				dey
				jsr ZPReadAux
				>PUSHA
				
				ldy #S.MEM.LEN+1
				jsr ZPReadAux
				>PUSHA
				dey
				jsr ZPReadAux
				>PUSHA
				
				ldy #S.MEM.F
				jsr ZPReadAux			Get flags
				bpl .12
	
				txa
				jsr CS.RUN.CHECKPS
				bcc .12
			
				>PUSHW L.MSG1.INV
				>PUSHBI 0
				>SYSCALL PrintF
	
.12				>PUSHBI 9
				>SYSCALL PrintF
				rts
*--------------------------------------
CS.RUN.CHECKPS	ldx #0

.1				cmp PS.Table.PID,x
				beq .8
				
				inx
				cpx #K.PS.MAX
				bne .1

				rts						CS

.8				clc
				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			clc
				rts
*--------------------------------------
CS.END
ZPCode			sta SETREADAUX
				lda (ZPPTR1),y
				sta CLRREADAUX
				rts
ZPCodeLen		.EQ *-ZPCode			
*--------------------------------------
MSG0			.AZ "hMem Flags    PID REF PTR   LEN   BINPATH/DATA"
MSG1.INV		.AZ "\e[7m"
MSG1			.AZ "$%h  %s %3d %3d $%H %5D "
MSG1X			.AZ "$%h  %s %3d %3d $%H %5D\e[0m\r\n"
MSG1.BIN		.AZ "{%s}\e[0m\r\n"
MSG1.STR		.AZ "[%03d:%s]\e[0m\r\n"
MSG1.HEX		.AZ "?HEX:%h%h.%h%h.%h%h.%h%h.%h%h.%h%h.%h%h.%h%h\e[0m\r\n"
MSG2			.AZ "\r\nAllocated hMem:%d, Total:%d\r\n"
MSG3			.AS "High Memory:   $%H\r\n"
				.AS "Free ULimit:   $%H\r\n"
				.AS "Low Memory:    $%H\r\n"
				.AZ "\r\nFree Memory:   %D Bytes.\r\n\r\n"
MSG.FLAGS		.AS "UZXAfcds"
MSG.FLAGSX		.AS "UZXAidep"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
MemStat			.BS S.MSTAT
MEM.FLAGS		.BS 9
DS.END			.ED
*--------------------------------------
MAN
SAVE usr/src/bin/memdump.s
ASM
