*DECK DB$ITC
USETEXT CDCSCTX 
      FUNC DB$ITC(TASK,(PARM)); 
      BEGIN 
 #
* *   DB$ITC--INTERNAL TASK CREATOR              PAGE  1
* *   C O GIMBER                                 8/23/76
* 
* DC  PURPOSE 
* 
*     CREATE AN INTERNAL TASK (ENTRY IN RCB CHAIN WHICH IS NOT
*     ASSOCIATED WITH AN EXECUTING JOB).
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMTERS 
# 
      LABEL TASK;            #TASK TO BE EXECUTED#
      ITEM PARM;             #PARAMTER TO BE PASED TO TASK# 
                             #  THIS IS PUSHED TOTO STACK#
# 
* DC  EXIT CONDITIONS 
* 
*     FUNCTION RETURN IS ADDRESS OF RCB CREATED.
* 
* DC  CALLED ROUTINES 
# 
      XREF FUNC DB$CDEC C(10);  #CONV BINARY TO DISPLAY CODED DECIMAL  #
      XREF PROC DB$FLOP;     #GENERATE FLOW POINT                      #
      XREF PROC DB$PUSH;     #PUSH INTO STACK#
      XREF PROC DB$RCBC;     #RCB CREATOR#
# 
*     NON-LOCAL VARIABLES 
* 
*     CDCS COMMON 
 #
# 
*     LOCAL VARIABLES.
# 
      ITEM ITNUM I = 0;      #INTERNAL TASK NUMBER# 
      ITEM RCBNEW;           #NEW RCB CREATED#
      ITEM RCBSAVED;         #SAVED RCB ADDRESS#
  
  
  
#     B E G I N   D B $ I T C   E X E C U T A B L E   C O D E .        #
  
  
#     GENERATE A FLOW POINT.                                           #
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP ("ITC");
      CONTROL ENDIF;
  
 #
* 
* DC  DESCRIPTION 
* 
*     SAVE CURRENT RCB ADDRESS. 
*     CREATE NEW RCB. 
*     PUSH SALX TO SAVE IT IN THE RCB.
*     INTERNAL TASKS DO NOT HAVE INDIVIDUAL TQT'S.
*     PUSH PASSED PARAMETER.
 #
      RCBSAVED = LOC(RCB);
      DB$RCBC;
  
      RCFUNC[0] = DFMTR;           # MONITOR FUNCTION CODE USED TO     #
                                   # IDENTIFY INTERNAL TASKS.          #
      RCBNEW = LOC(RCB);
      DB$PUSH(SALX);
      DB$PUSH(PARM);
 #
*     SET CREATED RCB TO CONTINUE AT THE PASSED LABEL.
*     RESET RCB BASE POINTER. 
 #
      RCCONSTRA[0] = LOC(STATCOMP); 
      RCCONTA[0] = LOC(TASK); 
      RCIRTASK[0] = 0;
      ITNUM = ITNUM +1;      #COUNT THE INTERNAL TASKS# 
      C<3,4>RCIRRUID[0] = DB$CDEC(B<47,13>ITNUM,4); 
      C<0,3>RCIRRUID[0] = "IT*";  #ASSIGN AN INTERNAL TASK NAME#
      P<RCB> = RCBSAVED;
      DB$ITC = RCBNEW;
      RETURN; 
      END   #DB$ITC#
      TERM; 
