view level2/cmds/dmem.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 5e48668f30b2
children
line wrap: on
line source

********************************************************************
* DMem - Dump memory from system
*
* dmem  <block> <offset> [<length>] ! dump
* dmem -<proc#> <offset> [<length>] ! dump
*
* $Id$
*
* From "Inside OS9 Level II", by Kevin Darling
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   2      ????/??/??  Kevin Darling
* Started.

         nam   DMem
         ttl   Dump memory from system

* Disassembled 98/09/14 19:24:59 by Disasm v1.6 (C) 1988 by RML

         ifp1
         use   defsfile
         endc

tylg     set   Prgrm+Objct
atrv     set   ReEnt+rev
rev      set   $00
edition  set   2

         mod   eom,name,tylg,atrv,entry,msize

acc      rmb   2
input    rmb   1
offset   rmb   2
dlen     rmb   2
id       rmb   1
prcdsc   rmb   512
buffer   rmb   4296
msize    equ   .

dat      equ   prcdsc+$40

name     fcs   /DMem/
         fcb   edition

hexin    clr   <acc
         clr   <acc+1

hexin01  lda   ,x+
         cmpa  #C$SPAC
         beq   hexrts
         cmpa  #C$CR
         beq   hexrts
         suba  #$30
         cmpa  #$0A
         bcs   hex2             0-9
         anda  #$07             A-F
         adda  #$09
hex2     lsla
         lsla
         lsla
         lsla
         sta   <input
         ldd   <acc             get accumulator
         rol   <input
         rolb
         rola
         rol   <input
         rolb
         rola
         rol   <input
         rolb
         rola
         rol   <input
         rolb
         rola
         std   <acc
         bra   hexin01
hexrts   leax  -1,x
         ldd   <acc
         rts

entry    lbsr  skipspc          skip leading spaces
         lbeq  badnum           ..was it CR?
         cmpa  #'-              else is it #id?
         bne   entry0            ..no

         leax  1,x              yes, skip '-'
         bsr   hexin            get id number
         tfr   b,a
         pshs  x
         leax  >prcdsc,u
         os9   F$GPrDsc         get that process descriptor
         lbcs  error
         puls  x
         bra   entry1

entry0   bsr   hexin            get block #
         clr   <dat             set in fake DAT image
         stb   <dat+1

entry1   lbsr  skipspc          get offset
         lbeq  badnum
         lbsr  hexin
         std   <offset
         lbsr  skipspc          get possible offset
         beq   entry2

         lbsr  hexin
         cmpd  #$1000
         bls   entry3
         ldd   #$1000
         bra   entry3
entry2   ldd   #$0100

entry3   std   <dlen

         leax  >dat,u
         tfr   x,d              D=DAT image pointer
         ldy   <dlen            Y=count
         ldx   <offset          X=offset within DAT image
         pshs  u
         leau  >buffer,u
         os9   F$CpyMem
         puls  u
         bcs   error

         ldy   <dlen
         leax  >buffer,u        point within buffer
         lda   #$01
         os9   I$Write

bye      clrb
error    os9   F$Exit

HelpTxt  fcc   "Use: DMem <block> <offset> [<length>] ! dump"
         fcb   C$LF
         fcc   " or: DMem -<id>   <offset> [<length>] ! dump"
         fcb   C$CR
HelpTxtL equ   *-HelpTxt

badnum   leax  >HelpTxt,pcr
         ldy   #HelpTxtL
         lda   #$02
         os9   I$WritLn
         bra   bye

skipspc  lda   ,x+
         cmpa  #C$SPAC
         beq   skipspc
         leax  -1,x
         cmpa  #C$CR
         rts

         emod
eom      equ   *
         end