diff level1/cmds/dmode.asm @ 963:7cecd837bcab

Added new commands as part of standard CMDS distribution
author boisy
date Fri, 31 Jan 2003 17:37:19 +0000
parents
children 84ea83668304
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/cmds/dmode.asm	Fri Jan 31 17:37:19 2003 +0000
@@ -0,0 +1,514 @@
+         nam   dmode     
+
+* DMode   by Kevin K. Darling
+* Disk descriptor utility.
+*
+* This version will do desc file on disk also.
+* 23 Sept 86, 1 Oct 86, 2 Oct 86
+
+* Modified by Roger A. Krupski (HARDWAREHACK)
+* Fixes "lower case bug", allows "$" prefix for hex
+* Last updated: 08-24-89 RAK
+
+* Oversized and kludgy, but works.
+* Apologies for lack of comments.
+************************************************
+* RBF descriptor utility similar to xmode.
+* Use: dmode </devicename> [options]
+*      dmode -<filename>   [options]
+*       (allows dmode use on a saved desc)
+*       (-filename will use data dir for default)
+*      dmode -?  will give bit definitions
+* If no options given, just returns desc info.
+* All numbers must be in HEX.
+* dmode
+* dmode /h0 cyl=0200 sas=8 ilv=4
+* dmode /d0
+* dmode -?
+* dmode -/d1/modules/d2.dd cyl=0028
+
+         ifp1            
+         use   defsfile use defsfile
+         use   rbfdefs
+         endc            
+
+         mod   size,name,$11,$81,entry,msiz
+
+         org   0         
+desc     rmb   $40        dev desc copy
+dsize    rmb   2          desc size
+path     rmb   1          file path
+parmptr  rmb   2          next name dataptr
+module   rmb   2          desc address
+dataptr  rmb   2          current option ptr
+buffptr  rmb   2          buffer address
+txtptr   rmb   2          option name ptr
+hexin    rmb   2          2 byte hex number
+hexcnt   rmb   1          number of option bytes
+buffer   rmb   10         output buffer
+stack    rmb   200       
+params   rmb   150       
+msiz     equ   .         
+
+************************************************
+name     fcs   "Dmode"   
+         fcb   8          version
+
+helpmsg                  
+         fcb   C$CR,C$LF
+         fcc   "drv  Drive Number 0...n"
+         fcb   C$CR,C$LF
+         fcc   "stp  Step Rate    0=30, 1=20, 2=12, 3=6ms"
+         fcb   C$CR,C$LF
+         fcb   C$CR,C$LF
+         fcc   'typ  Device Type  bit0- 0=5"   1=8"'
+         fcb   C$CR,C$LF
+         fcc   "            $20   bit5- 0=non  1=coco"
+         fcb   C$CR,C$LF
+         fcc   "            $40   bit6- 0=std  1=non"
+         fcb   C$CR,C$LF
+         fcc   "            $80   bit7- 0=flop 1=hard"
+         fcb   C$CR,C$LF
+         fcb   C$CR,C$LF
+         fcc   "dns  Density      bit0- 0=SD   1=DD"
+         fcb   C$CR,C$LF
+         fcc   "                  bit1- 0=48   1=96 tpi"
+         fcb   C$CR,C$LF
+         fcb   C$CR,C$LF
+         fcc   "cyl  Cylinders (tracks) (in hex)"
+         fcb   C$CR,C$LF
+         fcc   "sid  Sides (heads) (in hex)"
+         fcb   C$CR,C$LF
+         fcc   "vfy  Verify (0=yes)"
+         fcb   C$CR,C$LF
+         fcc   "sct  Sectors/Track (in hex)"
+         fcb   C$CR,C$LF
+         fcc   "tos  Sectors/Track on track 0 (in hex)"
+         fcb   C$CR,C$LF
+         fcc   "ilv  Interleave (in hex)"
+         fcb   C$CR,C$LF
+         fcc   "sas  Minimum segment allocation (in hex)"
+         fcb   C$CR,C$LF
+helplen  equ   *-helpmsg 
+
+errmsg                   
+         fcb   C$CR,C$LF
+         fcc   "Use Dmode /<dev_name> [options...]"
+         fcb   C$CR,C$LF
+         fcc   " or Dmode -<filename> [options...]"
+         fcb   C$CR,C$LF
+         fcc   " or Dmode -?  for options help"
+         fcb   C$CR,C$LF
+         fcb   C$CR,C$LF
+         fcc   " NOTE: specify options in hex."
+cr       fcb   C$CR,C$LF
+msglen   equ   *-errmsg  
+
+synmsg                   
+         fcb   C$CR,C$LF
+         fcc   "Syntax Error: "
+synlen   equ   *-synmsg  
+
+
+muchhelp                 
+         leax  helpmsg,pc
+         ldy   #helplen  
+         bra   helpprnt  
+
+rbfmsg                   
+         fcb   C$CR,C$LF
+         fcc   "NOT an RBF descriptor!"
+         fcb   C$CR,C$LF
+rbflen   equ   *-rbfmsg  
+
+notrbf                   
+         leax  rbfmsg,pc 
+         ldy   #rbflen   
+         lda   #2        
+         os9   I$Write   
+
+help                     
+         leax  errmsg,pc 
+         ldy   #msglen   
+
+helpprnt                 
+         lda   #2        
+         os9   I$Write   
+         lbra  okayend2  
+
+************************************************
+entry                    
+         ldd   #0        
+         std   module     zero mod flag
+         sta   path       zero file flag
+         ldd   ,x+        check for device name
+         cmpa  #'-        file option?
+         bne   link      
+         cmpb  #'?        help option?
+         beq   muchhelp  
+
+* Use Filename to Get Desc:
+         lda   #UPDAT.    open path to desc file
+         os9   I$Open    
+         bcs   error     
+         stx   parmptr   
+         sta   path       save path number
+
+         ldy   #$40       max size
+         leax  desc,u     desc buff
+         os9   I$Read     get it
+         bcc   use10     
+         cmpb  #E$EOF    
+         bne   error     
+
+use10                    
+         sty   dsize      save desc size
+         bra   gotit     
+
+link                     
+         cmpa  #PDELIM    else must be /<devicename> 
+         bne   help      
+         pshs  u         
+         lda   #Devic    
+         os9   F$Link     link to descriptor
+         bcs   error     
+         stx   parmptr    update after name
+         tfr   u,x       
+         puls  u         
+         stx   module    
+         ldd   M$Size,x   get desc size
+         std   dsize     
+         leay  desc,u    
+
+mloop                    
+         lda   ,x+       
+         sta   ,y+       
+         decb            
+         bne   mloop     
+
+gotit                    
+         leax  desc,u    
+         lda   $12,x      test device type
+         cmpa  #1         RBF?
+         bne   notrbf    
+
+         leax  $13,x      point to drive #
+         stx   dataptr    save mod option ptr
+
+         ldx   parmptr    point to input parms
+
+skip                     
+         lda   ,x+       
+         cmpa  #$20       skip blanks
+         beq   skip      
+
+         leax  -1,x      
+         cmpa  #$0D       no options?
+         lbeq  info       ..yes, give info
+         lbra  findtxt    else find options
+
+okayend                  
+         lbsr  outcr     
+okayend2                 
+         clrb             okay
+error                    
+         pshs  b,cc      
+         ldu   module    
+         beq   bye       
+         os9   F$UnLink  
+bye                      
+         puls  b,cc      
+         os9   F$Exit     end dmode.
+
+table                    
+         fcc   " drv"     option name 
+         fcb   IT.DRV,1      option offset & byte count
+         fcc   " stp"    
+         fcb   IT.STP,1     
+         fcc   " typ"    
+         fcb   IT.TYP,1     
+         fcc   " dns"    
+         fcb   IT.DNS,1     
+         fcc   " cyl"    
+         fcb   IT.CYL,2     
+         fcc   " sid"    
+         fcb   IT.SID,1     
+         fcc   " vfy"    
+         fcb   IT.VFY,1     
+         fcc   " sct"    
+         fcb   IT.SCT,2     
+         fcc   " tos"    
+         fcb   IT.T0S,2     
+         fcc   " ilv"    
+         fcb   IT.ILV,1     
+         fcc   " sas"    
+         fcb   IT.SAS,1     
+         fcc   " t0s"     extra so it parses, but doesn't print!
+         fcb   IT.T0S,2     
+         fcb   $80        end of table
+
+info     equ   *          Output Current Desc Info:
+         ldb   #11        eleven entries (we won't print #12)
+         pshs  b         
+         leax  table,pc   point to text table
+         stx   txtptr    
+ilup                     
+         bsr   outtext    print label and =
+         lbsr  outnum     print value
+         ldx   txtptr    
+         leax  6,x       
+         stx   txtptr    
+         dec   ,s        
+         lbeq  okayend    ..end of info
+         ldb   ,s        
+         cmpb  #5         <cr> after 6th option
+         bne   ilup      
+         bsr   outcr      <cr>
+         bra   ilup       ..loop
+
+outcr    equ   *          Print a <CR/LF>:
+         leax  cr,pc     
+         ldy   #2         byte count
+
+output   equ   *          Print generic
+         lda   #1         std out
+         os9   I$Write   
+         bcc   okay      
+         leas  2,s        purge return
+         lbra  error      error
+okay     rts             
+
+
+* -----------------------
+equal    fcc   "=$"      
+outtext  equ   *          Print Option Name:
+         ldx   txtptr    
+         ldy   #4        
+         bsr   output     print option name
+         leax  equal,pc  
+         ldy   #2        
+         bsr   output     sorry, must be a bsr
+         rts              return
+
+* -----------------------
+outnum   equ   *          Print Hex Option Values:
+         ldx   txtptr    
+         ldb   5,x        get # of digits
+         stb   hexcnt    
+numlup                   
+         bsr   outhex    
+         dec   hexcnt    
+         bne   numlup    
+         rts             
+
+outhex   equ   *          Print One Byte:
+         ldx   dataptr   
+         lda   ,x+       
+         stx   dataptr   
+         pshs  a         
+         lsra            
+         lsra            
+         lsra            
+         lsra            
+         bsr   outone    
+         puls  a         
+         anda  #$0F      
+
+outone   equ   *          Print 1/2 Byte Hex Char:
+         cmpa  #10       
+         bcs   number    
+         adda  #$11-10    make alpha
+number                   
+         adda  #$30       make ASCII
+         sta   buffer    
+         leax  buffer,u  
+         ldy   #1        
+         lbra  output    
+
+skipspc  equ   *          Skip Spaces:
+         lda   ,x+       
+         cmpa  #C$SPAC
+         beq   skipspc   
+         rts             
+
+************************************************
+* X=parmptr
+
+findtxt  equ   *          Find and Set Options:
+
+flup10                   
+         bsr   skipspc    get next input param
+         stx   parmptr    save for syntax error use
+         cmpa  #C$CR      end?
+         lbeq  verify     ..yes, update desc CRC
+
+         ora   #$20       force lower case first char
+         leay  table-6,pc ready option table ptr
+         pshs  d,u       
+         ldd   ,x++       get next two chars
+         ora   #$20       force lower case
+         orb   #$20       -ditto-
+         tfr   d,u        place two chars in U
+         puls  d          restore A&B (u is still pushed)
+
+flup20                   
+         leay  6,y        next option entry
+         tst   ,y         last entry?
+         lbmi  syntax     ..yes, bad option
+         cmpa  1,y       
+         bne   flup20     same name?
+         cmpu  2,y       
+         bne   flup20     ..no, loop
+
+* Found Option
+         puls  u         
+         sty   txtptr    
+         lda   ,x+        must be followed by "="
+         cmpa  #'=       
+         lbne  syntax    
+
+         bsr   setnum     set that option
+         bra   flup10    
+
+* -------------
+setnum   equ   *          Get Hex Input and Set Option:
+         ldb   5,y        get # of bytes
+         stb   hexcnt    
+         clr   hexin      zero hex input bytes
+         clr   hexin+1   
+
+setloop                  
+         lda   ,x+        get next #
+         cmpa  #'$        optional hex $?
+         beq   setloop    yes, ignore
+         cmpa  #C$SPAC    end of number?
+         beq   setnum2    ..yes, set option, rts
+         cmpa  #C$CR      end of line?
+         beq   setnum1   
+         bsr   hexcnvt    else, get next num
+         bra   setloop    ..loop
+
+setnum1                  
+         leax  -1,x       reset so can find <cr>
+setnum2                  
+         ldb   4,y        get option offset
+         leay  desc,u     point to desc
+         leay  b,y        point to option
+         ldd   hexin      pick up hex input
+         dec   hexcnt    
+         beq   setone    
+         std   ,y         set two byte option
+         rts             
+setone                   
+         tsta            
+         lbne  syntax    
+         stb   ,y         set one byte option
+         rts             
+
+hexcnvt  equ   *          Convert ASCII Hex-->Byte:
+         suba  #$30       make number from ASCII
+         lbmi  syntax    
+         cmpa  #10        is it number?
+         bcs   num       
+         anda  #$5F       make uppercase 
+         suba  #$11-$0a   make hex $A-$F
+         cmpa  #$0A      
+         lbcs  syntax    
+         cmpa  #$10       not hex char?
+         lbcc  syntax    
+num                      
+         ldb   #16        fancy asl *4
+         mul             
+         pshs  b          save top 4 bits
+         ldd   hexin     
+         rol   ,s        
+         rolb            
+         rola            
+         rol   ,s        
+         rolb            
+         rola            
+         rol   ,s        
+         rolb            
+         rola            
+         rol   ,s        
+         rolb            
+         rola            
+         std   hexin     
+         puls  b,pc       drop temp, rts.
+
+verify   equ   *          Update Descriptor CRC:
+         pshs  u          save data ptr
+         leau  desc,u    
+         tfr   u,x        X is mod address
+
+         ldy   M$Size,x   Y is mod size
+         leay  -3,y       beginning of chksum
+         tfr   y,d        Y is byte count
+         leau  d,u        set U to chksum
+
+         lda   #$FF       init chksum
+         sta   ,u        
+         sta   1,u       
+         sta   2,u       
+         pshs  u         
+         os9   F$CRC      calc new crc
+         puls  u         
+         com   ,u+        fix it up right
+         com   ,u+       
+         com   ,u        
+
+         lda   path       was it file?
+         beq   memmod     ..no, in memory
+         ldx   #0        
+         tfr   x,u       
+         os9   I$Seek     go back to file begin
+         lbcs  error     
+         puls  u         
+         leax  desc,u    
+         ldy   dsize     
+         os9   I$Write    update desc file
+         lbra  okayend   
+
+memmod                   
+         puls  u         
+         leax  desc,u    
+         ldb   dsize+1   
+         ldy   module    
+
+move                     
+         lda   ,x+       
+         sta   ,y+       
+         decb            
+         bne   move      
+
+         lbra  okayend2  
+
+
+syntax   equ   *         
+         leax  synmsg,pc 
+         ldy   #synlen   
+         lda   #2        
+         os9   I$Write   
+
+         ldx   parmptr   
+         leax  -1,x      
+         pshs  x         
+         ldy   #0        
+
+slup                     
+         leay  1,y       
+         lda   ,x+       
+         cmpa  #C$CR
+         beq   synsay    
+         cmpa  #C$SPAC
+         bne   slup      
+
+synsay                   
+         puls  x         
+         lda   #2        
+         os9   I$Write    output err
+         lbra  okayend   
+
+         emod            
+size     equ   *         
+         end