*DECK UCPMSG
USETEXT COMCBEG 
USETEXT COMRSFC 
USETEXT COMRQUE 
PROC UCPMSG(JOBID,MESSAGE,LENGTH,FUNCTION,UCPA);
# TITLE UCPMSG - SEND MESSAGE TO UCP #
  
      BEGIN  # UCPMSG # 
  
# 
**    UCPMSG - SNED MESSAGE TO UCP. 
* 
*     UCPMSG SENDS A DAYFILE MESSAGE TO A UCP AND OPTIONALLY ABORTS 
*     THE UCP 
* 
*     PROC UCPMSG(JOBID,MESSAGE,FUNCTION,UCPA). 
* 
*     ENTRY   -  JOBID - JOBID OF UCP TO WHICH MESSAGE WILL BE SENT.
*                MESSAGE - DAYFILE MESSAGE TO BE SENT TO UCP. 
*                LENGTH - COUNT OF CHARACTERS IN MESSAGE. 
*                FUNCTION - INFORM$ - SEND MESSAGE ONLY 
*                           INFORM$ABT - SEND MESSAGE AND ABORT UCP.
*                           REPLY$ - SEND MSG AND COMPLETE UCP REQUEST. 
*                           REPLY$ABT-SEND MSG, COMPLETE UCP REQUEST
*                                       AND ABORT UCP.
*                UCPA - ADDRESS IN UCP WHERE REQUEST IS TO BE SET 
*                       COMPLETE(APPLIES ONLY TO REPLY$ AND REPLY$ABT). 
* 
*     EXIT    -  DAYFILE MESSAGE HAS BEEN SENT TO UCP.
*                P<QU$ADDRESS>IS PRESERVED. 
* 
*     PROCESS -  SAVE P<QU$ADDRESS> 
*                SEND DAYFILE MESSAGE TO RHF CONTROL POINT
*                GET FREE QUEUE ENTRY 
*                PUT DAYFILE MESSAGE IN GUEUE ENTRY 
*                SAVE QUEUE ENTRY ADDRESS 
*                GET ANOTHER FREE QUEUE ENTRY 
*                START BUILDING SSF CALL IN QUEUE ENTRY 
*                DEPENDING ON WHICH CASE: 
*                  FUNCTION IS INFORM$: 
*                    BUILD SF.REGR REQUEST WITH UCPA = 0. 
*                  FUNCTION IS INFORM$ABT:  
*                    BUILD SF.REGR REQUEST WITH UCPA = 0. 
*                  FUNCTION IS REPLY$:  
*                    BUILD SF. LIST REQUEST:  
*                      SF.ENDT - SET UCP REQUEST COMPLETE 
*                      SF.REGR - SEND DAYFILE MESSAGE WITH UCPA = 0.
*                  FUNCTION IS REPLY$ABT: 
*                    BUILD SF.LIST REQUEST: 
*                      SF.ENDT - SET UCP REQUEST COMPLETE 
*                      SF-REGR - SEND DAYFILE MESSAGE WITH UCPA = 0.
*                INITIATE SSF CALL
*                RESTORE P<QU$ADDRESS>
*                RETURN 
* 
* 
# 
  
      ITEM JOBID    I;               # UCP JOB ID # 
  
      BASED ARRAY MESSAGE[0:0] S(7);
        BEGIN 
        ITEM MESSAGE$   C(00,00,70); # DAYFILE MESSAGE #
        END 
  
      ITEM LENGTH   I;               # COUNT OF CHARACTERS IN MESSAGE#
      ITEM FUNCTION I;               # UCPMSG FUNCTION #
      ITEM UCPA     I;               # UCP REPLY ADDRESS #
  
# 
*     PROC UCPMSG - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        LABEL ACCNT2;                # LABEL FOR HIGHER CHARGE #
        PROC GETFREE;                # GET FREE QUEUE ENTRY # 
        PROC RHFMSGJ;                # ISSUE RHF MESSAGE IWTH JOB NAME #
        PROC SSFCALL;                # INITIATE SSF CALL #
        PROC ZBYTE;                  # ADD ZERO BYTE AT END OF MESSAGE #
        END 
  
