.TITLE CDWAIT .IDENT /V1.1/ ; ; AUTHOR: ; VICKY WHITE ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - JUN2082 - VW - ORIGINAL VERSION ; V1.1 - 22JUN84 - DB - FIX LOOP FOR WAITAL ; ; ++ ; ; FUNCTION: ; ; CALLING SEQUENCE: ; ---------------- ; ; CALL CDWAIT(MBN) ; ; MACROS: ; ------ .MCALL MBL$DF,PUSH,POP,ASSUME,$CM82 .MCALL FWAIT,RESETF .MCALL MWAIT,RESETM MBL$DF ;DEFINE MESSAGE BLOCK OFFSETS ERR$DF ;DEFINE ERROR RETURNS INF$DF ;DEFINE INF RETURN VALUES ; ; ; GLOBALS: ; ------- .GLOBL CDWAIT ;ROUTINE ENTRY POINT .GLOBL $CDSTA ;ROUTINE ENTRY POINT FOR SCANNING ;OVER STATUS OF ALL MESSAGE BLOCKS .PAGE ; ; INPUTS TO ROUTINE ; ----------------- ; R5 IS THE ADDRESS OF A FORTRAN ARGUMENT LIST ; ; OUTPUTS ; ------- ; IF MBN ON INPUT WAS NON-ZERO - NO OUTPUTS. CDSTAT MUST ; BE CALLED FOR THIS MESSAGE BLOCK NUMBER TO GET ACTUAL STATUS ; IF MBN = 0 ON INPUT THEN MBN MUST BE A VARIABLE IN WHICH IS ; RETURNED THE NUMBER OF THE FIRST MESSAGE BLOCK ON WHICH ; A PENDING I/O HAS COMPLETED OR A SIGNAL OR MESSAGE ARRIVED ; ; ; ; ; COMMON AREA CDCM82 ; ------------------ $CM82 ;DEFINE PSECT CDCM82 ; ; COMMON FOR ERROR IN NO. OF ARGUMENTS ; .PSECT CDERR,RW,GBL,D,OVR,REL CDERR: .BLKW .PSECT ; ; ASSUME MB.CUR,0 ;STATUS ASSUMED TO BE 1ST ;WORD OF MESSAGE BLOCK .PAGE CDWAIT:: PUSH ;SAVE REGISTERS MOV @2(R5),R1 ;MESSAGE BLOCK NUMBER BEQ WAITAL ;IF ZERO WAIT ON ALL I/O CALL $FNDBN ;ELSE FIND THIS MESSAGE BLOCK TST R1 ;MESSAGE BLOCK FOUND? BEQ RET ;IF NO SUCH MB, JUST RETURN ;SUBSEQUENT CALL TO CDSTAT WILL ;DETECT THE ERROR TST (R1) ;STATUS = 0 IF INACTIVE BEQ RET ;IF INACTIVE JUST RETURN MOVB MB.FLG(R1),R0 ;PUT FLAG TO WAIT ON IN R0 1$: RESETF ;RESET WAIT FLAG BEFORE TESTING STATUS CMP #ER.PND,MB.ST1(R1) ;I/O STILL PENDING? BNE RET ;IF STATUS NOT PENDING RETURN BIT #S.OPEN,(R1) ;OPEN CONNECTION MB? BEQ 5$ ;IF NOT OPEN MUST WAIT FOR ;SOMETHING TO HAPPEN BIT #^CS.OPEN,(R1) ;ANY OTHER STATUS BITS? BNE RET ;IF SO RETURN 5$: FWAIT ;WAIT ON THIS MESSAGE BLOCK ; ; CHECK THIS REALLY IS THE I/O FOR WHICH FLAG HAS BEEN SET AND ; NOT SOME OTHER MESSAGE BLOCK ON THE SAME CHANNEL ; BR 1$ ; ; WAIT FOR SOMETHING TO HAPPEN ON SOME CHANNEL ; WAITAL: MOV CD.MSK,R0 ;PUT MASK OF ALL CHANNELS IN R0 6$: RESETM ;RESET FLAGS TO WAIT ON CALL $CDSTA ;FIND IF ANY ALREADY COMPLETED TST R1 ;IF SO R1 = ADDRESS OF MB BEQ 10$ ;IF NONE WAIT FOR SOMETHING MOV MB.MBN(R1),@2(R5) ;SET RETURN MBN BR RET 10$: MOV CD.MSK,R0 ;PUT MASK OF ALL CHANNELS IN R0 MWAIT ;WAIT FOR SOMETHING ; ; FIND OUT WHICH - SOME MB MUST HAVE COMPLETED ELSE LOGICAL ERROR ; BR 6$ ; RET: POP ;RESTORE REGISTERS RETURN .END