*DECK             GANAL 
USETEXT   TSOURCE 
USETEXT   TSYMCNS 
USETEXT   TCEXECQ 
USETEXT   TCOM37Q 
USETEXT   TCOM39Q 
USETEXT   TCOM78Q 
USETEXT   TCEXEC
USETEXT   TC7DECS 
PROC GANAL((I),(B));   # I POINTS TO CLAS.CONS ENTRY #
                                        #SETS CONL,C1NL,C2NL OF CLAS   #
                                        # "CONS" ENTRY. DETERMINES THE #
                                        # BEST METHOD OF GENERATING A  #
                                        # CONSTANT.                    #
                                        # CALOC IS CALLED IF B = TRUE  # JANDRE 
BEGIN 
  
  
  
  
*CALL COMEX 
  
  
  
  
    ITEM B B;                                                            JANDRE 
    ITEM I,J,K,L,M; 
    XDEF PROC CALOC;
    XDEF PROC DALOC;
    XREF PROC FIND;                                                      JANDRE 
    XREF FUNC PLNG; 
    XREF FUNC PTWO; 
CONTROL EJECT;
PROC CALOC((I));   # CONSTANT ALLOCATION  I= PTR TO CLAS CONS ENTRY # 
         BEGIN
         ITEM I,J;
    IF ASEQ[I] NQ 0 THEN RETURN;                                         JANDRE 
         J=LENT[LPLC];
    IF I EQ J THEN RETURN;                                               JANDRE 
         #NOT ALREADY ALLOCATED#                                         JANDRE 
              ASEQ[J]=I;
              LENT[LPLC]=I; 
              LOCN[I]=SSIZ[LPLC]; 
              SSIZ[LPLC]=PLNG(I)+SSIZ[LPLC];
         END
                                                                         JANDRE 
                                                                         JANDRE 
                                                                         JANDRE 
PROC DALOC((I));   # DATA ALLOCATION   I= PTR TO DATA-TYPE ENTRY #
         BEGIN
         ITEM I,J;
    IF ASEQ[I] NQ 0 THEN RETURN;                                         JANDRE 
         J=LENT[DPLC];
    IF I EQ J THEN RETURN;                                               JANDRE 
              ASEQ[J]=I;
              LENT[DPLC]=I; 
              LOCN[I]=SSIZ[DPLC]; 
              SSIZ[DPLC]=PLNG(I)+SSIZ[DPLC];
         END
CONTROL EJECT;                                                           JANDRE 
    IF CONL[I] EQ S"NULL" THEN
         BEGIN
         IF PLNG(I) EQ 1 THEN 
         BEGIN
         FIND(I,J); J=CONS[J];                                           JANDRE 
         IF J EQ 0 THEN 
              BEGIN #CONSTANT MAY BE + OR - ZERO# 
              CONL[I]=S"MASK";
              IF B<0,1>J NQ 0 THEN C1NL[I]=60; ELSE C1NL[I]=0;
              RETURN; 
              END 
         #CHECK IF SIMPLE MASK# 
         IF J LS 0 AND -J LAN (1-J) EQ 0 THEN 
              BEGIN #PAY-DIRT#
              K=1-J;
              IF K GR 0 THEN K=PTWO(K); ELSE K=59;
              CONL[I]=S"MASK";
              C1NL[I]=60-K; 
              RETURN; 
              END 
         #CHECK IF SHORT CONSTANT#
         IF ABS(J) LS O"400000" THEN
              BEGIN #SHORT CONSTANT#
              CONL[I]=S"LDSC";
              RETURN; 
              END 
         #CHECK IF MASK AND COMPLEMENT# 
         IF J LAN (1+J) EQ 0 THEN 
              BEGIN #MSKC#
              K=1+J;
              IF K GR 0 THEN K=PTWO(K); ELSE K=59;
              CONL[I]=S"MSKC";
              C1NL[I]=60-K; 
              RETURN; 
              END 
         #CHECK FOR MASK AND SHIFT# 
         K=ABS(J);
         L=1; M=0;
GA10:    IF L LAN K NQ L THEN 
              BEGIN 
              L=L+L; M=M+1; 
              GOTO GA10;
              END 
         L=K+L; 
         IF L GR 0 THEN L=PTWO(L); ELSE L=59; #SIGN-BIT OVERFLOW# 
         IF L GR 0 THEN 
              BEGIN #L=HI-ORDER BIT+1, M=LO-ORDER BIT#
              CONL[I]=S"MSKL";
              IF J LS 0 THEN
                   BEGIN
                   C1NL[I]=60-(L-M);
                   C2NL[I]=M; 
                   RETURN;
                   END
              C1NL[I]=L-M;
              C2NL[I]=L;
              RETURN; 
              END 
         END #PLNG EQ 1#
         #PLNG NQ 1 OR FULL-WORD LOAD#
         CONL[I]=S"LOAD"; 
    IF B THEN CALOC(I);                                                  JANDRE 
         END #CONL EQ S"NULL"#
    #CONL NON-NULL# 
END 
TERM
