.TITLE REQMCR -- REQUEST MCR PROCESSOR .IDENT /JRBARR/ PSEXP=177776 .MACRO .INH0 $PUSH PSEXP LET PSEXP :B= PSEXP SET.BY #140 .ENDM .INH0 ; .MACRO .ENB0 CALL ..ENB0 .ENDM .ENB0 ; ; .MACRO HOLDIT DIR$ #WSIG .ENDM HOLDIT .PAGE ; ; .MCALL RQST$,WSIG$,DIR$ .MCALL VRCX$,VSDR$,EXIT$S .MCALL SMACIT DSW=0 ; ; SMACIT ;BRING IN SUPER MAC MACROS ; .PSECT PURE,RO ; START: REPEAT LET ANS := #1 ;SET ERROR CODE TO OKAY DIR$ #VRCX ;READ DATA OR EXIT LET RES+S.DRTN := BUFF ;SET CALLER NAME IN LET RES+S.DRTN+2 := BUFF+2 ;REQUEST OR RESUME IF DSW LT #0 THEN EXIT$S FI ; LET R1 := UTI ;TI OF CALLER LET RQST+R.QSPC :B= U.PC(R1) LET RQST+R.QSGC :B= U.GC(R1) LET R2 := BUFF+6 ;SIZE OF MCR COMMAND LINE LET R1 := #BUFF+10 ;ADDRESS OF MCR COMMAND LINE CALL PUTMCR ;SEND THE LINE TO MCR IF DSW GT #0 AND BUFF+4 NE #0 THEN CALL WAIT ;WAIT UNTIL THE TASK COMPLETES FI IF DSW LT #0 THEN LET ANS := DSW CALL RESPOND ;LET CALLER KNOW THAT WE ARE DONE END .PAGE PROCEDURE PUTMCR IF R2 NE #0 AND R2 LE #80. THEN $PUSH R2 LET R2 := R1 ;ADDRESS OF STRING TO CONVERT LET R3 := #3 ;CONVERT THREE ASCII CHARACTERS LET R4 := #RQST+R.QSTN+2 ;TO LET (R4) := #0 CALL ..SGR5 ;TO RAD50 $POP R2 ON.NOERROR DIR$ #RQST IF DSW GT #0 THEN LET R3 := #6 CALL ..PICV ;REQUEST A 96 BYTE NODE ON.NOERROR CALL FILLUP ;SET UP NODE FOR MCR LET R1 := R4 LET R4 := #.MCRLH CALL ..NADD ;INSERT NODE IN MCR DEQUEUE .INH0 ;;INHIBIT TASK SWITCHING LET R0 := @#.ATLLH ;;ATL LIST HEAD LET R5 := #RQST WHILE R0 NE #.ATLLH AND TASK EQ #0 LET R1 := A.TD(R0) ;POINT TO TASK NAME IF (R1) EQ R.QSTN(R5) AND 2(R1) EQ R.QSTN+2(R5) THEN IF A.TI(R0) EQ UTI THEN LET A.TF(R0) := A.TF(R0) SET.BY #AF.GC LET TASK := R0 ;ATL OF THE REQUESTED TASK FI FI LET R0 := (R0) ;NEXT TASK END .ENB0 ;;ENABLE TASK SWITCHING ELSE LET DSW := #-1 END FI ELSE LET DSW := #-2 END ELSE LET DSW := #-4 FI ENDPROCEDURE PUTMCR .PAGE PROCEDURE FILLUP $PUSH R0,R1,R4 LET R4 := R4 + #6 LET (R4)+ := RQST+R.QSTN+2 ;RAD50 NAME OF MCR FUNCTION LET (R4)+ := UTI ;TI PUD ADDRESS LET (R4)+ := R2 ;LENGTH OF MCR COMMAND LINE THRU R2 LET (R4)+ :B= (R1)+ ;TRANSFER MCR COMMAND LINE END LET (R4) :B= #33 ;ALTMODE $POP R4,R1,R0 ENDPROCEDURE FILLUP .PAGE PROCEDURE WAIT IF TASK EQ #0 THEN LET R5 := #RQST REPEAT .INH0 ;;INHIBIT TASK SWITCHING LET R0 := @#.ATLLH WHILE TASK EQ #0 AND R0 NE #.ATLLH LET R1 := A.TD(R0) ;STD POINTER IF (R1) EQ R.QSTN(R5) AND 2(R1) EQ R.QSTN+2(R5) THEN IF A.TI(R0) EQ UTI THEN LET TASK := R0 FI FI LET R0 := (R0) ;NEXT TASK END .ENB0 ;;ENABLE TASK SWITCHING IF TASK EQ #0 THEN HOLDIT FI UNTIL TASK NE #0 FI LET R0 := TASK ;ATL POINTER TO REQUESTED TASK WHILEB A.TS(R0) NE #TS.EXT HOLDIT END LET TASK := #0 ENDPROCEDURE WAIT .PAGE PROCEDURE RESPOND DIR$ #RES ENDPROCEDURE RESPOND .PAGE ; .PSECT IMPURE,RW ; RQST: RQST$ ...XXX,,,200,200 VRCX: VRCX$ ,BUFF,46.,UTI RES: VSDR$ HISTSK,,,,,ANS,1 ANS: .WORD 0 WSIG: WSIG$ UTI: .WORD 0 DOT: .RAD50 /.../ BLK: .RAD50 / / MCR: .RAD50 /MCR/ TASK: .WORD 0 ; BUFF: .BLKW 48. ; .END START