# 
*     PROC UCPMSG - XREF LIST END.
# 
  
  
      ITEM MSGQUE I;                 # ADDR OF MESSAGE DATA Q ENTRY # 
      ITEM QUEADR I;                 # SAVES QU$ADDRESS POINTER # 
      ITEM LNGTH I;                  # TEMP CELL - LENGTH OF MESSAGE #
  
      SWITCH MSGTYPE
             INFORM,                 # LABEL FOR INFORM$ REQUEST #
             INFORMABT,              # LABEL FOR INFORM$ABT REQUEST # 
             REPLY,                  # LABEL FOR REPLY$ REQUEST # 
             REPLYABT,               # LABEL FOR REPLY$ABT REQUEST #
             ;
  
CONTROL EJECT;
  
      QUEADR  = P<QU$ADDRESS>;
      RHFMSGJ(JOBID,LOC(MESSAGE),LENGTH); 
      GETFREE;
      QU$TYPE = QT$UCPDATA;          # BUILD DAYFILE MSG QUEUE ENTRY #
      QU$RHF = "RHF, "; 
      QU$MESSAGE = MESSAGE$;
      LNGTH = LENGTH + 5; 
  
      IF LNGTH GT 68
      THEN
        BEGIN  # TRUNCATE MESSAGE # 
        LNGTH = 68; 
        END 
  
      ZBYTE(LOC(QU$RHF),LNGTH);      # TERMINATE MESSAGE WITH ZERO BYTE#
      MSGQUE  = P<QU$ADDRESS>;
  
      GETFREE;
      QU$TYPE = QT$UCPSSFC;          # BUILD SSF CALL ENTRIES # 
      QU$AUXPTR = MSGQUE; 
      QU$JOBID = JOBID; 
      QU$WD1   = 0; 
      QU$WD3   = 0; 
      QU$WD4   = 0; 
  
# 
*     USE SIMULATED CASE STATEMENT TO PROCESS UCPMSG FUNCTION.
# 
  
      GOTO MSGTYPE[FUNCTION]; 
  
INFORM: 
      QU$SFFC1 = SF$REGR; 
      QU$SFSCPA1 = MSGQUE + 1;
      GOTO  ENDCASE;
  
INFORMABT:  
      QU$SFFC1 = SF$REGR; 
      QU$SFSCPA1 = MSGQUE + 1;
      QU$SFUCPA1 = 1;                # ABORT UCP FLAG # 
      GOTO ENDCASE; 
  
REPLY:  
      QU$SFFC1 = SF$LIST;            # SF-LIST REQUEST #
      QU$SFFP1 = 2;                  # NUMBER OF ENTRIES IN LIST #
      QU$SFSCPA1 = LOC(QU$SFFC2); 
  
      QU$SFFC2 = SF$ENDT;            # SET REQUEST COMPLETE # 
      QU$SFUCPA2 = UCPA;
      QU$SFSCPA2 = LOC(ACCNT2); 
  
      QU$SFFC3 = SF$REGR;            # SEND DAYFILE MESSAGE # 
      QU$SFSCPA3 = MSGQUE + 1;
  
      GOTO  ENDCASE;
  
REPLYABT: 
      CONTROL IFEQ OS$NOSBE;
      QU$SFFC1 = SF$LIST;            # SF.LIST REQUEST #
      QU$SFFP1 = 2;                  # NUMBER OF ENTRIES IN LIST #
      QU$SFSCPA1 = LOC(QU$SFFC2); 
  
      QU$SFFC2  =  SF$ENDT;          # SET REQUEST COMPLETE # 
      QU$SFUCPA2=  UCPA;
      QU$SFSCPA2=  LOC(ACCNT2); 
  
      QU$SFFC3  = SF$REGR;           # SEND DAYFILE MSG AND ABORT UCP # 
      QU$SFSCPA3 = MSGQUE + 1;
      QU$SFUCPA3 = 1;                # ABORT UCP #
      CONTROL ENDIF;
  
      CONTROL IFEQ OS$NOS;
      QU$SFFC1 = SF$REGR;            # SEND DAYFILE MSG AND ABORT UCP # 
      QU$SFSCPA1 = MSGQUE + 1;
      QU$SFUCPA1 = SF$SEHX;          # SET HOSTILE USER FLAG #
      CONTROL ENDIF;
  
      GOTO ENDCASE; 
  
ENDCASE:  
  
# 
*     END OF SIMULATED CASE STATEMENT.
# 
  
      SSFCALL;
      P<QU$ADDRESS> = QUEADR; 
      RETURN; 
      END  # UCPMSG # 
  
      TERM
  
