.MCALL .MODULE .MODULE CONFIG,VERSION=22,COMMENT=,AUDIT=NO ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; ; Edit Who Date Description of modification ; ---- --- ---- --------------------------- ; 001 WLD 20-MAY-1991 Support RZ%% identifiers ;RQZX1 ; 002 WLD 29-MAY-1991 Fixed trap condition when /P/Q ; switches are set. ; 003 WLD 27-AUG-1991 Support RA 9x identifiers. ; 004 WLD 23-DEC-1991 Support RZ%%% identifiers ;RQZX1 ; 005 WLD 02-JUN-1992 Support RA %% identifiers. ;-- .SbTtl Internal documentation ;+ ;ERROR ; ; This program is a simple sniffer for the CONFIG.COM command file. ; It may also have general use for other command files which need ; to peek around the system. ; ; Its functionality breaks down into three parts: checking on handlers, ; checking on memory (and I/O Page) locations, and checking contents of ; files. ; ; To determine the existence of an installed handler simply specify ; the device name: ; ; RUN CONFIG DX: ; ; This will exit with Success if the handler is installed, with ; Error if it is not. To bypass the logical name searching specify: ; ; RUN CONFIG DX:/P ; ; This is the "equivalent" of the VMS _DX: specification. ; ; ; To determine if an MSCP device unit is a removable or fixed media ; device, specify the MSCP device unit with the /T switch: ; ; RUN CONFIG DU3:/T:REM ; RUN CONFIG DU3:/T:FIX ; ; If the unit specified matches the type (FIX or REM) specified in ; the switch, then success is set. If the unit does not match, ; the type specified, error is set; and if the unit is not available, ; fatal is set. ; ; To determine if an MSCP device matches a specific media name, specify ; the MSCP device unit with the /N switch: ; ; RUN CONFIG DU3:/N:"RX 50" ; ; If the unit specified matches the media type (from the information ; returned by the GET UNIT STATUS command), then success is set. If ; the unit does not match error is set; and if the unit is not available, ; fatal is set. NOTE: the name is surrounded by "" to indicate ASCII ; rather than RAD50. ; ; NOTE: the third char is normally blank (except for RCF25) ; ; Automatic Installation (STARTA.COM) needs a function to determine if ; a specific MSCP device can be the device on which to build a working ; system. Originally, it was thought that the device size could be used ; to determine this via IND's .TESTDEVICE, but due to certain technical ; difficulties, some MSCP controllers do not return a device size when ; the unit in question is not on line. ; ; To determine if an MSCP device can be used for building a working system, ; specify the MSCP device unit with the /Q switch: ; ; RUN CONFIG DU3:/Q ; ; If the unit specified matches any valid MSCP media names in an internal ; list in CONFIG (AIVal:) (returned by the GET UNIT STATUS command), then ; success is set. If the unit does not match, error is set; and if the ; unit is not available, fatal is set. ; ; During Automatic Installation of Field Test versions (e.g., system version ; numbers which have other than a V prefix), /Q will invoke conditional code ; to print all device names residing in the AIVal device table. ; ; To determine the existence of a memory location specify: ; ; RUN CONFIG /A:177776 ; ; If a read access of the location succeeds, Success is set, if it ; traps, Fatal is set. ; ; To determine if the contents of a memory location equal a specified ; value, specify: ; ; RUN CONFIG /A:000000/V:040000 ; ; If the location contents equal the value, Success is set, if they do not ; match, Error is set, and if accessing the location causes a trap, Fatal ; is set. ; ; The above comparison can be modified by a bit mask, which may be used to ; choose which bits are compared. To do this specify: ; ; RUN CONFIG /A:000002/V:104000/M:177400 ; ; In this case if the high 8 bits of location 2 are 1040xx, Success is set, ; if not, Error is set, and if accessing the location causes a trap, Fatal ; is set. ; ; The /A operations can be changed from word to byte accesses by using /B ; ; All the the /A operations can be done based on offsets from the beginning ; of RMON rather than actual addresses by using /R:offset rather than /A:addr. ; ; The /A operations can also be done to files contents. These are done by ; specifying the file name and /F in place of /A. The /B, /M, and /V are used ; in the same way for /F as for /A. Once the file has been specified, using ; just /F without a file specification will optimize disk operations for ; several tests on the same file. ; ; The /D option may be specified with any operation to cause messages to be ; displayed as well as the error byte to be set. The /D:YES option may be ; specified which will "lock" display on. Also /D:NO option may be ; specified which will unlock display. ;- .SbTtl Macro Library references and local definitions .NList BEX .MCall ...CMV .MCall .Exit .LookUp .CStatus .DStatus .Fetch .TrpSet .GVal .Assume .Br .MCall .Purge .ReadW .Print .Wait .Audit Sob .Macro JXX Rel .Irp x, .Macro J'x, Dst, ?l1 .IIf IDN , Bne l1 .IIf IDN , Beq l1 .IIf IDN , Bmi l1 .IIf IDN , Bpl l1 .IIf IDN , Bvs l1 .IIf IDN , Bvc l1 .IIf IDN , Bcs l1 .IIf IDN , Bcc l1 .IIf IDN , Blt l1 .IIf IDN , Bge l1 .IIf IDN , Ble l1 .IIf IDN , Bgt l1 .IIf IDN , Blos l1 .IIf IDN , Bhi l1 .IIf IDN , Blo l1 .IIf IDN , Bhis l1 Jmp Dst l1: .EndR .EndM .EndM JXX .Macro .Media Name MNmLen =: 6 ..MdPC = . .Asciz "Name" .Assume .-..MdPC Eq MNmLen .EndM .SbTtl Global (SYSLIB) references .Globl Call$F ; SYSLIB routine .Globl ICSI ; SYSLIB routine .Globl IGtDuS ; SYSLIB routine .Globl GtLin ; SYSLIB routine .Globl Index ; SYSLIB routine .Globl ISWild ; SYSLIB routine ;RQZX1 .Globl .Call$ .Globl .ICSI .Globl .IGtDu .Globl .GtLin .Globl .Index .Globl .ISWild ;RQZX1 .Globl .ErrPM .Globl .$NXAD .SbTtl .AUDIT list .Audit .CONFIG .Audit .Call$ .Audit .ICSI .Audit .IGtDu .Audit .GtLin .Audit .Index .Audit .ISWild ;RQZX1 .Audit .ErrPM .Audit .$NXAD ...CMV PART=PREFIX,TYPE=V .SbTtl SYSCOM references ErrByt =: 52 UsErrB =: 53 Succs$ =: 1 Warn$ =: 2 Error$ =: 4 Fatal$ =: 10 UCond$ =: 20 .SbTtl Determine request type .Enabl LSB DEBUG:: BPT ; Debug entry Config:: Add #2,Limit+2 ; Adjust high address Next: .TrpSet #Area,#0 ; clear any trapset Mov #PGtLin,R5 ; point to parameter list Mov #GtLin,R0 ; and to gtlin routine Call Call$F ; call it TstB CmdBuf ; empty line? Bne 10$ ; no .Print #HiMsg ; yes Br Next 10$: Mov #CmdBuf,PIndex+2 ; set addr of buffer to scan Mov #PIndex,R5 ; point to parameter list Mov #Index,R0 ; look for " Call Call$F ; and save registers Mov R0,Ascii ; save returned value Beq 20$ ; no string in "" ClrB CmdBuf-1(R0) ; change first delimiter to null 20$: Mov #PCSI,R5 ; point to parameter list Mov #ICSI,R0 ; get a command line and parse it Call Call$F ; and save registers Tst R0 ; Error? ;+ ;ERROR Jne CSIErr ; parsing error ;1 Invalid command line ;2 Invalid device ;3 Invalid option ;- .SbTtl Process /D:Val Cmp #O.YVal,Opt.D+O.Fnd ; was /D:val specified? Bne 40$ ; no Cmp #D.YES,Opt.D+O.Val ; value specified, was it "YES"? Bne 30$ ; no Mov SP,DLock ; yes, lock on /D 30$: Cmp #D.NO,Opt.D+O.Val ; value specified, was it "NO"? Bne 40$ ; no Clr DLock ; yes, unlock /D 40$: Cmp #O.YVal,Opt.R+O.Fnd ; was /R:offset specified? Beq AtRmon ; yes, access an RMON offset Tst Opt.F+O.Fnd ; was /F specified? Bne AtFile ; yes, test a file's contents Cmp #O.YVal,Opt.A+O.Fnd ; was /A:addr specified? Jne NoA ; no, then look for a device to test .Br PreA .Dsabl LSB .SbTtl Process /A .Enabl LSB PreA: .TrpSet #Area,#Trap ; set up for possible trap DoA: .Assume O.NFnd EQ 0 Tst Opt.B+O.Fnd ; byte operation? Beq WordM ; no, then do a word operation ByteM: Clc ; needed? MovB @Opt.A+O.Val,R0 ; get the value Br GetByt ; now process it .SbTtl Process /F .Enabl LSB AtFile: Mov #Status,R5 ; point to answer area Tst F.In1 ; was a file name specified? Beq 20$ ; no, maybe previously opened .Purge #0 ; clear the channel for lookup .DStat R5,#F.In1 ; check on the device ;+ ;ERROR Jcs DStErr ; no ;Invalid device ;- Tst 4(R5) ; is it in memory? Bne 10$ ; yes .Fetch Limit+2,#F.In1 ; else fetch it ;+ ;ERROR Jcs FetErr ; can't fetch ;Fetch failed ;- 10$: Mov #-1,CurBlk ; set current block to unlikely value .LookUp #Area,#0,#F.In1 ; lookup the file ;+ ;ERROR Jcs LukErr ; ok ;0 channel in use (logic error 1) ;1 File not found ;2 File open on non-sharable ;5 argument is invalid (logic error 2) 20$: .Wait #0 ; Is a file open? Jcs WaiErr ; no, /F specified without filename ; and without previous file name ;no file specified ;- Cmp #O.YVal,Opt.F+O.Fnd ; was /F:addr specified? Bne Next1 ; no, just a file name then Mov Opt.F+O.Val,R1 ; get file location to test Mov R1,R3 ; save it for use as offset later Clc ; clear carry Asr R1 ; /2 SwaB R1 ; /2/256.= /512. = block number Bic #^c377,R1 ; dump junk ; Note: this works only with files ; smaller than 512 blocks? Cmp R1,CurBlk ; already in memory? Beq 30$ ; yes, no need to read Mov R1,CurBlk ; set the current block .ReadW #Area,#0,#Buffer,#256.,CurBlk ; else read it in ;+ ;ERROR Jcs ReaErr ;0 EOF ;1 I/O error ;2 channel not open (logic error 3) ;- 30$: Bic #^c777,R3 ; clear all but block offset Add #Buffer,R3 ; add in buffer address Mov R3,Opt.A+O.Val ; fake /A value Br DoA ; and do it .Dsabl LSB .SbTtl Process /R .Enabl LSB AtRmon: Clr R3 ; init R3 Mov Opt.R+O.Val,R1 ; get the offset Ror R1 ; "odd" bit to carry Adc R3 ; set R3 non-zero if offset is odd Asl R1 ; make offset even for .GVal .GVal #Area,R1 ; get value from RMON ;+ ;ERROR Jcs GVaErr ; BAD! ;Offset not inside RMON ;- Tst R3 ; was it odd? Beq WBTest ; no SwaB R0 ; put the high byte in the low Bic #^c377,R0 ; dump junk WBTest: .Assume O.NFnd EQ 0 Tst Opt.B+O.Fnd ; was /B specified? Beq GetVal ; no, just process it ;Clc ; from TST above MovB R0,R0 ; sign extend it .Br GetByt .SbTtl Common matching code GetByt: MovB Opt.V+O.Val,R1 ; get possible compare value Br TrapCk ; check for trapping WordM: Mov @Opt.A+O.Val,R0 ; get the value GetVal: Mov Opt.V+O.Val,R1 ; get possible compare value .Enabl LSB TrapCk: Bcs Next1 ; non-existent address Cmp #O.YVal,Opt.M+O.Fnd ; mask specified? Bne 10$ ; no Mov Opt.M+O.Val,R2 ; load mask value Com R2 ; complement it Bic R2,R0 ; clear unwanted bits in values Bic R2,R1 ; to be compared. 10$: Cmp #O.YVal,Opt.V+O.Fnd ; was a value to compare with given? Jne Next ; no, done Cmp R0,R1 ; test the values ;+ ;ERROR Jne MatErr ; indicate not a match ;Values do not match ;- Next1: Jmp Next .Dsabl LSB .SbTtl Process dev: .Enabl LSB NoA: Tst F.In1 ; any file? Bne 10$ ; yes Tst Opt.D+O.Fnd ; no, was /D specified? Bne Next1 ; yes, then skip processing 10$: Mov #Status,R5 ; point to answer area .Assume O.NFnd EQ 0 Tst Opt.P+O.Fnd ; was a physical request made? Beq 20$ ; no Inc R5 ; else indicate physical (non-logical) 20$: .DStat R5,#F.In1 ; check on the device ;+ ;ERROR Bcs DStErr ; no ;Invalid device ;- .Assume O.NFnd EQ 0 Tst Opt.N+O.Fnd ; was /N specified (name?) Bne 30$ ;yes .Assume O.NFnd EQ 0 Tst Opt.Q+O.Fnd ; was /Q specified (AI valid device?) Bne 30$ ;yes .Assume O.NFnd EQ 0 Tst Opt.T+O.Fnd ; was /T specified (type?) Beq Next1 ; no 30$: BIC #1,R5 ; Fix R5 in case /P was specified. Tst 4(R5) ; is it in memory? Bne 40$ ; yes ;>>> add /P physical (later) .Fetch Limit+2,#F.In1 ; else fetch it ;+ ;ERROR Bcs FetErr ; can't fetch ;Fetch failed ;- 40$: Mov #PGtDuS,R5 ; point to arg list Mov #IGtDus,R0 ; get the status of the device Call Call$F ; and save registers Tst R0 ; any errors? ;+ ;ERROR Jne GtDErr ; yes, not available ;- .Assume O.NFnd EQ 0 Tst Opt.N+O.Fnd ; was it /N? Bne 60$ ; yes .Assume O.NFnd EQ 0 Tst Opt.Q+O.Fnd ; was it /Q? Bne 80$ ; yes .Assume R2REM EQ 200 TstB Report+2 ; Fixed Bmi 50$ ; no, removable Cmp Opt.T+O.Val,#^rFIX ; want fixed? Beq Next1 ; yes, success ;+ ;ERROR Jmp RemErr ; no, error ;Fixed requested, removable found ;- 50$: ; removable Cmp Opt.T+O.Val,#^rREM ; want removable? Beq Next1 ; yes, success ;+ ;ERROR Br FixErr ; no, error ;Removable requested, fixed found ;- 60$: ; name to match Mov #CmdBuf,R0 ; find addr to scan Add Ascii,R0 ; ... Mov R0,Ascii ; save it Mov R0,PIndex+2 ; set addr of buffer to scan Mov #PIndex,R5 ; point to parameter list Mov #Index,R0 ; look for " Call Call$F ; and save registers Beq 70$ ; no string in "" Add Ascii,R0 ; add in beginning address Dec R0 ; fudge ClrB @R0 ; change first delimiter to null 70$: Mov #1,R2 ; Only 1 trial string to compare Br 90$ 80$: .IF NE RT$PRE-'V ; if version other than "V" Call Shomed ; print devices in AIVal .ENDC Mov #AIVal,Ascii ; arg for trial media name string Mov #MNmTot,R2 ; number of valid media names in list .Br 90$ 90$: Mov #Report+P.Medi,R0 Mov #VarMed,R1 .Rept 5 MovB (R0)+,(R1)+ .EndR Mov #InfMed,R1 Call DoErr1 ; display type found if /D[:YES] 100$: Mov #PSComp,R5 ; load argument list Mov #ISWild,R0 ; compare the two strings ;RQZX1 Call Call$F ; saving registers. Tst R0 ; test return value Bge Next1 ; BR if match: Success ;RQZX1 Add #MNmLen,Ascii Sob R2,100$ ;+ ;ERROR Br MedErr ; else media name not matching ;- .Dsabl LSB .SbTtl Handle Traps Trap:: Bis #1,2(SP) ; Set Carry Mov #IllAdr,R1 ; point to message Call DoErr1 ; and process it ;location does not exist .TrpSet #Area,Code=NOSET ; reset trap trap RTI ; return .SbTtl Error Processing .Enabl LSB ;+ ;ERROR DstErr: Mov #IllDev,R1 ; point to error message Br DoErr FetErr: Mov #IllFet,R1 ; point to error message Br DoErr CSIErr: Mov #IllCmd,R1 ; Assume invalid command Cmp R0,#1 ; Is it? Beq DoErr ; Yes Mov #IllDev,R1 ; Assume invalid device Cmp R0,#2 ; Is it? Beq DoErr ; yes Mov #IllOpt,R1 ; Assume invalid option Cmp R0,#3 ; Is it? Beq DoErr ; Yes Mov #Logic0,R1 ; else invalid error code from ICSI Br DoErr LukErr: Mov #Logic1,R1 ; Assume channel in use MovB @#ErrByt,R0 ; get the value Beq DoErr Mov #IllFNF,R1 ; Assume file not found CmpB R0,#1 ; was it? Beq DoErr ; yes Mov #IllShr,R1 ; Assume device sharing problem CmpB R0,#2 ; was it? Beq DoErr ; yes Mov #Logic2,R1 ; Assume Ill arg error CmpB R0,#5 ; was it? Beq DoErr ; yes Mov #Logic3,R1 ; Unexpected error code from lookup Br DoErr WaiErr: Mov #IllFNS,R1 ; File not specified Br DoErr FixErr: Mov #IllRem,R1 ; Found fixed when removable requested Br DoErr RemErr: Mov #IllFix,R1 ; Found removable when fixed requested Br DoErr ReaErr: Mov #IllEOF,R1 ; Assume EOF MovB @#ErrByt,R0 ; was it? Beq DoErr ; yes Mov #IllIOE,R1 ; Assume I/O error CmpB R0,#1 ; was it? Beq DoErr ; yes Mov #Logic4,R1 ; assume channel not open CmpB R0,#2 ; was it? Beq DoErr ; yes Mov #Logic5,R1 ; unexpected error code from .READW Br DoErr GVaErr: Mov #IllGVa,R1 ; GVal failed Br DoErr ; do message MedErr: Mov #IllMed,R1 ; media ID not matching requested Br DoErr GtDErr: Mov #IllIOE,R1 ; Assume I/O error Cmp R0,#-5 ; is it? Beq DoErr ; yes Mov #IllFNS,R1 ; Assume not sharable device Cmp R0,#-17. ; is it? Beq DoErr ; yes (-17.) Mov #IllMSC,R1 ; Assume not an MSCP device Cmp R0,#-18. ; is it? Beq DoErr ; Yes Mov #Logic6,R1 ; logic error Br DoErr MatErr: Mov #IllMat,R1 ; Values do not match .Br DoErr DoErr: Call DoErr1 Jmp Next ;- DoErr1: BisB (R1)+,@#UsErrB ; set error level Tst DLock ; is /D locked on? Bne 10$ ; yes .Assume O.NFnd EQ 0 Tst Opt.D+O.Fnd ; was /D specified (display messages?) Beq 20$ ; no 10$: .Print #Prefix ; yes, print prefix .Print R1 ; and body of message 20$: Return ; and done .SbTtl Print device names found in AIVal .IF NE RT$PRE-'V ; if version other than "V" ; ************************************ ; To prevent branching out of range ; problems, Shomed logic is called as ; oppossed to being inserted as inline ; code. ; ************************************ Shomed: ;+ ;ERROR ;only for non "V" software .Print #Infaim ; print header for auto install table ; "!CONFIG-I-Following media in the ; auto install table:" ;- Mov #AIVal,R1 ; address of install table to R1 Mov #MNmTot,R2 ; number of valid names to R2 100$: Cmpb (R1),#40 ; use ASCII space for delimeter Beq 300$ ; branch when done .Print R1 ; print all the device names in AIVal 200$: Tstb (R1)+ ; bump up address Bne 200$ Dec R2 ; bump down count Bgt 100$ ; loop until done 300$: Return ; done printing all device names .ENDC .SbTtl Data Area PGtLin: .Word 3 ; 3 arguments .Word CmdBuf ; output buffer .Word Star ; prompt string .Word Plain ; unshuffeled PIndex: .Word 2 ; 2 arguments .BlkW 1 ; search buffer .Word Quote2 ; for " PCSI: .Word 5 ; 5 arguments .Word FilSpc ; place to put file specifications .Word DefTyp ; default types .Word CmdBuf ; get input from string .Word Option ; option table .Word NumOpt ; number of options PSComp: .Word 2 ; 2 arguments .Word Report+P.Medi ; from IGtDuS ;RQZX1 Ascii: .BlkW 1 ; input ;RQZX1 PGtDuS: .Word 7 ; 7 arguments .Word F.In1 ; device name .Word Zero ; channel 0 .Word Report ; 7 word report area .Word -1 ; unit number .Word AscRT ; RT-11 .Word Work ; work area .Word WASizV ; work area size (words) AscRT: .Ascii "RT" Zero: .Word 0 Report: .BlkW 7 R2REM=: 200 ; bit mask for removable media ; in Report+2 P.MEDI =:10 ; 5 byte asciz name field AIVal: .Media ;RAxx disks .Media .Media .Media .Media .Media .Media .Media .Media .Media .Media .Media ;RQZX1 .Media < > .Media < > .Media < > MNmTot =: <.-AIVal>/MNmLen WASize =: 144. ; IGTDUS work area size in words WASizV: .Word WASize ; IGTDUS work area size variable Work: .BlkW WASize ; IGTDUS work area DefTyp: ; default types -- don't care Area: ; EMT parm block Status: ; .DSTATUS reply FilSpc: ; file specifications F.Out1: .BlkW 5. F.Out2: .BlkW 5. F.Out3: .BlkW 5. F.In1: .BlkW 4. F.In2: .BlkW 4. F.In3: .BlkW 4. F.In4: .BlkW 4. F.In5: .BlkW 4. F.In6: .BlkW 4. Option: ; option array for ICSI O.Ltr=:0 ; word containing switch name O.Fnd=:2 ; word containing switch status O.NFnd=:0 ; not in command line O.NVal=:1 ; in command line, no value O.YVal=:2 ; in command line, value specified O.Fil=:4 ; word containing switch file number O.Val=:6 ; word containing switch value Opt.A: .Word 'A,.-.,.-.,.-. ; Address switch Opt.B: .Word 'B,.-.,.-.,.-. ; Byte operation switch Opt.D: .Word 'D,.-.,.-.,.-. ; Display results D.YES=: ^rYES ; Lock display D.NO=: ^rNO ; Unlock display Opt.F: .Word 'F,.-.,.-.,.-. ; File testing switch Opt.M: .Word 'M,.-.,.-.,.-. ; Mask switch Opt.N: .Word 'N,.-.,.-.,.-. ; Media Name switch Opt.P: .Word 'P,.-.,.-.,.-. ; Physical DSTAT Opt.Q: .Word 'Q,.-.,.-.,.-. ; Valid autoinstallation media query Opt.R: .Word 'R,.-.,.-.,.-. ; RMON offset switch Opt.T: .Word 'T,.-.,.-.,.-. ; Type switch T.FIX=: ^rFIX ; FIXed value T.REM=: ^rREM ; REMovable value Opt.V: .Word 'V,.-.,.-.,.-. ; Value switch OptX: ; end of option list NumOpt: .Word OptX-Option/8. ; number of options in table DLock: .BlkW 1 ; <>0 means /D locked on CurBlk: .Word -1+.-. ; current block Buffer: .BlkW 256. ; block buffer CmdBuf: .BlkB 81. ; command buffer .Even Limit: .Limit .SbTtl Messages NoCrLf =: 200 ; no CRLF suffix Quote2: .Asciz '"' ; qoute char for INDEX Star: .Ascii "*" ; prompt char for .GtLin Plain: .Ascii "P" ; IGtLin type HiMsg: .NlCSI Prefix: .NlCSI Part=PREFIX,Type=I .Byte ;+ ;ERROR IllAdr: .Asciz "F-Invalid address" IllCmd: .Asciz "F-Invalid command" IllDev: .Asciz "E-Invalid device" IllEOF: .Asciz "F-Unexpected EOF" IllFet: .Asciz "F-Fetch error" IllFix: .Asciz "E-Unit not removable" IllFNF: .Asciz "E-File not found" IllFNS: .Asciz "F-No file" IllGVa: .Asciz "F-GVAL failed" IllIOE: .Asciz "F-Input error" IllMat: .Asciz "E-Values do not match" IllMed: .Asciz "E-Media does not match" IllMSC: .Asciz "F-Non-MSCP device" IllOpt: .Asciz "F-Invalid option" IllRem: .Asciz "E-Unit removable" IllShr: .Asciz "F-Device busy" InfMed: .Ascii "I-Media type is - " VarMed: .BlkB 6 Logic0: .Asciz "U-Logic error 0" Logic1: .Asciz "U-Logic error 1" Logic2: .Asciz "U-Logic error 2" Logic3: .Asciz "U-Logic error 3" Logic4: .Asciz "U-Logic error 4" Logic5: .Asciz "U-Logic error 5" Logic6: .Asciz "U-Logic error 6" .IF NE RT$PRE-'V ; if version other than "V" Infaim: .Asciz "!CONFIG-I-Following media in the auto install table: " .ENDC ;- .End Config