.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 ; ; 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$,VSDR$,SPND$,VRCD$,EXIT$S MCR:: MOV #1,NCMD ;SET NCMD DEFAULT MOVB #1,R4 ;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 MOVB @6(R5),R4 ;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 #BUF+2,R1 ;BUFFER ADDRESS IN R1 MOV #80.,R2 ;MAX OF 80. CHARACTERS 10$: MOVB (R0)+,(R1)+ ;MOVE A BYTE BEQ 20$ ;ZERO IS END OF COMMAND SOB R2,10$ ;GO GET ANOTHER MOVB #1,ERR+1 ;ERROR!! - NO TERMINATOR BR ERROR1 ;SO SET UP ERROR RETURN 20$: MOV #80.,R1 ;CALCULATE NUMBER OF BYTES SUB R2,R1 MOV R1,BUF ;AND PUT COUNT IN BUFFER MOV R1,VSDR+S.DRBL ;AND IN SEND.REQUEST DPB TST R4 ;CHECK IF MODE =1 BLE SEND NEG BUF ;IF MODE=1, NEGATE THE COUNT SEND: DIR$ #VSDR ;SEND COMMAND TO MCRTSK BCS ERROR ;CHECK FOR ERRORS TST R4 ;CHECK MODE BGT SUSPND ;IF MODE=1, GO SUSPEND DEC R3 ;DECREMENT COMMAND COUNT BGT SCAN ;IF NON-ZERO, GO GET ANOTHER TST R4 ;CHECK MODE BEQ RETURN ;IF MODE=0, RETURN EXIT$S ;OTHERWISE EXIT (MODE=-1) SUSPND: DIR$ #SPND ;SUSPEND UNTIL MCRTSK IS DONE BCS ERROR ;CHECK FOR ERRORS DIR$ #VRCD ;RECEIVE DATA FROM MCRTSK BCS ERROR ;CHECK FOR ERRORS TST BUF+4 ;ANY ERRORS FROM MCRTSK? BEQ 10$ MOVB BUF+4,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 BUF: .BLKW 41. ;SEND/RECEIVE BUFFER NCMD: .WORD 0 ;NUMBER OF COMMANDS VSDR: VSDR$ MCRTSK,,,,,BUF,0 ;SEND DATA AND REQUEST DPB SPND: SPND$ ;SUSPEND DPB VRCD: VRCD$ MCRTSK,BUF,1 ;RECEIVE DATA DPB .END