.TITLE CCLDSP -- CCL'S CLI DISPATCHER .IDENT /012985/ .ENABL GBL .ENABL LC .NLIST BEX ; ;+ ;***** ; ; CCLDSP -- Forms the basic command line dispatcher for CCL ; used as an alternate CLI under 11-M V3.2 or 11-M-Plus V1.0. ; Alternate CLI support is afforded by a set of psuedo-directives ; patterned after their counterparts in M V4.0/M-Plus V2.0, eg. ; GCCI$ (get-command-for-command-interpreter), and RPOI$ ; (request-pass-offspring-info). These routines require ; this dispatcher to be privileged and map the executive. ; ; Installed as CCL..., this dispatcher dequeues command lines ; from its receive-data queue via a pseudo-GCCI$ directive. ; The GCCI$ routine also handles all CLI prompts and ; assigns TI: to the user's terminal (NOTE: this is not ; a normal function of GCCI$ under later versions of M/M-Plus). ; Once a command line is available, CCL... immediately executes ; a psuedo-RPOI$ directive for its partner task ...CCL. ; ; Once requested, ...CCL has full responsibility for ; interpretting/executing the command. Internally, ...CCL ; is NOT a CLI in that only one command may be queued to ; a single ...CCL task (blocked by "task active" error in RPOI$). ; Generating the ...CCL task image follows the same procedure ; used in generating the CCL catchall task. The following ; options must be selected: ; 1) Privileged CCL; allows RPOI$ type of ; command dispatching ; 2) Lookup from internal table should be first; ; pass "CLITBL.CCL" through TABLEGEN to ; create "TABLE.MAC" file for task building into CCL. ; The first option is required to stop the CLI from being ; blocked during execution of all commands. The second ; option defines login and logout commands and a "MCR" ; command which should not be circumvented by any users. ; ; ;***** ; ; EMST$, GCCI$ and RPOI$ macro's are defined in CLI.MLB, and executed ; by appropriate calls to $EMST$, $GCCI$ and $RPOI$ respectively. ; RSX-11Mplus V1.0 supports EMST$, but in this task, the 11M ; $EMST$ routine will be used. Because of the multiple definitions ; of the EMST$ macro in both the RSXMAC and CLI libraries, it ; would be necessary to explicitly include "LB:[1,1]RSXMAC.SML/ML ; AFTER "CLI/ML" in the MAC command line so the correct emit-status ; directive was extracted ; ;***** ; ; Update 4/9/84 -- PRS; original edit ; Update 1/29/85 -- PRS; Final cosmetic changes and debugging ; ;***** ;- ; TAB = 11 ; ASCII HORIZONTAL TAB SPA = 40 ; ASCII SPACE ; .MCALL GTSK$,DIR$,EXST$S .MCALL GCCI$,RPOI$,EMST$,DIR$G .PSECT $IDATA,RW,D,LCL,CON,REL ; GETTSK: GTSK$ CCLNAM GETCMD: GCCI$ CMDBUF,L.CMDB,INFBUF,L.INFB,,GC.CST .LIST ME RQSTSK: RPOI$ ,,,,,,,,,,,, .NLIST ME EMITST: EMST$ , ; CCLNAM: .BLKW 2 ; SPACE FOR CCL'S PARTNER TASK NAME CMDBUF: .BLKB 88. ; OVERLAP REST OF GTSK$ BUFFER WITH GCCI$ BUFFER L.CMDB=.-CMDBUF INFBUF: .BLKB 14. ; INFORMATION BUFFER FOR GCCI$ L.INFB=.-INFBUF EM1: ; ONLY ERROR ASSUMED TO BE TASK ACTIVE FROM RPOI$ .ASCII <12><15> ; VERTICAL FORMAT CHARACTERS ASCTN: .ASCII /XXX -- CLI Interpreter Task Active; (DSW = / ASCDE: .BLKB 10. ; PLACE FOR DSW ERROR CODE .EVEN ; ; *** ; .PSECT $PCODE,RO,I,LCL,CON,REL ; CCLDSP:: ; GLOBAL ENTRY POINT DIR$ #GETTSK ; GET OUR TASK PARAMETERS MOV CCLNAM,CCLNAM+2 ; CONVERT OUR NAME FROM XXX... MOV #^R...,CCLNAM ; TO ...XXX; NORMAL TARGET FOR RPOI$ 5$: ; MAIN LOOP DIR$G #GETCMD ; GET COMMAND OR STOP... ;* MOV #GETCMD,R5 ; POINT TO GCCI$ "DPB" ;* CALL $GCCI$ ; TRY TO GET COMMAND BCS ERREX ; EXIT ON PROBLEMS TST @#$DSW ; CHECK STATUS RETURNED BEQ 5$ ; BRANCH IF JUST UNSTOPPED ; ; *** CLI'S MUST DO THEIR OWN PRE-PROCESSING OF COMMAND LINES, EG. ; CONVERT LOWER TO UPPER CASE, REMOVE MULTIPLE SPACES, MAKE ; TABS SPACES, ETC. ; 10$: MOV #CMDBUF+G.CCBF,R0 ; POINT TO COMMAND LINE CLR R3 ; PICKUP LENGTH, BISB CMDBUF+G.CCCT,R3 ; W/O SIGN EXTENSION MOV R0,R1 ; PROCESS LINE IN PLACE 14$: MOVB (R0)+,R2 ; GET CHARACTER CMPB R2,#TAB ; TAB ?? BNE 18$ ; BRANCH IF NO MOVB #SPA,R2 ; YES, CONVERT TO SPACE BR 20$ 18$: CMPB R2,#SPA ; SPACE ?? BNE 22$ ; BRANCH IF NO 20$: CMPB -1(R1),#SPA ; LAST CHAR A SPACE TOO ?? BEQ 28$ ; BRANCH IF YES, SKIP IT BR 27$ ; ELSE, SAVE IT 22$: CMPB R2,#141 ; LOWER CASE ALPHA ?? BLT 27$ ; BRANCH IF NO CMPB R2,#172 ; MAYBE ?? BGT 27$ ; BRANCH IF NO BICB #40,R2 ; MAKE IT UPPER CASE 27$: MOVB R2,(R1)+ ; SAVE CHAR 28$: SOB R3,14$ ; LOOP TIL DONE CMPB R2,#SPA ; LAST CHAR A SPACE ?? BNE 32$ ; BRANCH IF NO DEC R1 ; YES, BACKUP OVER IT 32$: MOVB (R0),(R1) ; COPY TERMINATOR SUB #CMDBUF+G.CCBF,R1 ; COMPUTE NEW BYTE COUNT MOVB R1,CMDBUF+G.CCCT ; SAVE IT ; ; *** COPY PERTINENT INFO TO RPOI$ "DPB" AND REQUEST PARTNER ; MOV #RQSTSK,R5 ; POINT TO RPOI$ DPB MOV #INFBUF,R0 ; POINT TO INFO BUFFER MOV CCLNAM,R.POTK(R5) ; DEFINE TARGET TASK NAME MOV CCLNAM+2,R.POTK+2(R5) ; IN RPOI$ DPB MOV G.CCOA(R0),R.POOA(R5) ; IDENTIFY PARENT OCB MOVB G.CCPU+1(R0),R.POUG(R5) ; IDENTIFY UIC MOVB G.CCCU(R0),R.POUM(R5) MOV #CMDBUF,R0 ; POINT TO COMMAND BUFFER MOV G.CCDV(R0),R.PODV(R5) ; IDENTIFY TI: MOVB G.CCUN(R0),R.POUN(R5) MOVB G.CCCT(R0),R.POBL(R5) ; IDENTIFY COMMAND LENGTH ADD #G.CCBF,R0 ; POINT TO BUFFER START ADDR MOV R0,R.POBF(R5) ; SAVE IT ;* DIR$G R5 ; CHAIN TO TARGET TASK ;* CALL $RPOI$ ; CHAIN TO TARGET TASK BCC 5$ ; BRANCH IF WORKED ; ; *** RPOI$ FAILED, ASSUMING ITS BECAUSE CCLTnn IS ALREADY ACTIVE ; ON TI:. FORMAT AND SEND MESSAGE TO TI: USING SPECIAL ; WRITE/TIME-OUT ROUTINE "$TIQIO". ; MOV #ASCTN,R0 ; PICKUP PLACE FOR ASCII TASK NAME MOV CCLNAM+2,R1 ; PICKUP TASK NAME CALL $C5TA ; CONVERT IT TO ASCII MOV #ASCDE,R0 ; PICKUP PLACE FOR DSW CODE MOV @#$DSW,R1 ; GET DSW CLR R2 ; ENABLE LEADING 0 SUPPRESSION CALL $CBDSG ; CONVERT # MOVB #'.,(R0)+ ; SET DECIMAL RADIX MOVB #'),(R0)+ ; AND TERMINATOR MOV R0,R1 ; COPY CURRENT POINTER MOV #EM1,R0 ; GET START ADDRESS OF MESSAGE SUB R0,R1 ; COMPUTE BYTE COUNT CALL $TIQIO ; CALL ROUTINE TO WRITE/TIMEOUT ; ; *** FINALLY, DON'T LET PARENT HANG FOREVER BY HOLDING IT'S OCB ; IN OUR QUEUE...EMIT STATUS TO PARENT ; MOV CMDBUF+G.CCPT,EMITST+E.MSTN ; SETUP PARENT TASK BEQ 65$ ; BRANCH IF NULL, NO OCB MOV CMDBUF+G.CCPT+2,EMITST+E.MSTN+2 MOV #EX$ERR,EMITST+E.MSST ; DEFINE STATUS ; DIR$G #EMITST ; EMIT STATUS TO PARENT ; 65$: JMP 5$ ; LOOP TO EMPTY COMMAND QUEUE ; ; ERREX: EXST$S #EX$SEV ; FATAL ERROR EXIT ; .END CCLDSP