NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/DEV/MEMDUMP
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/KERNEL.I
*--------------------------------------
PAGELEN			.EQ 22
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPTR1			.BS 2
ZPPTR2			.BS 2
ZPPSPtr			.BS 2
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.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
L.MSG4			.DA MSG4
L.MSG5			.DA MSG5
L.MSG.FREE		.DA MSG.FREE
				.DA 0
*--------------------------------------
CS.INIT			lda #0
				>STA.G MEM.COUNT			Skip SLOT 0

				>LEA.G MemStat
				>SYSCALL GetMemStat

				clc
				rts
*--------------------------------------
CS.RUN			>SYSCALL GetChar
				bcs .13
				
				cmp #3					Ctrl-C ?
				beq .9
				
				cmp #19					Ctrl-S ?
				bne .12
				
				>LDA.G bSTOP
				eor #$ff
				sta (pData),y
				bra .13
				
.12				>STZ.G bSTOP
				
.13				>LDA.G bSTOP
				bne .8
				
				>INC.G MEM.COUNT
				>SYSCALL GetMemByID
				>STYA ZPPTR1
				
				>LDA.G LINE.COUNT
				bne .1
				
				>LDYA L.MSG0
				>SYSCALL puts

.1				lda (ZPPTR1)
				bpl .2
				
				>INC.G USED.COUNT
				
.2				jsr CS.RUN.PRINTMEM
				
				>LDA.G MEM.COUNT
				>CMP.G MemStat+S.MSTAT.MLast
				beq CS.RUN.FOOTER
				
.8				clc
				rts
				
.9				sec
				rts
				
CS.RUN.FOOTER	>SYSCALL GetChar
				bcs CS.RUN.FOOTER
				
				>PUSHB.G MEM.COUNT
				>PUSHB.G USED.COUNT
				>PUSHBI 2
				>LDYA L.MSG2
				>SYSCALL printf

				>PUSHW.G MemStat+S.MSTAT.MH
				>PUSHBI 2
				>LDYA L.MSG3
				>SYSCALL printf

				>PUSHW.G MemStat+S.MSTAT.MF
				>PUSHBI 2
				>LDYA L.MSG4
				>SYSCALL printf

				>PUSHW.G MemStat+S.MSTAT.ML
				>PUSHBI 2
				>LDYA L.MSG5
				>SYSCALL printf
				
				sec
				>LDA.G MemStat+S.MSTAT.MF
				>SBC.G MemStat+S.MSTAT.ML
				pha
				>LDA.G MemStat+S.MSTAT.MF+1
				>SBC.G MemStat+S.MSTAT.ML+1
				ply
				
				>PUSHYA
				>PUSHBI 2
				>LDYA L.MSG.FREE
				>SYSCALL printf
				lda #0
				sec				
				rts
*--------------------------------------
CS.RUN.PRINTMEM	ldy #S.MEM.LEN+1

				ldx #4
				
.13				lda (ZPPTR1),y
				>PUSHA
				dey
				dex
				bne .13
				
				ldy #S.MEM.REFCNT
				lda (ZPPTR1),y
				>PUSHA
				
				ldy #S.MEM.OWNERPID
				lda (ZPPTR1),y
				>PUSHA
				
				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				
				
				>PUSHB.G MEM.COUNT
				
				lda (ZPPTR1)			Get flags
				bpl .12
				
				ldy #S.MEM.OWNERPID
				lda (ZPPTR1),y
				jsr CS.RUN.CHECKPS
				bcc .12
				
				>PUSHBI 0
				>LDYA L.MSG1.INV
				>SYSCALL printf
	
.12				>PUSHBI 9
				>LDYA L.MSG1
				>SYSCALL printf
	
				lda (ZPPTR1)
				and #S.MEM.F.CODE
				bne CS.RUN.PRINTMEM.BIN
				
****** 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				tya
				beq .2					Startig with 0...PrintHEX
				
				>PUSHW ZPPTR2			String
				tya						Len
				>PUSHA
				>PUSHBI 3
				>LDYA L.MSG1.STR
				bra CS.RUN.PRINTMEM.OUT

.2				ldy #15

.3				>PUSHB (ZPPTR2),y
				dey
				bpl .3
				
				>PUSHBI 16
				>LDYA L.MSG1.HEX			
				bra CS.RUN.PRINTMEM.OUT
				
CS.RUN.PRINTMEM.BIN
				
				ldy #S.MEM.BIN
				lda (ZPPTR1),y
				>SYSCALL GetMemPtr
				>PUSHYA
				>PUSHBI 2
				>LDYA L.MSG1.BIN
				
CS.RUN.PRINTMEM.OUT
				>SYSCALL printf
				
				>INC.G LINE.COUNT
				cmp #PAGELEN
				beq .9
				rts
				
.9				lda #$FF
				>STA.G bSTOP
				
				inc
				>STA.G LINE.COUNT
				
				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
MSG0			.AZ " #  Flags    PID REF PTR   LEN   BINPATH/DATA"
MSG1.INV		.AZ "\e[7m"
MSG1			.AZ "$%h %s %3d %3d $%H %5D "
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			.AZ "High Memory:   $%H\r\n"
MSG4			.AZ "Free ULimit:   $%H\r\n"
MSG5			.AZ "Low Memory:    $%H\r\n"
MSG.FREE		.AZ "\r\nFree Memory:   %D Bytes.\r\n"
MSG.FLAGS		.AS "UZNAfcds"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
LINE.COUNT		.BS 1
MEM.COUNT		.BS 1
USED.COUNT		.BS 1
bSTOP			.BS 1
MemStat			.BS S.MSTAT
MEM.FLAGS		.BS 9
DS.END
				.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/MEMDUMP.S
ASM
