.TITLE MCL .IDENT /160885/ ; ; COMMAND SEQUENCE: ; ; >MAC MCL=MCL ; >TKB MCL=MCL,[1,1]EXELIB/LB ; >INS MCL/CLI=YES/TASK=...MCL ; >CLI /INIT=MCL/MESSAGE/DPR="<15><12>/>>/"/TASK=...MCL ; ; >SET /CLI=TTN:MCL ; ; NOTE THAT THE PROMPT ISSUED IN RESPONSE TO A CONTROL/C DEFAULTS TO THE ; NAME OF THE CLI WHICH IS "MCR>". ; ; IT CAN BE ELIMINATED FROM THE SYSTEM BY THE FOLLOWING COMMANDS, ASSUMING ; NO TERMINALS ARE SET TO IT: ; ; >CLI /ELIM=MCL ; >REM ...MCL ; .MCALL GCCI$,RPOI$,EXIT$S,QIOW$,ALUN$,DIR$ ; ; DIRECTIVE DPBS ; GCCI: GCCI$ CMDBUF,CBLEN,IBUF,IBLEN,0,GC.CEX RPOI: RPOI$ MCR... QIOW: QIOW$ IO.WVB,5,1,,,,<,,40> ALUN: ALUN$ 5 QIOW6: QIOW$ IO.WVB,6,1,,,,<,,40> ALUN6: ALUN$ 6,CO,0 ; ; BUFFER AREAS ; CMDBUF: .BLKB 80.+G.CCBF ;LENGTH = HEADER PLUS COMMAND IN BYTES CBLEN=.-CMDBUF ;CALCULATE LENGTH .EVEN IBUF: .BLKB G.CCCA+2 ;LONG ENOUGH TO CONTAIN ALL INFORMATION IBLEN=.-IBUF ;CALCULATE LENGTH .EVEN MCR: .ASCII <4><15> MCMD: .ASCII %SET /CLI=TI:MCR% ;SET TERMINAL TO MCR COMMAND MCLEN=.-MCMD ;LENGTH OF COMMAND .EVEN ; QIOBUF: .BLKB 120. BUF: .BLKB 80. ;BUFFER TO GENERATE COMMANDS IN .EVEN ; ; TEXT TO BE DISPLAYED UPON RECEIPT OF NEW TERMINAL LINKED OR ; TERMINAL REMOVED MESSAGES FROM SYSTEM. ; LKT: .ASCII <15><12>/ --- MCL --- /<15><12> LKTLEN=.-LKT .EVEN RMT: .ASCII <15><12>/ --- MCR --- /<15><12> RMTLEN=.-RMT .EVEN ; ; CHARACTERS LOST DUE TO BUFFER BEING TO SMALL MESSAGE ; CHLOST: .ASCII <15><12>/MCR -- Sorry, part of your command was lost/<15><12> CLLEN=.-CHLOST .EVEN ; ; CLI CODE ; .ENABL LSB START: DIR$ #GCCI ;GET A COMMAND FROM SYSTEM BCS 100$ ;IF CS, DIRECTIVE ERROR ; ; IF THE GCCI$ DIRECTIVE HAD THE GC.CST OPTION SPECIFIED, WE MAY HAVE ; JUST BEEN UNSTOPPED, SO WE HAVE TO GET THE COMMAND. ; CMP #IS.CLR,$DSW ;WERE WE JUST UNSTOPPED? BEQ START ;IF EQ YES MOV #CMDBUF,R0 ;POINT TO COMMAND BUFFER TST (R0) ;IS THIS A SYSTEM MESSAGE? BEQ MSG ;IF EQ YES ; BPT CMPB G.CCCT(R0),G.CCCL(R0) ;DID ENTIRE COMMAND FIT IN BUFFER BLO 150$ ;IF LO NO MOV #RPOI,R5 ;POINT TO DPB OF RPOI$ DIRECTIVE CMP MCR,G.CCBF(R0) ;IS IT A "M" COMMAND? BEQ 4$ ;IF EQ YES BR 50$ ;NO - NORMAL PROCESSING ; ; THE USER HAS ENTERED AN "M" COMMAND, SO SET THE TERMINAL TO MCR. ; 4$: MOV #MCMD,R.POBF(R5) ;PUT ADDRESS OF CMD TO ISSUE IN DPB MOV #MCLEN,R.POBL(R5) ;PUT LENGTH OF CMD IN DPB BR ISSCMD ;ISSUE COMMAND ; ; AT THIS POINT, THE CLI HAS A COMMAND TO BE PROCESSED. ; 50$: MOV #CMDBUF+G.CCBF,R.POBF(R5) ;PUT ADDRESS OF STRING IN DPB MOVB G.CCCT(R0),R.POBL(R5) ;PUT LENGTH IN RPOI DPB ; ; SEND INPUT TO THE CO: DEVICE ; MOV #CMDBUF+G.CCBF,R1 CLR R4 MOVB G.CCCT(R0),R4 MOV #QIOBUF,R3 MOV (R0),(R3)+ CLR R2 MOVB G.CCUN(R0),R2 ;COPY UNIT NUMBER ADD #60,R2 MOVB R2,(R3)+ MOVB #':,(R3)+ 1$: MOVB (R1)+,(R3)+ SOB R4,1$ MOV #QIOBUF,R1 SUB R1,R3 MOV R1,QIOW6+Q.IOPL ;SET ADDRESS OF MESSAGE MOV R3,QIOW6+Q.IOPL+2 ;INSERT LENGTH OF MESSAGE DIR$ #ALUN6 DIR$ #QIOW6 ;DO I/O AND WAIT FOR IT ; ; ISSUE RPOI$ DIRECTIVE TO EXECUTE COMMAND ; ISSCMD: MOV (R0),R.PODV(R5) ;PUT NAME OF ISSUING DEVICE IN RPOI MOVB G.CCUN(R0),R.POUN(R5) ;COPY UNIT NUMBER MOVB IBUF+G.CCPU,R.POUM(R5) ;PROPOGATE UIC OF TERMINAL MOVB IBUF+G.CCPU+1,R.POUG(R5) MOV IBUF+G.CCOA,R.POOA(R5) ;COPY ID PARENT IN CASE WE WERE SPAWNED DIR$ #RPOI ;PASS COMMAND TO EXECUTOR TASK BCS 110$ ;ERROR BR START ;IF CC, SUCCESS ; ; ERROR HANDLING CODE ; 100$: CLR R0 ;FATAL ERROR ON GCCI$ BR 150$ 110$: MOV #1,R0 ;FATAL ERROR ON RPOI$ 120$: IOT ;FATAL 150$: MOV #CHLOST,R1 ;POINT TO MESSAGE TO BE PRINTED MOV #CLLEN,R2 ;GET LENGTH OF MESSAGE CALL ISSMSG ;ISSUE MESSAGE BR START .DSABL LSB ; ; A SYSTEM MESSAGE WAS RECEIVED INSTEAD OF A COMMAND ; MSG: CMPB #CM.LKT,G.CCUN(R0) ;IS IT A NEW TERMINAL LINKED TO US? BEQ 10$ ;IF EQ YES CMPB #CM.RMT,G.CCUN(R0) ;IS IT A TERMINAL BEING REMOVED BEQ 20$ ;IF EQ YES CMPB #CM.EXT,G.CCUN(R0) ;IS IT A ELIMINATE ALL PACKET BEQ 50$ ;IF EQ YES CMPB #CM.ELM,G.CCUN(R0) ;IS IT A CLI ELIMINATION MESSAGE BEQ 50$ ;IF EQ YES JMP START ;IGNORE ALL OTHER MESSAGES ; ; ISSUE WELCOME MESSAGE ; 10$: MOV #LKT,R1 ;POINT TO MESSAGE TEXT MOV #LKTLEN,R2 ;GET LENGTH ADD #G.CCBF,R0 ;POINT TO TERMINAL THAT WAS SET BR 30$ ; ; ; ISSUE GOOD BYE MESSAGE ; 20$: MOV #RMT,R1 ;POINT TO MESSAGE TEXT MOV #RMTLEN,R2 ;GET LENGTH ADD #G.CCBF,R0 ;POINT TO TERMINAL NAME 30$: CALL ISSMSG ;ISSUE MESSAGE JMP START ;GET NEXT COMMAND ; ; WHEN AN ELIMINATE ALL MESSAGE IS RECEIVED, EXIT IMMEDIATELY ; 50$: EXIT$S ; ; ROUTINE TO PRINT TO TERMINAL ; ; ; INPUTS: ; ; R0=ADDRESS OF NAME OF TERMINAL TO PRINT TO ; R1=ADDRESS OF MESSAGE TO PRINT ; R2=LENGTH OF MESSAGE ; ; OUTPUTS: ; ; NONE ; ; THIS ROUTINE PRINTS THE SPECIFIED MESSAGE ON THE SPECIFIED TERMINAL. ; ISSMSG: MOV (R0),ALUN+A.LUNA ;SET UP DEVICE NAME MOVB 2(R0),ALUN+A.LUNU ;AND UNIT NUMBER CLRB ALUN+A.LUNU+1 ;CLEAR HIGH BYTE DIR$ #ALUN ;ASSIGN LUN 5 TO THE SPECIFIED DEVICE BCS 10$ ;IF CS, SKIP I/O MOV R1,QIOW+Q.IOPL ;SET ADDRESS OF MESSAGE MOV R2,QIOW+Q.IOPL+2 ;INSERT LENGTH OF MESSAGE DIR$ #QIOW ;DO I/O AND WAIT FOR IT 10$: RETURN .END START