.TITLE RECV ; ; FORTRAN CALLABLE SUBROUTINE TO RECEIVE A MESSAGE FROM A TIME-SHARED TASK ; ; CALL RECV(BUFF, LENGTH [,ISNDER]) ; ; BUFF ADDRESS OF BUFFER TO RECEIVE MESSAGE (WORD BDRY) ; ; LENGTH LENGTH OF BUFFER IN BYTES ; ; ISNDER OPTIONAL WORD TO RECEIVE SENDING TASK INDICATOR: ; = -2 SENDER WAS A SUBTASK WHOSE TDB HAS BEEN RELEASED ; OR REUSED. ; = -1 SENDER WAS OWNER ; = 0 SENDER WAS THE PREDECESSOR ; = OTHER -- NTDB OF SENDER ; ; .PSECT SUBDAT,RW,D,GBL,REL,CON ; SDBR: SDBDF$ ,,,ESBR ESBR: ESBDF$ .EVEN ; .PSECT SUBTAS,RO,I,LCL,REL,CON ; RECV:: MOVB (R5)+,R2 ;NO. OF ARGS BLE 100$ INC R5 MOV #SDBR,R4 MOV (R5)+,T.SNDA(R4) ;SET UP ADDRESS BLE 100$ CMP #2,R2 BGT 100$ ;MUST HAVE >= 2 ARGS MOV (R5)+,R1 ;A(LENGTH) MOVB (R1),T.SNDL(R4) ;L(BUFFER) CMP #3,R2 ;3 ARGS? BGT 10$ ;NO MOV (R5)+,R3 ;A(ISNDER) 10$: RCV$T #SDBR BCS 98$ ; DO WE NEED SENDER STUFF? CMP #3,R2 ;>=3 ARGS? BGT 99$ ;NO TST R3 ;VALID ADDRESS? BLE 99$ MOV T.SNDT(R4),R4 BLE 97$ ;ISNDER .LE.0 MOV #TDB,R2 76$: CMP (R2)+,R4 BNE 76$ ;NO MATCH SUB #2,R2 ;FOUND POINTER SUB #TDB,R2 ;DIFFERENCE MOV R2,R4 ASR R4 ;NTDB-1 INC R4 ;NTDB 97$: MOV R4,(R3) ;RETURN ISNDR 99$: MOV #1,R0 ;SUCCESS INDICATOR RETURN 98$: ;IF AN ERROR OCCURS ADD #T.SESB-T.TESB,R0 ;FAKE TDB ERROR OFFSET JSR PC,ERRTS ;ERROR CODE IN R0 BR 102$ ;AND RETURN 101$: MOV #1,R0 ;SUCCESS INDICATOR 102$: RETURN 100$: MOV #-1,R0 ;INVALID ARGUMENT LIST RETURN .END