.TITLE MSGCOM.MAC 84j03a 24-SEP-80/03-Oct-84. .ENABL LC ; AUTHOR: N. A. BOURGEOIS, JR. ; of ; NAB Software Services, Inc. ; PO Box 20009 ; Albuquerque, NM 87154 ; and ; SANDIA NATIONAL LABORATORIES ; PO BOX 5800 ; ALBUQUERQUE, NM 87185 .SBTTL EDIT RECORD 24-SEP-80/03-Oct-84. ;24-SEP-80 ORIGINAL CREATION. ;08-OCT-80 REVISED. ;25-MAR-81 CORRECTED ADDRESSING ERROR. ;08-APR-81 RENAMED "SNDMSG" TO "MSGSND". ADDED FUNCTION CALLING CODE ; TO "MSGSND". MADE CODE REENTRANT. ;14-APR-81 "ERRBYT" WAS 53. ;16-JUN-81 CHANGED ARGUMENT TYPE IN CALLS. ;30-JUL-81 CORRECTED ADDRESSING ERRORS IN THE SUPPORTING SUBROUTINES. ;26-FEB-82 ADDED IDENTIFICATION CODE. ;06-Jan-84 Maintenance assumed by NAB Software Services, Inc. ;03-Oct-84 Added MSGREQ routine. Minor revisions for V5.1. ; THIS SOFTWARE WAS ORIGINALLY ISSUED BY SANDIA NATIONAL ; LABORATORIES, OPERATED FOR THE UNITED STATES DEPARTMENT ; OF ENERGY BY SANDIA CORPORATION. ; ; NOTICE ; ; THIS SOFTWARE WAS ORIGINALLY SPONSORED BY THE UNITED ; STATES GOVERNMENT. NEITHER THE UNITED STATES GOVERNMENT ; NOR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF ; THEIR EMPLOYEES, NOR ANY OF THEIR CONTRACTORS, ; SUBCONTRACTORS, OR THEIR EMPLOYEES MAKES ANY WARRANTY, ; EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR ; RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS OR ; USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT OR ; PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT ; INFRINGE PRIVATELY OWNED RIGHTS. ; ; THIS WORK WAS ORIGINALLY FUNDED BY: ; ; HEADQUARTERS, ESD / OCB / STOP 36 ; HANSCOM AIR FORCE BASE, MA 01731 .PAGE .SBTTL DESCRIPTION 24-SEP-80/14-APR-81. ;THESE FORTRAN CALLABLE SUBROUTINES PROVIDE A FACILITY THAT ;ALLOWS RUNNING PROGRAMS TO SEND MESSAGES TO EACH OTHER. THIS MESSAGE ;COMMUNICATION FACILITY ALLOWS PROGRAMS TO SEND MESSAGES THROUGH NAMED ;CHANNELS, CHECK TO SEE IF MESSAGES ARE PENDING, AND SUSPEND EXECUTION ;UNTIL A MESSAGE IS RECEIVED. THE MESSAGE SENDING ROUTINE IS ALSO ;CALLABLE AS A FORTRAN FUNCTION. THIS MODULE IS A PART OF THE LIBRARY ;OF FORTRAN CALLABLE TSX/TSX-PLUS EMT ROUTINES. ;SEND A MESSAGE TO ANOTHER JOB. ; ;CALLING SEQUENCES: ; ; CALL MSGSND ( ICHNAM ,MSGBUF ,MSGSIZ [ ,IERR ] ) ; OR ; IERR = MSGSND ( ICHNAM, MSGBUF ,MSGSIZ ) ; ; WHERE: ICHNAM SIX ASCII CHARACTER NAME OF THE MESSAGE ; CHANNEL. ; ; IBUFSZ LENGTH OF RECEIVING BUFFER IN CHARACTERS. ; ; MSGBUF NAME OF THE STRING ARRAY CONTAINING THE ; MESSAGE. ; ; MSGSIZ LENGTH OF THE MESSAGE SENT OR RECEIVED IN ; CHARACTERS. ; ; IERR ERROR CODE RETURNED AS FOLLOWS: ; ; 0 NO ERROR. ; 1 ALL MESSAGE CHANNELS BUSY. ; 2 MAXIMUM ALLOWED NUMBER OF MESSAGES. ; 3 NO MESSAGE IS PENDING ON THE NAMED ; CHANNEL. ; 4 MESSAGE WAS TOO LONG AND WAS TRUNCATED ; TO MAXIMUM LENGTH. ;RECEIVE A MESSAGE FROM ANOTHER JOB, RETURN IF NONE IS PENDING. ; ;CALLING SEQUENCE: ; ; CALL RCVMSG ( ICHNAM ,MSGBUF ,IBUFSZ ,MSGSIZ [ ,IERR ] ) ; ; WHERE: ICHNAM SIX ASCII CHARACTER NAME OF THE MESSAGE ; CHANNEL. ; ; IBUFSZ LENGTH OF RECEIVING BUFFER IN CHARACTERS. ; ; MSGBUF NAME OF THE STRING ARRAY CONTAINING THE ; MESSAGE. ; ; MSGSIZ LENGTH OF THE MESSAGE SENT OR RECEIVED IN ; CHARACTERS. ; ; IERR ERROR CODE RETURNED AS FOLLOWS: ; ; 0 NO ERROR. ; 1 ALL MESSAGE CHANNELS BUSY. ; 2 MAXIMUM ALLOWED NUMBER OF MESSAGES. ; 3 NO MESSAGE IS PENDING ON THE NAMED ; CHANNEL. ; 4 MESSAGE WAS TOO LONG AND WAS TRUNCATED ; TO MAXIMUM LENGTH. ;RECEIVE A MESSAGE FROM ANOTHER JOB, WAIT IF NONE IS PENDING. ; ;CALLING SEQUENCE: ; ; CALL RCVMSW ( ICHNAM ,MSGBUF ,IBUFSZ ,MSGSIZ [ ,IERR ] ) ; ; WHERE: ICHNAM SIX ASCII CHARACTER NAME OF THE MESSAGE ; CHANNEL. ; ; IBUFSZ LENGTH OF RECEIVING BUFFER IN CHARACTERS. ; ; MSGBUF NAME OF THE STRING ARRAY CONTAINING THE ; MESSAGE. ; ; MSGSIZ LENGTH OF THE MESSAGE SENT OR RECEIVED IN ; CHARACTERS. ; ; IERR ERROR CODE RETURNED AS FOLLOWS: ; ; 0 NO ERROR. ; 1 ALL MESSAGE CHANNELS BUSY. ; 2 MAXIMUM ALLOWED NUMBER OF MESSAGES. ; 3 NO MESSAGE IS PENDING ON THE NAMED ; CHANNEL. ; 4 MESSAGE WAS TOO LONG AND WAS TRUNCATED ; TO MAXIMUM LENGTH. ; Post a read request for a message. ; ; Calling sequences: ; ; CALL MSGREQ (CHNL,BUFR,ISIZ,CPLRTN [ ,IERR ] ) ; or ; IERR = MSGREQ (CHNL,BUFR,ISIZ,CPLRTN) ; ; where: CHNL is the name of the string array containing ; the six character name of the message channel. ; ; BUFR is the name of the string array that is to ; receive the message. ; ; ISIZ is the length of the message buffer. ; ; IERR is as follows. ; ; 0 no error. ; 1 all message channels are busy. ; 5 maximim message requests are active. .PAGE .SBTTL DIRECTIVES 24-SEP-80/03-Oct-84. .IDENT \84j03a\ ;TELL LINKER OUR VERSION .PSECT TSXLIB,I .GLOBL TSLBID .WORD TSLBID .DSABL GBL .SBTTL ASSIGNMENTS 24-SEP-80/14-APR-81. ERRBYT =52 ;ERROR CODE LOCATION .PAGE .SBTTL ENTRY POINTS 24-SEP-80/03-Oct-84. ;SEND A MESSAGE IN A NAMED CHANNEL. ; MSGSND::MOV #104 ,R1 ;EMT CODE JSR PC ,DOIT ;SEND THE MESSAGE RTS PC ;RECEIVE A PENDING MESSAGE ON A NAMED CHANNEL. RETURN WITH AN ERROR ;CODE IF NONE IS PENDING. ; RCVMSG::MOV #105 ,R1 ;EMT CODE JSR PC ,DOIT1 ;RECEIVE THE MESSAGE RTS PC ;RECEIVE A MESSAGE ON A NAMED CHANNEL. WAIT FOR ONE IF NONE IS PENDING. ; RCVMSW::MOV #106 ,R1 ;EMT CODE JSR PC ,DOIT1 ;RECIEVE THE MESSAGE RTS PC ; Post a read request for a message. ; MSGREQ::MOV #106 ,R1 ;EMT code MOV #1 ,R2 ;function code CALL DOIT2 ;post the request RETURN .PAGE .SBTTL SUPPORTING SUBROUTINES 24-SEP-80/03-Oct-84. DOIT: MOV @6(R5) ,-(SP) ;PASS ARGUMENT 3 MOV 4(R5) ,-(SP) ;PASS ARGUMENT 2 MOV 2(R5) ,-(SP) ;PASS ARGUMENT 1 CLR -(SP) ;LO BYTE = 0 MOV SP ,R0 ;SET UP THE POINTER MOVB R1 ,1(R0) ;HI BYTE = EMT CODE EMT 375 ;LET TSX DO IT CLR R0 ;GET THE MOVB @#ERRBYT,R0 ; ERROR CODE CMP #4 ,(R5) ;SUBROUTINE ERROR RETURN? BNE 1$ ; NO MOV R0 ,@10(R5) ; YES 1$: ADD #10 ,SP ;FIX THE STACK POINTER RTS PC DOIT1: MOV 6(R5) ,-(SP) ;PASS ARGUMENT 3 MOV 4(R5) ,-(SP) ;PASS ARGUMENT 2 MOV 2(R5) ,-(SP) ;PASS ARGUMENT 1 CLR -(SP) ;LO BYTE = 0 MOV SP ,R0 ;SET UP THE POINTER MOVB R1 ,1(R0) ;HI BYTE = EMT CODE EMT 375 ;LET TSX DO IT MOV R0 ,@10(R5) ;RETURN ARGUMENT 4 CMP #5 ,(R5) ;SUBROUTINE ERROR RETURN? BNE 1$ ; NO CLR @12(R5) ; YES, SO GET THE MOVB @#ERRBYT,@12(R5) ; ERROR CODE 1$: ADD #10 ,SP ;FIX THE STACK POINTER RTS PC DOIT2: MOV 10(R5) ,-(SP) ;pass argument 4 MOV @6(R5) ,-(SP) ;pass argument 3 MOV 4(R5) ,-(SP) ;pass argument 2 MOV 2(R5) ,-(SP) ;pass argument 1 MOV R2 ,-(SP) ;lo byte = function code MOV SP ,R0 ;set up the pointer MOVB R1 ,1(R0) ;hi byte = EMT code EMT 375 ;let TSX do it BCC 1$ ; if no error CLR R1 ; if error, then MOVB @#ERRBYT,R1 ; get the code 1$: CMPB #5 ,(R5) ;subroutine error return? BNE 2$ ; no MOV R1 ,@12(R5) ; yes 2$: MOV R1 ,R0 ;function error return RETURN .SBTTL END 24-SEP-80/. .END