.TITLE MCRTSK ; ; MCRTSK RECEIVES AN MCR COMMAND FROM SUBROUTINE MCR OF REQUESTING TASK ; AND EXECUTES IT. IF REQUESTING TASK IS SUSPENDED, MCRTSK SENDS ; ANY ERROR FLAGS TO IT AND RESUMES IT, AFTER COMPLETING THE ; REQUESTED MCR COMMAND. ; ; WRITTEN MARCH 1975 R B FRENCH THE BOEING COMPANY ; MODIFIED NOVEMBER 1975 R B FRENCH CONVERTED TO VERSION 6A ; MODIFIED JULY 1976 R B FRENCH REMOVED BUG - FAILED TO FIND TASK ; IF IT WAS LAST ENTRY IN MRL. ; MODIFIED MARCH 1977 R B FRENCH CONVERTED TO VERSION 6.2 ; ; TASK BUILD FILE ; ; MCRTSK/PR/-FP/MU=MCRTSK,DSW,[1,1]EXEC.STB ; / ; ASG=TI:1 ; UNITS=1 ; STACK=32 ; PRI=100 ; .MCALL DIR$,VRCX$,RQST$,WSIG$S,VSDR$,QIOW$,EXIT$S MCRTSK: DIR$ #VRCX ;RECEIVE DATA OR EXIT MOV #6,R3 ;GET A 96 BYTE NODE JSR PC,..PICV BCC 10$ ;CHECK IF OK MOV #-4,BUF ;IF NOT, RETURN ERROR=-4 JMP DONE 10$: MOV .CRTSK,R0 ;GET ATL NODE MOV A.TD(R0),STDADR ;SAVE OUR STD ADDRESS MOV A.TI(R0),TI ;SAVE TI ADDRESS MOV A.TI(R0),M.TI(R4) ;PUT IT IN BUFFER MOV #BUF+6,R0 ;GET COMMAND LINE ADDRESS JSR PC,$CAT5 ;CONVERT MCR TASKNAME TO RAD50 MOV #NAMES,R0 ;6.2 - LIST OF MFT TASKS IN R0 MOV #9.,R2 ;6.2 - NINE OF THEM 11$: CMP R1,(R0)+ ;6.2 - CHECK TASK NAME AGAINST MFT LIST BEQ 12$ ;6.2 - BRANCH ON MATCH SOB R2,11$ ;6.2 BR 13$ ;6.2 12$: MOV MFT,R1 ;6.2 - CHANGE TASK NAME TO MFT 13$: MOV R1,M.TN(R4) ;AND PUT IT IN BUFFER MOV R1,RQST+R.QSTN+2 ;AND IN RQST DPB CLR RESFLG MOV BUF+4,R2 ;PUT BYTE COUNT IN R2 BGE 20$ ;IS IT NEGATIVE? NEG R2 ;MAKE IT POSITIVE INC RESFLG ;SET RESUME FLAG MOV BUF,VSDR+S.DRTN ;PUT ISSUING TASK NAME MOV BUF+2,VSDR+S.DRTN+2 ;IN SEND/RESUME DPB 20$: MOV #BUF+6,R0 ;COMMAND LINE ADDRESS IN R0 MOV R4,R1 ;NODE ADDRESS IN R1 ADD #M.BF,R1 ;OFFSET TO START OF COMMAND MOV R2,M.BC(R4) ;PUT BYTE COUNT IN BUFFER 30$: MOVB (R0)+,(R1)+ ;PUT COMMAND LINE IN BUFFER SOB R2,30$ MOVB #33,(R1) ;PUT IN ALTMODE MOV R4,R1 ;PUT NODE ADDRESS IN R1 MOV #.MCRLH,R4 ;MCR LISTHEAD IN R1 JSR PC,..NADD ;ADD NODE TO LIST DIR$ #RQST ;AND REQUEST THE TASK BCS 40$ ;IF ALL OK, GO WAIT TST RESFLG ;RESUME FLAG SET? BEQ MCRTSK ;RESTART IF NOT BR WAIT ;OTHERWISE GO WAIT 40$: MOV 0,BUF ;SET UP ERROR RETURN JSR PC,..NDEL ;DELETE THE NODE FROM MCR LIST MOV R4,R1 ;SET UP TO RETURN NODE TO POOL MOV #6,R3 JSR PC,..NADV ;AND RETURN IT BR DONE ENAB: JSR PC,..ENB0 ;ENABLE TASK SWITCHING WAIT: WSIG$S ;WAIT FOR SIGNIFICANT EVENT MOV #.ATLLH,R0 ;GET START OF ATL MOV R0,R1 ;AND SAVE IT MOV @#177776,-(SP) ;PUT PSW ON STACK MOVB #140,@#177776 ;;INHIBIT TASK SWITCHING ATL: MOV (R0),R0 ;;GET A NODE CMP R0,R1 ;;END OF ATL? BEQ MRL ;;GO CHECK MRL CMP A.TI(R0),TI ;;IS TI SAME AS OUR'S? BNE ATL ;;BRANCH IF NOT CMP A.RQ(R0),STDADR ;;DID WE REQUEST IT? BNE ATL ;;BRANCH IF NOT MOV A.TD(R0),R2 ;;GET STD ADDRESS CMP RQST+R.QSTN,(R2) ;;CHECK 1ST WORD OF TASKNAME BNE ATL ;;BRANCH IF NO MATCH CMP RQST+R.QSTN+2,2(R2) ;;CHECK 2ND WORD OF TASKNAME BEQ ENAB ;;BRANCH ON MATCH MRL: MOV .TPDBA,R1 ;;GET START OF TPD 10$: MOV T.RF(R1),R0 ;;GET START OF MRL CMP (R0),R0 ;;EMPTY? BEQ 40$ ;;BRANCH IF SO 20$: MOV (R0),R0 ;;GET A NODE CMP A.TI(R0),TI ;;TI SAME AS OURS? BNE 30$ ;;BRANCH IF NOT CMP A.RQ(R0),STDADR ;;DID WE REQUEST IT? BNE 30$ ;;BRANCH IF NOT MOV A.TD(R0),R2 ;;GET STD ADDRESS CMP RQST+R.QSTN,(R2) ;;CHECK IST WORD OF TASKNAME BNE 30$ CMP RQST+R.QSTN+2,2(R2) ;;CHECK 2ND WORD OF TASKNAME BEQ ENAB 30$: CMP R0,T.RB(R1) ;;END OF MRL? BNE 20$ ;;IF NOT, GO GET ANOTHER NODE 40$: ADD #T.SZ,R1 ;;STEP TO NEXT TPD ENTRY CMP R1,.TPDEA ;;END OF TPD? BNE 10$ ;;IF NOT, KEEP LOOKING CALL ..ENB0 ;OTHERWISE IT'S GONE, SO ENABLE TASK SWITCHING CLR BUF ;AND CLEAR ERROR RETURN DONE: TST RESFLG ;RESUME FLAG SET? BEQ RESTART ;IF NOT, GO CHECK FOR MORE REQUESTS DIR$ #VSDR ;OTHERWISE RESUME REQUESTING TASK CLR RESFLG ;CLEAR THE RESUME FLAG BCC RESTART ;THEN CHECK FOR MORE REQUESTS, IF ALL OK ERR: CALL DSW ;CONVERT DSW TO ASCII MOV R0,DSWERR ;AND PUT IN QIO MESSAGE DIR$ #QIOW ;AND PRINT THE MESSAGE EXIT$S RESTART:JMP MCRTSK ;THEN CHECK ON MORE REQUESTS BUF: .BLKW 43. ;SEND/RECEIVE BUFFER TI: .WORD 0 ;PUD ADDRESS OF CURRENT TI STDADR: .WORD 0 ;STD ADDRESS RESFLG: .WORD 0 ;RESUME FLAG NAMES: .RAD50 /ABOALTCANDISENAFIXLOARESUNF/ MFT: .RAD50 /MFT/ VRCX: VRCX$ ,BUF,41. ;RECEIVE DATA OR EXIT DPB RQST: RQST$ ...XXX ;REQUEST DPB VSDR: VSDR$ ,,,,,BUF,1 ;SEND DATA AND RESUME DPB QIOW: QIOW$ IO.WLB,1,1,,,, ;QIO DPB FOR ERROR MESSAGE MSG: .ASCII /MCRTSK ERROR /<55> ;ERROR MESSAGE DSWERR: .WORD 0 .END MCRTSK