.TITLE INDMCR -- MCR FUNCTION TASKS .IDENT /V42B/ .SBTTL "MCR DISPATCHER TASK" .NLIST TTM ; ; ; ; ; 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 ; MODIFIED BY: ; H.A. NICHOLS 10-APR-75 +008 ; 009 JOHN HARPER 3-MAY-76 FIX TIMEOUT ; 010 R. NEWLAND 19-JUL-76 CONDITIONALISE IAS VERSION ; 011 R. NEWLAND (FOR H. NICHOLS) 19-JUL-76 FORM CMD LINE BEFORE ; TASK REQUEST ; 012 JOHN HARPER 1-SEP-76 BIG TT HANDLER CHANGES ; ALLOW LOWER CASE COMMAND NAME ; 013 JOHN HARPER 15-SEP-76 FIX PROMPT CARRIAGE CONTROL ; 014 JOHN HARPER 04-OCT-76 FIX BUG IN TT01 PROMPTING ; 025 17-JAN-77 J. MASSE BY H NICHOLS ADD SUPPORT FOR INDIRECT ; MCR (...AT.) ; .MCALL CALL,QIOW$,DIR$,RQST$,EXIT$S,MRKT$,CMKT$,ASTX$S,SDRQ$ .MCALL SETF$S ;++009 .PSECT PURE,RO ;++012 ; THE MCR TASK CAN BE ASSEMBLED IN TWO WAYS. IF THE SYMBOL 'TT01' ; IS DEFINED, AN OLD-TYPE MCR IS BUILT. OTHERWISE, THE READ-WITH-PROMPT ; QIO IS USED WHICH PROMPTS, READS AND DEALS WITH TIMEOUT AUTOMATICALLY. ;--012 MCRSTR: 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$: MOV U.TF(R5),LGOST ;SAVE LOGON/LOGOF STATUS. MOV #6,R3 ;SET UP TO GET 96 BYTES FROM POOL CALL ..PICV BCC 15$ JMP RTNCAR ; +++011 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 20$: ADD #M.BF,R4 ;POINT TO DATA AREA OF BUFFER .IF DF,TT01 ;++012 MOV #BUFPRM,WTQIO+Q.IOPL ;MOVE IN BUFFER ADDRESS MOV #6,WTQIO+Q.IOPL+2 ;++013 AND LENGTH CLR WTQIO+Q.IOPL+4 ;++014 AND CARRIAGE CONTROL MOV R4,RDQIO+Q.IOPL ;STORE IN READ DPB DIR$ #WTQIO ;WRITE OUT THE PROMPT. BCS 27$ TSTB IOSB ;DID WRITE FAIL? BMI 25$ MOV .MCRTO,MRKTIM+M.KTMG ;SET TIMEOUT VALUE DIR$ #MRKTIM ;SET MCR TIMEOUT BCS 27$ DIR$ #RDQIO ;READ IN THE REPLY BCS 27$ DIR$ #CANMKT BCS 27$ .IFF MOV R4,RDQIO+Q.IOPL ;++020 SET UP IN READ QIO MOV .MCRTO,R3 ;++020 GET MCR TIMEOUT IN SECONDS CLR R2 ;++020 CLEAR HIGH ORDER FOR DIV DIV #10.,R2 ;++020 GET INTO FORM FOR HANDLER MOV R2,RDQIO+Q.IOPL+4 ;++020 SET IN DPB DIR$ #RDQIO ;++020 NOW PROMPT FOR AND GET A LINE CMPB IOSB,#IS.TMO ;++020 TIMEOUT? BEQ 25$ ;++020 TREAT AS ERROR IF SO .ENDC; DF,TT01 ;++020 TSTB IOSB ;DID READ 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 ; HERE CHECK FOR AN INITIAL BLANK. FLUSH ANY SUCH BEFORE GOING ON. ; (GCE) MOV R2,-(SP) ;USE (SP) AS AN ACCUMULATOR SUB R4,(SP) ;SUBTRACT START OF BUFFER CMP (SP)+,#1 ;THIS THE FIRST CHARACTER? BEQ 47$ ;YES. FLUSH IT. (NONBLANK ALREADY AT 50$) CMPB #40,-1(R1) ;YES - IS PREVIOUS CHARACTER A BLANK? BNE 50$ ;NO, CONTINUE 47$: 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 61$: CMPB (R4),#'A+40 ;++020 LOWER CASE LETTER? BLO 62$ ;++020 J IF LESS CMPB (R4),#'Z+40 ;++020 WITHIN THE ALPHABET? BHI 62$ ;++020 J IF NOT BICB #40,(R4) ;++020 CONVERT LOOWER TO UPPER CASE 62$: CMPB (R4)+,#'A ;++020 STILL LOOKING AT LETTERS? BHIS 61$ ;++020 LOOP IF SO MOV R0,R4 ;++020 RESET R4 FOR LATER 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 LOGIO,R1 ;(ALLOW "LOG" CMD TOO...) BEQ 80$ ;GCE 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$: CMPB #'@,(R4) ; +++025 IS FIRST CHARACTER AN "AT" SIGN? BNE 75$ ; +++025 NO -- CONTINUE MOV (PC)+,R1 ; +++025 YES -- SET UP R1 TO CALL '...AT.' .RAD50 /AT./ ; +++025 BR 95$ ; +++025 GO REQUEST '...AT.' 75$: ;+++025 JIM MASSE CMP LOG,R1 ;IS THIS JUST A COMMENT? BNE 76$ ;IF SO, JUST RETURN A COMMENT JMP 150$ 76$: CMPB #';,(R4) ;IS THIS JUST A COMMENT? BNE 77$ ;IF SO , JUST RETURN A PROMPT JMP 150$ 77$: CMPB #'!,(R4) ;IS THIS JUST A COMMENT? BNE 80$ ;IF SO JUST RETURN A PROMPT JMP 150$ 80$: .IF DF IAS ; +++010 MOV DDDDOT,RQST+R.QSTN ; /IAS/ .ENDC ; +++010 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$: ;+++025 MOV R1,RQST+R.QSTN+2 ;TASK NAME INTO REQUEST DPB 100$: MOV (SP),R1 ; +++011 GET BUFFER ADDRESS MOV RQST+R.QSTN+2,M.TN(R1) ; +++011 TASK NAME MOV IOSB+2,M.BC(R1) ; +++011 CHARACTER COUNT MOV #.MCRLH,R4 ; +++011 PUT BUFFER INTO MCRR LIST CALL ..NADD ; +++011 DIR$ #RQST ;REQUEST THE APPROPRIATE TASK BCC RQSTOK ; +++011 EXIT IF REQUEST OK .IF DF IAS ; +++010 CMP #-2,$DSW ; TASK NOT INSTALLED? /IAS/ BNE 105$$ ; +++011 NO MOV DOLLAR,RQST+R.QSTN ; TRY $$$ VERSION /IAS/ DIR$ #RQST ; /IAS/ BCC RQSTOK$ ; +++011 /IAS/ 105$: ; +++011 .ENDC ; +++010 MOV (SP),R4 ; +++011 DELETE BUFFER FROM MCR LIST CALL ..NDEL ; REMOVE BUFFER FROM MCR LIST FIRST. ; (MAY ADD IT WITH LATER PROCESSING AGAIN) ; ; HERE ADD CODE TO SEE IF NON-INSTALLED TASK. ; ; IF ANY SUCH THING IS DETECTED, ; INSERT THE TEXT "@[2,1]" FIRST AND TRY ...AT. ; (GCE) CMP #-2,@#$DSW ;TASK NOT INSTALLED? BNE 106$ ;NO, OTHER ERROR. DO USUAL STUFF. CMP #<80.-ATSIZ-1>,IOSB+2 ; TOO MUCH DATA ON LINE? BLOS 106$ ; YES, NO INDIRECT ATTEMPT HERE...NO ROOM IN BUF ; RECONSTITUTE R4 HERE ADD #M.BF,R4 ;POINT TO DATA AREA OF LINE CMPB @R4,#'A ;TEST LINE STARTS WITHH AN ALPHA BLO 109$ ;ERR IF NOT IS BAD TSK CMPB @R4,#'Z ;RANGE IS A-Z BLOS 114$ 109$: MOV @SP,R4 ;RETRIEVE R4 BR 106$ ;AND GO DELETE THAT BUFFER! 114$: ;LINE LOOKS OK SO FAR... ;NOW ADD THE TEXT PROMISED AND GO BACK TO 70$ TO CALL ...AT. MOV R0,-(SP) MOV R1,-(SP) ;NEED A FEW REGS MOV R2,-(SP) MOV R4,R0 ;DATA ADDR ADD IOSB+2,R0 ;END OF DATA MOV R0,R1 ;COPY... ADD #<1.+ATSIZ>,R0 ;POINT PAST THE "@[1,2]" WE'LL ADD MOV IOSB+2,R2 ;GET LENGTH OF LINE INC R1 ;ALLOW FOR AUTODECREMENT INC R2 MOVB #33,@R0 ;BE SURE TERMINATOR PUT INTO LINE. (ESC) 107$: MOVB -(R1),-(R0) ;MOVE FROM TOP DOWN UP BUFFER SOB R2,107$ ;DO ALL TEXT ADD #ATSIZ,IOSB+2 ;COUNT NEW TEXT MOV R4,R0 ;POINTER START OF DATA NOW MOV #ATSIZ,R2 MOV #ATUIC,R1 ;DATA TO INSERT 108$: MOVB (R1)+,(R0)+ SOB R2,108$ ;COPY TEXT MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 BR 70$ ;GO CALL 'AT' PROCESSOR 106$: ; CALL ..NDEL ; +++011 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$ ; +++011 5 LINES DELETED RQSTOK: ; +++011 TST (SP)+ ; +++011 CLEAR OUT BUFFER ADDRESS CMPB #15,IOSB+1 ;WAS THE TERMINATOR A CARRIAGE RETURN BEQ EXIT ;YES - THEN DO NOT RETURN THE CARRIAGE AGAIN RTNCAR: MOV #1,WTQIO+Q.IOPL+2 ; +++011 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 BR RTNCAR ; +++011 .IF DF,TT01 ;++020 KILMCR: DIR$ #KILQIO SETF$S #1 ;++009 SET FLAG 1 TO WAKE UP TASK TST (SP)+ ASTX$S .ENDC; TT01 ;++020 SDRQDD: SDRQ$ MCRERR,,,,,DIRERR .IF DF,TT01 ;++020 CANMKT: CMKT$ KILQIO: QIOW$ IO.KIL,1,2,,KIIOSB .ENDC ;++020 .EVEN NENMSG: .ASCII <15><12>/MCR -- NOT ENOUGH NODES TO SERVICE REQUEST/<15><12> NENLEN=.-NENMSG .EVEN HELLO: .RAD50 /HEL/ MCR: .RAD50 /MCR/ MFT: .RAD50 /MFT/ LOG: .RAD50 /YAK/ ; N.B. ALLOWS FOR USE OF A "LOGIN" PROCEDURE DDDDOT: .RAD50 /.../ LOGIO: .RAD50 /LOG/ ;ALTERNATE LOGIN CMD ALLOWED .IF DF IAS ; +++010 DOLLAR: .RAD50 /$$$/ ; /IAS/ .ENDC ; +++010 MCRMSG: .BYTE NTINS,-2 .BYTE HNNRE,-6 .BYTE TACTI,-7 .BYTE DSABL,-8. .BYTE UNKDI,0 .EVEN BUFPRM: .ASCII <15><12>/MCR>/ ;++013 .EVEN COMFN: .RAD50 /ABOALTCANDISENAFIXLOARESUNF/ FNNR=.-COMFN/2 ; ATUIC: .ASCII /@[2,1]/ ; TEXT TO ADD IF TASK NOT INSTALLED ATSIZ=.-ATUIC .EVEN .PSECT IMPURE.RW DIRERR: .BLKW 13 .IF DF,TT01 ;++020 MRKTIM: MRKT$ 2,.MCRTO,2,KILMCR RDQIO: QIOW$ IO.RLB,1,1,,IOSB,,<0,80.,40> .IFF RDQIO: QIOW$ IO.RPR!TF.TMO,1,1,,IOSB,,<.-.,80.,.-.,BUFPRM,6> ;++020 .ENDC; TT01 WTQIO: QIOW$ IO.WLB,1,1,,,, ;++013 RQST: RQST$ ...MCR ; LGOST: .WORD 0 ;CONTAINS LOGON STATUS FROM PUD. IOSB: .BLKW 2 KIIOSB: .BLKW 2 ; .END MCRSTR