.IDENT /V04/ ;**NEW** .TITLE RSX11D -- MCR FUNCTION TASKS ;**-1 .SBTTL "SET FUNCTION ;**NEW** .NLIST BEX ; ; ; ; ; ; ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MA 01754. ; ; ; THE MATERIAL INCLUDED IN THIS FUNCTIONAL SPECIFICATION, ; INCLUDING BUT NOT LIMITED TO INSTRUCTION TIMES AND OPERATING ; SPEEDS, IS FOR INFORMATION PURPOSES ONLY. ALL SUCH MATERIAL ; IS SUBJECT TO CHANGE WITHOUT NOTICE. CONSEQUENTLY, DEC MAKES ; NO CLAIM AND SHALL NOT BE LIABLE FOR ITS ACCURACY. ; ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; UNLESS OTHERWISE SPECIFIED, THE TERMS "RSX" AND "RSX-11" ; IMPLY "RSX-11D". ; ; ; ; MODULE: "SET" MCR FUNCTION TASK ; VERSION: V03 ;**NEW** ; AUTHOR: J. MASSE ;**-1 ; DATE: 10 JAN 74 ; ; EDIT AUTHOR DATE REASON ; ---- ------ ---- ------ ; M CONNORS 10-MAY-74 ; M CONNORS 14-JUN-74 ; H A NICHOLS 22-JUL-74 ; H A NICHOLS 30-SEP-74 ; 001 G L WOLFENDALE 25-APR-75 ; 002 ELLEN SIMICH 8-JUL-75 ; 003 JOHN HARPER 12-MAR-76 ADD SET /WIDTH ; 004 RICHARD NEWLAND 07-MAY-76 ADD SET /SWR ; 005 JOHN HARPER 23-SEP-76 REMOVE SET / ; 006 JOHN HARPER 23-SEP-76 CHANGE SET /WCHK ; 007 BOB DRAY 06-FEB-78 ADD SET /CLI, REMOVE SET /INB ; 008 JOHN HARPER 28-MAR-78 CHANGES FOR NEW SPOOLING ; ; ; THIS MODULE CONTAINS: ; ; 1 -- CODE TO SERVICE THE "SET" MCR FUNCTION ; ;+ ; MCR FUNCTION -- SET ; ; TASK NAME "...SET" TO SET KEYWORD(S). ; THIS TASK CAN BE REQUESTED ONLY FROM A PRIVILEGED TERMINAL ;**NEW** ; ; ; THE FIRST LINE OF THE COMMAND INPUT FOR ANY MCR FUNCTION IS READ ; BY THE RESIDENT MCR TASK ("...MCR"). FOR THE "SET" FUNCTION, THERE ; IS ONLY ONE LINE OF COMMAND INPUT, WHOSE SYNTAX IS: ; ; SET::="SET"; ; ::=[]"/"/; ; ::="=" ; ["/"]; ; ::=/ ; ::=/; ; ; ; THE FOLLOWING KEYWORDS ARE IMPLEMENTED IN THIS VERSION: ; ; 1. ::="UIC="["/"]; ; ::="["",""]"; ; ::=1-377; ; ::=1-377; ; ; 2. ::="TMO="["/"]; ; ::=1-32767.; ; ; ; 4. ::="="":"[::="LA30S"/"LA30P"/"KSR33"/"VT05"; ; "SLV"/"-SLV"/"PRV"/"-PRV"; ; ::= ; ; 5. ::="="":"[::="SP"/"-SP" ; ::= ; ::=(ANY TWO CHARACTER ASCII STRING APPEARING IN THE PUD ; ::=1-77 ; ; 6. ::="=" ; ::="CAC" ; ::="ON0", "0N1", "OF0", "OF1", 1-32767. ; ; ; ; INPUTS: ; MCR COMMAND LINE AS READ BY MCR DISPATCHER TASK. ; ; OUTPUTS: ; THE SPECIFIED KEYWORDS ARE RESET TO THE NEW PARAMETERS. ; ; ;- ; ; ; ; M A C R O L I B R A R Y C A L L S ; ; .MCALL CALL,RETURN,DIR$,EXIT$S,GMCR$,WTSE$S,QIO$,QIOW$S .MCALL QIOW$ ;**NEW** ; ; ; ; ; ; ; L O C A L M A C R O S ; ; ; MACRO TO GENERATE MESSAGE DPB'S ; ; ARG1 = MESSAGE LOCATION ; ARG2 = MESSAGE SIZE (IN BYTES) ; ; MESSAGE IS IN ASCII -- E.G., .ASCII /MESSAGE/ ; ; .MACRO .QIO ARG1,ARG2 QIO$ FNC,LUN,EFN,PRI,IOST,AST, .ENDM .QIO ; ; ; ; ; ; ; ; L O C A L S Y M B O L S ; ; SPACE =40 ;SPACE CR =15 ;CARRIAGE RETURN ALTMOD =33 ;ALT MODE TAB =11 ;TAB FNC =400 ;FUNCTION CODE FOR WRITE LUN =2 ;LOGICAL UNIT NO. EFN =1 ;EVENT FLAG NO. PRI =0 ;PRIORITY NO. AST =0 ;I/O DONE AST ENTRY POINT CCW =40 ;CARRIAGE CONTROL WORD .PAGE ; ; ; L O C A L D A T A ; ; ; DPB'S & ERROR MESSAGES ; ; MCRLN: GMCR$ ; ; .EVEN ;**NEW** PRIVD: QIOW$ IO.WVB,6,1,,,, ;**NEW** PRVMS: .ASCII /SET -- ILLEGAL FUNCTION FOR NON PRIVILEGED TERMINAL/ ;**NEW** PRVLN=.-PRVMS ;**NEW** .EVEN ;**NEW** ; MCRMSG: .QIO MCRBFF,MCRSZ MCRBFF: .ASCII /SET -- CAN'T READ MCR COMMAND BUFFER/ MCRSZ=.-MCRBFF .EVEN ; ; ; SYNMSG: .QIO SYNMS,SYNSZ SYNMS: .ASCII /SET -- SYNTAX ERROR/ SYNSZ=.-SYNMS .EVEN ; ; ; TTYMES: .QIO TTY,TTYLEN TTY: .ASCII /SET -- PLEASE USE 'TER' COMMAND/ ;++005 TTYLEN=.-TTY ; DDVNA: .ASCII /SET -- PARAMETER ERROR - BAD DEVICE NAME/ DVLN=.-DDVNA .EVEN ;++007 ; DVTMSG: .QIO DVTTA,DVTTL ;++007 DVTTA: .ASCII /SET -- SPECIFIED DEVICE IS NOT A TERMINAL TYPE DEVICE/ DVTTL=.-DVTTA ; MGMS: .ASCII /SET -- SPOOLING NOT SUPPORTED FOR THIS DEVICE/ ;++003 MGLN=.-MGMS NWCKMS: .ASCII /SPECIFIED DEVICE DOES NOT SUPPORT WRITE CHECK./ NWCKLN=.-NWCKMS WIDERR: .ASCII /SET WIDTH ONLY VALID FOR RECORD-ORIENTED DEVICES/ ;++003 WIDERN=.-WIDERR .EVEN MACMSG: .QIO MACMES,MACSZ ;MACHINE TYPE MES. 002 VALMSG: .QIO VALMES,VALSZ ;002 MACMES: .ASCII /ILLEGAL FUNCTION FOR MACHINE TYPE./ ;002 MACSZ=.-MACMES VALMES: .ASCII /INVALID CACHE VALUE./ ;002 VALSZ=.-VALMES ; SWRMES: .ASCII /SWR = / ; +++004 SWRVAL: .ASCII /177777/ ; +++004 SWRSZ=.-SWRMES ; +++004 .EVEN ; CLIMSG: .QIO CLIMES,CLISZ ;++007 CLIMES: .ASCII /SET -- ILLEGAL CLI NAME/ CLISZ=.-CLIMES .EVEN ; LOGMSG: .QIO LOGMES,LOGSZ ;++007 LOGMES: .ASCII /SET -- TERMINAL LOGGED IN/ LOGSZ=.-LOGMES .EVEN SPRDQ: .QIO SPRDM,SPRDL SPRDM: .ASCII /SET -- DEVICE ILLEGALLY REDIRECTED/ SPRDL=.-SPRDM .EVEN SPNSPQ: .QIO SPNSPM,SPNSPS SPNSPM: .ASCII /SET -- DEVICE 'SP0:' NOT IN SYSTEM/ SPNSPS=.-SPNSPM .EVEN SPNOTQ: .QIO SPNOTM,SPNOTS SPNOTM: .ASCII /SET -- DEVICE NOT SPOOLED/ SPNOTS=.-SPNOTM .EVEN SPMNTQ: .QIO SPMNTM,SPMNTS SPMNTM: .ASCII /SET -- DEVICE SP0: IS MOUNTED/ SPMNTS=.-SPMNTM .EVEN .PAGE ; ; ; MISC. CONSTANTS & DATA ; KEYWRD: .WORD 0 ;EXIT FLAG -- 0=NO KEYWORDS FOUND SETUIC: .WORD 0 ;UIC ASSEMBLY WORD KWNAME: .WORD 0 ;KEYWORD ASSEMBLY WORD DECNUM: .WORD 0 ;MULTIPLIER FOR NUMBER DECODER IOST: .BLKW 2 ;I/O STATUS BLOCK DEV: .WORD 0 ;DEVICE NAME FOR PUD SEARCH UNIT: .WORD 0 ;UNIT NUMBER FOR PUD SEARCH .PAGE ; ; ; DISPATCH TABLE FOR FIRST LEVEL KEYWORDS ; ; EACH FIVE WORD ENTRY CONSISTS OF: ; ; 1. THE ADDRESS OF AN ASCIZ KEYWORD STRING ; 2. THE ADDRESS OF CODE TO SERVICE THE SPECIFIED KEYWORD ; 3-5 ADDITIONAL DATA FOR EACH KEYWORD, OR ZERO ; ; ; KWD: UICA,UICX,0,0,0 ;/UIC= TMOA,TMOX,0,0,0 ;/TMO= SPAS,SPAX,-1,UC.OSP,0 ;/SP= MSPA,SPAX,0,UC.OSP,0 ;/-SP= LA30S,SETCHA,20000,1,72. ;/LA30S= VT05,SETCHA,50010,0,80. ;/VT05= LA36,SETCHA,40100,1,110. VT50,SETCHA,50010,0,80. ;/VT50= KSR33,SETCHA,4000,0,72. ;/KSR33= SLV,PRVSLV,-1,UT.SL,0 ;/SLV= NSLV,PRVSLV,0,UT.SL,0 ;/-SLV= PRV,PRVSLV,-1,UT.PR,0 ;/PRV= NPRV,PRVSLV,0,UT.PR,0 ;/-PRV= WCHK,DKWCHK,-1,U2.WCK,0 ;WCHK= ;++006 NWCHK,DKWCHK,0,U2.WCK,0 ;/-WCHK= ;++006 ;++007 /INB DELETED CACHE,SETCAC,0,0,0 ;++002/++003 WIDTH,SETWID,0,0,0 ;++003 SWR,SETSWR,0,0,0 ; +++004 /SWR= CLIA,SETCLI,0,0,0 ;++007 0 ;*** END OF TABLE *** .PAGE ; ; ; ; ASCIZ STRINGS FOR FIRST LEVEL KEYWORDS: ; ; ; UICA: .ASCIZ /UIC/ TMOA: .ASCIZ /TMO/ PWDA: .ASCIZ /PWD/ SPAS: .ASCIZ /SP/ MSPA: .ASCIZ /-SP/ LA30S: .ASCIZ /LA30S/ LA30P: .ASCIZ /LA30P/ VT05: .ASCIZ /VT05/ VT50: .ASCIZ/VT50/ LA36: .ASCIZ/LA36/ KSR33: .ASCIZ /KSR33/ SLV: .ASCIZ /SLV/ NSLV: .ASCIZ /-SLV/ PRV: .ASCIZ /PRV/ NPRV: .ASCIZ /-PRV/ WCHK: .ASCIZ /WCHK/ NWCHK: .ASCIZ /-WCHK/ ;++007 3 LINES DELETED CACHE: .ASCIZ /CAC/ ;002 WIDTH: .ASCIZ /WIDTH/ ;++003 SWR: .ASCIZ /SWR/ ; +++004 CLIA: .ASCIZ /CLI/ ;++007 .EVEN .PAGE SET: DIR$ #MCRLN ;READ MCR COMMAND LINE BCC 10$ ;FAILURE IF CARRY SET JMP MCRER ;PRINT ERROR MESSAGE 10$: ;**NEW** CALL CHKPRV ;CHECK ACCESS PRIVILEDGES ;**NEW** BCC PRIVOK ;**NEW** DIR$ #PRIVD ;**NEW** EXIT$S ;**NEW** PRIVOK: ;**NEW** CLR KEYWRD ;(INDICATES NO KEYWORD FOUND) ;**NEW** MOV #MCRLN+2,R2 ;DECODE MCR COMMAND LINE -- ;**-1 ;SET UP R2 TO INCREMENT THRU LINE ;SKIP TO FIRST BREACK CHARACTER 20$: MOVB (R2)+,R1 ;PICKUP NEXT CHARACTER CMPB #SPACE,R1 ;A BREAK CHAR? BEQ SCAN ;YES -- GO DECODE KEYWORD CMPB #TAB,R1 ;NO -- TRY AGAIN BEQ SCAN ;EUREKA! -- DECODE KEYWORD CMPB #CR,R1 ;NULL LINE? BEQ SYN ;YES -- SYNTAX ERROR *** CMPB #ALTMOD,R1 BEQ SYN BR 20$ ;CONTINUE UNTIL A BREAK CHARACTER IS SEEN SCAN: MOVB (R2)+,R1 ;SCAN FOR SPACE, TAB, OR SLASH CMP #SPACE,R1 ;IS IT A SPACE? BEQ SCAN ;YES -- DO NEXT CHARACTER CMP #TAB,R1 ;NO -- IS IT TAB? BEQ SCAN ;YES -- DO NEXT CHARACTER CMP #'/,R1 ;NO -- IS IT SLASH? BEQ 20$ ;YES -- DECODE KEYWORD CMP #CR,R1 ;NO -- IS IT CR? BEQ 22$ ;YES -- CHECK IF SYNTAX ERROR CMP #ALTMOD,R1 ;NO -- IS IT ALT MODE? BEQ 22$ ;YES -- CHECK IF SYNTAX ERROR BR SCAN ;NO -- CONTINUE SCANNING LINE ; ; ; ; KEYWORD FOUND -- VALIDATE NAME ; 20$: MOV #KWD,R0 ;ADDRESS OF DISPATCH TABLE IN R0 INC KEYWRD ;SET KEYWORD SEEN FLAG MOV #8.,R4 ;NUMBER OF WORDS TO SKIP IF NO MATCH ON STRING CALL DISP ;CALL DISPATCHING ROUTINE BR SCAN ;GO TO DO ANOTHER KEYWORD ; 22$: JMP LTFND ;BRANCH AIDS SYN: JMP SYNERR ; ; UIC KEYWORD NAME FOUND -- VALIDATE ; UICX: MOVB (R2)+,R1 ;YES -- "UIC" FOUND CMP #'[,R1 ;IS NEXT CHARACTER A LEFT BRACKET? BNE SYN ;NO -- SYNTAX ERROR MOV #8.,DECNUM ;YES -- SET FOR OCTAL NUMBER CALL GETNUM ;DECODE GROUP NO. TST R1 ;IS IT ZERO? BEQ SYN ;YES -- SYNTAX ERROR BIT #177400,R1 ;NO -- IS IT LEGAL? BNE SYN ;NO -- SYNTAX ERROR MOVB R1,SETUIC+1 ;YES -- SAVE GROUP NO. CMP R5,#', ;IS TERMINATOR A COMMA? BNE SYN ;NO -- SYNTAX ERROR CALL GETNUM ;YES -- GET OWNER NO. TST R1 ;IS IT ZERO? BEQ SYN ;YES -- SYNTAX ERROR BIT #177400,R1 ;NO -- IS IT LEGAL? BNE SYN ;NO -- SYNTAX ERROR MOVB R1,SETUIC ;YES -- SAVE OWNER NO. CMP #'],R5 ;IS TERMINATOR A RIGHT BRACKET? BNE SYN ;NO -- SYNTAX ERROR CALL TRMCHK ;YES -- CHECK NEXT CHAR BCS SYN ;NO -- SYNTAX ERROR MOV .CRTSK,R3 ;OK -- PICKUP OUR ATL MOV A.TI(R3),R3 ;PICKUP OUR TI POINTER MOV SETUIC,U.UI(R3) ;SETUP UIC IN PUD ENTRY RETURN ; THIS SUBROUTINE DETERMINES WHETHER THE TI UNDER WHICH THIS ;**NEW** ; TASK IS RUNNING IS PRIVILEGED. IF TERMINAL IS PRIVILEGED ;**NEW** ; ROUTINE RETURNS WITH C-BIT CLEAR. IF TERMINAL IS NOT PRIVILEGED ;**NEW** ; C-BIT IS SET. ;**NEW** CHKPRV: CLC ;**NEW** MOV .CRTSK,R5 ;**NEW** MOV A.TI(R5),R5 ;PUD FOR THIS TI ;**NEW** BIT #UT.PR,U.TF(R5) ;**NEW** BNE 10$ ;**NEW** SEC ;**NEW** 10$: RETURN ;**NEW** ; ; ; ; ; TMO KEYWORD FOUND -- VALIDATE MCR TIMEOUT ; TMOX: MOV #10.,DECNUM ;SET FOR DECIMAL NUMBER CALL GETNUM ;DECODE MCR TIMEOUT TST R1 ;MUST BE 1-77777 SECONDS BLE SYN ;ERROR IF NEGATIVE OR ZERO TSTB -(R2) ;BACK UP POINTER CALL TRMCHK ;CHECK FOR VALID BC BCS SYN ;SYNTAX ERROR IF INVALID MOV R1,.MCRTO ;SET NEW MCR TIMEOUT RETURN ;CONTINUE SCAN ; ; ; ; ; ROUTINE TO SET OR CLEAR THE READ AFTER WRITE CHECK ; CHARACTERISTICS OF AN RK. DKWCHK: MOV R0,R4 10$: CALL PUDSR BITB #UC.DIR,U.C1(R3) ;++006 DIRECTORY DEVICE? BEQ 30$ ;++006 ILLEGAL FUNCTION IF NOT MOV R4,R0 TST (R0)+ BEQ 20$ BIS (R0)+,U.C2(R3) BR 10$ 20$: BIC (R0)+,U.C2(R3) BR 10$ 30$: MOV #TTYMES,R0 ;ISSUE ERROR MESSAGE. MOV #NWCKMS,Q.IOPL(R0) MOV #NWCKLN,Q.IOPL+2(R0) DIR$ R0 JMP WAIT ;WAIT AND EXIT. .PAGE ; ; GENERAL DISPATCH ROUTINE FOR ASCIZ KEYWORDS ; ; DISP: MOV R2,R1 ;SAVE POINTER TO USER'S STRING 10$: MOV (R0)+,R3 ;PICKUP ADDRESS OF NEXT KEYWORD TEMPLATE STRING BEQ SYNEXX ;END OF TABLE -- SCREAM 'SYNTAX ERROR' MOV R1,R2 ;PICKUP ADDRESS OF START OF KEYWORD 20$: MOVB (R3)+,R5 ;PICKUP NEXT ASCIZ CHARACTER BEQ 30$ ;END OF STRING -- GO CHECK FOR TERMINATER CMPB R5,(R2)+ ;DO THE CHARACTERS MATCH? BEQ 20$ ;YES -- CHECK THE NEXT CHARACTER ADD R4,R0 ;NO -- STEP OVER OTHER ENTRIES IN DISPATCH TABLE BR 10$ ;AND CHECK NEXT ENTRY ; 30$: CMPB #'=,@R2 ;IS THE TERMINATING CHARACTER A '='? BEQ 40$ ;YES -- DON'T CHECK THE TERMINATER CALL TRMCHK ;NO -- CHECK TERMINATER BCS SYNEXX ;'C' SET SAYS USER HAD TOO MANY CHARACTERS 40$: MOV (R0)+,R1 ;PICKUP ADDRESS OF ROUTINE IN R1 TSTB (R2)+ ;SKIP OVER TERM CHARACTER CALL @R1 ;DISPATCH TO APPROPRIATE ROUTINE RETURN ;AND CONTINUE TO SCAN FOR MORE KEYWORDS SYNEXX: JMP SYNERR .PAGE ;+ ; THIS ROUTINE SERVICES THE CACHE KEYWORD. IT ; PERFORMS ONE OF THREE FUNCTIONS. IT WILL SET THE DEFAULT NUMBER ; OF ERRORS, TURN EITHER GROUP OF THE CACHE ON OR TURN ; EITHER GROUP OF THE CACHE OFF. ;- SETCAC: BITB #ON.70,.UMR22+1 ;ON A 70 002 BEQ ERREX1 ;NO 002 CMPB @R2,#71 ;IS IT A NUMERIC VALUE 002 BLOS 10$ ;YES 002 CMPB (R2)+,#'O ;MUST BR AN O 002 BNE ERREXT ;NO 002 CMPB @R2,#'N ;N OR F 002 BEQ 5$ ;N 002 CMPB (R2)+,#'F ;REALLY F 002 BNE ERREXT ;NO 002 CMPB @R2,#60 ;GROUP 0 OR 1 002 BNE 15$ ;GROUP 0NE 002 BIS #44,CR.70 ;TURN IT OFF 002 JMP EXT 15$: CMPB @R2,#61 ;REALLY ONE 002 BNE ERREXT ;NO 002 BIS #30,CR.70 ;TURN IT OFF 002 JMP EXT 5$: CMPB 1(R2),#60 ;GROUP 0 OR 1 002 BNE 20$ ;ONE 002 BIC #44,CR.70 ;ZERO TURN ON 002 JMP EXT 20$: CMPB 1(R2),#61 ;REALLY ONE 002 BNE ERREXT ;NO 002 BIC #30,CR.70 ;YES TURN ON 002 JMP EXT 10$: MOVB (R2)+,R1 ;SCAN UNTIL BREAK 002 CMP #SPACE,R1 ;SPACE 002 BEQ 25$ ;YES 002 CMP R1,#TAB ;TAB 002 BEQ 25$ ;YES 002 CMP R1,#CR ;CR 002 BEQ 25$ ;YES 002 CMP #'/,R1 ;/ 002 BEQ 25$ ;YES 002 CMP R1,#ALTMOD ;ALT 002 BNE 10$ ;NO 002 25$: MOV R2,R0 ;SAVE LINE POINTER 002 CLR R4 ;SET UP TO CONVERT 002 MOV #1,R1 TSTB -(R0) ;BACKUP TO FIRST DIGIT 002 30$: CMPB -(R0),#'= ;NO MORE DIGITS 002 BEQ 35$ ;YES MOVB @R0,R3 ;DIGIT 002 BIC #60,R3 ;CLEAR OFF ASCII 002 MUL R1,R3 ;CORRECT PLACE 002 MUL #10.,R1 ;NEXT DIGITS PLACE 002 ADD R3,R4 ;TOTAL VALUE 002 BR 30$ ;NO 002 35$: TST R4 ;TOO LARGE 002 BLE ERREX2 ;YES 002 MOV R4,.CACHE ;RESET COUNT 002 EXT: RETURN ERREXT: JMP SYNERR ;PRINT ERROR 002 ERREX1: JMP MACERR ;002 ERREX2: JMP VALERR ;002 ; ; CODE TO SET TERMINAL CHARACTERISTICS TYPES ; SETCHA: DIR$ #TTYMES ;++011 SAY THE COMMAND HAS GONE AWAY JMP WAIT ;++011 AND GO AWAY ;++002 ; 16 LINES DELETED ; ; THIS ROUTINE SERVICES THE 'CLI' KEYWORD. IT ALLOCATES A CLI ; NAME TO ONE OR MORE TERMINALS. THE SYNTAX IS SET /CLI:TT1:TT2:...:TTN ; 'CLI' IS A ONE TO THREE LETTER CLI NAME OR 'DEFAULT' FOR THE DEFAULT ; CLI. THE SPECIFIED TERMINALS MUST BE NOT LOGGED-IN AND WILL BE SET ; NON-SLAVED. ;--007 ; SETCLI: CMPB #'=,-(R2) ; CHECK FOR '=' BNE 60$ ; ERROR IF NOT INC R2 ; STEP TO CLI NAME MOV R2,R0 ; REMEMBER WHERE WE ARE ; MOV #3,R1 ; PREPARE TO SCAN FOR CLI NAME 10$: CMPB (R2)+,#'$ ; FIRST DISALLOW '$' BEQ 70$ ; ERROR IF FOUND SOB R1,10$ ; ; CALL $CAT5 ; GET THE NAME (N.B. R0=BUFFER POINTER, R1=0) SBC R0 ; IF NAME<3 CHARS, DEC THE POINTER MOV #1,R2 ; PREPARE TO CHECK FOR ':' CMP R1,#^RDEF ; IS NAME = 'DEF' BNE 20$ ; SKIP IF NOT ; CLR R1 ; NAME WILL BE SET TO ZERO MOV #5,R2 ; PREPARE TO SEARCH FOR END OF 'DEFAULT' 20$: CMPB (R0)+,#': ; BEQ 30$ ; BR IF FOUND SOB R2,20$ ; BR 60$ ; ERROR IF NOT FOUND WITHIN 5 CHARS. ; 30$: MOV R0,R2 ; BUFFER POINTER 40$: CALL PUDSR ; GET A TERMINAL SPEC BIT #UC.TTY,U.C1(R3) ; IS IT A TERMINAL? BNE 50$ ; BR IF IT IS CMP U.DN(R3),#"BA ; BUT IS IT BA? BNE 80$ ; ERROR IF NOT 50$: BITB #UT.LG,U.PR(R3) ; LOGGED IN BNE 90$ ; ERROR IF SO BICB #UT.SL,U.PR(R3) ; SET NON-SLAVED MOV R1,U.DACP(R3) ; SET TERMINAL'S DEFAULT CLI BR 40$ ; LOOP FOR ANOTHER TERMINAL ; 60$: JMP SYNERR ; SYNTAX ERROR 70$: JMP CLIERR ; CLI NAME ERROR 80$: JMP DVTERR ; NOT A TERMINAL 90$: JMP LOGERR ; LOOGED IN ; ; ; CODE TO SET SPOOL/NOSPOOL STATUS IN PUDS ; ; SPAX: MOV R0,R4 ;SAVE R0 FOR LATER 10$: CALL PUDSR ;GET NEXT PUD ADDRESS CMP #"CR,U.DN(R3) ;IF DEVICE IS A CARD READER BEQ 15$ ; BYPASS CHARACTERISTICS CHECK. MOV U.C1(R3),R5 ;CHECK FOR CORRECT DEVICE TYPE BIC #^C,R5 CMP #UC.CCL+UC.REC,R5 BNE 30$ ;BRANCH IF NOT ALLOWED 15$: MOV R4,R0 ;RESTORE R0 TST (R0)+ ;TEST SET/CLR FLAG BEQ 20$ ;BRANCH TO CLEAR MOV U.RP(R3),R4 ;++008 GET REDIRECT POINTER FOR DEVICE CMP R4,R3 ;++008 NOT REDIRECTED? BEQ 17$ ;++008 J IF SO BIT #UC.OSP,U.C1(R4) ;++008 IS TARGET DEV ALSO REDIRECTED? BEQ 40$ ;++008 J IF NOT, ILLEGAL 17$: MOV #"SP,R4 ;++008 SEARCH FOR SP0: CLR R5 ;++008 ... CALL ..FDEV ;++008 FIND PUD BCS 50$ ;++008 J IF NONE MOV R5,U.RP(R3) ;++008 SET REDIRECT POINTER FOR SPOOLED DEV BIS #UC.OSP,U.C1(R3) ;++008 AND MARK IT SPOOLED BR 10$ ;RETURN FOR ANOTHER DEVICE ; 20$: BIT #UC.OSP,U.C1(R3) ;++008 DEVICE SPOOLED? BEQ 60$ ;++008 J IF NOT, ILLEGAL MOV R3,R5 ;++008 FOLLOW THE REDIRECT... CALL ..REDT ;++008 BITB #CH.OFF,U.CH(R5) ;++008 TARGET DEV MOUNTED? BEQ 70$ ;++008 J IF SO, CANNOT UNSPOOL MOV U.RP(R3),R4 ;++008 GET IMMEDIATE REDIRECT CMP U.DN(R4),#"SP ;++008 IS IT SP0:? BNE 25$ ;++008 NO TSTB U.UN(R4) ;++008 CHECK UNIT BNE 25$ ;++008 NO MOV R3,U.RP(R3) ;++008 ELSE REDIRECT DEVICE TO ITSELF 25$: BIC #UC.OSP,U.C1(R3) ;++008 CLEAR REDIRECT FLAG BR 10$ ;RETURN FOR ANOTHER DEVICE ; 30$: MOV #TTYMES,R0 ;PRINT ERROR MESSAGE MOV #MGMS,Q.IOPL(R0) MOV #MGLN,Q.IOPL+2(R0) DIR$ R0 JMP WAIT ;WAIT FOR MESSAGE TO COMPLETE,EXIT SYSTEM 40$: DIR$ #SPRDQ ;++008 SAY CANNOT SET SPOOLED BECAUSE REDIRECTED JMP WAIT ;++008 50$: DIR$ #SPNSPQ ;++008 NO SP0 IN SYSTEM JMP WAIT ;++008 60$: DIR$ #SPNOTQ ;++008 DEVICE NOT SPOOLED JMP WAIT ;++008 70$: DIR$ #SPMNTQ ;++008 SP0 STILL MOUNTED JMP WAIT ; ; CODE TO SET PRIVILEGED/SLAVE BITS IN TERMINAL PUDS ; ; PRVSLV: MOV R0,R4 ;SAVE R0 FOR LATER 10$: CALL PUDSR ;FETCH THE NEXT PUD ADDRESS IN R3 MOV R4,R0 ;RESTORE R0 CALL DVTT ;CHECK TO BE SURE IT'S A TERMINAL DEVICE TST (R0)+ ;TEST THE SET/CLEAR FLAG BEQ 20$ ;BRANCH TO CLEAR BISB (R0)+,U.PR(R3) ;ELSE SET BR 10$ ;GET THE NEXT SPEC ; 20$: BICB (R0)+,U.PR(R3) ;CLEAR THE BIT BR 10$ ;AND GO GET ANOTHER ; ; DVTT: BIT #UC.TTY,U.C1(R3);IS THIS A TERMINAL? BEQ 10$ ;NO -- TELL THE USER RETURN ;YES -- DON'T WORRY ; 10$: MOV #TTYMES,R0 ;ISSUE ERROR MESSAGE MOV #DVTTA,Q.IOPL(R0) MOV #DVTTL,Q.IOPL+2(R0) DIR$ R0 JMP WAIT ;WAIT AND EXIT TO SYSTEM ; ;++011 LINE DELETED ; .PAGE ;++003 ; ; SET /WIDTH=LP0:120 ; ; FOR EXAMPLE - SET WIDTH OF DEVICE IN PUD CHARACTERISTICS ; WORD 4. ;--003 SETWID: MOV R0,R4 ;++003 SAVE R0 FOR LATER 10$: CALL PUDSR ;++003 GET A DEVICE BIT #UC.REC,U.C1(R3) ;++003 RECORD TYPE DEVICE? BEQ 20$ ;++003 ERROR IF NOT MOV #10.,DECNUM ;++003 WIDTH IS DECIMAL CALL GETNUM ;++003 READ THE WIDTH MOV R1,U.C4(R3) ;++003 STORE IT IN THE PUD DEC R2 ;++003 BACK OFF THE LINE POINTER BR 10$ ;++003 AND TRY FOR SOME MORE 20$: MOV #WIDERR,TTYMES+Q.IOPL ;++003 SET UP ERROR MESSAGE MOV #WIDERN,TTYMES+Q.IOPL+2 ;++003 DIR$ #TTYMES ;++003 PRINT THE LINE JMP WAIT ;++003 AND WAIT FOR IT TO FINISH .PAGE ; +++004 ; ; SET /SWR=177777 ; SET /SWR=SET:0:1:2 ; SET /SWR=CLR:13:14:15 ; ; +++004 ; ; REGISTERS USED AS FOLLOWS: ; ; R0 = FLAG TO INDICATE SET OR CLR OPERATION ; R1 = RETURNED VALUE FROM 'GETNUM' ROUTINE ; R2 = INPUT STRING BUFFER POINTER ; R3 = MASK OF BITS TO SET OR CLR ; R4 = GENERAL REGISTER ; R5 = TERMINATOR RETURNED FROM 'GETNUM' ROUTINE ; SETSWR: CALL TRMCHK ; TERMINATOR NOW? BCC 110$ ; YES: PRINT VALUE CMPB (R2),#'0 ; IS FIRST CHAR AN OCTAL DIGIT? BLT 10$ ; NO CMPB (R2),#'7 ; MAYBE? BGT 10$ ; NO MOV #7,R4 ; SET DIGIT COUNT CLR R1 ; AND ZERO NUMBER 4$: MOVB (R2)+,R5 ; GET NEXT BYTE CMPB R5,#'0 ; IS IT AN OCTAL DIGIT? BLT 6$ ; NO CMPB R5,#'7 ; MAYBE BGT 6$ ; NO SUB #'0,R5 ; YES: CONVERT TO NUMERIC VALUE ASH #3,R1 ; MULTIPLY PRESENT NUMBER BY 8 BCS 100$ ; OVERFLOW ADD R5,R1 ; AND ADD IN NEW DIGIT BCS 100$ ; OVERFLOW SOB R4,4$ ; MORE THAN 7 DIGITS? BR 100$ ; YES: SYNTAX ERROR 6$: DEC R2 ; BACK-UP POINTER CALL TRMCHK ; TERMINATOR OK? BCS 100$ ; NO INC R2 ; YES: RESTORE POINTER MOV R1,.SWSWR ; RESET SOFTWARE SWITCH REGISTER BR 70$ 10$: MOV R2,R4 ; SAVE BUFFER POINTER CMPB (R2)+,#'S ; IS OPERATION 'SET'? BNE 20$ ; NO CMPB (R2)+,#'E ; MAYBE BNE 20$ ; NO CMPB (R2)+,#'T ; MAYBE BNE 20$ ; NO MOV #1,R0 ; YES: SET OPERATION FLAG FOR 'SET' BR 30$ 20$: MOV R4,R2 ; RESET BUFFER POINTER CMPB (R2)+,#'C ; IS OPERATION 'CLR'? BNE 100$ ; NO CMPB (R2)+,#'L ; MAYBE BNE 100$ ; NO CMPB (R2)+,#'R ; MAYBE BNE 100$ ; NO CLR R0 ; YES: SET OPERATION FLAG FOR 'CLR' 30$: CMPB (R2)+,#': ; IS NEXT CHAR ':'? BNE 100$ ; NO MOV #10.,DECNUM ; SET FOR DECODING DECIMAL DIGITS CLR R3 ; INITIALLY NO BITS TO CHANGE 40$: CALL GETNUM ; GET NUMBER CMPB R5,#': ; TERMINATED BY ':'? BEQ 50$ ; YES DEC R2 ; BACK-UP POINTER CALL TRMCHK ; AND CHECK FOR OTHER VALID TERMINATOR BCS 100$ ; VALID TERMINATOR? INC R2 ; YES: RESTORE POINTER 50$: CMPB R1,#15. ; IS NUMBER 0 TO 15.? BGT 100$ ; NO: ERROR MOV #1,R4 ; SET BIT-0 ASH R1,R4 ; AND MOVE TO BIT POSITION BIS R4,R3 ; AND ADD TO BIT MASK CMPB R5,#': ; WAS TERMINATOR ':'? BEQ 40$ ; YES: BACK FOR NEXT BIT NUMBER TST R0 ; CLEAR OR SET OPERATION? BNE 60$ ; SET BIC R3,.SWSWR ; CLEAR REQUIRED BITS BR 70$ 60$: BIS R3,.SWSWR ; SET REQUIRED BITS 70$: DEC R2 ; BACK-UP POINTER RETURN 100$: JMP SYNERR ; 110$: MOV R0,-(SP) ; SAVE R0, R1, R2, R3 MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) CLR R0 ; GET SWR IN DOUBLE WORD MOV .SWSWR,R1 MOV #6,R2 ; SET COUNT MOV #SWRVAL,R3 ; SET BUFFER POINTER ASHC #1,R0 ; GET FIRST DIGIT 120$: ADD #'0,R0 ; MAKE INTO ASCII CODE MOVB R0,(R3)+ ; AND PUT INTO MESSAGE CLR R0 ASHC #3,R0 ; GET NEXT DIGIT SOB R2,120$ ; FINISHED? MOV #SWRMES,TTYMES+Q.IOPL MOV #SWRSZ,TTYMES+Q.IOPL+2 DIR$ #TTYMES MOV (SP)+,R3 ; RESTORE R3, R2, R1, R0 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN .PAGE ; ; ; ; E R R O R R O U T I N E S ; ; ; ;++011 LINES DELETED ; ; ; ; READ MCR LINE ERROR ; MCRER: DIR$ #MCRMSG ;PRINT MCR ERROR BR WAIT ; ; VALUE ERROR ON CACHE ; VALERR: DIR$ #VALMSG ;002 BR WAIT ;002 ; ; MACHINE ERROR ; MACERR: DIR$ #MACMSG ;002 BR WAIT ; ; ; LTFND: TST KEYWRD ;PREMATURE END OF LINE? BNE EXIT ;NO -- EXIT ; ; DVTERR: DIR$ #DVTMSG ;++007 BR WAIT ;++007 ; CLIERR: DIR$ #CLIMSG ;++007 BR WAIT ;++007 ; LOGERR: DIR$ #LOGMSG ;++007 BR WAIT ;++007 ; ; ; SYNTAX ERROR ; SYNERR: DIR$ #SYNMSG ;PRINT SYNTAX ERROR ; ; ; ; WAIT: BCS EXIT ;EXIT IF ERROR WTSE$S #1 ;ELSE WAIT FOR MESSAGE ; ; ; EXIT: EXIT$S ;EXIT TO SYSTEM .PAGE ; ; ; ; COMMON PUD SEARCH ROUTINE FOR SET TASK ; ; PUDSR: MOV R0,-(SP) ;SAVE R0 FOR LATER CLR DEV ;INIT DEVICE TYPE CLR UNIT ;AND UNIT NUMBER MOVB (R2)+,R0 ;PICKUP NEXT CHARACTER CALL ALPHA ;ALPHA CHARACTER? BCC 20$ ;YES -- MAKE IT INTO A DEVICE NAME ; TSTB -(R2) ;NO -- CHECK FOR END OF DEVICE STRING CALL TRMCHK ;CHECK FOR VALID TERMINATOR BCC 10$ ;VALID -- RETURN TO SCAN FOR MORE 5$: JMP SYNERR ;NONVALID -- SYNTAX ERROR ; 10$: JMP SCAN ;RETURN FOR ANOTHER KEYWORD ; ; 20$: MOVB R0,DEV ;STORE FIRST BYTE OF DEVICE NAME MOVB (R2)+,R0 ;PICKUP NEXT CHARACTER CALL ALPHA ;ALPHA CHARACTER? BCC 30$ ;YES -- MAKE IT SECOND CHARACTER OF DEVICE NAME ;NO -- IS IT NUMERIC? CMP #'0,R0 BGT 5$ ;NO -- SYNTAX ERROR CMP #'7,R0 BLT 5$ ;NO -- SYNTAX ERROR ;YES -- MAKE IT INTO A UNIT NUMBER TSTB -(R2) ;BACKUP POINTER FOR SECOND SCAN BR 40$ ;GO TO COMMON CODE ; 30$: MOVB R0,DEV+1 ;SETUP SECOND HALF OF DEVICE NAME ;AND FALL THROUGH TO DECODE UNIT NUMBER 40$: CMPB #':,@R2 ;IS THIS IMPLIED UNIT ZERO? BNE 50$ ;NO -- DECODE THE UNIT NUMBER TSTB (R2)+ ;YES -- STEP OVER THE COLON FOR NEXT PASS BR 60$ ;AND SKIP OVER DECODING UNIT NUMBER ; 50$: ;DECODE UNIT NUMBER MOV #8.,DECNUM ;SETUP TO CONVERT AS OCTAL MOV R1,-(SP) ;SAVE AND RESTORE R1,R4,R5 MOV R4,-(SP) MOV R5,-(SP) CALL GETNUM ;CONVERT THE OCTAL NUMBER MOV R1,UNIT ;AND STORE IT IN 'UNIT' ; CMPB #':,R5 ;WAS THE TERMINATOR A COLON? BNE 5$ ;NO -- SYNTAX ERROR MOV (SP)+,R5 ;YES -- RESTORE R5,R4,R1 MOV (SP)+,R4 MOV (SP)+,R1 ;AND FALL THROUGH TO SEARCH PUD FOR MATCH 60$: MOV .PUDBA,R3 ;PICKUP START OF PUD IN R3 70$: CMP .PUDEA,R3 ;END OF PUD REACHED? BEQ DVNF ;YES -- NONEXISTANT DEVICE ; CMP DEV,U.DN(R3) ;DEVICE TYPE MATCH? BNE 80$ ;NO -- TRY NEXT PUD ENTRY CMPB UNIT,U.UN(R3) ;UNIT NUMBER MATCH ALSO? BNE 80$ ;NO -- TRY NEXT PUD ENTRY ;YES -- RESTORE R0 AND DELIVER R3 TO OTHER ROUTI MOV (SP)+,R0 RETURN ;RETURN TO CALLER WITH R3 = PUD ADDRESS ; 80$: ADD #U.SZ,R3 ;STEP TO NEXT ENTRY IN PUD BR 70$ ;CHECK FOR END OR MATCH ; ; ; ALPHA: BIC #177400,R0 ;CHECK FOR R0 = ALPHA CHARACTER CMP #'A,R0 ;CHAR .LT. 'A'? BGT 10$ ;YES -- SET 'C' BIT CMP #'Z,R0 ;CHAR .GT. 'Z'? BGE 20$ ;NO -- RETURN WITH 'C' BIT CLEAR 10$: SEC ;NON-ALPHA CHARACTER 20$: RETURN ;RETURN WITH 'C' SET APPROPRIATELY ; ; DVNF: MOV #TTYMES,R0 ;DEVICE NOT FOUND -- ISSUE MESSAGE MOV #DDVNA,Q.IOPL(R0) MOV #DVLN,Q.IOPL+2(R0) DIR$ R0 JMP WAIT ;EXIT SYSTEM ; .PAGE ; ; ; G E T N U M ; ; ; ROUTINE TO DECODE A NUMBER ; ; CALLING SEQUENCE: ; 'DECNUM' -- 8. (IF OCTAL) OR 10. (IF DECIMAL) ; R2 -- BUFFER POINTER ; CALL GETNUM ; ; ; ERROR RETURN GOES DIRECTLY TO 'SYNERR' ; ; OUTPUT: ; R1 -- RETURNED VALUE ; R5 -- TERMINATOR ; ; ; GETNUM: MOV #6,R4 ;MOVE A MAXIMUM OF 5 DIGITS CLR R1 ;CLEAR THE FOUND VALUE 10$: MOVB (R2)+,R5 ;PICK UP A CHARACTER CMP #57,R5 ;CHECK LOWER LIMIT BPL 40$ ;CHECK FOR TERMINATOR CMP #67,R5 ;CHECK OCTAL LIMITS BMI 30$ ;NOT WITHIN OCTAL LIMITS 20$: CLC ;CLEAR CARRY FOR MULTIPLY MUL DECNUM,R1 ;COMPUTE NEW NUMBER BCS 50$ ;ERROR IF OVERFLOW BIC #177760,R5 ;MAKE OCTAL OR DECIMAL NUMBER ADD R5,R1 ;AND ADD IN NEW DIGIT SOB R4,10$ ;FINISHED? BR 40$ ;YES -- EXIT 30$: CMP #10.,DECNUM ;IS THIS A DECIMAL NUMBER? BNE 40$ ;NO -- EXIT CMP #71,R5 ;YES -- IS IT A 8 OR 9? BPL 20$ ;YES -- GO MULTIPLY 40$: RETURN ;RETURN TO CALLER ; ; 50$: TST (SP)+ ;CLEAN STACK JMP SYNERR ;SYNTAX ERROR (MULTIPLY OVERFLOW) ; ; ; ; T R M C H K ; ; ; ROUTINE TO CHECK TERMINATOR ; ; ; CALLING SEQUENCE: ; R2 -- LOCATION OF CHARACTER ; CALL TRMCHK ; ; NO ERROR RETURN ; ; OUTPUT: ; CC IF LEGAL TERMINATOR ; CS IF ILLEGAL TERMINATOR ; ; ; ; TRMCHK: CMPB #SPACE,@R2 ;IS IT A SPACE? BEQ 10$ ;YES CMPB #TAB,@R2 ;NO -- IS IT A TAB? BEQ 10$ ;YES CMPB #'/,@R2 ;NO -- IS IT A SLASH? BEQ 10$ ;YES CMPB #CR,@R2 ;NO -- IS IT A CARRIAGE RETURN? BEQ 10$ ;YES CMPB #ALTMOD,@R2 ;NO -- IS IT AN ALTMODE? BEQ 10$ ;YES SEC ;NO -- ILLEGAL TERMINATOR BR 20$ ;EXIT 10$: CLC ;LEGAL TERMINATOR FOUND 20$: RETURN ;EXIT ; ; ; ; .END SET