.TITLE MCR -- MCR DISPATCHER TASK .IDENT -014- ; ; ; ; ; ; ; COPYRIGHT 1974, DIGITAL EQUIPMENT CORP., MAYNARD, MA 01754. ; COPYRIGHT 1975, DIGITAL EQUIPMENT CORP., MAYNARD, MA 01754. ; COPYRIGHT 1976, 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: "MCR DISPATCHER" ; VERSION: V41 ; AUTHOR: H.A. NICHOLS. ; DATE: 14-NOV-74 ; ; ; MODIFICATIONS: ; ; NO. DATE PROGRAMMER PURPOSE ; --- ---- ---------- ------- ; 008 10-APR-75 H. NICHOLS ; 009 30-MAY-76 J. MASSE ADD SUPPORT FOR INDIRECT ; MCR (...AT.). ; 010 24-NOV-76 R. KITTELL, LASL MP-3 ADDED "BELL" TO ; PROMPT. USED IO.RPR ; 011 25-NOV-76 R. KITTELL, LASL MP-3 CAUSED THE KILMCR AST TO ; SET THE EVENT FLAG ; FOR THE READ. ; ALLOWED A BYE COMMAND ; ON A LOGGED OFF TERMINAL. ; 012 03-DEC-76 R. KITTELL, LASL MP-3 "HEL" IS RUN ; IMMEDIATLEY ON A LOGGED ; OFF TERMINAL. ; 013 13-DEC-76 R. KITTELL, LASL MP-3 PREVENTED HEL FROM LOOPING ; ON LOGGED OFF TERMINAL. ; 014 13-JUN-77 M. KELLOGG, LASL MP-1 ALLOW CHECKPOINTING DURING ; TERMINAL INPUT. ; ; .PAGE ; ; UT.HL=10 ;UNUSED BIT IN TERMINAL FLAGS BYTE OF PUD. ; ; WILL INDICATE WHETHER USER IS LOGGING ON. .MCALL CALL,QIOW$,DIR$,RQST$,EXIT$S,MRKT$,CMKT$,ASTX$S,SDRQ$ .MCALL DSCP$S,ENCP$S,ALTP$ .PSECT PURE,RO MCRSTR: DSCP$S ;DISABLE CHECKPOINT MOV .CRTSK,R0 ;GET MY ATL NODE - DO A CHECK TO MAKE MOV #.ATLLH,R1 ;SURE ONLY ONE VERSION OF MCR IS ACTIVE 1$: MOV (R1),R1 ;PER TERMINAL AT ANY TIME. CMP R0,R1 ;IS THIS ME? BEQ 1$ ;YES - THEN GET NEXT ATL NODE CMP R1,.ATLLH+2 ;END OF ATL LIST? BEQ 5$ ;YES - THEREFORE NO OTHER MCR ACTIVE ;ON THIS TERMINAL. CMP A.TD(R0),A.TD(R1) ;COMPARE STD ADDRESSES BNE 1$ ;NOT THE SAME! - TRY NEXT ATL NODE CMP A.TI(R0),A.TI(R1) ;TI ADDRESSES THE SAME? BNE 1$ ;NO - TRY NEXT ATL NODE. JMP EXIT ;YES -- RETURN 5$: MOV A.TI(R0),R5 ;GET THE PUD FOR THIS TERMINAL. 10$: MOVB U.TF(R5),LGOST ;SAVE LOGON/LOGOF STATUS. MOV #6,R3 ;SET UP TO GET 96 BYTES FROM POOL CALL ..PICV BCC 15$ JMP ERR2 15$: MOV .CRTSK,R0 ;GET MY ATL ADDRESS. MOV A.TI(R0),R0 ;GET TI ADDRESS. MOV R0,M.TI(R4) ;MOVE TI ADDRESS INTO MCR BUFFER. MOV U.UI(R0),RQST+R.QSPC ;MOVE UIC INTO REQUEST DPB. MOV R4,-(SP) ;SAVE BUFFER ADDRESS BIT #UT.LG,LGOST ;IS TERMINAL LOGGED ON BNE 20$ ;PROCEED IF SO BITB #UT.HL,U.TF(R5) ;IS USER LOGGING ON? BEQ 16$ ;BRANCH IF NOT AND START LOGON SEQUENCE BICB #UT.HL,U.TF(R5) ;USER FAILED TO LOG ON - SLEEP JMP ERR1 16$: BISB #UT.HL,U.TF(R5) ;REMEMBER WE'RE LOGGING ON BR 65$ ;START LOGON SEQUENCE 20$: BICB #UT.HL,U.TF(R5) ;CLEAR LOGON-IN-PROGRESS ADD #M.BF,R4 ;POINT TO DATA AREA OF BUFFER MOV R4,PRMQIO+Q.IOPL ; +++010 STORE IN READ DPB MOV .MCRTO,MRKTIM+M.KTMG ;SET TIMEOUT VALUE DIR$ #MRKTIM ;START MCR TIMEOUT BCS 27$ DIR$ #PRI220 ;LOWER PRIOR ENCP$S ;ENABLE CHECKPOINT DIR$ #PRMQIO ; +++010 READ IN THE REPLY (WITH PROMPT) ROL -(SP) ;SAVE C BIT DSCP$S ;DISABLE CHECKPOINT DIR$ #PRI230 ;RAISE PRIOR ROR (SP)+ ;RESTORE C BIT BCS 27$ DIR$ #CANMKT BCS 27$ TSTB IOSB ; +++010 DID READ (OR PROMPT) FAIL? BMI 25$ ; ; TST IOSB+2 ;DID USER TYPE SOMETHING? BNE 30$ 25$: JMP ERR1 ;NO,EXIT MCR 27$: JMP 110$ 30$: CLR R3 ;COUNTER FOR MULTIPLE BLANKS. MOV R4,R5 ;SET UP TO REMOVE HT'S AND MOV R4,R1 ;MULTIPLE BLANKS FROM THE INPUT MOV R4,R2 ;LINE ADD IOSB+2,R5 ;SET UP THE END OF LINE MARKER ; 35$: CMPB #11,(R2) ;IS THE POINTER LOOKING AT AN HT BNE 40$ ;NO - SKIP MOVB #40,(R2) ;YES - CONVERT IT TO A BLANK 40$: CMPB #40,(R2)+ ;IS THE POINTER LOOKING AT A BLANK BNE 50$ ;NO - GO MOVE THE CHARACTER CMPB #40,-1(R1) ;YES - IS PREVIOUS CHARACTER A BLANK? BNE 50$ ;NO, CONTINUE INC R3 BR 60$ 50$: MOVB -1(R2),(R1)+ 60$: CMP R2,R5 ;FINISHED? BNE 35$ ;NO - DO MORE CHARACTERS ; SUB R3,R5 ;REFLECT THE BLANK DELETIONS SUB R3,IOSB+2 ;DITTO MOVB IOSB+1,(R5) ;PUT TERMINATION CHRACTER IN BUFFER MOV R4,R0 ;SET UP TO CONVERT TASK NAME CALL $CAT5 ;TO RAD 50 BIT #UT.LG,LGOST ;IS THIS TERMINAL LOGGED ON? BNE 70$ ;IF NE THEN ALREADY LOGGED ON. CMP HELLO,R1 ;IS USER NOW LOGGING ON? BEQ 80$ ;+008 IF YES, THEN LET HIM. CMP BYEBYE,R1 ; +011 IS USER LOGGING OFF AGAIN BEQ 80$ ; LET HIM IF SO 65$: MOV #PLSLO,R4 CLR IOSB+2 ;FAKE A ZERO LENGTH COMMAND LINE MOV (SP),R2 ;RETRIEVE THE COMMAND LINE POINTER MOVB #15,M.BF(R2) ;TERMINATE ZERO LENGTH LINE WITH A C.R MOV HELLO,DIRERR+4. ;MCRERR SHOULD RQST "HELLO" UPON TERMINATION BR 130$ ; 70$: CMP BYEBYE,R1 ; IS USER LOGGING OFF? BNE 72$ ; BRANCH IF NOT MOVB #33,@R5 ; FORCE TERMINATOR TO ESCAPE 72$: CMPB #'@,(R4) ; +++009 IS FIRST CHARACTER AN "AT" SIGN? BNE 75$ ; +++009 NO -- CONTINUE MOV (PC)+,R1 ; +++009 YES -- SET UP R1 TO CALL '...AT.' .RAD50 /AT./ ; +++009 BR 95$ ; +++009 GO REQUEST '...AT.' ; 75$: CMP LOG,R1 ;IS THIS JUST A COMMENT? BEQ 150$ ;IF SO, JUST RETURN A COMMENT CMPB #';,(R4) ;IS THIS JUST A COMMENT? BEQ 150$ ;IF SO , JUST RETURN A PROMPT CMPB #'!,(R4) ;IS THIS JUST A COMMENT? BEQ 150$ ;IF SO JUST RETURN A PROMPT 80$: MOV #FNNR,R5 MOV #COMFN,R4 MOV MFT,RQST+R.QSTN+2 ;ASSUME SPECIAL FUNCTION 90$: CMP R1,(R4)+ BEQ 100$ SOB R5,90$ 95$: ; +++009 MOV R1,RQST+R.QSTN+2 ;TASK NAME INTO REQUEST DPB 100$: DIR$ #RQST ;REQUEST THE APPROPRIATE TASK BCC 160$ ;EXIT IF NO ERRORS 110$: MOV #NENMSG,WTQIO+Q.IOPL MOV #NENLEN,WTQIO+Q.IOPL+2 CMP #-1,$DSW BEQ 140$ MOV #MCRMSG,R5 MOV MCR,DIRERR+4. ;MCRERR SHOULD RQST "MCR" UPON TERMINATION 120$: MOVB (R5)+,R4 BEQ 130$ CMPB (R5)+,$DSW BNE 120$ 130$: MOVB R4,DIRERR MOVB IOSB+2,DIRERR+1 BEQ 135$ MOV IOSB+2,R3 CMP #18.,R3 BGE 132$ MOV #18.,R3 132$: MOV #DIRERR+8.,R4 MOV (SP),R5 ADD #M.BF,R5 133$: MOVB (R5)+,(R4)+ SOB R3,133$ 135$: MOV DDDDOT,DIRERR+2. DIR$ #SDRQDD BR ERR1 ; 140$: DIR$ #WTQIO ;WRITE OUT ERROR MESSAGE BCS ERR1 TSTB IOSB ;DID WRITE FAIL BMI ERR1 150$: MOV (SP),R4 ;NOW TRY AGAIN - RESTORE BUFFER ADDRESS JMP 20$ 160$: MOV (SP)+,R1 ;GET BUFFER ADDRESS MOV RQST+R.QSTN+2,M.TN(R1) ;MOVE IN TASK NAME MOV IOSB+2,M.BC(R1) ;MOVE CHARACTER COUNT INTO BUFFER MOV #.MCRLH,R4 ;SET BUFFER INTO MCR LIST CALL ..NADD ;ADD TO LIST CMPB #15,IOSB+1 ;WAS THE TERMINATOR A CARRIAGE RETURN BEQ EXIT ;YES - THEN DO NOT RETURN THE CARRIAGE AGAIN ERR2: MOV #BUFPRM,WTQIO+Q.IOPL ; +++010 SET ADDR OF CHARACTER MOV #1,WTQIO+Q.IOPL+2 ;RETURN THE CARRIAGE. CLR WTQIO+Q.IOPL+4 ;NO OTHER CARRIAGE CONTROL DIR$ #WTQIO EXIT: EXIT$S ;EXIT ERR1: MOV (SP)+,R1 MOV #6,R3 CALL ..NADV BIT #UT.LG,LGOST ;IS TERMINAL LOGGED ON? BEQ EXIT ;BRANCH IF NOT. NO PROMPT WAS WRITTEN. BR ERR2 KILMCR: DIR$ #KILQIO TST (SP)+ ASTX$S SDRQDD: SDRQ$ MCRERR,,,,,DIRERR CANMKT: CMKT$ KILQIO: QIOW$ IO.KIL,1,1 PRI220: ALTP$ ,220. PRI230: ALTP$ ,230. .EVEN NENMSG: .ASCII <15><12>/MCR -- NOT ENOUGH NODES TO SERVICE REQUEST/<15><12> NENLEN=.-NENMSG .EVEN HELLO: .RAD50 /HEL/ BYEBYE: .RAD50 /BYE/ ; +011 MCR: .RAD50 /MCR/ MFT: .RAD50 /MFT/ LOG: .RAD50 /LOG/ DDDDOT: .RAD50 /.../ MCRMSG: .BYTE NTINS,-2 .BYTE HNNRE,-6 .BYTE TACTI,-7 .BYTE DSABL,-8. .BYTE UNKDI,0 .EVEN BUFPRM: .ASCII <15><12>/MCR>/<7> .EVEN COMFN: .RAD50 /ABOALTCANDISENAFIXLOARESUNF/ FNNR=.-COMFN/2 .PAGE .PSECT IMPURE.RW DIRERR: .BLKW 13. MRKTIM: MRKT$ 2,.MCRTO,2,KILMCR WTQIO: QIOW$ IO.WLB,1,1,,,, PRMQIO: QIOW$ IO.RPR,1,1,,IOSB,,<0,80.,0,BUFPRM,7> RQST: RQST$ ...HEL LGOST: .WORD 0 ;CONTAINS LOGON STATUS FROM PUD. IOSB: .BLKW 2 .END MCRSTR