*DECK COBCG 
USETEXT CCTTEXT 
          PRGM COBCG; 
  
#**       COBCG -  GENERATE OBJECT CODE 
* 
*         THIS IS THE DRIVER ROUTINE FOR THE (20,2) OVERLAY.
* 
*         THIS OVERLAY READS THE GTEXT FILE AND, REFERENCING
*           VARIOUS TABLES,  CREATES THE OTEXT FILE.
* 
*         THE CODE-GENERATION DECISIONS AND ACTIONS ARE GOVERNED
*           BY INTERPRETIVE CODE.  CGEN STARTS EXECUTING THIS CODE
*           IN MODULE *CGSTART*.  AS THE INTERPRETIVE CODE IS 
*           EXECUTED,  THE GTEXT FILE IS READ,  TABLES ARE REFERENCED,
*           AND THE OTEXT FILE IS WRITTEN.  WHEN THE OTEXT FILE 
*           IS COMPLETELY WRITTEN,  A STOP COMMAND IS EXECUTED
*           WHICH SIGNALS (VIA BOOLEAN VARIABLE INT$STOPPED) TO CGEN
*           TO FINISH UP AND EXIT FROM THIS OVERLAY.
# 
  
          BEGIN 
  
  
*CALL M$
  
*CALL ASMSEQ
*CALL FIXCOM
  
*CALL FIXED 
  
*CALL INT$
  
  
*CALL REGTABL 
  
*CALL LISTCTL 
  
*CALL SUBTYPE 
  
*CALL SUBINFO 
  
*CALL TABLETYP
  
          $BEGIN
*CALL BUG202C 
          $END
  
  
          $BEGIN
          ARRAY CGENTITLE [0] S(10);
          BEGIN 
            ITEM TITLE1      C(0,0,10) = ["  HEADER  "];
            ITEM TITLE2      C(1,0,10) = ["          "];
            ITEM TITLE3      C(2,0,10) = [" RUN ADDRE"];
            ITEM TITLE4      C(3,0,10) = ["SS       M"];
            ITEM TITLE5      C(4,0,10) = ["ODULE NAME"];
            ITEM TITLE6      C(5,0,10) = ["      OFFS"];
            ITEM TITLE7      C(6,0,10) = ["ET   OTHER"];
            ITEM TITLE8      C(7,0,10) = [" INFORMATI"];
            ITEM TITLE9      C(8,0,10) = ["ON        "];
          END 
          $END
                                                                         CGEN 
  
*CALL RAPLUSC 
  
          $BEGIN
          XREF  ITEM  DUMPFLG      I;  # MAIN DUMP CONTROL FLAG        #
          XREF  PROC  BUG202PRINT;     # PRINT COMMAND FOR DEBUG       #
          XREF  PROC  BUG202SET;       # SET DEBUG PARAMETERS          #
          $END
  
          XREF
              BEGIN 
              PROC  CGENINT;           # INTERPRET NEXT CGEN COMMAND   #
              ITEM  CGSTART      I;    # FIRST ENTERPRETIVE COMMAND    #
               PROC  CLOSOTX;          # CLOSE OTEXT FILE              #
              FUNC  CMM$AGR      I;    # CMM: GROUP ID                 #
              FUNC CMM$ALV       I;    # CMM: ALLOCATE BLOCK           #
              PROC  CMM$FRV;           # CMM: FREE BLOCK               #
              PROC  CMM$FGR;           # CMM: FREE GROUP               #
              PROC  CBLIST;            # PROCESS COBOL LIST FILE       #
              ITEM  CODEBLK;
              FUNC  DEFBLOCK     I; 
              PROC  DISPLAY;           # DISPLAY MESSAGE               #
              PROC  FLUSHOT;           # FLUSH OTEXT BUFFER            #
          PROC INITGTX;   #INITIALIZE GTEXT#
              ITEM  GROUP1FLAG I; 
              ITEM  MAXLITLENGTH I;    # MAX. LENGTH OF LITERAL BLOCK  #
              ITEM  NUMLITOFFSET I;    # OFFSET WITHIN LIT BLOCK FOR NU#
              PROC  OVERRTN;           # RETURN FROM THIS OVERLAY      #
              ITEM RCOUNT;
              ITEM  REGSEQ; 
              ITEM  SGIXBLK;
              FUNC  VIRTUAL;
              END 
  
          XDEF  ITEM  NUMLBLK    I;    # NUMERIC LITERALS USETAB INDEX #
  
          ITEM  DUMMY        I;        # FOR USE IN *LOOP* DEF         #
          ITEM  I            I;        # SCRATCH                       #
          ITEM  SUBID        I;        # CMM ID FOR SUBSCRIPT TABLE    #
          ITEM  SUBSIZE      I;        # SIZE OF SUBSCRIPT TABLE       #
          ITEM  TABINDEX     U; 
          ITEM  TEMP         I;        # SCRATCH                       #
  
