.TITLE CDSTAT .IDENT /V1.3/ ; ; AUTHOR: ; VICKY WHITE ; FERMI NATIONAL ACCELERATOR LABORATORY ; BATAVIA, IL 60510 ; ; UPDATE HISTORY: ; V01 - JUN0982 - VW - ORIGINAL VERSION ; V1.1 - OCT1382 - VW - CONVERT BYTE COUNT TO WORD COUNT FOR STATUS 2 ; FOR RSX ONLY ; V1.2 - 26JUL84 - DB - sign-extend the status byte returned ; V1.3 - 31AUG84 - DB - fix bug in updating signal numbers for RT11 ; ; ++ ; ; FUNCTION: ; ; CALLING SEQUENCE: ; ---------------- ; ; CALL CDSTAT(MBN,INF,STAT) ; ; MACROS: ; ------ .MCALL RT$RSX .MCALL ASSUME,PUSH,POP .MCALL MBL$DF,ERR$DF,INF$DF,$CM82 RT$RSX ;DEFINE VERSION: RT-11 OR RSX-11M MBL$DF ;DEFINE MESSAGE BLOCK OFFSETS ERR$DF ;DEFINE ERROR RETURNS INF$DF ;DEFINE INF RETURN VALUES ; ; LOCAL MACROS ; ------------ ; .MACRO ERRXIT,ERR MOV #ERR,CDERR ; EXIT IN ERROR CONDITION BR PEXIT ; .ENDM ; .MACRO EXITP,INF ; EXIT WITH IO PENDING ON THIS MB MOV #INF,@2(R5) BR PEXIT .ENDM ; .MACRO EXITD,INF ; EXIT WITH IO COMPLETED OR TIMED OUT ON THIS MB MOV #INF,@2(R5) BR DEXIT .ENDM ; ; GLOBALS: ; ------- .GLOBL CDSTAT ;ROUTINE ENTRY POINT .GLOBL $CDSTA ;ROUTINE ENTRY POINT FOR SCANNING ;OVER STATUS OF ALL MESSAGE BLOCKS .GLOBL $FNDBN ;ROUTINE TO FIND MSGE BLOCK NO .PAGE ; ; INPUTS TO ROUTINE ; ----------------- ; R5 IS THE ADDRESS OF A FORTRAN ARGUMENT LIST ; ; OUTPUTS ; ------- ; STATUS IS RETURNED IN STATUS ARGUMENT ; IF THE NUMBER OF ARGUMENTS IS INCORRECT AN ERROR STATUS ; IS RETURNED IN THE COMMON /CDERR/ ; ; ; ; 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 CDSTAT:: PUSH ;SAVE SOME REGISTERS CMPB (R5)+,#3 ;MUST BE 3 ARGUMENTS BEQ 10$ ERRXIT ER.ARG 10$: TSTB (R5)+ ;POINT TO 1ST ARG ADDRESS MOVB @(R5),R1 ;R1 = MESSAGE BLOCK NUMBER BNE 11$ ;IF PARTICULAR MBN GIVEN CALL $CDSTA ;ELSE SCAN ALL MBS TST R1 ;ANY MBS FOUND? BEQ 12$ ;BRANCH IF NO MOV MB.MBN(R1),@(R5) ;RETURN MB NUMBER BR 20$ 11$: CALL $FNDBN ;SET R1 TO ADDRESS OF THIS MB TST R1 ;MB EXISTS? BNE 20$ 12$: EXITP I.NOMB ;EXIT REPORTING NO SUCH MB ; ; MESSAGE BLOCK LOCATED ; 20$: TST (R1) ;ACTIVE MESSAGE BLOCK?? BNE 25$ ;BRANCH IF ACTIVE - SOME BITS ON EXITP I.NOMB ;ELSE REPORT NOT ACTIVE 25$: MOV 4(R5),R0 ;ADDRESS OF STATUS RETURN BLOCK CLR (R0) ;CLEAR 1ST STATUS WORD CMP #S.OPEN,(R1) ;STATUS = OPEN CONNECTION ONLY BNE 30$ ;IF ANY OTHER BITS SET SOME ;OTHER TYPE OF MB OR SOME ACTION .IF DF RT11 ; CMPB MB.SNO(R1),MB.DSN(R1) ;NEW SIGNAL? BEQ 27$ ;IF EQ NO BLO 26$ ;ON DRIVER SIG NUM OVERFLOW, INCR INCB MB.SNO+1(R1) ;HIGH BYTE OF CDPACK SIG NUM 26$: MOVB MB.DSN(R1),MB.SNO(R1) ;UPDATE CDPACK SIGNAL NUMBER MOVB MB.SIG(R1),(R0) ;SET SIGNAL VALUE IN 1ST STATUS MOV MB.SNO(R1),2(R0) ;SIGNAL NUMBER IN 2ND STATUS WD BIC #^C,(R1) ;I/O REPORTED BUT EXIT AS IF ;PENDING EXITP I.SIG 27$: .ENDC ; EXITP I.OPEN ;JUST OPEN MB - NO ACTION 30$: BIT #,(R1) ;XMT TYPE MB? BEQ 40$ ;BRANCH IF NOT ; ; TRANSMIT MESSAGE BLOCK ; CMP #ER.PND,MB.ST1(R1) ;CHECK IF STILL INITIAL STATUS ;VALUE IN 1ST MB STATUS WORD? BNE 35$ ;IF NOT MUST HAVE COMPLETED EXITP I.XMTP ;ELSE STILL PENDING 35$: EXITD I.XMTD ;OR REPORT COMPLETED OR TIMED OUT 40$: BIT #S.RCV,(R1) ;RCV TYPE MB? BEQ 60$ ;BRANCH IF NOT ; ; RECEIVE MESSAGE BLOCK ; BIT #S.WRCV,(R1) ;WAITING TO ISSUE QIO BNE 45$ ;IF SET STILL PENDING OPERATION CMP #ER.PND,MB.ST1(R1) ;STILL INITIAL TIMEOUT STATUS BNE 50$ ;IF NOT MUST HAVE COMPLETED 45$: EXITP I.RCVP ;RECEIVE STILL PENDING 50$: EXITD I.RCVD ;RECEIVE COMPLETED OR TIMED OUT ; ; NOT RCV OR XMT OR SIG MB - MUST BE OPEN CONNECTION ; 60$: BIT #S.PMSG,(R1) ;MESSAGE PENDING BUT NO RCV DONE? BEQ 70$ ;YES IF BIT SET MOV MB.PWC(R1),2(R0) ;SET 2ND STATUS WORD EXITP I.PMSG ;EXIT WITH PENDING MESSAGE 70$: ; .IF NDF RT11 ; BIT #S.PSIG,(R1) ;PENDING SIGNAL? BEQ 80$ MOVB MB.SIG(R1),(R0) ;SET SIGNAL VALUE IN 1ST STATUS MOV MB.SNO(R1),2(R0) ;SIGNAL NUMBER IN 2ND STATUS WD BIC #^C,(R1) ;I/O REPORTED BUT EXIT AS IF ;PENDING EXITP I.SIG 80$: .ENDC ; EXITP I.BUG ;ERROR EXIT UNKNOWN STATUS ; DEXIT: MOVB MB.ST1(R1),(R0) ;SET 1ST STATUS WORD SXT -(SP) ;SIGN-EXTEND HIGH BYTE MOVB (SP)+,1(R0) ;OF 1ST STATUS WORD MOV MB.ST2(R1),2(R0) ;SET 2ND STATUS WORD BIC #^C,(R1) ;CLEAR STATUS BITS - STATUS ;OF COMPLETED I/O HAS BEEN ;REPORTED .IF NDF RT11 ; CMP #IE.DAO,(R0) ;BUFFER TRANSFERRED BUT TRUNCATED? BEQ 111$ CMP #ER.SUC,(R0) ;SUCCESSFUL COMPLETION BNE PEXIT ;IF NOT LEAVE 2ND STATUS WORD 111$: ASR 2(R0) ;ELSE CONVERT BYTE COUNT TO ;WORD COUNT .ENDC ; PEXIT: POP ;RESTORE REGISTERS RETURN .PAGE .SBTTL $CDSTA ; ; SUBROUTINE TO FIND FIRST MESSAGE BLOCK WHICH HAS EITHER ; A COMPLETED TRANSFER OR A PENDING MESSAGE OR SIGNAL ; ; ; INPUTS: NONE ; ; OUTPUT: RETURNS R1 = ADDRESS OF 1ST MESSAGE BLOCK WITH NEW ; COMPLETED I/O, PENDING MESSAGE OR SIGNAL ; R1 = 0 IF NO SUCH MESSAGE BLOCKS ; ASSUME MB.CUR,0 ; $CDSTA:: MOV #CD.MBL,R1 ;START OF MESSAGE BLOCKS MOV CD.NUM,R0 ;NUMBER OF MESSAGE BLOCKS 1$: TST (R1) ;ACTIVE MESSAGE BLOCK? BEQ 10$ ;IF STATUS = 0, NOT ACTIVE CMP #S.OPEN,(R1) ;ONLY OPEN CONNECTION? BEQ 10$ ;IF SO SKIP OVER CMP #ER.PND,MB.ST1(R1) ;STATUS = PENDING BNE 50$ ;IF NOT MUST BE SOMETHING TO ;REPORT 10$: ADD #MB.SIZ,R1 ;POINT TO NEXT MESSAGE BLOCK SOB R0,1$ ;ELSE TRY NEXT MB CLR R1 ;NOTHING TO REPORT 50$: RETURN .END