changeset 967:835a015e3f3b

Added to CMDS
author boisy
date Fri, 31 Jan 2003 17:55:01 +0000
parents 5747fa790c2e
children 69757400b240
files level2/cmds/dirm.asm
diffstat 1 files changed, 256 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/cmds/dirm.asm	Fri Jan 31 17:55:01 2003 +0000
@@ -0,0 +1,256 @@
+********************************************************************
+* DirM - Show module directory
+*
+* $Id$
+*
+* Changes:
+*
+* Added internal print buffer, so an I$Write call is not performed for every
+* byte printed out.  Halves printout time.
+*
+* Added SS.ScSiz check, and goes to 32-column output if display is 40 columns
+* or less.
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+* ?      Disassembled at 8:18:38                        AD  94/11/10
+* 5      Added internal print buffer, so an I$Write     AD  ??/??/??
+*        call is not performed for every byte printed
+*        out.  Halves printout time.  Added SS.ScSiz
+*        check, and goes to 32-column output if display
+*        is 40 columns or less.
+
+         nam   DirM
+         ttl   Show module directory
+
+         ifp1
+         use   defsfile
+         endc
+
+tylg     set   Prgrm+Objct   
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   5
+
+Bound    equ   40         width at which change is made to 32-col printing
+
+
+         mod   eom,name,tylg,atrv,start,size
+
+MD.DAT   rmb   2
+MD.Crnt  rmb   2
+MD.Strt  rmb   2
+MD.End   rmb   2
+MD.MPDAT rmb   5
+PntCnt   rmb   1
+
+*Single   rmb   1          single entry/line?
+Width    rmb   1          width of the output device
+
+PBuffer  rmb   31         internal print buffer
+Buffer   rmb   40         room for a name buffer
+MD.Data  rmb   2048       size of the module directory
+         rmb   200        for the stack
+size     equ   .
+name     equ   *
+         fcs   /DirM/
+         fcb   edition
+
+H2       fcc   / Bk Ofst Size Ty At Link Name/
+         fcb   C$CR
+H3       fcc   / -- ---- ---- -- -- ---- -----/
+H1       fcb   C$CR
+
+* Believe it or not, all this internal crap is still smaller than having
+* a different version of the header for 32/80 columns.
+Dump     ldu   #PBuffer   output print buffer
+         lda   ,x+        get first character
+         sta   ,u+        move it over
+         ldb   <Width     get the width
+
+D.01     cmpa  #C$CR      CR?
+         beq   D.Print    yup, dump it out
+
+         lda   ,x+        grab a character
+         sta   ,u+        save it
+         cmpa  #C$SPAC    was it a space?
+         bne   D.01       no, just save it
+
+         cmpb  #Bound     40-column screen?
+         bls   D.01       yes, don't add the space
+         sta   ,u+        if a space, save another copy of it
+         bra   D.01
+
+D.Print  lda   #$01       to STDOUT
+         ldx   #PBuffer
+         ldy   #50        max. size of data to print
+         OS9   I$WritLn   dump it out
+         bcs   Exit
+         rts
+
+start    equ   *
+         stu   <MD.DAT    u=$0000 always on startup in OS-9 LII
+         ldd   #$0100+SS.ScSiz stdout, get screen size
+         OS9   I$GetStt
+         bcs   s.01
+         tfr   x,d
+         bra   s.02       save actual screen size
+
+s.01     cmpb  #E$UnkSvc
+         bne   Exit
+         ldb   #80        default to 80 columns if error
+s.02     stb   <Width
+
+         leax  <H1,pcr   print out initial CR
+         bsr   Dump
+         leax  >H2,pcr   header of names
+         bsr   Dump
+         leax  <H3,pcr   and hyphens
+         bsr   Dump
+
+         ldx   #MD.Data
+         os9   F$GModDr 
+         bcs   Exit
+         stu   <MD.Strt     save start address of system module dir
+
+         sty   <MD.End     save end of the module directory
+         bra   L00B5
+
+ClnExit  clrb  
+Exit     os9   F$Exit   
+
+L00AD    ldx   <MD.Crnt
+         leax  MD$ESIZE,x go to the next entry
+         cmpx  <MD.End
+         bcc   ClnExit
+
+L00B5    stx   <MD.Crnt
+         ldu   #PBuffer      temporary print buffer
+         ldd   MD$MPDAT,x get module DAT image
+         beq   L00AD      if zero, skip this entry
+         pshs  d
+         cmpd  <MD.DAT
+         beq   L00CD
+         std   <MD.DAT    save the current DAT image
+         lda   #'-        start of this block
+         fcb   $8C        skip 2 bytes
+
+L00CD    lda   #C$SPAC    space
+         sta   ,u+        store it in the data buffer
+L00D0    puls  d          restore current DAT image
+         subd  <MD.Strt   take out start of the block
+         ldy   #MD.Data   point to module directory data
+         leay  d,y        to the DAT image within it
+         tfr   y,d
+         std   <MD.MPDAT     save pointer to DAT
+         lda   MD$MPtr,x  module pointer
+         lsra  
+         lsra  
+         lsra  
+         lsra             turn address into block offset
+         anda  #$0E       keep low bits only
+         inca             DAT image is (junk),(block)
+         lda   a,y        get the starting block number
+         bsr   L0165      dump it out
+         ldd   MD$MPtr,x  get real pointer
+         anda  #$1F       get offset inside block
+         bsr   L0159      print it out
+         ldx   MD$MPtr,x  and get pointer again
+
+         pshs  u          save print buffer pointer
+         ldu   #Buffer     to a name buffer
+         ldy   #$000A     move first 10 bytes of the module?
+         ldd   <MD.MPDAT
+         os9   F$CpyMem   copy it over
+         puls  u          restore print buffer ptr
+         bcs   Exit
+
+         ldd   <Buffer+M$Size
+         bsr   L0159      print out the size of the module
+         lda   <Buffer+M$Type
+         bsr   L0165      print out the Ty/Lg
+         lda   <Buffer+M$Revs
+         bsr   L0165      print out At/Rv
+         ldx   <MD.Crnt   get current module pointer
+         ldd   MD$Link,x  link count
+         bsr   L0159
+         ldd   <Buffer+M$Name
+         ldx   <MD.Crnt
+         ldx   MD$MPtr,x  start address of the module
+         leax  d,x        point to the name
+
+         pshs  u          save print buffer ptr
+         ldu   #Buffer    to the buffer again
+         lda   <Width
+         cmpa  #Bound
+         bhi   n.01
+         leau  -6,u       discount 6 spaces
+
+n.01     ldd   <MD.MPDAT
+         ldy   #40        copy over 40 bytes of the name
+         os9   F$CpyMem 
+         tfr   u,x        save copy of the start of the buffer
+         puls  u          restore print buffer ptr
+         lbcs  Exit
+
+         ldb   #39        maximum number of characters to check
+L013F    lda   ,x+        get a character
+         bpl   L013F      if it's OK
+         anda  #$7F       force it to be printable
+         sta   -1,x       save it again
+         lda   #C$CR      drop a CR after the last character of the name
+
+         sta   ,x         save it
+         ldx   #PBuffer   point to the start of the buffer
+         ldy   #64        64 characters
+         lda   #$01
+         os9   I$WritLn   print out the name
+         lbra  L00AD      start all over again
+
+* Print out a 2-byte hex number in D
+L0159    pshs  b          save low order character
+         ldb   #3         3 digits to print out
+         bsr   L0171      print out A
+         puls  a          restore low byte
+         bsr   L0173      print it, too
+         bra   L0167      and dump out 2 spaces
+
+* print out a 1-digit hex number in A
+L0165    bsr   L016F
+L0167    lda   <Width     check the width
+         cmpa  #Bound
+         bls   L016B      if 40 columns or smaller, don't print extra space
+         lda   #C$SPAC    space
+         sta   ,u+
+L016B    lda   #C$SPAC    and another space
+         sta   ,u+
+         rts
+
+L016F    ldb   #$01
+L0171    stb   <PntCnt
+L0173    tfr   a,b        save a copy of the number in B
+         lsra  
+         lsra  
+         lsra  
+         lsra             move high nibble into the lower nibble
+         bsr   L017D      print out lower nibble of A as hex number
+         tfr   b,a        restore lower nibble
+
+L017D    anda  #$0F       make 0-15
+         beq   L019C      if zero, skip printing it out
+         clr   <PntCnt
+         cmpa  #$0A       higher than A?
+         bcs   L0189      no, add in ascii zero
+         adda  #$07       yes, add difference between 9 and A
+L0189    adda  #'0        turn it into an ascii number
+
+Print    sta   ,u+        save the character in the buffer
+         rts
+
+L019C    dec   <PntCnt    count down of number of characters to print
+         bmi   L0189      if last one, print out a zero
+         bra   L016B      otherwise print out a space
+
+         emod
+eom      equ   *
+         end