*CALL,ASSEMOP 
          CONTROL IFNQ CB5$CDCS,"NO"; 
          XREF PROC  TMRECL;  #ENSURE TABLE IS CLOSED#
          XREF PROC  TMREOP;  #ENSURE TABLE IS OPEN#
          CONTROL FI; 
      CONTROL  EJECT; 
          XDEF  PROC  CHKSEQ; 
          PROC  CHKSEQ;      #ARBITRARILY LIMIT SEQUENCE SIZE          #
          BEGIN 
          IF  RCOUNT GR 100 
          THEN  FIXEDCELL[FIXED"P1"] = 1; 
          ELSE  FIXEDCELL[FIXED"P1"] = 0; 
          RETURN; 
          END 
      CONTROL  EJECT; 
      XDEF  PROC  ZEROMOD;
      PROC  ZEROMOD;
      BEGIN 
      FOR  I = 1 STEP 1 UNTIL CCTMAXMNUM  DO MODIFIERWORD[I] = 0; 
      RETURN; 
      END 
CONTROL EJECT;
  
  
  
#      ALLOCATE THE SUBSCRIPT INFORMATION TABLE                        #
  
          IF GROUP1FLAG EQ 0 THEN 
              GROUP1FLAG = CMM$AGR (1);   #ASSIGN A GROUP 1 BLOCK#
          I = CMM$ALV (CCTMAXMNEM,1,3,GROUP1FLAG,  P<SUBINFOARRAY>,0);
      I = CMM$ALV(CCTMAXMNUM,1,3,GROUP1FLAG,P<MODIFIER>,0); 
  
#      INITIALIZE ARRAY TO REFERENCE WORDS BY ABSOLUTE ADDRESSES       #
  
          P<RAPLUSARRAY> = 0; 
  
#      INITIALIZE THE TABLE OF FIXED CELLS                             #
  
          FOR I = 0 STEP 1 UNTIL M$FIXED  DO
              FIXEDCELL[I] = 0; 
          FOR I = FIXED"REG1" STEP 1 UNTIL FIXED"REGMAX"  DO
              FIXEDCELL[I] = I; 
          FIXEDCELL[FIXED"K1"] = 1; 
          FIXEDCELL[FIXED"K10"] = 10; 
          FIXEDCELL[FIXED"K20"] = 20; 
          FIXEDCELL[FIXED"K60"] = 60; 
          FIXEDCELL[FIXED"CURDNAT"] = CCTDNATLEN; 
          FIXEDCELL[FIXED"VREGB1"] = 1; 
          IF  CCTSEGMENTS[0] AND (NOT CCTSUBPROGR[0]
              OR  CCTALTINDSEG[0])
          THEN  FIXEDCELL[FIXED"SEGPROG"] = 1;
          ELSE  FIXEDCELL[FIXED"SEGPROG"] = 0;
  
#      CLEAR REGTABL                                                   #
  
          FOR I = 0 STEP 1 UNTIL 49  DO 
              BEGIN 
              REGWORD0[I] = 0;
              REGDNATADDR[I] = 0; 
              REGWORD2[I] = 0;
              REGAUXTADDR[I] = 0; 
              REGWORD4[I] = 0;
              END 
  
