.TITLE MCR ; ; FORTRAN CALLABLE FUNCTION-TYPE SUBROUTINE TO PROCESS MCR COMMANDS. ROUTINE ; CHECKS INPUT ARRAY OF MCR COMMANDS FOR ZERO BYTE TERMINATOR AND SENDS THEM ; TO 'MCRTSK' FOR EXECUTION. ; ; WRITTEN MARCH 1975 R B FRENCH THE BOEING COMPANY ; CONVERTED TO VERSION 6A NOVEMBER 1975 R B FRENCH ; CONVERTED TO IAS 3.0 JUNE 1978 R B FRENCH ; ; CALLING SEQUENCE ; ; IERR=MCR(IARR,[NCMD],[MODE]) ; ; IARR = ARRAY OF MCR COMMANDS, EACH TERMINATED BY A ZERO BYTE ; NCMD = NUMBER OF COMMANDS IN IARR (DEFAULT = 1) ; MODE = ACTION AFTER ISSUING MCR REQUEST(S) (DEFAULT = 1) ; -1 EXIT IMMEDIATELY ; 0 RETURN IMMEDIATELY ; 1 SUSPEND TASK UNTIL MCR REQUEST(S) ARE DONE, THEN RETURN ; IERR = ERROR RETURN ; ZERO = SUCESS ; NON-ZERO = ERROR DETECTED ; .MCALL DIR$,SPWN$,WTSE$,EXIT$S MCR:: MOV #1,NCMD ;SET NCMD DEFAULT MOV #1,MODE ;SET MODE DEFAULT MOV 2(R5),R0 ;INPUT ARRAY ADDRESS IN R0 CMPB #2,(R5) ;CHECK NUMBER OF ARGUMENTS BGT 20$ ;BRANCH IF ONLY ONE ARGUMENT BEQ 10$ ;2 ARGUMENTS TST 6(R5) ;CHECK 3RD ARGUMENT ADDRESS BMI 10$ ;MINUS IS A NULL ARGUMENT MOV @6(R5),MODE ;3RD ARGUMENT IS MODE 10$: TST 4(R5) ;CHECK 2ND ARGUMENT ADDRESS BMI 20$ ;MINUS IS A NULL ARGUMENT MOV @4(R5),NCMD ;2ND ARGUMENT IS NCMD ; 20$: MOV NCMD,R3 ;USE R3 FOR COMMAND COUNTER SCAN: MOV R0,SPWN+S.PWCA ;PUT COMMAND LINE ADDRESS IN DPB JSR PC,$CAT5 ;CONVERT NAME TO RAD50 MOV R1,SPWN+S.PWTN+2 ;AND PUT IN DPB MOV #76.,R2 30$: TSTB (R0)+ ;SCAN FOR ZERO TERMINATOR BEQ 40$ SOB R2,30$ MOVB #2,ERR+1 ;ERROR!! BR ERROR1 40$: MOV #79.,R1 ;CALCULATE NUMBER OF BYTES SUB R2,R1 MOV R1,SPWN+S.PWCL ;AND PUT COUNT IN DPB ; DIR$ #SPWN ;SPAWN THE TASK BCS ERROR ;CHECK FOR ERRORS TST MODE ;CHECK MODE BGT WAIT ;IF MODE=1, GO WAIT DEC R3 ;DECREMENT COMMAND COUNT BGT SCAN ;IF NON-ZERO, GO GET ANOTHER TST MODE ;CHECK MODE BEQ RETURN ;IF MODE=0, RETURN EXIT$S ;OTHERWISE EXIT (MODE=-1) WAIT: DIR$ #WTSE ;WAIT FOR TASK TO FINISH BCS ERROR ;CHECK FOR ERRORS CMP #EX$SUC,ESB ;WAS TASK SUCCESSFUL? BEQ 10$ MOVB ESB,ERR+1 ;RETURN THE ERROR BR ERROR1 10$: DEC R3 ;DECREMENT COMMAND COUNT BGT SCAN ;IF NON-ZERO, GO GET ANOTHER RETURN: CLR R0 ;CLEAR ERROR RETURN RTS PC ERROR: MOVB 0,ERR+1 ;PUT DSW IN ERROR RETURN ERROR1: SUB R3,NCMD ;CALCULATE CURRENT COMMAND NUMBER MOVB NCMD,ERR ;AND PUT IN ERROR RETURN MOV ERR,R0 ;RETURN ERROR RTS PC ERR: .WORD 0 NCMD: .WORD 0 ;NUMBER OF COMMANDS MODE: .WORD 0 ;MODE SPWN: SPWN$ ...XXX,,,,,20,,ESB,,, ESB: .BLKW 10 WTSE: WTSE$ 20 .END