Mercurial > hg > Members > kono > nitros9-code
view level2/cmds/pmap.asm @ 3194:2ecebda8716b
mfree.asm: Fix zero-day Block Map entry bug
Previously, code assumed that the final entry in the block map would be
used. This was true for CoCo but is not necessarily true (and is not
true for mc09). Slight mod removes that implicit assumption; the code
now works correctly on both platforms.
author | Neal Crook <foofoobedoo@gmail.com> |
---|---|
date | Tue, 30 May 2017 23:59:46 +0100 |
parents | 90cb94c964d9 |
children | 6b012cf1b400 |
line wrap: on
line source
******************************************************************** * PMap - Show process map information * * $Id$ * * From "Inside Level II" by Kevin Darling * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * ? 1987/02/08 Kevin Darling * Original version. * * 2 1989/09/12 Ken Drexler * Revised to handle 4K or 8K blocks. * * 3 2004/05/28 Rodney Hamilton * Revised for NitrOS-9/OS9Tools compatibility. * Revised to build for either 8K or 4K blocksize * based on DAT parameters in SysType file. * * 4 2004/06/03 Rodney Hamilton * Added test for DEAD processes. nam PMap ttl Show process map information ifp1 use defsfile endc Type set Prgrm+Objct Revs set ReEnt+0 Bufsiz set 512 Edition set 4 Stdout set 1 Maxnam set 30 Buflen set 80 pag *************************************************** * mod PrgSiz,Name,Type,Revs,Entry,DatSiz Name fcs /PMap/ fcb Edition * Data Equates umem rmb 2 datimg rmb 2 datimg for copymem lineptr rmb 2 number rmb 3 leadflag rmb 1 pid rmb 1 hdr rmb 12 outbuf rmb Buflen buffer rmb Bufsiz working proc. desc. stack rmb 200 DatSiz equ . ************************************************* * * Messages * IFEQ DAT.BlSz-8192 8K blocks Head1 fcc / ID 01 23 45 67 89 AB CD EF Program / fcb C$CR Head2 fcc /____ __ __ __ __ __ __ __ __ ___________/ ELSE 4K blocks Head1 fcc / ID 0 1 2 3 4 5 6 7 8 9 A B C D E F Program/ fcb C$CR Head2 fcc /____ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ _______/ ENDC Hdrcr fcb C$CR SysNam fcs "SYSTEM" Syslen equ *-SysNam DeadNam fcs "DEAD" Deadlen equ *-DeadNam spc 3 *************************************************** * Entry stu <umem lda #1 start with process 1 clr <pid * Print header leax buffer,u point at storage os9 F$GBlkMp get block info bcs Error IFEQ DAT.BlSz-8192 cmpd #8192 8k? ELSE cmpd #4096 4k? ENDC bne Error we only do 4k/8k leax <Hdrcr,pcr print line lbsr PrintL1 print it leax <Head1,pcr lbsr PrintL1 print it leax <Head2,pcr lbsr PrintL1 * Main Program Loop Main ldu <umem leax outbuf,u set line pointer stx <lineptr inc <pid next process beq Bye >= 255 --> exit lda <pid get proc id leax buffer,u set destination os9 F$GPrDsc bcs Main loop if no descriptor bsr Output print data for descriptor bra Main Bye clrb Error os9 F$Exit * Subroutines Output lda P$ID,x process id lbsr Outdecl lbsr Space lbsr Space * Print Process DAT Image * IN: x = process descriptor * pshs x leax P$DATImg,x point to DAT image IFEQ DAT.BlSz-8192 ldb #DAT.BlCt set count ELSE ldb #64/4 set count ENDC pshs b PrntImg ldd ,x++ get DAT block cmpd #DAT.Free empty? bne PrntImg2 ldy <lineptr ldd #$2E2E was #".. (os9asm beta bug) std ,y++ sty <lineptr lbsr Space bra PrntImg3 PrntImg2 tfr b,a print block no. lbsr Out2HS PrntImg3 dec ,s count -= 1 bne PrntImg puls b,x * Print primary module name * IN: X - process descriptor * lbsr Space leay P$DATImg,x sty <datimg save pointer ldb P$State,x check process state andb #Dead was it DEAD? beq Undead no, print name leax >DeadNam,pcr ldb #Deadlen bra Copy0 yes, print "DEAD" Undead ldx P$PModul,x x=offset in map bne Doname leax >SysNam,pcr point at name ldb #Syslen Copy0 ldy <lineptr Copy lda ,x+ sta ,y+ decb bne Copy bsr Name2 bra Printlin Doname bsr Printnam * Print Line Printlin ldx <lineptr terminate line lda #C$CR sta ,x ldu <umem leax outbuf,u * Print line PrintL1 ldy #Buflen lda #Stdout os9 I$WritLn lbcs Error rts ** Find and print a module name * IN: X - module offset * U - data area * datimg = pointer * Printnam equ * * Read module header pshs u save u leau hdr,u destination ldd <datimg proc datimg pointer ldy #10 set length os9 F$CpyMem lbcs Error * Read name from Module to buffer ldd M$Name,u get name offset from header ldu <lineptr move name to outbuf leax d,x X - offset to name ldd <datimg ldy #Maxnam set maximum length os9 F$CpyMem puls u lbcs Error Name2 pshs x ldx <lineptr clrb set length = 0 Name3 incb lda ,x+ bpl Name3 cmpb #40 bcc Name5 anda #$7F clear d7 sta -1,x cmpb #9 bcc Name5 lda #C$SPAC Name4 sta ,x+ incb cmpb #9 bcs Name4 Name5 stx <lineptr puls x,pc * Print hex digit in A Out2HS bsr Hexl Space lda #C$SPAC bra Print * Print Hexidecimal Digit in A Hexl tfr a,b lsra lsra lsra lsra bsr Outhex tfr b,a Outhex anda #$0F cmpa #$0A 0 - 9 bcs Outdig adda #$07 A - F Outdig adda #'0 make ASCII * Put character in A in buf Print pshs x ldx <lineptr sta ,x+ stx <lineptr puls x,pc * Print 1 Decimal Digit in A * Outdecl tfr a,b number to B clra * Print 2 Decimal Digits in D Outdec clr <leadflag pshs x ldx <umem leax number,x clr ,x clr 1,x clr 2,x Hundred inc ,x subd #100 bcc Hundred addd #100 Ten inc 1,x subd #10 bcc Ten addd #10 incb stb 2,x bsr Printled bsr Printled bsr Printnum bsr Space puls x,pc Printnum lda ,x+ get char adda #'0-1 make ASCII bra Print Printled tst <leadflag print leading zero? bne Printnum yes ldb ,x is it zero? inc <leadflag decb bne Printnum no, print zeros clr <leadflag lda #C$SPAC leax 1,x bra Print emod PrgSiz equ * end