#      PREPARE FOR POOLING NUMERIC LITERALS                            #
  
          MAXLITLENGTH = -1;           # TRIGGER RE-INIT. OF LITPOOL   #
          NUMLITOFFSET = (CCTLPOOLLEN + 9)/10 - 1;   #(WORKS FOR LEN=0)#
  
  
#      PROCESS POSSIBLE DEBUG CONTROL CARD                             #
  
          $BEGIN
          IF DUMPFLG NQ 0  THEN 
              BUG202SET;
          BUG202C$EGNM = "(NOEGO)"; 
          BUG202C$EGAD = 0; 
          $END
  
#      INITIALIZE USE BLOCKS                                           #
  
          FIXEDCELL[FIXED"USECODE"] = CODEBLK;
  
          FIXEDCELL[FIXED"USEPARAM"] =
            DEFBLOCK("PARAM  ", FALSE, TRUE);    # PARAMETER BLOCK     #
  
          FIXEDCELL[FIXED"USECMU"] =
            DEFBLOCK("CMU    ", FALSE, TRUE);    # CMU BLOCK           #
  
          FIXEDCELL[FIXED"USEPILST"] =
            DEFBLOCK("PILST  ", FALSE, FALSE);   # PARAMETER INSERTION #
  
          FIXEDCELL[FIXED"USESSTMP"] =
            DEFBLOCK("SSTEMP ", FALSE, FALSE);
  
          FIXEDCELL[FIXED"USESGJMP"] =
            DEFBLOCK("SGJMP  ", FALSE, FALSE);
  
          FIXEDCELL[FIXED"USESM"] = 
            DEFBLOCK("SORTMRG", FALSE, FALSE);
  
          FIXEDCELL[FIXED"USESGIX"] = SGIXBLK;
          NUMLBLK = 
            DEFBLOCK("NUMLITS", FALSE, FALSE);   # NUMERIC LITERALS    #
  
          FIXEDCELL[FIXED"USEBEFOR"] =
            DEFBLOCK("BEFORE ", FALSE, FALSE);
          FIXEDCELL[FIXED"USEPRFM"] = DEFBLOCK("USEPRFM",FALSE,FALSE);
          FIXEDCELL[FIXED"BEFORCNT"] = 0; 
          IF CCTIDBUG[0] THEN 
              FIXEDCELL[FIXED"USEIDBG"] = DEFBLOCK("IDBUG",FALSE,FALSE);
          INITGTX;
  
          CONTROL IFNQ CB5$CDCS,"NO"; 
          FIXEDCELL[FIXED"USECDCS"] = 
            DEFBLOCK("CDCS   ", FALSE, FALSE);  #CDCS INTERFACE PARAMS# 
# 
# 
          TMREOP (TABLETYPE"DNT$");  #ENSURE DNT TABLE OPEN#
          CONTROL FI; 
  
#      EXECUTE THE INTERPRETIVE CGEN COMMANDS                          #
  
          P<COMMANDWORDS> = 0;         # COMMANDS INDEXED BY ABS. ADDR #
          INT$ADDR = LOC(CGSTART);     # FIRST INTERPRETIVE COMMAND    #
          INT$POS = 0;
          INT$STOPPED = FALSE;
  
          FOR I=I WHILE NOT INT$STOPPED  DO 
              BEGIN 
              CGENINT;                 # INTERPRET NEXT COMMAND        #
              $BEGIN
              IF BUG202C$ANYF[0]  THEN           # IF DEBUG TRACE      #
                  BUG202PRINT;                   # THEN PRINT          #
              $END
              END 
  
          REGCNT[VIRTUAL(TABLETYPE"ASMSEQ$",REGSEQ)] = RCOUNT;
#      FLUSH THE OTEXT BUFFER AND CLOSE THE FILE                       #
  
          FLUSHOT;
          CLOSOTX;
          CONTROL IFNQ CB5$CDCS,"NO"; 
# 
# 
          TMRECL (TABLETYPE"DNT$");  #ENSURE DNT TABLE CLOSED#
          CONTROL FI; 
  
  
#      RETURN TO CALLING OVERLAY                                       #
  
          OVERRTN;
  
          END 
          TERM
