PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF /A2OSX.DEV/BIN/MEMDUMP
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
*--------------------------------------
PAGELEN			.EQ 22
FOOTERLEN		.EQ 8
*--------------------------------------
ZPPTR1			.EQ ZPBIN
ZPPTR2			.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
*--------------------------------------
* Relocation Table
*--------------------------------------				
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT		
				.DA	CS.QUIT
L.MSG0			.DA MSG0
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.MSG6			.DA MSG6
				.DA 0
*--------------------------------------
CS.INIT			ldy #MEM.COUNT			Skip SLOT0
				lda (pData),y
				inc
				sta (pData),y

				lda (pPs)
				ora #S.PS.F.EVENT		Now accept events
				sta (pPs)
				clc
.9				rts
*--------------------------------------
CS.RUN			ldy #bCANCEL
				lda (pData),y
				bne .9
				
				ldy #bSTOP
				lda (pData),y
				bne .8
				
				ldy #MEM.COUNT
				lda (pData),y
				cmp MemMgr.LastSlot
				beq .10

				ldy #LINE.COUNT
				lda (pData),y
				bne .1
				
				>LDYA L.MSG0
				>SYSCALL SYS.PrintFYA

.1				ldy #MEM.COUNT
				lda (pData),y
				>SYSCALL SYS.GetMemByIDA
				>STYA ZPPTR1
				lda (ZPPTR1)
				bpl .2
				
				ldy #USED.COUNT
				lda (pData),y
				inc
				sta (pData),y
				
.2				jsr CS.RUN.PRINTMEM
				
				ldy #MEM.COUNT
				lda (pData),y
				inc
				sta (pData),y
				
.8				clc
				rts
				
.9				sec
				rts
				
.10				ldy #LINE.COUNT
				lda (pData),y
				clc
				adc #FOOTERLEN
				cmp #PAGELEN
				bcc .11
				
				lda #$FF
				ldy #bSTOP
				sta (pData),y
				
				lda #0
				ldy #LINE.COUNT
				sta (pData),y
				
				clc
				rts
				
.11				ldy #MEM.COUNT
				>PUSHB (pData),y
				ldy #USED.COUNT
				>PUSHB (pData),y
				>LDYA L.MSG2
				>SYSCALL SYS.PrintFYA

				>PUSHW MemMgr.HiMem
				>LDYA L.MSG3
				>SYSCALL SYS.PrintFYA

				>PUSHW MemMgr.Free
				>LDYA L.MSG4
				>SYSCALL SYS.PrintFYA

				>PUSHW MemMgr.LoMem
				>LDYA L.MSG5
				>SYSCALL SYS.PrintFYA
				
				lda MemMgr.Free
				sec
				sbc MemMgr.LoMem
				tay
				lda MemMgr.Free+1
				sbc MemMgr.LoMem+1
				
				>PUSHYA
				>LDYA L.MSG6
				>SYSCALL SYS.PrintFYA
				sec				
				rts
*--------------------------------------
CS.RUN.PRINTMEM	ldy #S.MEM.LEN
				lda (ZPPTR1),y
				pha
				iny
				lda (ZPPTR1),y
				ply
				>PUSHYA
				
				ldy #S.MEM.PTR
				lda (ZPPTR1),y
				pha
				iny
				lda (ZPPTR1),y
				ply
				>PUSHYA
				
				ldy #S.MEM.REFCNT
				lda (ZPPTR1),y
				>PUSHA
				
				ldy #S.MEM.OWNERPID
				lda (ZPPTR1),y
				>PUSHA
				
				lda (ZPPTR1)
				>PUSHA
				
				ldy #MEM.COUNT
				lda (pData),y
				>PUSHA
				
				>LDYA L.MSG1
				>SYSCALL SYS.PrintFYA
				
				ldy #S.MEM.BIN
				lda (ZPPTR1),y
				bne .7
****** DATA				
				ldy #S.MEM.PTR
				lda (ZPPTR1),y
				sta ZPPTR2
				iny
				lda (ZPPTR1),y
				sta ZPPTR2+1
				
				lda (ZPPTR2)
				tay
				
.1				lda (ZPPTR2),y			Check if it looks like a printable string
				cmp #$20
				bcc .2					not printable....->hex
				dey
				bne .1

				>PUSHW ZPPTR2			String
				>PUSHB (ZPPTR2)			Len
				>LDYA L.MSG1.STR
				>SYSCALL SYS.PrintFYA				
				bra .8

.2				ldy #15

.3				>PUSHB (ZPPTR2),y
				dey
				bpl .3
				
				>LDYA L.MSG1.HEX
				>SYSCALL SYS.PrintFYA				
				
				bra .8
****** BIN				
.7				>SYSCALL SYS.GetMemPtrA
				>PUSHYA
				>LDYA L.MSG1.BIN
				>SYSCALL SYS.PrintFYA
				
.8				ldy #LINE.COUNT
				lda (pData),y
				inc
				sta (pData),y
				cmp #PAGELEN
				bne .9
				
				lda #$FF
				ldy #bSTOP
				sta (pData),y
				
				ldy #LINE.COUNT
				lda #0
				sta (pData),y
				
.9				rts
*--------------------------------------
CS.DOEVENT		ldy #S.EVT.hDEV		is Event from active IN device?
				lda (pEvent),y
				ldy #S.PS.hINDEV
				cmp (pPs),y
				bne .9
				
				lda (pEvent)
				and #S.EVT.F.KEY		is it a KEY event?
				beq .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 .1
				
				lda #$FF
				ldy #bCANCEL
				sta (pData),y
				bra .8
				
.1				cmp #$13				Ctrl-S
				bne .2
				
				ldy #bSTOP
				lda (pData),y
				eor #$FF
				sta (pData),y
				bra .8
				
.2				ldy #bSTOP
				lda #0
				sta (pData),y
				
.8				clc
				rts	
				
.9				sec
				rts
*--------------------------------------
CS.QUIT			clc
				rts
*--------------------------------------
CS.END
MSG0			>CSTRING "hMem Flags    PID REF PTR   LEN   BINPATH/DATA\n"
MSG1			>CSTRING " %03d %b %03d %03d $%H %05D "
MSG1.BIN		>CSTRING "!BIN:%40S\n"
MSG1.STR		>CSTRING "#STR:[%03d]:%32S\n"
MSG1.HEX		>CSTRING "?HEX:%h%h%h%h.%h%h%h%h.%h%h%h%h.%h%h%h%h\n"
MSG2			>CSTRING "\nAllocated hMem:%d, Total:%d\n"
MSG3			>CSTRING "High Memory:   $%H\n"
MSG4			>CSTRING "Free ULimit:   $%H\n"
MSG5			>CSTRING "Low Memory:    $%H\n"
MSG6			>CSTRING "\nFree Memory:   %D Bytes.\n"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
LINE.COUNT		.BS 1
MEM.COUNT		.BS 1
USED.COUNT		.BS 1
bSTOP			.BS 1
bCANCEL			.BS 1
DS.END
				.ED
*--------------------------------------
MAN
SAVE BIN/MEMDUMP.S
ASM
