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