.TITLE CLI - MAIN "ROOT" SECTION FOR "CLI" TASK .IDENT /020584/ .ENABL GBL .ENABL LC .NLIST BEX ; ;+ ;***** ; ; CLI.MAC forms the program entry point and command ; dispatcher for the "CLI" task. CLI allows user's ; to display, change, initialize and eliminate alternate ; CLI's from RSX-11M v3.2 and RSX-11Mplus V1.0 systems. ; ; All command line parsing is handled by ".CIPRS" (see CLIPRS.MAC). ; All CLI task manipulations are performed by the routines ; in CLISUB.MAC. Error reporting and the task exit point is ; consolidated in CLIERR.MAC. Global impure/pure data ; is defined in CLIDAT.MAC. ; ; CLI uses the following naming convention for global symbols: ; "$CI" prefix is used for all global locations ; "CI." prefix is used for all global bit-patterns/offsets ; ".CI" prefis is used for all global module entry points ; ; Privileged users are allowed to execute all command keywords. ; Non-privileged users are allowed to execute the "/SHOW" ; keyword and the "/SET" keyword (only for their own terminal). ; ;***** ; ; COMMAND SET: ; ; CLI /INIT -- Initializes task as alternate CLI, defining ; default prompts, etc. ; CLI /ELIM -- Eliminates task as an alternate CLI ; CLI /SHOW -- Displays information on all CLI tasks in system ; CLI /SET -- Takes on 3 flavors... ; CLI /SET (or CLI /SET=, or CLI /SET=*) displays CLI ; assignments for all TT:'s (privileged command) ; CLI /SET=ddn: displays CLI assignment for specific ; device (non-privileged user's only allowed ddn: = TI:) ; CLI /SET=ddn:clinam sets specific device to use ; specified CLI (non-privileged user's only ; allowed ddn: = TI:) ;***** ; ; Update 2/5/84 - PRS; original edit ; Update 3/20/84 -- PRS; Final debugging, add special /SET options ; to show all TT's CLI's ; ;***** ;- ; .MCALL DIR$,QIOW$,CCBDF$,UCBDF$,TCBDF$ CCBDF$ ; DEFINE CLI CONTROL BLOCK OFFSETS UCBDF$ ; DEFINE UCB OFFSETS TCBDF$ ; DEFINE TCB OFFSETS ; .PSECT $IDATA,RW,D,LCL,CON,REL SETMSG: .ASCII /CLI=/ ; PREFIX FOR /SET OUTPUT... SHWMSG: .BLKB 40. ; BUFFER FOR /SHOW OUTPUT...MUST BE WORD ALIGNED MSGQIO: QIOW$ IO.WVB,TI$LUN,TI$EFN,,,,<,,40> ; /SET OR /SHOW QIO .PSECT $PCODE,RO,I,LCL,CON,REL CLI:: ; PROGRAM ENTRY POINT MOV #EX$SUC,$CIEXS ; ANTICIPATE SUCCESS CLR $CIDCB ; MAKE SURE SOME THINGS ARE CLR $CIUCB ; CLEARED !! MOV $CIDIC,$CIMCR ; SETUP GMCR$ DIR. ID. CODE DIR$ #$CIMCR ; GET MCR COMMAND LINE BCS 7$ ; BRANCH IF FAILS 5$: MOV @#$DSW,$CIMCR ; SAVE COMMAND LINE LENGTH CALL .CIPRS ; PARSE LINE BCC 8$ ; BRANCH ON VALID COMMAND 7$: JMP 101$ ; START EXIT PROCESS 8$: CALL $LOCKL ; LOCK SYSTEM LISTS MOV $CIFLG,R0 ; PICKUP KEYWORD DEFN ; ; *** PROCESS "SHOW" ; 10$: ASR R0 ; IS IT "/SHOW" BCC 20$ ; BRANCH IF NO MOV #SHWMSG,MSGQIO+Q.IOPL ; DEFINE MESSAGE START ADDR IN QIO DPB CALL .CILOC ; FIND ALL CLI'S CALL $UNLKL ; UNLOCK LISTS...SO CTRL-S WON'T ; BLOCK CLI/INS, ETC. PROBLEMS WILL ; APPEAR IF CLI'S STATUS CHANGES ; DURING LISTING INTERVAL !!! CALL CLISHW ; CALL PROCESS ROUTINE BR 101$ ; ; *** TIME TO DO SOME PRIVILEGE CHECKING ; 20$: MOV $TKTCB,R5 ; PICKUP OUR TCB ADDRESS MOV T.UCB(R5),R5 ; GET TO TI:'S UCB 22$: MOV U.RED(R5),R5 ; FOLLOW ANY REDIRECT CMP U.RED(R5),R5 BNE 22$ MOV U.CW2(R5),R5 ; GET 2ND STATUS WORD BIT #U2.PRV,R5 ; PRIVILEGED TI: ?? BNE 30$ ; BRANCH IF YES ASR R0 ; DOING /SET ?? BCC 92$ ; BRANCH IF NO, PRIV VIOLATION CMP $CIDEV,#"TI ; /SET FOR TI: ?? BNE 92$ ; BRANCH IF NO, PRIV VIOLATION BR 32$ ; YES, PICKUP WITH NORMAL FLOW ; ; *** HANDLE /SET KEYWORD...THREE CASES HANDLED: ; WHEN DEVICE NOT SPECIFIED => SHOW CLI'S FOR ALL TT'S ; WHEN CLI NAME IS NOT SPECIFIED => DISPLAY DEVICE'S CURRENT CLI NAME ; WHEN BOTH DEVICE AND CLI GIVEN => RESET DEVICE'S CLI ; 30$: ASR R0 ; DOING /SET ?? BCC 40$ ; BRANCH IF NO 32$: MOV #SETMSG,MSGQIO+Q.IOPL ; DEFINE MESSAGE START ADDR TST $CINAM ; CLI NAME GIVEN ?? BNE 38$ ; BRANCH IF YES, RESET CLI CALL .CILOC ; FIND ALL CLI'S CALL $UNLKL ; UNLOCK SYSTEM LISTS TST $CIUNT ; CHECK DEVICE UNIT # BGE 37$ ; BRANCH IF DEFINED MOV #"TT,$CIDEV ; ELSE, SETUP DEVICE NAME CLR $CIUNT ; AND 1ST UNIT # 35$: ; "SET" DISPLAY FOR ALL TT'S CALL .CIUCB ; FILL IN INFO ON DEVICE BCS 36$ ; BRANCH ON ERROR, DONE CALL CLISET ; PRINT MESSAGE INC $CIUNT ; STEP TO NEXT DEVICE UNIT BR 35$ ; LOOP TIL EXHAUST TT'S 36$: MOV #IS.SUC,@#$DSW ; RESET STATUS BR 101$ ; AND DO NORMAL EXIT 37$: ; "SET" DISPLAY FOR SPECIFIED DEVICE CALL .CIUCB ; FILL IN INFO ON DEVICE BCS 101$ ; BRANCH ON ERROR BR 39$ ; ELSE, SHOW CLI ASSIGNMENT 38$: ; REAL "SET" FOR SPECIFIED DEVICE CALL .CISET ; SET DEVICE'S CLI BCS 101$ ; BRANCH ON ERROR 39$: CALL CLISET ; PRINT MESSAGE BR 101$ ; AND EXIT ; ; *** HANDLE /INI KEYWORD ; 40$: ASR R0 ; DOING /INI ?? BCC 50$ ; BRANCH IF NO CALL .CIINI ; INITIALIZE CLI BR 100$ ; ; *** HANDLE /ELI KEYWORD ; 50$: ASR R0 ; DOING /ELI ?? BCC 90$ ; BRANCH IF NO CALL .CIELM ; ELIMINATE CLI BR 100$ ; ; *** ERROR TRAP ; 90$: MOV #IE.AST,@#$DSW ; "INVALID COMMAND LINE" BR 100$ 92$: MOV #IE.PRI,@#$DSW ; "PRIVILEGE VIOLATION" ; BR 100$ ; ; *** COMMON EXIT/ERROR POINT ; 100$: CALL $UNLKL ; MAKE SURE LISTS ARE FREE 101$: JMP .CIERR ; HANDLE EXIT/ERROR PROCESSING ; .PAGE .SBTTL LOCAL SUBROUTINES ;+ ;***** ; ; CLISHW - Implements the CLI /SHOW command. Start by ; finding all CLI's, then building message blocks for ; each CLI in turn. ; ; ALL REGISTERS USED, NEITHER SAVED NOR RESTORED !!!! ; ;***** ;- CLISHW: MOV #$CILST,R5 ; GET START OF CLI LIST 2$: MOV #SHWMSG,R0 ; POINT TO PLACE TO BUILD TEXT MOV (R5)+,R4 ; GET POINTER TO CLI'S NAME BEQ 30$ ; BRANCH ON END-OF-LIST MOV (R4)+,R1 ; GET 1ST HALF OF CLI NAME CALL $C5TA ; CONVERT RAD50 TO ASCII MOV (R4),R1 ; GET 2ND HALF CALL $C5TA ; CONVERT IT TOO MOVB #40,(R0)+ ; INSERT SPACERS MOVB #40,(R0)+ MOV (R5)+,R4 ; GET ADDRESS OF CLI'S TCB POINTER MOV (R4),R3 ; GET CLI'S TCB ADDRESS ADD #T.NAM,R3 ; POINT TO TASK NAME MOV (R3)+,R1 ; GET 1ST HALF OF TASK NAME CALL $C5TA ; CONVERT RAD50 TO ASCII MOV (R3),R1 ; GET 2ND HALF CALL $C5TA ; CONVERT IT TOO CMP #$POOL,R4 ; TCB POINTER IN POOL ?? BHI 25$ ; BRANCH IF NO, DEC'S CLI MOVB #40,(R0)+ ; INSERT SPACERS MOVB #40,(R0)+ MOVB #'(,(R0)+ ; START OF NEW FIELD MOV C.LINT-C.LITA(R4),R1 ; GET # TT'S USING CLI CLR R2 ; SUPPRESS 0'S CALL $CBDMG ; CONVERT TO ASCII MOVB #'.,(R0)+ ; SHOW ITS DECIMAL MOVB #'),(R0)+ ; INSERT TRAILER 25$: SUB #SHWMSG,R0 ; COMPUTE BYTE COUNT OF TEXT MOV R0,MSGQIO+Q.IOPL+2 ; SAVE IT IN QIO DPB DIR$ #MSGQIO ; SEND IT TO TI: BR 2$ ; LOOP TIL DONE 30$: RETURN ; ALL DONE ; ;+ ;***** ; ; CLISET - Performs the formatting and output functions for the ; CLI /SET command. ; ; R0-R3 used, neither saved nor restored !!! ; ;***** ;- CLISET: MOV #SHWMSG,R0 ; PICKUP PLACE TO BUILD STRING MOV $CIDEV,(R0)+ ; SETUP DEVICE NAME MOV $CIUNT,R2 ; GET UNIT NUMBER BEQ 17$ ; HANDLE SIMPLEST CASE MOV R2,R1 ; COPY IT BIC #177407,R1 ; SAVE HI-ORDER UNIT # BEQ 16$ ; BRANCH IF 0, SIMPLE ASR R1 ; READJUST BITS ASR R1 ASR R1 CMP R1,#10 ; UNIT EXCEED #77 ?? BLT 14$ ; BRANCH IF YES ADD #11,R1 ; ALLOW M+ TERMINALS A0-X7 14$: ADD #60,R1 ; CONVERT TO ASCII MOVB R1,(R0)+ ; AND SAVE IT 16$: BIC #177770,R2 ; GRAB LO ORDER UNIT # 17$: ADD #60,R2 ; MAKE IT ASCII MOVB R2,(R0)+ ; AND SAVE IT MOVB #':,(R0)+ ; SET DELIMITER MOV #$CILST,R1 ; PICKUP START OF CLI LIST 20$: MOV (R1)+,R3 ; FETCH POINTER TO CLI'S NAME BEQ 28$ ; BRANCH ON END-OF-LIST CMP (R1)+,$CICLI ; POINT TO DEVICE'S CLI ?? BNE 20$ ; LOOP FOR MATCH MOV (R3)+,R1 ; PICKUP 1ST HALF OF CLI NAME CALL $C5TA ; CONVERT TO ASCII MOV (R3),R1 ; DO 2ND HALF CALL $C5TA 28$: SUB #SETMSG,R0 ; COMPUTE BYTE COUNT OF TEXT MOV R0,MSGQIO+Q.IOPL+2 ; SAVE IT IN QIO DPB DIR$ #MSGQIO ; SEND IT TO TI: RETURN ; BACK TO CALLER ; .END CLI