changeset 621:f5faeb8929ff

Added exmode utility
author boisy
date Tue, 03 Dec 2002 16:07:00 +0000
parents be4e1a676e45
children 18b0ab24a828
files level2/cmds/exmode.asm level2/cmds/makefile
diffstat 2 files changed, 682 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/cmds/exmode.asm	Tue Dec 03 16:07:00 2002 +0000
@@ -0,0 +1,681 @@
+********************************************************************
+* EXMode - Extended SCF device descriptor utility
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*   1    Bruce Isted version released to PD             BRI 89/06/21
+
+         nam   EXMode
+         ttl   Extended SCF device descriptor utility
+
+         ifp1            
+         use   defsfile
+         endc            
+
+BuffSize equ   10         max. CHAR string length
+Edtn     equ   1         
+MaxSize  equ   $80        maximum module size
+NameSize equ   4          maximum module name length
+Vrsn     equ   1         
+
+         org   0         
+Count    rmb   1          number of option bytes
+DataPtr  rmb   2          current option ptr
+HexIn    rmb   2          2 byte hex number
+ModAddr  rmb   2          module address
+ModSize  rmb   2          module size
+OptEnd   rmb   2          option table end offset
+ParmPtr  rmb   2          next name DataPtr
+PathNmbr rmb   1          file path
+TxtPtr   rmb   2          option name ptr
+Buffer   rmb   BuffSize   miscellaneous output buffer
+ModBuff  rmb   MaxSize    module work copy buffer
+stack    rmb   $0200      stack and parameter space
+MemSize  equ   .         
+
+         mod   Size,Name,Prgrm+Objct,ReEnt+Vrsn,Entry,MemSize
+
+Name     fcs   "EXMode"   
+         fcb   Edtn       edition number
+
+OptTable                 
+         fcc   " nam"     option name
+         fcb   Sign+M$Name,NameSize offset to string offset & max. byte count to change
+         fcc   " mgr"    
+         fcb   Sign+M$FMgr,0 offset to string offset & no changes allowed
+         fcc   " ddr"    
+         fcb   Sign+M$PDev,0
+         fcc   " hpn"    
+         fcb   M$Port,1   option offset & byte count
+         fcc   " hpa"    
+         fcb   M$Port+1,2
+         fcc   " upc"    
+         fcb   IT.UPC,1  
+         fcc   " bso"    
+         fcb   IT.BSO,1  
+         fcc   " dlo"    
+         fcb   IT.DLO,1  
+         fcc   " eko"    
+         fcb   IT.EKO,1  
+         fcc   " alf"    
+         fcb   IT.ALF,1  
+         fcc   " nul"    
+         fcb   IT.NUL,1  
+         fcc   " pau"    
+         fcb   IT.PAU,1  
+         fcc   " pag"    
+         fcb   IT.PAG,1  
+         fcc   " bsp"    
+         fcb   IT.BSP,1  
+         fcc   " del"    
+         fcb   IT.DEL,1  
+         fcc   " eor"    
+         fcb   IT.EOR,1  
+         fcc   " eof"    
+         fcb   IT.EOF,1  
+         fcc   " rpr"    
+         fcb   IT.RPR,1  
+         fcc   " dup"    
+         fcb   IT.DUP,1  
+         fcc   " psc"    
+         fcb   IT.PSC,1  
+         fcc   " int"    
+         fcb   IT.INT,1  
+         fcc   " qut"    
+         fcb   IT.QUT,1  
+         fcc   " bse"    
+         fcb   IT.BSE,1  
+         fcc   " ovf"    
+         fcb   IT.OVF,1  
+         fcc   " par"    
+         fcb   IT.PAR,1  
+         fcc   " bau"    
+         fcb   IT.BAU,1  
+         fcc   " xon"    
+         fcb   IT.XON,1  
+         fcc   " xof"    
+         fcb   IT.XOFF,1 
+         fcc   " col"    
+         fcb   IT.COL,1  
+         fcc   " row"    
+         fcb   IT.ROW,1  
+         fcc   " xtp"    
+         fcb   IT.XTYP,1 
+         fcc   " wnd"    
+         fcb   IT.WND,1  
+         fcc   " val"    
+         fcb   IT.VAL,1  
+         fcc   " sty"    
+         fcb   IT.STY,1  
+         fcc   " cpx"    
+         fcb   IT.CPX,1  
+         fcc   " cpy"    
+         fcb   IT.CPY,1  
+         fcc   " fgc"    
+         fcb   IT.FGC,1  
+         fcc   " bgc"    
+         fcb   IT.BGC,1  
+         fcc   " bdc"    
+         fcb   IT.BDC,1  
+TablOpts equ   (*-OptTable)/6 number of table entries
+         fcb   $80        end of option table
+
+UseMsg                   
+         fcb   C$LF      
+         fcc   "Usage:  EXMode [/<device> || -<pathlist> || -?] [option] [option] [...]"
+         fcb   C$LF,C$LF 
+         fcc   "Purpose:  To report or alter current option settings of SCF device"
+         fcb   C$LF      
+         fcc   "          descriptors in memory or on disk in single module files."
+         fcb   C$LF,C$LF 
+         fcc   "Options:  nam, mgr, ddr, hpn, hpa, upc, bso, dlo, eko, alf, nul, pau,"
+         fcb   C$LF      
+         fcc   "          pag, bsp, del, eor, eof, rpr, dup, psc, int, qut, bse, ovf,"
+         fcb   C$LF      
+         fcc   "          par, bau, xon, xof, col, row, xtp, wnd, val, sty, cpx, cpy,"
+         fcb   C$LF      
+         fcc   "          fgc, bgc, bdc"
+         fcb   C$LF,C$LF 
+         fcc   "Examples:  exmode /t2"
+         fcb   C$LF      
+         fcc   "               Prints the current option settings of the /T2 descriptor"
+         fcb   C$LF      
+         fcc   "               in memory."
+         fcb   C$LF      
+         fcc   "           exmode -modules/t4.dd nam=T2 bau=6 hpa=ff6c eof=1B"
+         fcb   C$LF      
+         fcc   "               Changes the module name in the MODULES/T4.dd file to T2,"
+         fcb   C$LF      
+         fcc   "               sets the baud rate code to 6,  the hardware port address"
+         fcb   C$LF      
+         fcc   "               to $FF6C, and the end of file character to $1B."
+         fcb   C$LF      
+         fcc   "           exmode -?"
+         fcb   C$LF      
+         fcc   "               Prints more complete information on all of the options."
+         fcb   C$CR      
+UseLen   equ   *-UseMsg  
+
+HelpMsg                  
+         fcb   C$LF      
+         fcc   "The NAM option accepts only a legal OS-9 module name with a maximum of"
+         fcb   C$LF      
+         fcc   "4 characters.  It is up to the user to ensure that there is adequate"
+         fcb   C$LF      
+         fcc   "room for the module name, and if required to rename the disk file to"
+         fcb   C$LF      
+         fcc   "suit the new module name.  The MGR and DDR options can't be changed."
+         fcb   C$LF      
+         fcc   "All other options require hexadecimal numbers (0 through FFFF).  XTP is"
+         fcb   C$LF      
+         fcc   "for certain ACIA descriptors only.  WND, VAL, STY, CPX, CPY, FGC, BGC,"
+         fcb   C$LF      
+         fcc   "and BDC are for window descriptors only."
+         fcb   C$LF,C$LF 
+         fcc   "nam Device Name         mgr File Manager Name   ddr Device Driver Name"
+         fcb   C$LF      
+         fcc   "hpn H'ware Page Number  hpa H'ware Port Address upc Case Lock Flag"
+         fcb   C$LF      
+         fcc   "bso Backspace Method    dlo Delete Line Method  eko Screen Echo Flag"
+         fcb   C$LF      
+         fcc   "alf Auto Linefeed Flag  nul End Of Line Nulls   pau Page Pause Flag"
+         fcb   C$LF      
+         fcc   "pag Page Length         bsp Backspace Character del Delete Line Char"
+         fcb   C$LF      
+         fcc   "eor End Of Record Char  eof End Of File Char    rpr Reprint Line Char"
+         fcb   C$LF      
+         fcc   "dup Duplicate Line Char psc Pause Character     int Interrupt Character"
+         fcb   C$LF      
+         fcc   "qut Quit Character      bse Backspace Echo Char ovf Overflow Character"
+         fcb   C$LF      
+         fcc   "par Type (Parity) Code  bau Baud Rate Code      xon XON Character"
+         fcb   C$LF      
+         fcc   "xof XOFF Character      col Display Columns     row Display Rows"
+         fcb   C$LF      
+         fcc   "xtp Extended Type Code  wnd Window Number       val Valid Window Flag"
+         fcb   C$LF      
+         fcc   "sty Window Screen Type  cpx X Corner Position   cpy Y Corner Position"
+         fcb   C$LF      
+         fcc   "fgc Foreground Colour   bgc Background Colour   bdc Border Colour"
+         fcb   C$CR      
+HelpLen  equ   *-HelpMsg 
+
+Equal    fcc   "="       
+
+TypeMsg                  
+         fcb   C$LF      
+         fcc   "Not an SCF descriptor!"
+CR       fcb   C$CR      
+TypeLen  equ   *-TypeMsg 
+
+Sizemsg                  
+         fcb   C$LF      
+         fcc   "Module size out of range!"
+         fcb   C$CR      
+Sizelen  equ   *-Sizemsg 
+
+SynMsg                   
+         fcb   C$LF      
+         fcc   "Syntax error:  "
+SynLen   equ   *-SynMsg  
+
+****************
+* miscellaneous error and help routines
+
+MuchHelp                 
+         leax  HelpMsg,pc
+         ldy   #HelpLen  
+         bra   Helpprnt  
+
+BadSize                  
+         leax  Sizemsg,pc
+         ldy   #Sizelen  
+         bra   AddHelp   
+
+BadType                  
+         leax  TypeMsg,pc
+         ldy   #TypeLen  
+AddHelp                  
+         lda   #2        
+         os9   I$WritLn  
+Help                     
+         leax  UseMsg,pc 
+         ldy   #UseLen   
+Helpprnt                 
+         lda   #2        
+         os9   I$WritLn  
+         lbra  OkayEnd2  
+
+****************
+Entry                    
+         ldd   #0        
+         std   <ModAddr   zero mod flag
+         sta   <PathNmbr  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 module file
+         os9   I$Open    
+         bcs   Help      
+         stx   <ParmPtr  
+         sta   <PathNmbr  save path number
+         ldy   #MaxSize   max size
+         leax  ModBuff,u  module buff
+         os9   I$Read     get it
+         lbcs  Error     
+         ldb   M$Opt,x   
+         clra             [D] = option table size
+         addd  #M$DTyp    add options start offset
+         std   <OptEnd    save options end offset
+         ldd   M$Size,x   get module size
+         cmpd  #MaxSize   module size OK?
+         bhi   BadSize    no, go return error...
+         std   <ModSize  
+         bra   GotIt     
+
+Link                     
+         cmpa  #'/        else must be /<devicename>
+         bne   Help      
+         pshs  u         
+         lda   #Devic    
+         os9   F$Link     link to module
+         bcs   Help      
+         stx   <ParmPtr   update after name
+         tfr   u,x       
+         puls  u         
+         stx   <ModAddr  
+         ldb   M$Opt,x   
+         clra             [D] = option table size
+         addd  #M$DTyp    add options start offset
+         std   <OptEnd    save options end offset
+         ldd   M$Size,x   get module size
+         cmpd  #MaxSize   module size OK?
+         lbhi  BadSize    no, go report error...
+         std   <ModSize  
+         tfr   d,y        copy module size...
+         pshs  u          save data area pointer
+         leau  ModBuff,u 
+
+GetModLp                 
+         lda   ,x+       
+         sta   ,u+       
+         leay  -1,y      
+         bne   GetModLp  
+         puls  u          recover data area pointer
+
+GotIt                    
+         ldd   <OptEnd    get option table end offset
+         cmpd  <ModSize   is option table size OK?
+         lbhs  BadSize    no, go report error...
+         leax  ModBuff,u 
+         lda   M$DTyp,x   get device type
+         lbne  BadType    SCF = $00
+         ldx   <ParmPtr   point to input parms
+         lbsr  SkipSpac   go skip leading spaces...
+         cmpa  #C$CR      no options?
+         lbeq  Info       ..yes, give info
+         leax  -1,x      
+
+****************
+* X=ParmPtr
+* Find and Set Options:
+
+FindLp10                 
+         lbsr  SkipSpac   get next input param
+         stx   <ParmPtr   save for syntax error use
+         cmpa  #C$CR      end?
+         lbeq  Verify     ..yes, update module CRC
+         leay  OptTable-6,pc ready option table ptr
+         pshs  u         
+         ldu   ,x++       get next two chars
+         ora   #$20       convert 1st param char to lower case
+         exg   d,u        move [U] where we can convert param chars
+         ora   #$20       convert 2nd param char...
+         orb   #$20       convert 3rd...
+         exg   d,u        move back again
+
+FindLp20                 
+         leay  6,y        next option entry
+         tst   ,y         last entry?
+         bmi   Syntax     ..yes, bad option
+         cmpa  1,y       
+         bne   FindLp20   same name?
+         cmpu  2,y       
+         bne   FindLp20   ..no, loop
+* Found Option
+         puls  u         
+         sty   <TxtPtr   
+         ldd   ,x+        must be followed by "=", leave [X] pointing at char after "="
+         cmpa  #'=       
+         bne   Syntax    
+         cmpb  #C$CR      rest of option missing?
+         beq   Syntax     yes, go report error
+         cmpb  #C$SPAC    rest of option missing?
+         beq   Syntax     yes, go report error
+         ldb   5,y        get # of bytes
+         beq   Syntax     0 bytes, not allowed to change this option
+         stb   <Count    
+         ldb   4,y        get option offset or offset to option offset
+         bpl   NumOpt     option offset, go set hexadecimal option
+* Get CHAR input and set option:
+         andb  #^Sign     clear sign bit of offset to string offset
+         clra             [D] = offset to string offset within module
+         cmpd  <ModSize   is it OK?
+         bhs   Syntax     no, go report error...
+         leay  ModBuff,u  point to module
+         ldd   b,y        get offset to string
+         cmpd  <ModSize   is it OK?
+         bhs   Syntax     no, go report error...
+         leay  d,y        point to option
+         pshs  y          save option pointer
+         os9   F$PrsNam   valid OS-9 name?
+         puls  y          recover option pointer (end of name pointer lost)
+         bcs   Syntax     no, go report error
+         cmpa  #C$SPAC    space delimiter char?
+         beq   ChkLen     yes, go check name length...
+         cmpa  #C$CR      <CR> delimiter char?
+         bne   Syntax     no, go report error
+
+ChkLen                   
+         cmpb  <Count     name length OK?
+         bhi   Syntax     no, go report error...
+
+SetChrLp                 
+         lda   ,x+        get character
+         sta   ,y+        save it to module copy
+         decb             done yet?
+         bne   SetChrLp   no, go copy another char...
+         lda   -1,y       get last char
+         ora   #Sign      set sign bit
+         sta   -1,y       save last char
+         lbra  FindLp10   go do next...
+
+* Syntax Error:
+Syntax                   
+         leax  SynMsg,pc 
+         ldy   #SynLen   
+         lda   #2        
+         os9   I$Write   
+         ldx   <ParmPtr  
+         leax  -1,x      
+         pshs  x         
+         ldy   #0        
+
+CntLoop                  
+         leay  1,y       
+         lda   ,x+       
+         cmpa  #C$CR     
+         beq   SynSay    
+         cmpa  #C$SPAC   
+         bne   CntLoop   
+
+SynSay                   
+         puls  x         
+         lda   #2        
+         os9   I$Write    output err
+         lbra  OkayEnd   
+
+* Get Hex Input and Set Option:
+NumOpt                   
+         clra             [D] = option offset within module
+         cmpd  <OptEnd    is it OK?
+         bhs   Syntax     no, go report error...
+         clr   <HexIn     zero hex input bytes
+         clr   <HexIn+1  
+
+SetNumLp                 
+         lda   ,x+        get next #
+         cmpa  #C$SPAC    end of number?
+         beq   SetNum2    ..yes, set option
+         cmpa  #C$CR      end of line?
+         beq   SetNum1    ..yes, set option
+* Convert ASCII Hex-->Byte:
+         suba  #$30       make number from ASCII
+         bmi   Syntax    
+         cmpa  #10        is it number?
+         bcs   Num       
+         anda  #$5F       make uppercase
+         suba  #$11-$0A   make hex $A-$F
+         cmpa  #$0A      
+         bcs   Syntax    
+         cmpa  #$10       not hex char?
+         bcc   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          drop temp
+         bra   SetNumLp   ..loop
+
+SetNum1                  
+         leax  -1,x       reset so can find <CR>
+
+SetNum2                  
+         ldb   4,y        get option offset
+         leay  ModBuff,u  point to module
+         leay  b,y        point to option
+         ldd   <HexIn     pick up hex input
+         dec   <Count    
+         beq   SetOne    
+         std   ,y         set two byte option
+         lbra  FindLp10  
+
+SetOne                   
+         tsta            
+         lbne  Syntax    
+         stb   ,y         set one byte option
+
+SetNDone                 
+         lbra  FindLp10  
+
+* --------------
+* Skip Spaces:
+SkipSpac                 
+         lda   ,x+       
+         cmpa  #C$SPAC   
+         beq   SkipSpac  
+         rts             
+
+* --------------
+* Update Module CRC:
+Verify                   
+         pshs  u          save data ptr
+         leau  ModBuff,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   <PathNmbr  was it file?
+         beq   MemMod     ..no, in memory
+         ldx   #0        
+         tfr   x,u       
+         os9   I$Seek     go back to file begin
+         bcs   Error     
+         puls  u         
+         leax  ModBuff,u 
+         ldy   <ModSize  
+         os9   I$Write    update module file
+         bra   OkayEnd   
+
+MemMod                   
+         ldu   ,s         get data area pointer
+         leax  ModBuff,u 
+         ldy   <ModSize  
+         ldu   <ModAddr  
+
+PutModLp                 
+         lda   ,x+       
+         sta   ,u+       
+         leay  -1,y      
+         bne   PutModLp  
+         puls  u          recover data area pointer
+         bra   OkayEnd2  
+
+OkayEnd                  
+         bsr   OutCR     
+
+OkayEnd2                 
+         clrb             okay
+
+Error                    
+         pshs  b,cc      
+         ldu   <ModAddr  
+         beq   Bye       
+         os9   F$UnLink  
+
+Bye                      
+         puls  b,cc      
+         os9   F$Exit     we're done...
+
+* --------------
+* Print a <CR>:
+OutCR                    
+         leax  CR,pc     
+         ldy   #1        
+         lda   #1        
+         os9   I$WritLn  
+         rts             
+
+****************
+* Output Current Desc Info:
+Info                     
+         bsr   OutCR      do a <CR>
+         ldb   #TablOpts  number of table entries
+         pshs  b          save counter
+         leax  OptTable,pc point to text table
+         stx   <TxtPtr   
+
+InfoLoop                 
+         ldx   <TxtPtr   
+         ldy   #4        
+         lbsr  OutPut     print option name
+         leax  Equal,pc  
+         ldy   #1        
+         lbsr  OutPut     print =
+         ldx   <TxtPtr   
+         ldb   4,x        get offset to HEX option;  if minus, offset to option offset
+         bpl   PrintHex   go do simple offset to HEX option
+         andb  #^Sign     clear sign bit
+         clra             [D] = offset to string offset within module
+         cmpd  <ModSize   is it OK?
+         bhs   MovePtr    no, skip this option...
+         leay  ModBuff,u  point [Y] to module work copy
+         ldd   b,y        get string offset within module
+         cmpd  <ModSize   is string offset OK?
+         bhs   MovePtr    no, skip this option...
+         leay  d,y        point [Y] to CHAR string
+         lda   #BuffSize  get max. chars to print
+         leax  Buffer,u   point [X] to CHAR string buffer
+         clr   <Count     init counter
+
+CharCopy ldb   ,y+        get char
+         bpl   NotLast    sign bit clear so not last, go on...
+         andb  #^Sign     clear sign bit
+         lda   #1         set up as last char
+
+NotLast  stb   ,x+       
+         inc   <Count     count chars in string
+         deca             done yet?
+         bne   CharCopy   no, go do another char...
+         ldb   <Count     get chars in string ([A]=0, so [D]=char count)
+         tfr   d,y        module name length into [Y]
+         leax  Buffer,u   point [X] to CHAR string copy
+         bsr   OutPut     print CHAR string
+         bra   MovePtr    skip HEX output routine
+
+* Print Hex Option Values:
+PrintHex                 
+         ldx   <TxtPtr   
+         ldb   5,x        get # of digits
+         stb   <Count    
+         ldb   4,x        get option offset in module
+         clra             [D] = option offset within module
+         cmpd  <OptEnd    is option offset OK?
+         bhs   MovePtr    no, skip this option...
+         leax  ModBuff,u  point [X] to module work copy
+         abx              point [X] to option
+         stx   <DataPtr  
+
+* Print One Byte:
+NumLoop                  
+         ldx   <DataPtr  
+         lda   ,x+       
+         stx   <DataPtr  
+         pshs  a         
+         lsra            
+         lsra            
+         lsra            
+         lsra            
+         bsr   OutOne    
+         puls  a         
+         anda  #$0F      
+         bsr   OutOne    
+         dec   <Count    
+         bne   NumLoop   
+
+MovePtr                  
+         ldx   <TxtPtr   
+         leax  6,x       
+         stx   <TxtPtr   
+         dec   ,s        
+         lbeq  OkayEnd    done...
+         ldb   ,s        
+         bitb  #$07       # of options remaining evenly divisible by eight?
+         lbne  InfoLoop   no, go print next option on same line
+         lbsr  OutCR      <CR> after every 8th option
+         lbra  InfoLoop   ..loop
+
+* --------------
+* Print 1/2 Byte Hex Char:
+OutOne                   
+         cmpa  #10       
+         bcs   Number    
+         adda  #$11-10    make alpha
+
+Number                   
+         adda  #$30       make ASCII
+         sta   <Buffer   
+         leax  Buffer,u  
+         ldy   #1        
+
+OutPut                   
+         lda   #1         std out
+         os9   I$Write   
+         lbcs  Error     
+         rts             
+
+         emod            
+Size     equ   *         
+         end             
+
--- a/level2/cmds/makefile	Tue Dec 03 14:48:59 2002 +0000
+++ b/level2/cmds/makefile	Tue Dec 03 16:07:00 2002 +0000
@@ -3,7 +3,7 @@
 DEPENDS		= ./Makefile
 
 CMDS		= asm attr backup binex build cmp cobbler copy date \
-		deiniz del deldir dir display dsave dump echo edit error exbin format \
+		deiniz del deldir dir display dsave dump echo edit error exbin exmode format \
 		free grfdrv help ident iniz link list load login makdir mdir \
 		merge mfree modpatch montype os9gen procs pwd pxd rename runb save \
 		setime shell_21 shellplus sleep tee tmode tsmon unlink \