.TITLE CDSTOP .IDENT /V001/ ; ; AUTHOR: ; DAVID M. BERG ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - 7AUG84 - DB - ORIGINAL VERSION ; ; ++ ; ; FUNCTION: ; ; CALLING SEQUENCE: ; ---------------- ; ; CALL CDSTOP(MBN) ; ; MACROS: ; ------ .MCALL MBL$DF,PUSH,POP,ASSUME,$CM82 .MCALL FSTOP,RESETF .MCALL MSTOP,RESETM MBL$DF ;DEFINE MESSAGE BLOCK OFFSETS ERR$DF ;DEFINE ERROR RETURNS INF$DF ;DEFINE INF RETURN VALUES ; ; ; GLOBALS: ; ------- .GLOBL CDSTOP ;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 CDSTOP:: PUSH ;SAVE REGISTERS MOV @2(R5),R1 ;MESSAGE BLOCK NUMBER BEQ STOPAL ;IF ZERO STOP 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 STOP ON IN R0 1$: RESETF ;RESET STOP 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$: FSTOP ;STOP 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 ; STOPAL: MOV CD.MSK,R0 ;PUT MASK OF ALL CHANNELS IN R0 6$: RESETM ;RESET FLAGS TO STOP 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 MSTOP ;WAIT FOR SOMETHING ; ; FIND OUT WHICH - SOME MB MUST HAVE COMPLETED ELSE LOGICAL ERROR ; BR 6$ ; RET: POP ;RESTORE REGISTERS RETURN .END