home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / ibmtsonih / tsnalp.pli < prev    next >
Text File  |  2020-01-01  |  249KB  |  3,081 lines

  1.  /* ALP -- ASSEMBLY LANGUAGE PREPROCESSOR -- VERSION 6.19 -- 04/02/88 */00001000
  2.  (SUBRG):  /* CHECK SUBSCRIPTS */                             /*RAF-3*/ 00001500
  3.  ALP:                                                                   00002000
  4.    PROCEDURE OPTIONS(MAIN) REORDER;                                     00003000
  5.                                                              /*RAF-24*/ 00003100
  6.      DECLARE PLIXOPT CHAR(32) VARYING STATIC EXTERNAL        /*RAF-24*/ 00003200
  7.         INIT('ISASIZE(70K)');                     /*RAF-40*/ /*RAF-24*/ 00003300
  8.                                                              /*RAF-24*/ 00003400
  9.       DEFAULT RANGE(*) ALIGNED;                              /*RAF-46*/ 00003500
  10.                                                              /*RAF-46*/ 00003600
  11.   /*                                                                    00004000
  12.    INTERNAL PROCEDURES:                                                 00005000
  13.        ALP          (MAIN CONTROL PROGRAM)                              00006000
  14.         STMNT                                                           00007000
  15.         GROUP                                                           00008000
  16.         CEND,CIF,CCASE,CWHILE,CDO,CFOR,CFOREVER,CGOTO,CEXIT,CNEXT,      00009000
  17.         CUSE,CASMIF,CMACRO,CBAL,CPCASE,ALCSTMT                          00010000
  18.         PRED,GB                                                         00011000
  19.         WLABEL,WFLUSH                                                   00012000
  20.         GENSYM                                                          00013000
  21.                                                                         00014000
  22.         INPUT        (INPUT SCANNING PROCEDURES)                        00015000
  23.          RWORD,ROPANDS                                                  00016000
  24.          RCHECK,RCHAR                                                   00017000
  25.          SKIP,INC,ALPHANUM                                              00018000
  26.                                                                         00019000
  27.         ERROR,OUTPUT                                                    00020000
  28.                                                                         00021000
  29.    INPUT/OUTPUT CONVENTIONS:                                            00022000
  30.                                                                         00023000
  31.       INPUT FILE:                                                       00024000
  32.           SYSIN -- CARDS IN ALP LANGUAGE                                00025000
  33.                                                                         00026000
  34.       OUTPUT FILES:                                                     00027000
  35.           SYSOUT -- CARD IMAGES FOR BAL ASSEMBLER                       00028000
  36.           SYSPRINT -- INPUT IMAGES AND MESSAGES                         00029000
  37.           SYSTERM -- MESSAGE DATA SET                                   00030000
  38.  */                                                                     00031000
  39. 1                                                                       00032000
  40.  %DECLARE (#TRUE,#FALSE,#DUMMY) CHARACTER;                              00033000
  41.  %#TRUE='''1''B';                                                       00034000
  42.  %#FALSE='''0''B';                                                      00035000
  43.  %#DUMMY='''0''B';                                                      00036000
  44.  %DECLARE (@OUTER_PREDICATE,@INNER_PREDICATE) CHARACTER;                00037000
  45.  %@OUTER_PREDICATE='''1''B';                                            00038000
  46.  %@INNER_PREDICATE='''0''B';                                            00039000
  47.  %DECLARE (@USE_NEGATED,@USE_TRUTH) CHARACTER;                          00040000
  48.  %@USE_NEGATED='''1''B';                                                00041000
  49.  %@USE_TRUTH='''0''B';                                                  00042000
  50.  %DECLARE (@B,@BR) CHARACTER;                                           00043000
  51.  %@B='''0''B';                                                          00044000
  52.  %@BR='''1''B';                                                         00045000
  53.                                                                         00046000
  54.  %DECLARE CALLINC CHARACTER;                                            00047000
  55.  %CALLINC = ' DO; '                                                     00048000
  56.          || '  IF COL>72 THEN CALL INC; '                               00049000
  57.          || '  COL = COL+1; '                                           00050000
  58.          || '  IF COL=73 THEN '                                         00051000
  59.          || '   CHAR= '' '';'                                           00052000
  60.          || '  ELSE '                                                   00053000
  61.          || '   CHAR=SUBSTR(CARDIN,COL,1); '                            00054000
  62.          || ' END ';                                                    00055000
  63.                                                              /*RAF-41*/ 00055100
  64.  % ALPHANUM: PROCEDURE(CHAR) RETURNS(CHARACTER);             /*RAF-41*/ 00055200
  65.     DECLARE CHAR CHARACTER;                                  /*RAF-41*/ 00055300
  66.     RETURN('(('||CHAR||')>=''A'' | ('||CHAR||')=''$'' | '||  /*RAF-41*/ 00055400
  67.        '('||CHAR||')=''#'' | ('||CHAR||')=''@'')');          /*RAF-41*/ 00055500
  68.  % END ALPHANUM;                                             /*RAF-41*/ 00055600
  69.  % ACTIVATE ALPHANUM;                                        /*RAF-41*/ 00055700
  70.                                                                         00056000
  71.  %GEN: PROCEDURE(OPERATION,OPERANDS) RETURNS(CHARACTER);                00057000
  72.    DECLARE (OPERATION,OPERANDS) CHARACTER;                              00058000
  73.    DECLARE STRING CHARACTER;                                            00059000
  74.      STRING='DO; ';                                                     00060000
  75.      IF OPERATION ^= '''''' THEN                                        00061000
  76.         STRING = STRING||'C_OPERATION = '||OPERATION||';';              00062000
  77.      IF OPERANDS ^= '''''' THEN                                         00063000
  78.         STRING = STRING||' GEN_OPERANDS('||OPERANDS||');';   /*RAF-11*/ 00064000
  79.      ELSE STRING = STRING||' CALL WFLUSH;';                  /*RAF-11*/ 00064500
  80.      RETURN(STRING||' END ');                                /*RAF-11*/ 00065000
  81.  %END GEN;                                                              00066000
  82.  %ACTIVATE GEN;                                                         00067000
  83.                                                                         00068000
  84.  %GEN_OPERANDS: PROCEDURE(OPERANDS) RETURNS(CHARACTER);      /*RAF-11*/ 00069000
  85.    DECLARE OPERANDS CHARACTER;                               /*RAF-11*/ 00070000
  86.    RETURN(' DO; '                                            /*RAF-11*/ 00071000
  87.        || ' OP_SAVE = '||OPERANDS||';'                       /*RAF-11*/ 00072000
  88.        || ' C_OPERANDS = OP_SAVE;'                           /*RAF-11*/ 00073000
  89.        || ' DO OP_COUNT=53 TO LENGTH(OP_SAVE) BY 56;'        /*RAF-11*/ 00074000
  90.        || ' C_CONTINUE = ''*'';'                             /*RAF-11*/ 00075000
  91.        || ' CALL WFLUSH;'                                    /*RAF-11*/ 00076000
  92.        || ' C_DATA = '''';'                                  /*RAF-11*/ 00077000
  93.        || ' C_CONT_OPERANDS = SUBSTR(OP_SAVE,OP_COUNT);'     /*RAF-11*/ 00078000
  94.        || ' END;'                                            /*RAF-11*/ 00079000
  95.        || ' CALL WFLUSH;'                                    /*RAF-11*/ 00080000
  96.        || ' END');                                           /*RAF-11*/ 00081000
  97.                                                              /*RAF-11*/ 00082000
  98.                                                              /*RAF-11*/ 00083000
  99.                                                              /*RAF-11*/ 00084000
  100.                                                              /*RAF-11*/ 00085000
  101.  %END GEN_OPERANDS;                                                     00086000
  102.  %ACTIVATE GEN_OPERANDS;                                                00087000
  103. 1                                                                       00088000
  104.   /* "ALP"  "INPUT" INTERFACE */                                        00089000
  105.        DECLARE                                                          00090000
  106.          INAL FIXED BIN INIT(2),                                        00091000
  107.          ENDFLG BIT(1) INIT(#FALSE), ENDMARK CHAR(8) STATIC,            00092000
  108.          SYSIN FILE RECORD INPUT,                                       00093000
  109.          CHAR CHAR(1) INIT(' ') ,  /* ALWAYS CONTAINS THE CHARACTER     00094000
  110.                                      POINTED TO BY THE INPUT POINTER */ 00095000
  111.          WORD CHAR(8) VARYING, WORDAL BIT(1), /* SET BY RWORD*/         00096000
  112.          OPANDS CHAR(2000) VARYING, /* SET BY ROPANDS */     /*RAF-44*/ 00097000
  113.          CARDIN CHAR(80) UNALIGNED, /* INPUT BUFFER*/        /*RAF-46*/ 00098000
  114.          CIN_DATA CHAR(72) POS(1) DEF CARDIN UNALIGNED,      /*RAF-46*/ 00099000
  115.          CIN_ID CHAR(8) POS(73) DEF CARDIN UNALIGNED,        /*RAF-46*/ 00100000
  116.          CIN_2COLS CHAR(2) POS(1) DEF CARDIN UNAL, /*RAF-46*/ /*RAF-9*/ 00100500
  117.          COL FIXED BIN INIT(80);  /* INPUT COLUMN WITHIN CARDIN */      00101000
  118.                                                                         00102000
  119.   /* "ALP"  "OUTPUT" INTERFACE" */                                      00103000
  120.        DECLARE                                                          00104000
  121.          SYSPRINT FILE PRINT ENV(FB,RECSIZE(133)),           /*RAF-19*/ 00105000
  122.          SYSTERM FILE OUTPUT ENV(FB,RECSIZE(121),BLKSIZE(121)),         00106000
  123.          SYSOUT FILE RECORD OUTPUT ENV(FB,RECSIZE(80),TOTAL),/*RAF-19*/ 00107000
  124.          CARDOUT CHAR(80) INIT(' ') UNAL,  /*OUTPUT BUFFER*/ /*RAF-46*/ 00108000
  125.          C_LABEL CHAR(8) POS(1) DEF CARDOUT UNALIGNED,       /*RAF-46*/ 00109000
  126.          COL_1 CHAR(1) POS(1) DEF CARDOUT UNALIGNED,         /*RAF-46*/ 00110000
  127.          C_DATA CHAR(72) POS(1) DEF CARDOUT UNALIGNED,       /*RAF-46*/ 00111000
  128.          COUT_ID CHAR(8) POS(73) DEF CARDOUT UNALIGNED,      /*RAF-46*/ 00112000
  129.          C_OPERATION CHAR(8) POS(10) DEF CARDOUT UNALIGNED,  /*RAF-46*/ 00113000
  130.          C_OPERANDS CHAR(52) POS(20) DEF CARDOUT UNALIGNED,  /*RAF-46*/ 00114000
  131.          C_CONTINUE CHAR(1) POS(72) DEF CARDOUT UNALIGNED,   /*RAF-46*/ 00115000
  132.          C_CONT_OPERANDS CHAR(56) POS(16) DEF CARDOUT UNAL,  /*RAF-46*/ 00116000
  133.          OP_COUNT FIXED BIN,                                 /*RAF-11*/ 00116100
  134.          OP_SAVE CHAR(2000) VARYING,              /*RAF-44*/ /*RAF-11*/ 00116200
  135.          GENNUM FIXED DEC(5) INIT(10000) STATIC;                        00117000
  136.                                                                         00118000
  137.        DECLARE                                                          00119000
  138.          ERRCNT FIXED BIN INIT(0),                                      00120000
  139.       (BRANCH_LAST,IN_MACRO,SUBTITL,LABEL_WRITTEN) BIT(1) INIT(#FALSE), 00121000
  140.          NESTLEV FIXED BIN INIT(0),NESTID(75) CHAR(8),                  00122000
  141.          DOLEV FIXED BIN INIT(0),                                       00123000
  142.          (EXID(75),DOID(75),DOLABEL(75)) CHAR(8) VARYING,               00124000
  143.          ASMDOLEV FIXED BIN INIT(0),                          /*RAF-9*/ 00124100
  144.          (ASMEXID(75),ASMDOID(75),ASMDOLABEL(75))             /*RAF-9*/ 00124200
  145.                                          CHAR(8) VARYING,     /*RAF-9*/ 00124300
  146.          PREDLABLEV FIXED BIN INIT(0),                        /*RAF-6*/ 00125000
  147.          PREDLABSTK(100,2) CHAR(14) VARYING,       /*RAF-49*/ /*RAF-6*/ 00125500
  148.            PREDBTYPE(50) CHAR(1),                             /*RAF-6*/ 00126000
  149.        SYMLEV FIXED BIN INIT(0),SYMSTK(3000) CHAR(8) VARYING,/*RAF-38*/ 00127000
  150.          LABLEV FIXED BIN INIT(0),LABSTK(50) CHAR(8) VARYING,/*RAF-42*/ 00128000
  151.          EQVLEV FIXED BIN INIT(0),                           /*RAF-37*/ 00129000
  152.          EQVSTK(100,2) CHAR(10) VARYING;                     /*RAF-37*/ 00129500
  153.                                                                         00130000
  154.        DECLARE                                                          00131000
  155.          DTE CHAR(6),TIM CHAR(9),TIME_STAMP CHAR(20),                   00132000
  156.          PAGECNT FIXED BIN INIT(0),                                     00133000
  157.          DECKNAME CHAR(8) INIT(' '),                                    00134000
  158.          TITLE CHAR(72) INIT(                                           00135000
  159.           'A L P  :  A S S E M B L E R   P R E P R O C E S S O R .'     00136000
  160.           ),                                                            00137000
  161.          SUBTITLE CHAR(72) INIT(' ');                                   00138000
  162. 0                                                                       00139000
  163.   /* "ALP" RETURN CODE */                                               00140000
  164.        DECLARE                                                          00141000
  165.          RETCODE FIXED BINARY(31) INIT(0);                              00142000
  166. 1                                                                       00143000
  167.        DECLARE                                                          00144000
  168.          PREDICATES (18,2)  CHAR(8)  STATIC INIT(                       00145000
  169.            'OPENP'  , 'NZ' ,           /* TM  */                        00146000
  170.            'TM'     , 'NZ',    /* ANY SELECTED BIT ON  */               00147000
  171.            'TS'     , 'NZ',                                             00148000
  172.            'TF'     , 'NZ',                                             00149000
  173.            'TRT'    , 'NZ',                                             00150000
  174.            'RM'     , 'M' ,    /* REGISTER TESTS */                     00151000
  175.            'RZ'     , 'Z' ,                                             00152000
  176.            'RP'     , 'P' ,                                             00153000
  177.            'RMZ'    , 'NP',                                             00154000
  178.            'RMP'    , 'NZ',                                             00155000
  179.            'RZP'    , 'NM',                                             00156000
  180.            'RNM'    , 'NM',                                             00157000
  181.            'RNZ'    , 'NZ',                                             00158000
  182.            'RNP'    , 'NP',                                             00159000
  183.            'RNMZ'   , 'P' ,                                             00160000
  184.            'RNMP'   , 'Z' ,                                             00161000
  185.            'RNZP'   , 'M' ,                                             00162000
  186.            '***'    , 'E'),    /*   DEFAULT:   TRUTH IS EQUAL  */       00163000
  187.                                                                         00164000
  188.          1 CCTAB STATIC,                                                00165000
  189.            2 IVAL(19)  INIT((3)0, (5)8, (4)4, (4)2, (3)1),              00166000
  190.            2 LET CHAR(19)  INIT(' N^ 0=EZ 1LM 2PH 3O'),                 00167000
  191.                                                                         00168000
  192.          OPTAB (16)   CHAR(10)  STATIC INIT(                            00169000
  193.            'BC      0,',                                                00170000
  194.            'BO',                                                        00171000
  195.            'BH',                                                        00172000
  196.            'BC      3,',                                                00173000
  197.            'BL',                                                        00174000
  198.            'BC      5,',                                                00175000
  199.            'BC      6,',                                                00176000
  200.            'BNE',                                                       00177000
  201.            'BE',                                                        00178000
  202.            'BC      9,',                                                00179000
  203.            'BC     10,',                                                00180000
  204.            'BNL',                                                       00181000
  205.            'BC     12,',                                                00182000
  206.            'BNH',                                                       00183000
  207.            'BNO',                                                       00184000
  208.            'BC     15,'  );                                             00185000
  209. 1                                                                       00186000
  210.  ON ENDFILE(SYSIN) GO TO MAIN_END ;                                     00187000
  211.                                                                         00188000
  212.  OPEN FILE(SYSPRINT) LINESIZE(132);                          /*RAF-19*/ 00188500
  213.  ON ENDPAGE(SYSPRINT)                                                   00189000
  214.   BEGIN;                                                                00190000
  215.    PAGECNT = PAGECNT+1;                                                 00191000
  216.    PUT PAGE FILE(SYSPRINT)                                              00192000
  217.     EDIT(DECKNAME,TITLE,TIME_STAMP,'PAGE ',PAGECNT,SUBTITLE)            00193000
  218.      (A(8),A(72),X(9),A(20),X(3),A(5),P'ZZ9',SKIP,X(8),A(72));          00194000
  219.    PUT SKIP(2) FILE(SYSPRINT);                                          00195000
  220.    SUBTITL = #FALSE;                                                    00196000
  221.   END;                                                                  00197000
  222.                                                                         00198000
  223.  OPEN FILE(SYSTERM); PUT SKIP FILE(SYSTERM); CLOSE FILE(SYSTERM);       00199000
  224.  OPEN FILE(SYSOUT);                                          /*RAF-19*/ 00200000
  225.                                                                         00201000
  226.  DTE = DATE() ;  TIM = TIME() ;                                         00202000
  227.  TIME_STAMP = SUBSTR(DTE,3,2)||'/'||                                    00203000
  228.               SUBSTR(DTE,5,2)||'/'||                                    00204000
  229.               SUBSTR(DTE,1,2)||'    '||                                 00205000
  230.               SUBSTR(TIM,1,2)||':'||                                    00206000
  231.               SUBSTR(TIM,3,2)||':'||                                    00207000
  232.               SUBSTR(TIM,5,2) ;                                         00208000
  233.                                                                         00209000
  234.   PUT SKIP FILE(SYSTERM) EDIT('*ALP*',TIME_STAMP) (A,X(2),A);           00210000
  235.   SIGNAL ENDPAGE(SYSPRINT);                                             00211000
  236. 1                                                                       00212000
  237.  MAIN_LOOP:                                                             00213000
  238.       DO WHILE(#TRUE);                  /* MAIN PROGRAM LOOP*/          00214000
  239.          CALL STMNT ;                                                   00215000
  240.          IF ^RCHAR(';') THEN                                            00216000
  241.             CALL ERROR ('MA10: MISSING SEMICOLON INSERTED.') ;          00217000
  242.          CALL EQVFLUSH(#FALSE,1);                                       00218000
  243.       END MAIN_LOOP ;                                                   00219000
  244.                                                                         00220000
  245.  MAIN_END :                                                             00221000
  246.       CALL EQVFLUSH(#TRUE,1);                                           00222000
  247.       IF ^ENDFLG THEN                                                   00223000
  248.          CALL ERROR('MAIN: MISSING "END" AT END OF PROGRAM.');          00224000
  249.       WORD = 'END';                                                     00225000
  250.       COL = 1;                                                          00226000
  251.       SUBSTR(CARDIN,1,1),CHAR = ';';                                    00227000
  252.       CALL ALCSTMT;                                                     00228000
  253.       IF NESTLEV^=0 THEN                                                00229000
  254.          DO;                                                            00230000
  255.             CALL OUTPUT(' ');                                           00231000
  256.             CALL OUTPUT('MISSING "END"/">" FOR "BEGIN"/"<" AT:');       00232000
  257.             DO NESTLEV = NESTLEV TO 1 BY -1;                            00233000
  258.                CALL OUTPUT(NESTID(NESTLEV));                            00234000
  259.             END;                                                        00235000
  260.             RETCODE=8;                                                  00236000
  261.          END;                                                           00237000
  262.       CALL OUTPUT(' ');                                                 00238000
  263.       IF ERRCNT = 0 THEN                                                00239000
  264.        CALL OUTPUT('NO ALP STATEMENTS FLAGGED.');                       00240000
  265.       ELSE                                                              00241000
  266.        IF ERRCNT = 1 THEN                                               00242000
  267.         CALL OUTPUT('1 ALP STATEMENT FLAGGED.');                        00243000
  268.        ELSE                                                             00244000
  269.         CALL OUTPUT(ERRCNT||' ALP STATEMENTS FLAGGED.');                00245000
  270.       CALL OUTPUT(' ');                                                 00246000
  271.       CLOSE FILE(SYSTERM),FILE(SYSPRINT),FILE(SYSOUT),FILE(SYSIN);      00247000
  272.       CALL PLIRETC(RETCODE);                                            00248000
  273.       RETURN ;                                                          00249000
  274. 1                                                                       00250000
  275.  STMNT:  /* PROCESS ONE STATEMENT (SIMPLE OR COMPOUND) */               00251000
  276.    PROCEDURE RECURSIVE ;                                                00252000
  277.    DCL                                                                  00253000
  278.       SAVID CHAR(8);                                                    00254000
  279.                                                                         00255000
  280.  ST:                                                                    00256000
  281.       CALL RLABEL ;                                                     00257000
  282.       IF ENDFLG THEN                                                    00258000
  283.          DO;                                                            00259000
  284.             CALL ERROR('ST10: EXTRANEOUS OR LABELED "END" AT '          00260000
  285.                      ||ENDMARK||' IGNORED.');                           00261000
  286.             ENDFLG = #FALSE;                                            00262000
  287.          END;                                                           00263000
  288.       IF WORD = ';' THEN                                                00264000
  289.          RETURN;                                                        00265000
  290.       SAVID = CIN_ID;                                                   00266000
  291.       IF ^WORDAL THEN                                                   00267000
  292.          IF WORD = '<' THEN                                             00268000
  293.             DO;                                                         00269000
  294.                CALL GROUP(#FALSE,SAVID);                                00270000
  295.                RETURN;                                                  00271000
  296.             END;                                                        00272000
  297.          ELSE                                                           00273000
  298.             DO;                                                         00274000
  299.               CALL ERROR('ST15: "'||WORD||'" OUT OF CONTEXT, IGNORED.');00275000
  300.               GO TO ST;                                                 00276000
  301.             END;                                                        00277000
  302.                                                                         00278000
  303.  /* WORD IS A SYMBOL  */                                                00279000
  304.       IF WORD = 'BEGIN' THEN                                            00280000
  305.          DO;                                                            00281000
  306.             CALL GROUP(#TRUE,SAVID);                                    00282000
  307.             RETURN;                                                     00283000
  308.          END;                                                           00284000
  309.       ELSE                                                              00285000
  310.          IF RCHAR(':') THEN                                             00286000
  311.             DO;                                                         00287000
  312.                CALL WLABEL(WORD);                                       00288000
  313.                GO TO ST;                                                00289000
  314.             END;                                                        00290000
  315. 1                                                                       00291000
  316.       /* IDENTIFY ALP INSTRUCTIONS */                                   00292000
  317.       IF WORD = 'IF' THEN                                               00293000
  318.         CALL CIF ;                                                      00294000
  319.       ELSE                                                              00295000
  320.         IF WORD = 'CASE' THEN                                           00296000
  321.           CALL CCASE ;                                                  00297000
  322.         ELSE                                                            00298000
  323.           IF WORD = 'WHILE' THEN                                        00299000
  324.             CALL CWHILE(#FALSE) ;                                       00300000
  325.           ELSE                                                          00301000
  326.             IF WORD = 'UNTIL' THEN                                      00302000
  327.               CALL CWHILE(#TRUE);                                       00303000
  328.             ELSE                                                        00304000
  329.               IF WORD = 'DO' THEN                                       00305000
  330.                 CALL CDO;                                               00306000
  331.               ELSE                                                      00307000
  332.                 IF WORD = 'FOR' THEN                                    00308000
  333.                   CALL CFOR;                                            00309000
  334.                 ELSE                                                    00310000
  335.                   IF WORD = 'FOREVER' THEN                              00311000
  336.                     CALL CFOREVER;                                      00312000
  337.                   ELSE                                                  00313000
  338.                     IF WORD = 'GOTO' THEN                               00314000
  339.                       CALL CGOTO(#FALSE);                               00315000
  340.                     ELSE                                                00316000
  341.                       IF WORD = 'RGOTO' THEN                            00317000
  342.                         CALL CGOTO(#TRUE);                              00318000
  343.                       ELSE                                              00319000
  344.                         IF WORD = 'EXIT' THEN                           00320000
  345.                           CALL CEXIT;                                   00321000
  346.                         ELSE                                            00322000
  347.                           IF WORD = 'USE' THEN                          00323000
  348.                             CALL CUSE;                                  00324000
  349.                           ELSE                                          00325000
  350.                             IF WORD = 'BAL' THEN                        00326000
  351.                               DO;                                       00327000
  352.                                  IF RCHAR(';') THEN                     00328000
  353.                                     CALL CBAL;                          00329000
  354.                                  ELSE                                   00330000
  355.                                     CALL ALCSTMT;                       00331000
  356.                               END;                                      00332000
  357.                             ELSE IF WORD = 'COMMENT' THEN    /*RAF-10*/ 00332100
  358.                               DO;                            /*RAF-10*/ 00332200
  359.                                  IF RCHAR(';') THEN          /*RAF-10*/ 00332300
  360.                                     CALL CCOMMENT;           /*RAF-10*/ 00332400
  361.                                  ELSE                        /*RAF-10*/ 00332500
  362.                                     CALL ALCSTMT;            /*RAF-10*/ 00332600
  363.                               END;                           /*RAF-10*/ 00332700
  364.                             ELSE IF WORD='DATA' THEN         /*RAF-36*/ 00332800
  365.                                CALL CDATA;                   /*RAF-36*/ 00332900
  366.                             ELSE                                        00333000
  367.                               IF WORD = 'END' THEN                      00334000
  368.                                 CALL CEND(SAVID);                       00335000
  369.                               ELSE                                      00336000
  370.                                 IF WORD = 'NEXT' THEN                   00337000
  371.                                   CALL CNEXT;                           00338000
  372.                                 ELSE                                    00339000
  373.                                 IF WORD='ASM' THEN            /*RAF-9*/ 00339100
  374.                                 CALL CASM;                    /*RAF-9*/ 00339200
  375.                                 ELSE                          /*RAF-9*/ 00339300
  376.                                   IF WORD = 'ASMIF' THEN                00340000
  377.                                     CALL CASMIF;                        00341000
  378.                                   ELSE                                  00342000
  379.                                     IF WORD = 'MACRO' THEN              00343000
  380.                                       CALL CMACRO;                      00344000
  381.                                     ELSE                                00345000
  382.                                       IF WORD = 'SELECT' THEN           00346000
  383.                                         CALL CSELECT;                   00347000
  384. 1                                                                       00348000
  385.                 ELSE                                                    00349000
  386.                    IF WORD='THEN'                                       00350000
  387.                     | WORD='ELSE'                                       00351000
  388.                     | WORD='MEND'                             /*RAF-8*/ 00352000
  389.                     | WORD='ENDMACRO'                         /*RAF-8*/ 00352500
  390.                     | WORD='ENDSEL'                                     00353000
  391.                     | WORD='ENDCASE' THEN                               00354000
  392.                      DO;                                                00355000
  393.                       CALL ERROR('ST25: INVALID "'||WORD||'" IGNORED.');00356000
  394.                       GOTO ST;                                          00357000
  395.                      END;                                               00358000
  396.                    ELSE                                                 00359000
  397.                      CALL ALCSTMT;                                      00360000
  398.       RETURN ;                                                          00361000
  399.    END STMNT ;                                                          00362000
  400. -                                                                       00363000
  401.  /* PROCESS STATEMENT "GROUP" */                                        00364000
  402.  GROUP:                                                                 00365000
  403.    PROCEDURE(BEGTYPE,CARDID) RECURSIVE ;                                00366000
  404.    DECLARE                                                              00367000
  405.       BEGTYPE BIT(1),                                                   00368000
  406.       CARDID CHAR(8);                                                   00369000
  407.                                                                         00370000
  408.       NESTLEV=NESTLEV+1;                                                00371000
  409.       NESTID(NESTLEV)=CARDID;                                           00372000
  410.  GRLOOP:                                                                00373000
  411.       DO WHILE(#TRUE) ;                                                 00374000
  412.          IF ^BEGTYPE THEN DO;                                 /*RAF-7*/ 00375000
  413.             IF RCHAR('>') THEN GO TO GROUT;                   /*RAF-7*/ 00375500
  414.             END;                                              /*RAF-7*/ 00376000
  415.          ELSE IF RCHECK('END') THEN GO TO GROUT;              /*RAF-7*/ 00376500
  416.          CALL STMNT ;                                                   00377000
  417.          IF ENDFLG THEN                                       /*RAF-7*/ 00377100
  418.             DO;                                               /*RAF-7*/ 00377200
  419.                CALL ERROR('GR11: EXTRANEOUS OR LABELED "END"' /*RAF-7*/ 00377300
  420.                         ||' AT '||ENDMARK||' IGNORED.');      /*RAF-7*/ 00377400
  421.                ENDFLG = #FALSE;                               /*RAF-7*/ 00377500
  422.             END;                                              /*RAF-7*/ 00377600
  423.          IF ^BEGTYPE THEN DO;                                 /*RAF-7*/ 00378000
  424.             IF RCHAR('>') THEN GO TO GROUT;                   /*RAF-7*/ 00378500
  425.             END;                                              /*RAF-7*/ 00379000
  426.          ELSE IF RCHECK('END') THEN GO TO GROUT;              /*RAF-7*/ 00379500
  427.          IF ^RCHAR (';') THEN                                           00380000
  428.             CALL ERROR('GR10: MISSING SEMICOLON INSERTED.');            00381000
  429.       END GRLOOP;                                                       00382000
  430.  GROUT:                                                                 00383000
  431.       NESTLEV=NESTLEV-1;                                                00384000
  432.       IF NESTLEV=0 THEN PREDLABLEV=0;                         /*RAF-6*/ 00384500
  433.       RETURN;                                                           00385000
  434.    END GROUP ;                                                          00386000
  435. 1                                                                       00387000
  436.  /*  END  */                                                            00388000
  437.                                                                         00389000
  438.  CEND:                                                                  00390000
  439.    PROCEDURE(ENDID);                                                    00391000
  440.       DCL                                                               00392000
  441.          ENDID CHAR(8);                                                 00393000
  442.                                                                         00394000
  443.       ENDFLG = #TRUE;                                                   00395000
  444.       ENDMARK = ENDID;                                                  00396000
  445.       RETURN;                                                           00397000
  446.  END CEND;                                                              00398000
  447. 1                                                                       00399000
  448.  /*  IF <PREDICATE> THEN <STATEMENT> |                                  00400000
  449.      IF <PREDICATE> THEN <STATEMENT> ELSE <STATEMENT>  */               00401000
  450.                                                                         00402000
  451.  CIF:                                                                   00403000
  452.    PROCEDURE RECURSIVE ;                                                00404000
  453.    DECLARE                                                              00405000
  454.       (THENPART,ELSEPART,SKIPLABEL) CHAR(8) VARYING;                    00406000
  455.                                                                         00407000
  456.       THENPART = '';                                                    00408000
  457.       ELSEPART = GENSYM;                                                00409000
  458.       CALL PREDICATE(THENPART,ELSEPART,@OUTER_PREDICATE,                00410000
  459.                      #DUMMY,@USE_TRUTH,#DUMMY,@B);                      00411000
  460.       IF ^RCHECK('THEN') THEN                                           00412000
  461.          CALL ERROR('CIF: "THEN" INSERTED AFTER "'||WORD||'".');        00413000
  462.       CALL STMNT;                      /* THEN CLAUSE */                00414000
  463.       IF RCHECK('ELSE') THEN                                            00415000
  464.          DO ; /*  ELSE CLAUSE  */                                       00416000
  465.             SKIPLABEL = GENSYM;                                         00417000
  466.             GEN('B',SKIPLABEL);                                         00418000
  467.             CALL WLABEL(ELSEPART) ;                                     00419000
  468.             CALL STMNT;                      /* ELSE CLAUSE  */         00420000
  469.             CALL WLABEL(SKIPLABEL) ;                                    00421000
  470.          END;                                                           00422000
  471.       ELSE  /* NO ELSE CLAUSE */                                        00423000
  472.          CALL WLABEL(ELSEPART);                                         00424000
  473.       RETURN;                                                           00425000
  474.    END CIF ;                                                            00426000
  475. 1                                                                       00427000
  476.  /*  CASE <REGISTER> MAX <MAXVAL>;                                      00428000
  477.      <CASE LIST>                                                        00429000
  478.      ENDCASE                        */                                  00430000
  479.                                                                         00431000
  480.  CCASE:                                                                 00432000
  481.    PROCEDURE RECURSIVE;                                                 00433000
  482.    DECLARE                                                              00434000
  483.       (REGID,CLABELB,CLABELI,CLABELE,TLABEL) CHAR(8) VARYING,           00435000
  484.       ELSEPART CHAR(8) VARYING INIT(''),                     /*RAF-32*/ 00435100
  485.       MINCASE CHAR(80) VARYING INIT('(0)'),                  /*RAF-32*/ 00435200
  486.       MAXCASE CHAR(80) VARYING INIT(''),                     /*RAF-32*/ 00435300
  487.       (CLOW,CHIGH) CHAR(80) VARYING,                         /*RAF-32*/ 00436000
  488.      (EMSG1 CHAR(72) INIT(                                   /*RAF-32*/ 00437000
  489.        '* ERROR IF CASE RANGE NOT A MULTIPLE OF FOUR:'),     /*RAF-32*/ 00438000
  490.       EMSG2 CHAR(72) INIT(                                   /*RAF-32*/ 00439000
  491.        '* ERROR IF ORDER OF "THRU" CASES IS INVALID:'),                 00440000
  492.       EMSG3 CHAR(72) INIT('* ERROR IF CASE OUT OF RANGE:'),  /*RAF-32*/ 00441000
  493.       EMSG4 CHAR(72) INIT('* ERROR IF CASE NOT A MULTIPLE OF FOUR:'),   00442000
  494.       EMSG5 CHAR(72) INIT(                                   /*RAF-32*/ 00442100
  495.        '* ERROR IF CASE RANGE NOT GREATER THAN ZERO:')       /*RAF-32*/ 00442200
  496.      ) STATIC;                                                          00443000
  497.                                                                         00444000
  498.       CALL ROPANDS(#TRUE);                                   /*RAF-32*/ 00445000
  499.       IF OPANDS='' THEN                                      /*RAF-32*/ 00446000
  500.          DO;                                                            00447000
  501.             CALL ERROR('CCASE: NO REGISTER ID FOR CASE STATEMENT.');    00448000
  502.             OPANDS='0';                            /*RAF-32*/ /*RAF-8*/ 00449000
  503.          END;                                                           00450000
  504.       REGID = OPANDS;                                        /*RAF-32*/ 00451000
  505.  /*   IF ^RCHECK('MAX') THEN                          */  /*RAF-32*/ /* 00452000
  506.          CALL ERROR('CCASE: "MAX" INSERTED AFTER "'||REGID||'".');      00453000
  507.       CALL RWORD;                                                       00454000
  508.       IF ^WORDAL THEN                                                   00455000
  509.          DO;                                                            00456000
  510.             CALL ERROR('CCASE: MISSING MAXIMUM CASE INDICATION.');      00457000
  511.             RETURN;                                                     00458000
  512.          END;     */                                         /*RAF-32*/ 00459000
  513.       DO WHILE('1'B);                                        /*RAF-32*/ 00459020
  514.          IF RCHECK('MAX') THEN DO;                           /*RAF-32*/ 00459040
  515.             CALL ROPANDS(#TRUE);                             /*RAF-32*/ 00459060
  516.             MAXCASE='('||OPANDS||')';                        /*RAF-32*/ 00459080
  517.             END;                                             /*RAF-32*/ 00459100
  518.          ELSE IF RCHECK('MIN') THEN DO;                      /*RAF-32*/ 00459120
  519.             CALL ROPANDS(#TRUE);                             /*RAF-32*/ 00459140
  520.             MINCASE='('||OPANDS||')';                        /*RAF-32*/ 00459160
  521.             END;                                             /*RAF-32*/ 00459180
  522.          ELSE IF RCHECK('CHECK') THEN DO;                    /*RAF-32*/ 00459200
  523.             ELSEPART=GENSYM;                                 /*RAF-32*/ 00459220
  524.             END;                                             /*RAF-32*/ 00459240
  525.          ELSE DO;                                            /*RAF-32*/ 00459260
  526.             IF ^RCHAR(';') THEN                              /*RAF-32*/ 00459280
  527.             CALL ERROR('CCASE: MISSING SEMICOLON INSERTED'); /*RAF-32*/ 00459300
  528.             GO TO CASEBODY;                                  /*RAF-32*/ 00459320
  529.             END;                                             /*RAF-32*/ 00459340
  530.          END;                                                /*RAF-32*/ 00459360
  531.       CASEBODY:                                              /*RAF-32*/ 00459380
  532.       IF MAXCASE='' THEN DO;                                 /*RAF-32*/ 00459400
  533.          CALL ERROR('CCASE: MAX MUST BE SPECIFIED');         /*RAF-32*/ 00459420
  534.          MAXCASE=MINCASE;                                    /*RAF-32*/ 00459440
  535.          END;                                                /*RAF-32*/ 00459460
  536.       CLABELE = '';                                          /*RAF-32*/ 00460000
  537.       DOLEV = DOLEV+1;                                                  00461000
  538.       EXID(DOLEV) = '';                                       /*RAF-8*/ 00462000
  539.       DOID(DOLEV) = GENSYM;                                  /*RAF-15*/ 00463000
  540.       DOLABEL(DOLEV) = CURLAB;                                          00464000
  541.    /* MAXCASE = WORD;                                  */ /*RAF-32*/ /* 00465000
  542.       DO WHILE(^RCHAR(';'));                                            00466000
  543.          CALL RWORD;                                                    00467000
  544.          MAXCASE = MAXCASE||WORD;                                       00468000
  545.       END;                                                              00469000
  546.       MAXCASE='('||MAXCASE||')';                          */ /*RAF-32*/ 00470000
  547.       CLABELB = GENSYM;                                                 00471000
  548.       CALL WLABEL(DOID(DOLEV));                              /*RAF-15*/ 00471500
  549.       IF ELSEPART^='' THEN DO;                               /*RAF-32*/ 00471520
  550.          GEN('C',REGID||',=A'||MAXCASE);                     /*RAF-32*/ 00471540
  551.          GEN('BH',ELSEPART);                                 /*RAF-32*/ 00471560
  552.          IF MINCASE='(0)' THEN DO;                           /*RAF-32*/ 00471580
  553.             GEN('LTR',REGID||','||REGID);                    /*RAF-32*/ 00471600
  554.             GEN('BM',ELSEPART);                              /*RAF-32*/ 00471620
  555.             END;                                             /*RAF-32*/ 00471640
  556.          ELSE DO;                                            /*RAF-32*/ 00471660
  557.             GEN('C',REGID||',=A'||MINCASE);                  /*RAF-32*/ 00471680
  558.             GEN('BL',ELSEPART);                              /*RAF-32*/ 00471700
  559.             END;                                             /*RAF-32*/ 00471720
  560.          END;                                                /*RAF-32*/ 00471740
  561.       GEN('B',CLABELB||'-'||MINCASE||'('||REGID||')');       /*RAF-32*/ 00472000
  562.       C_DATA=EMSG1;                                                     00473000
  563.       CALL WFLUSH;                                                      00474000
  564.       GEN('DS','0CL(1+('||MAXCASE||'-'||MINCASE||')/4*4-'||  /*RAF-32*/ 00475000
  565.                 MAXCASE||'+'||MINCASE||')');                 /*RAF-32*/ 00475100
  566.       C_DATA=EMSG5;                                          /*RAF-32*/ 00475200
  567.       CALL WFLUSH;                                           /*RAF-32*/ 00475300
  568.       GEN('DS','0CL('||MAXCASE||'-'||MINCASE||')');          /*RAF-32*/ 00475400
  569.       CALL WLABEL(CLABELB);                                             00476000
  570.       IF ELSEPART='' THEN DO;                                /*RAF-32*/ 00476500
  571.          GEN('DC','(('||MAXCASE||'-'||MINCASE||')/4+1)'||    /*RAF-32*/ 00477000
  572.                 'H''0,0''');                                 /*RAF-32*/ 00477100
  573.          END;                                                /*RAF-32*/ 00477200
  574.       ELSE DO;                                               /*RAF-32*/ 00477300
  575.          GEN('DC','(('||MAXCASE||'-'||MINCASE||')/4+1)'||    /*RAF-32*/ 00477400
  576.                 'S(X''7F0''(4),'||ELSEPART||')');            /*RAF-32*/ 00477500
  577.          END;                                                /*RAF-32*/ 00477600
  578. 1                                                                       00478000
  579.       NESTLEV = NESTLEV+1;                                              00479000
  580.       NESTID(NESTLEV) = CIN_ID;                                         00480000
  581.    /* CALL RWORD; */                                         /*RAF-32*/ 00481000
  582.       DO WHILE(^RCHECK('ENDCASE'));                          /*RAF-32*/ 00482000
  583.          IF CLABELE=''                                       /*RAF-32*/ 00482100
  584.          THEN CLABELE=GENSYM;                                /*RAF-32*/ 00482200
  585.          ELSE GEN('B',CLABELE);                              /*RAF-32*/ 00482300
  586.          TLABEL = GENSYM;                                               00483000
  587.          CLABELI = GENSYM;                                              00484000
  588.          CALL WLABEL(TLABEL);                                           00485000
  589.          GEN('DS','0H');                                                00486000
  590.          DO WHILE('1'B);                                     /*RAF-32*/ 00487000
  591.          /* CLOW,CHIGH = '';                           */ /*RAF-32*/ /* 00488000
  592.             DO WHILE(WORD^='THRU' & WORD^=',' & WORD^=':' & WORD^=';'); 00489000
  593.                CLOW = CLOW||WORD;                                       00490000
  594.                CALL RWORD;                                              00491000
  595.             END;                                                        00492000
  596.             CLOW='('||CLOW||')';    */                       /*RAF-32*/ 00493000
  597.             CALL ROPANDS(#TRUE);                             /*RAF-32*/ 00493100
  598.             CLOW='('||OPANDS||')';                           /*RAF-32*/ 00493200
  599.             CHIGH='';                                        /*RAF-32*/ 00493300
  600.             IF RCHECK('THRU') THEN                           /*RAF-32*/ 00494000
  601.                DO ;                                                     00495000
  602.              /*   CALL RWORD ;                         */ /*RAF-32*/ /* 00496000
  603.                   DO                                                    00497000
  604.                    WHILE(WORD ^= ',' & WORD ^= ':' & WORD ^= ';');      00498000
  605.                      CHIGH = CHIGH||WORD;                               00499000
  606.                      CALL RWORD ;                                       00500000
  607.                   END;                                    */ /*RAF-32*/ 00501000
  608.                CALL ROPANDS(#TRUE);                          /*RAF-32*/ 00501100
  609.                CHIGH='('||OPANDS||')';                       /*RAF-32*/ 00501200
  610.                END ;                                                    00502000
  611.          /* IF CHIGH^='' THEN  */                            /*RAF-32*/ 00503000
  612.          /*    CHIGH='('||CHIGH||')';   */                   /*RAF-32*/ 00504000
  613.             IF RCHAR(';') THEN                               /*RAF-32*/ 00505000
  614.                DO;                                                      00506000
  615.                   CALL ERROR('CCASE: '||                                00507000
  616.                              'MISSING CASE LABEL, CASE IGNORED.');      00508000
  617.                   GO TO NOCASE;                              /*RAF-32*/ 00509000
  618.                END;                                                     00510000
  619. 1                                                                       00511000
  620.             ELSE                                                        00512000
  621.                DO;                                                      00513000
  622.                 C_DATA=EMSG3;                                           00514000
  623.                 CALL WFLUSH;                                            00515000
  624.                 GEN('DS','0CL(1+'||MAXCASE||'-'||CLOW||'),'   /*RAF-5*/ 00516000
  625.                 ||'0CL(1+'||CLOW||'-'||MINCASE||')');  /*RAF-32,RAF-5*/ 00516100
  626.                 C_DATA=EMSG4;                                           00517000
  627.                 CALL WFLUSH;                                            00518000
  628.                 GEN('DS','0CL(1+('||CLOW||'-'||MINCASE||     /*RAF-32*/ 00519000
  629.                 ')/4*4-'||CLOW||'+'||MINCASE||')');          /*RAF-32*/ 00519100
  630.                 IF CHIGH^='' THEN                                       00520000
  631.                    DO;                                                  00521000
  632.                     C_DATA=EMSG2;                                       00522000
  633.                     CALL WFLUSH;                                        00523000
  634.                     GEN('DS','0CL(1+'||CHIGH||'-'||CLOW||')');          00524000
  635.                     C_DATA=EMSG3;                                       00525000
  636.                     CALL WFLUSH;                                        00526000
  637.                     GEN('DS','0CL(1+'||MAXCASE||'-'||CHIGH||')');       00527000
  638.                     C_DATA=EMSG4;                                       00528000
  639.                     CALL WFLUSH;                                        00529000
  640.                     GEN('DS','0CL(1+('||CHIGH||'-'||MINCASE  /*RAF-32*/ 00530000
  641.                     ||')/4*4-'||CHIGH||'+'||MINCASE||')');   /*RAF-32*/ 00530100
  642.                    END;                                                 00531000
  643.                 GEN('ORG',CLABELB||'+'||CLOW||'-'||MINCASE); /*RAF-32*/ 00532000
  644.                 IF CHIGH = '' THEN                                      00533000
  645.                    DO;                                                  00534000
  646.                       C_OPERATION = 'B';                                00535000
  647.                       C_OPERANDS = CLABELI;                             00536000
  648.                    END;                                                 00537000
  649.                 ELSE                                                    00538000
  650.                    DO;                                                  00539000
  651.                       C_OPERATION = 'DC';                               00540000
  652.                       C_OPERANDS = '(('||CHIGH||'-'||CLOW||             00541000
  653.                       ')/4+1)S(X''7F0''(4),'||CLABELI||')';             00542000
  654.                    END;                                                 00543000
  655.                 CALL WFLUSH;                                            00544000
  656.                 IF ^RCHAR(',') THEN                          /*RAF-32*/ 00545000
  657.                    GO TO END_CASE_LIST;                      /*RAF-32*/ 00546000
  658.                END;                                                     00547000
  659.            END;                                                         00548000
  660.            END_CASE_LIST:                                    /*RAF-32*/ 00548500
  661.            IF ^RCHAR(':') THEN                               /*RAF-32*/ 00548600
  662.               CALL ERROR('CCASE: MISSING COLON INSERTED');   /*RAF-32*/ 00548700
  663.            GEN('ORG',TLABEL);                                           00549000
  664.            IF ^RCHAR(';') THEN                                          00550000
  665.               DO;                                                       00551000
  666.                  CALL WLABEL(CLABELI);                                  00552000
  667.                  BRANCH_LAST=#TRUE;                          /*RAF-32*/ 00552500
  668.                  CALL STMNT;                                            00553000
  669.                  IF ^RCHAR(';') THEN                                    00554000
  670.                     CALL ERROR('CA10: MISSING SEMICOLON INSERTED.') ;   00555000
  671.               /* CALL RWORD; */                              /*RAF-32*/ 00556000
  672.               /* IF WORD ^= 'ENDCASE' THEN  */               /*RAF-32*/ 00557000
  673.               /*    GEN('B',CLABELE);   */                   /*RAF-32*/ 00558000
  674.               END;                                                      00559000
  675.            ELSE                                                         00560000
  676.               DO;                                                       00561000
  677.                  CALL EQVADD((CLABELI),(CLABELE));                      00562000
  678.               /* CALL RWORD;  */                             /*RAF-32*/ 00563000
  679.               END;                                                      00564000
  680.            NOCASE:                                           /*RAF-32*/ 00564500
  681.       END ;                                                             00565000
  682. 1                                                                       00566000
  683.       NESTLEV = NESTLEV-1;                                   /*RAF-34*/ 00566020
  684.                                                                         00566030
  685.       IF ELSEPART='' THEN DO;                                /*RAF-32*/ 00566050
  686.          IF RCHECK('ELSE') THEN DO;                          /*RAF-32*/ 00566100
  687.             CALL ERROR('CCASE: CHECK REQUIRED WITH ELSE');   /*RAF-32*/ 00566150
  688.             CALL STMNT;                                      /*RAF-32*/ 00566200
  689.             END;                                             /*RAF-32*/ 00566250
  690.          END;                                                /*RAF-32*/ 00566300
  691.       ELSE DO;                                               /*RAF-32*/ 00566350
  692.          GEN('B',CLABELE);                                   /*RAF-32*/ 00566400
  693.          CALL WLABEL(ELSEPART);                              /*RAF-32*/ 00566450
  694.          IF RCHECK('ELSE')                                   /*RAF-32*/ 00566500
  695.          THEN CALL STMNT;                                    /*RAF-32*/ 00566550
  696.          ELSE GEN('DC','H''0''');                            /*RAF-32*/ 00566600
  697.          END;                                                /*RAF-32*/ 00566650
  698.                                                              /*RAF-32*/ 00566700
  699.   /*  IF DOID(DOLEV)^='' THEN   */                           /*RAF-15*/ 00567000
  700.   /*     CALL EQVADD((DOID(DOLEV)),(CLABELB||'-4'));  */     /*RAF-15*/ 00568000
  701.       CALL WLABEL(CLABELE);                                             00569000
  702.       TLABEL = EXID(DOLEV);                                   /*RAF-8*/ 00569500
  703.       DOLEV = DOLEV-1;                                                  00570000
  704.    /* NESTLEV = NESTLEV-1; */                                /*RAF-34*/ 00571000
  705.       IF NESTLEV=0 THEN PREDLABLEV=0;                         /*RAF-6*/ 00571500
  706.       IF RCHECK('THEN') THEN CALL STMNT;                      /*RAF-8*/ 00571600
  707.       CALL CWLABEL(TLABEL);                                   /*RAF-9*/ 00571700
  708.       RETURN;                                                           00572000
  709.    END CCASE;                                                           00573000
  710. 1                                                                       00574000
  711.  /*  WHILE <PRED>  DO  <STMNT> | UNTIL <PRED>  DO  <STMNT>   */         00575000
  712.                                                                         00576000
  713.  CWHILE:                                                                00577000
  714.    PROCEDURE(UWB) RECURSIVE ;                                           00578000
  715.    DCL                                                                  00579000
  716.       UWB BIT(1), /* #FALSE => WHILE */                                 00580000
  717.       (TOP,BODY,FAILURE,DO_LABEL,THENPART) CHAR(8) VARYING;             00581000
  718.                                                                         00582000
  719.       DO_LABEL = CURLAB;                                                00583000
  720.       CALL SWLABEL(TOP);                                                00584000
  721.       FAILURE = GENSYM;                                                 00585000
  722.       BODY = '';                                                        00586000
  723.       CALL PREDICATE(BODY,FAILURE,@OUTER_PREDICATE,#DUMMY,UWB,#DUMMY,   00587000
  724.                      @B);                                               00588000
  725.       IF ^RCHECK('DO') THEN                                             00589000
  726.          CALL ERROR('CWHILE/UNTIL: "DO" INSERTED AFTER "'||WORD||'".'); 00590000
  727.       DOLEV = DOLEV+1;                                                  00591000
  728.       EXID(DOLEV) = '';                                                 00592000
  729.       DOLABEL(DOLEV) = DO_LABEL;                                        00593000
  730.       DOID(DOLEV) = TOP;                                                00594000
  731.       CALL STMNT;                                                       00595000
  732.       GEN('B',TOP);                                                     00596000
  733.       CALL WLABEL(FAILURE);                                             00597000
  734.       THENPART = EXID(DOLEV);                                           00598000
  735.       DOLEV = DOLEV-1;                                                  00599000
  736.       IF RCHECK('THEN') THEN                                            00600000
  737.          CALL STMNT;                                                    00601000
  738.       CALL CWLABEL(THENPART);                                           00602000
  739.       RETURN;                                                           00603000
  740.    END CWHILE ;                                                         00604000
  741. 1                                                                       00605000
  742.  /*  DO <STMNT> UNTIL/WHILE <PRED>  |  FOR <REGISTER> | FOREVER */      00606000
  743.                                                                         00607000
  744.  CDO:                                                                   00608000
  745.    PROCEDURE RECURSIVE;                                                 00609000
  746.    DCL                                                                  00610000
  747.       FEVER BIT(1) INIT(#FALSE),                                        00611000
  748.       ELEV FIXED BIN,                                        /*RAF-37*/ 00611500
  749.       (BODY,PREDFAIL,THENPART) CHAR(8) VARYING,    /*RAF-13*/ /*RAF-8*/ 00612000
  750.       REG CHAR(64) VARYING;                                  /*RAF-13*/ 00612500
  751.                                                                         00613000
  752.       CALL SWLABEL(BODY);                                               00614000
  753.       PREDFAIL = '';                                                    00615000
  754.       DOLEV = DOLEV+1;                                                  00616000
  755.       EXID(DOLEV),DOID(DOLEV) = '';                                     00617000
  756.       DOLABEL(DOLEV) = CURLAB;                                          00618000
  757.       CALL STMNT;                                                       00619000
  758.       IF RCHECK('UNTIL') THEN                                           00620000
  759.          DO;                                                            00621000
  760.             CALL CWLABEL(DOID(DOLEV));                                  00622000
  761.             CALL PREDICATE(PREDFAIL,BODY,@OUTER_PREDICATE,#DUMMY,       00623000
  762.                            @USE_TRUTH,#DUMMY,@B);                       00624000
  763.          END;                                                           00625000
  764.       ELSE                                                              00626000
  765.          IF RCHECK('WHILE') THEN                                        00627000
  766.             DO;                                                         00628000
  767.                CALL CWLABEL(DOID(DOLEV));                               00629000
  768.                CALL PREDICATE(PREDFAIL,BODY,@OUTER_PREDICATE,#DUMMY,    00630000
  769.                               @USE_NEGATED,#DUMMY,@B);                  00631000
  770.             END;                                                        00632000
  771.          ELSE                                                           00633000
  772.             IF RCHECK('FOR') THEN                                       00634000
  773.                DO;                                                      00635000
  774.                   CALL CWLABEL(DOID(DOLEV));                            00636000
  775.                   CALL ROPANDS(#TRUE);                       /*RAF-13*/ 00637000
  776.                   IF OPANDS^='' THEN                         /*RAF-13*/ 00638000
  777.                      REG=OPANDS;                             /*RAF-13*/ 00639000
  778.                   ELSE                                                  00640000
  779.                      DO;                                                00641000
  780.                         REG='0';                                        00642000
  781.                         CALL ERROR('CDO: MISSING "FOR" REGISTER.');     00643000
  782.                      END;                                               00644000
  783.                   GEN('BCT',REG||','||BODY);                            00645000
  784.                END;                                                     00646000
  785.             ELSE                                                        00647000
  786.                IF RCHECK('FOREVER') THEN                                00648000
  787.                   DO;                                                   00649000
  788.                      FEVER = #TRUE;                                     00650000
  789.                      CALL CWLABEL(DOID(DOLEV));                         00651000
  790.                      GEN('B',BODY);                                     00652000
  791.                   END;                                                  00653000
  792.                ELSE                                                     00654000
  793.                   IF DOID(DOLEV) ^= '' THEN DO;              /*RAF-37*/ 00655000
  794.                      ELEV = EQVLEV+1;                        /*RAF-37*/ 00655500
  795.                      CALL EQVADD((DOID(DOLEV)),(BODY));                 00656000
  796.                      CALL EQVFLUSH(#FALSE,ELEV);             /*RAF-37*/ 00656100
  797.                      END;                                    /*RAF-37*/ 00656200
  798. 1                                                                       00657000
  799.       THENPART = EXID(DOLEV);                                 /*RAF-8*/ 00657100
  800.       DOLEV = DOLEV-1;                                        /*RAF-8*/ 00657200
  801.       IF RCHECK('THEN') THEN                                            00658000
  802.          DO;                                                            00659000
  803.             IF FEVER THEN                                               00660000
  804.                CALL ERROR('CDO: INAPPROPRIATE "THEN" IGNORED.');        00661000
  805.             CALL STMNT;                                                 00662000
  806.          END;                                                           00663000
  807.       CALL CWLABEL(THENPART);                                 /*RAF-8*/ 00664000
  808.    /* DOLEV = DOLEV-1; */                                     /*RAF-8*/ 00665000
  809.       RETURN;                                                           00666000
  810.    END CDO;                                                             00667000
  811. 1                                                                       00668000
  812.  /* UTILITY PROCEDURE FOR LOOP CONSTRUCTS */                            00669000
  813.  CURLAB: PROCEDURE RETURNS(CHAR(8) VARYING);                            00670000
  814.   DCL CLABEL CHAR(8) VARYING,                                           00671000
  815.       I FIXED BIN;                                                      00672000
  816.                                                                         00673000
  817.   IF C_LABEL = ' '                                                      00674000
  818.    | ((SUBSTR(C_LABEL,1,1)<'A' | SUBSTR(C_LABEL,1,1)>'Z')    /*RAF-30*/ 00675000
  819.       & SUBSTR(C_LABEL,1,1)^='&') THEN                       /*RAF-30*/ 00676000
  820.      DO;                                                                00677000
  821.         DO I=LABLEV TO 1 BY -1                                          00678000
  822.          WHILE(SUBSTR(LABSTK(I),1,1)<'A'                                00679000
  823.              | SUBSTR(LABSTK(I),1,1)>'Z');                              00680000
  824.         END;                                                            00681000
  825.         IF I>0 THEN                                                     00682000
  826.            CLABEL = LABSTK(I);                                          00683000
  827.         ELSE                                                            00684000
  828.            CLABEL = '';                                                 00685000
  829.      END;                                                               00686000
  830.   ELSE                                                                  00687000
  831.      CLABEL = C_LABEL;                                                  00688000
  832.   RETURN(CLABEL);                                                       00689000
  833.  END CURLAB;                                                            00690000
  834. 1                                                                       00691000
  835.  /*  FOR <REGISTER> DO <STATEMENT>  */                                  00692000
  836.                                                                         00693000
  837.  CFOR:                                                                  00694000
  838.    PROCEDURE RECURSIVE;                                                 00695000
  839.    DCL                                                                  00696000
  840.       (GEN1,GEN2,GEN3) CHAR(8) VARYING,                      /*RAF-13*/ 00697000
  841.       REG CHAR(64) VARYING;                                  /*RAF-13*/ 00697500
  842.                                                                         00698000
  843.       GEN3 = CURLAB;                                                    00699000
  844.       GEN1 = GENSYM;                                                    00700000
  845.       GEN2 = GENSYM;                                                    00701000
  846.       DOLEV = DOLEV+1;                                                  00702000
  847.       EXID(DOLEV),DOID(DOLEV) = '';                                     00703000
  848.       DOLABEL(DOLEV) = GEN3;                                            00704000
  849.       CALL ROPANDS(#TRUE);                                   /*RAF-13*/ 00705000
  850.       IF OPANDS^='' THEN                                     /*RAF-13*/ 00706000
  851.          REG = OPANDS;                                       /*RAF-13*/ 00707000
  852.       ELSE                                                              00708000
  853.          DO;                                                            00709000
  854.             REG = '0';                                                  00710000
  855.             CALL ERROR('CFOR: MISSING "FOR" REGISTER.');                00711000
  856.          END;                                                           00712000
  857.       GEN('LTR',REG||','||REG);                                         00713000
  858.       GEN('BNP',GEN2);                                                  00714000
  859.       CALL WLABEL(GEN1);                                                00715000
  860.       IF ^RCHECK('DO') THEN                                             00716000
  861.          CALL ERROR('CFOR: "DO" INSERTED AFTER "'||REG||'".');          00717000
  862.       CALL STMNT;                                                       00718000
  863.       CALL CWLABEL(DOID(DOLEV));                                        00719000
  864.       GEN('BCT',REG||','||GEN1);                                        00720000
  865.       CALL WLABEL(GEN2);                                                00721000
  866.       GEN3 = EXID(DOLEV);                                               00722000
  867.       DOLEV = DOLEV-1;                                                  00723000
  868.       IF RCHECK('THEN') THEN                                            00724000
  869.          CALL STMNT;                                                    00725000
  870.       CALL CWLABEL(GEN3);                                               00726000
  871.       RETURN;                                                           00727000
  872.    END CFOR;                                                            00728000
  873. 1                                                                       00729000
  874.  /*  FOREVER DO <STATEMENT>  */                                         00730000
  875.                                                                         00731000
  876.  CFOREVER:                                                              00732000
  877.    PROCEDURE RECURSIVE ;                                                00733000
  878.    DCL                                                                  00734000
  879.       (GEN1,GEN2) CHAR(8) VARYING;                                      00735000
  880.                                                                         00736000
  881.       GEN1 = CURLAB;                                                    00737000
  882.       CALL SWLABEL(GEN2) ;                                              00738000
  883.       DOLEV = DOLEV+1;                                                  00739000
  884.       EXID(DOLEV),DOID(DOLEV) = '';                                     00740000
  885.       DOLABEL(DOLEV) = GEN1;                                            00741000
  886.       IF ^RCHECK('DO') THEN                                             00742000
  887.          CALL ERROR('CFOREVER: "DO" ASSUMED AFTER "FOREVER".');         00743000
  888.       CALL STMNT ;                                                      00744000
  889.       CALL CWLABEL(DOID(DOLEV));                                        00745000
  890.       GEN('B',GEN2);                                                    00746000
  891.       CALL CWLABEL(EXID(DOLEV));                                        00747000
  892.       DOLEV = DOLEV-1;                                                  00748000
  893.       IF RCHECK('THEN') THEN                                            00749000
  894.          CALL ERROR('CFOREVER: INAPPROPRIATE "THEN" IGNORED.');         00750000
  895.       RETURN;                                                           00751000
  896.    END CFOREVER ;                                                       00752000
  897. 1                                                                       00753000
  898.  /*  GOTO  <LABEL>  |  GOTO  <LABEL> IF <PREDICATE>  */                 00754000
  899.  /*  RGOTO <LABEL>  |  RGOTO <LABEL> IF <PREDICATE>  */                 00755000
  900.                                                                         00756000
  901.  CGOTO:                                                                 00757000
  902.    PROCEDURE(RTYPE) RECURSIVE;                                          00758000
  903.    DCL                                                                  00759000
  904.       RTYPE BIT(1);                                                     00760000
  905.    DCL                                                                  00761000
  906.       IFF BIT(1), /* FOR RCHECK */                                      00762000
  907.       TARGET CHAR(25) VARYING,                                          00763000
  908.       FAIL CHAR(8) VARYING;                                             00764000
  909.                                                                         00765000
  910.    CALL ROPANDS(#FALSE);                           /*RAF-39*/ /*RAF-9*/ 00766000
  911.    TARGET = OPANDS;                                                     00767000
  912.    FAIL = '';                                                           00768000
  913.    IF RCHECK('IF') THEN                                                 00769000
  914.       IF CHAR = ';' | CHAR = '>' THEN                                   00770000
  915.             CALL ERROR('CGOTO: EXTRANEOUS "IF" IGNORED.');              00771000
  916.          ELSE                                                           00772000
  917.             CALL PREDICATE(FAIL,TARGET,@OUTER_PREDICATE,#DUMMY,         00773000
  918.                            @USE_NEGATED,#DUMMY,RTYPE);                  00774000
  919.    ELSE                                                                 00775000
  920.       DO;                                                               00776000
  921.          IF RTYPE THEN                                                  00777000
  922.             C_OPERATION = 'BR';                                         00778000
  923.          ELSE                                                           00779000
  924.             C_OPERATION = 'B';                                          00780000
  925.          GEN('',OPANDS);                                                00781000
  926.       END;                                                              00782000
  927.    RETURN;                                                              00783000
  928.    END CGOTO;                                                           00784000
  929. 1                                                                       00785000
  930.  /*  EXIT FROM <BLOCK LABEL> IF <PREDICATE>  */                         00786000
  931.                                                                         00787000
  932.  CEXIT: PROCEDURE RECURSIVE;                                            00788000
  933.       DCL                                                               00789000
  934.          I FIXED BIN,                                                   00790000
  935.          (EXLABEL,FAIL) CHAR(8) VARYING;                                00791000
  936.                                                                         00792000
  937.       IF DOLEV > 0 THEN                                                 00793000
  938.          DO;                                                            00794000
  939.             EXLABEL,FAIL = ''; I = 0;                                   00795000
  940.             IF RCHECK('FROM') THEN                                      00796000
  941.                IF CHAR = ';' | CHAR = '>' THEN                          00797000
  942.                   CALL ERROR('CEXIT: EXTRANEOUS "FROM" IGNORED.');      00798000
  943.                ELSE                                                     00799000
  944.                   DO;                                                   00800000
  945.                      CALL RLABEL;                            /*RAF-16*/ 00801000
  946.                      IF WORD^='' THEN                        /*RAF-16*/ 00802000
  947.                         DO;                                             00803000
  948.                            DO I=1 TO DOLEV WHILE(DOLABEL(I)^=WORD);     00804000
  949.                            END;                                         00805000
  950.                            IF I>DOLEV THEN                              00806000
  951.                               DO;                                       00807000
  952.                                  I = 0;                                 00808000
  953.                                  CALL ERROR('CEXIT: NO LABEL TO MATCH "'00809000
  954.                                             ||WORD||'".');              00810000
  955.                               END;                                      00811000
  956.                            ELSE                                         00812000
  957.                               EXLABEL = EXID(I);                        00813000
  958.                         END;                                            00814000
  959.                      ELSE                                               00815000
  960.                        CALL ERROR('CEXIT: LABEL MISSING AFTER "FROM".');00816000
  961.                   END;                                                  00817000
  962.             IF I=0 THEN I=DOLEV;                                        00818000
  963.             IF EXLABEL = '' THEN                                        00819000
  964.                DO;                                                      00820000
  965.                   IF EXID(I) = '' THEN                                  00821000
  966.                      EXID(I) = GENSYM;                                  00822000
  967.                   EXLABEL = EXID(I);                                    00823000
  968.                END;                                                     00824000
  969.             IF RCHECK('IF') THEN                                        00825000
  970.                IF CHAR = ';' | CHAR = '>' THEN                          00826000
  971.                   CALL ERROR('CEXIT: EXTRANEOUS "IF" IGNORED.');        00827000
  972.                ELSE                                                     00828000
  973.                   CALL PREDICATE(FAIL,EXLABEL,@OUTER_PREDICATE,#DUMMY,  00829000
  974.                                  @USE_NEGATED,#DUMMY,@B);               00830000
  975.             ELSE                                                        00831000
  976.                GEN('B',EXLABEL);                                        00832000
  977.          END;                                                           00833000
  978.       ELSE                                                              00834000
  979.          CALL ERROR('CEXIT: NO CONTAINING LOOP STRUCTURE FOR "EXIT".'); 00835000
  980.       RETURN;                                                           00836000
  981.  END CEXIT ;                                                            00837000
  982. 1                                                                       00838000
  983.  /*  NEXT OF <BLOCK LABEL> IF <PREDICATE>  */                           00839000
  984.                                                                         00840000
  985.  CNEXT: PROCEDURE RECURSIVE;                                            00841000
  986.       DCL                                                               00842000
  987.          I FIXED BIN,                                                   00843000
  988.          (NXLABEL,FAIL) CHAR(8) VARYING;                                00844000
  989.                                                                         00845000
  990.       IF DOLEV > 0 THEN                                                 00846000
  991.          DO;                                                            00847000
  992.             NXLABEL,FAIL = ''; I = 0;                                   00848000
  993.             IF RCHECK('OF') THEN                                        00849000
  994.                IF CHAR = ';' | CHAR = '>' THEN                          00850000
  995.                   CALL ERROR('CNEXT: EXTRANEOUS "OF" IGNORED.');        00851000
  996.                ELSE                                                     00852000
  997.                   DO;                                                   00853000
  998.                      CALL RLABEL;                            /*RAF-16*/ 00854000
  999.                      IF WORD^='' THEN                        /*RAF-16*/ 00855000
  1000.                         DO;                                             00856000
  1001.                            DO I=1 TO DOLEV WHILE(DOLABEL(I)^=WORD);     00857000
  1002.                            END;                                         00858000
  1003.                            IF I>DOLEV THEN                              00859000
  1004.                               DO;                                       00860000
  1005.                                  I = 0;                                 00861000
  1006.                                  CALL ERROR('CEXIT: NO LABEL TO MATCH "'00862000
  1007.                                             ||WORD||'".');              00863000
  1008.                               END;                                      00864000
  1009.                            ELSE                                         00865000
  1010.                               NXLABEL = DOID(I);              /*RAF-1*/ 00866000
  1011.                         END;                                            00867000
  1012.                      ELSE                                               00868000
  1013.                        CALL ERROR('CNEXT: LABEL MISSING AFTER "OF".');  00869000
  1014.                   END;                                                  00870000
  1015.             IF I=0 THEN I=DOLEV;                                        00871000
  1016.             IF NXLABEL = '' THEN                                        00872000
  1017.                DO;                                                      00873000
  1018.                   IF DOID(I) = '' THEN                                  00874000
  1019.                      DOID(I) = GENSYM;                                  00875000
  1020.                   NXLABEL = DOID(I);                                    00876000
  1021.                END;                                                     00877000
  1022.             IF RCHECK('IF') THEN                                        00878000
  1023.                IF CHAR = ';' | CHAR = '>' THEN                          00879000
  1024.                   CALL ERROR('CNEXT: EXTRANEOUS "IF" IGNORED.');        00880000
  1025.                ELSE                                                     00881000
  1026.                   CALL PREDICATE(FAIL,NXLABEL,@OUTER_PREDICATE,#DUMMY,  00882000
  1027.                                  @USE_NEGATED,#DUMMY,@B);               00883000
  1028.             ELSE                                                        00884000
  1029.                GEN('B',NXLABEL);                                        00885000
  1030.          END;                                                           00886000
  1031.       ELSE                                                              00887000
  1032.          CALL ERROR('CNEXT: NO CONTAINING LOOP STRUCTURE FOR "NEXT".'); 00888000
  1033.       RETURN;                                                           00889000
  1034.  END CNEXT ;                                                            00890000
  1035. 1                                                                       00891000
  1036.  /*  USE <REGISTER> AS <DSECT> IN <STATEMENT>  */                       00892000
  1037.                                                                         00893000
  1038.  CUSE:                                                                  00894000
  1039.    PROCEDURE RECURSIVE;                                                 00895000
  1040.       DCL                                                               00896000
  1041.          REGSTR CHAR(51) VAR INIT(''),                                  00897000
  1042.          MULTUSE BIT(1) INIT(#TRUE),                                    00898000
  1043.          (REG,CONBLK) CHAR(8) VARYING;                                  00899000
  1044.                                                                         00900000
  1045.       CALL LABPUSH;                                                     00901000
  1046.       DO WHILE(MULTUSE);                                                00902000
  1047.          CALL RWORD;                                                    00903000
  1048.          IF WORDAL THEN                                                 00904000
  1049.             REG = WORD;                                                 00905000
  1050.          ELSE                                                           00906000
  1051.             DO;                                                         00907000
  1052.                REG = '?';                                               00908000
  1053.                CALL ERROR('CUSE: MISSING "USING" REGISTER, "'||         00909000
  1054.                           WORD||'" IGNORED');                           00910000
  1055.             END;                                                        00911000
  1056.          IF ^RCHECK('AS') THEN                                          00912000
  1057.             CALL ERROR('CUSE: "AS" ASSUMED BEFORE "'||WORD||'".');      00913000
  1058.          CALL RWORD;                                                    00914000
  1059.          IF WORDAL | WORD = '*' THEN                                    00915000
  1060.             CONBLK = WORD;                                              00916000
  1061.          ELSE                                                           00917000
  1062.             DO;                                                         00918000
  1063.                CONBLK = '???';                                          00919000
  1064.                CALL ERROR('CUSE: MISSING DSECT IDENTIFIER, "'||         00920000
  1065.                           WORD||'" IGNORED');                           00921000
  1066.             END;                                                        00922000
  1067.          GEN('USING',CONBLK||','||REG);                                 00923000
  1068.          REGSTR = REGSTR||','||REG;                                     00924000
  1069.          MULTUSE = RCHAR(',');                                          00925000
  1070.       END;                                                              00926000
  1071.       IF ^RCHECK('IN') THEN                                             00927000
  1072.          CALL ERROR('CUSE: "IN" ASSUMED AFTER "'||CONBLK||'".');        00928000
  1073.       CALL STMNT;                                                       00929000
  1074.       CALL LABPUSH;                                                     00930000
  1075.       GEN('DROP',SUBSTR(REGSTR,2));                                     00931000
  1076.       RETURN;                                                           00932000
  1077.  END CUSE;                                                              00933000
  1078. 1                                                                       00933010
  1079.  CASM: PROCEDURE RECURSIVE;                                   /*RAF-9*/ 00933020
  1080.                                                               /*RAF-9*/ 00933030
  1081.     CALL RWORD;  /* GET SUBSTATEMENT NAME */                  /*RAF-9*/ 00933040
  1082.                                                               /*RAF-9*/ 00933050
  1083.     IF WORD='IF' THEN CALL CASMIF;                            /*RAF-9*/ 00933060
  1084.     ELSE IF WORD='CASE' THEN CALL CASMCASE;                   /*RAF-9*/ 00933070
  1085.     ELSE IF WORD='WHILE' THEN CALL CASMWHILE(#FALSE);         /*RAF-9*/ 00933080
  1086.     ELSE IF WORD='UNTIL' THEN CALL CASMWHILE(#TRUE);          /*RAF-9*/ 00933090
  1087.     ELSE IF WORD='FOREVER' THEN CALL CASMFOREVER;             /*RAF-9*/ 00933100
  1088.     ELSE IF WORD='FOR' THEN CALL CASMFOR;                     /*RAF-9*/ 00933110
  1089.     ELSE IF WORD='DO' THEN CALL CASMDO;                       /*RAF-9*/ 00933120
  1090.     ELSE IF WORD='SELECT' THEN CALL CASMSELECT;               /*RAF-9*/ 00933130
  1091.     ELSE IF WORD='EXIT' THEN CALL CASMEXIT;                   /*RAF-9*/ 00933140
  1092.     ELSE IF WORD='NEXT' THEN CALL CASMNEXT;                   /*RAF-9*/ 00933150
  1093.     ELSE IF WORD='GOTO' THEN CALL CASMGOTO;                   /*RAF-9*/ 00933160
  1094.     ELSE CALL ERROR('CASM: '||WORD||' SHOULD NOT FOLLOW ASM');/*RAF-9*/ 00933170
  1095.                                                               /*RAF-9*/ 00933180
  1096.     RETURN;                                                   /*RAF-9*/ 00933190
  1097.     END;                                                      /*RAF-9*/ 00933200
  1098. 1                                                                       00934000
  1099.  /*  ASMIF <CONDITION> THEN <STATEMENT> |                               00935000
  1100.      ASMIF <CONDITION> THEN <STATEMENT> ELSE <STATEMENT> */             00936000
  1101.                                                                         00937000
  1102.  CASMIF:                                                                00938000
  1103.    PROCEDURE RECURSIVE ;                                                00939000
  1104.    DECLARE                                                              00940000
  1105.       (GS1,GS2) CHAR(8) VARYING,                                        00941000
  1106.       ELSEF BIT(1),                                                     00942000
  1107.       (L,ELEV) FIXED BIN,                                               00943000
  1108.       CONDSTR CHAR(170) VARYING;                                        00944000
  1109.                                                                         00945000
  1110.  /*   IF ^RCHAR('(') THEN                                  */ /*RAF-9*/ 00946000
  1111.  /*      DO;                                               */ /*RAF-9*/ 00947000
  1112.  /*         CALL ERROR('CASMIF: MISSING CONDITION CLAUSE.')*/ /*RAF-9*/ 00948000
  1113.  /*         RETURN;                                        */ /*RAF-9*/ 00949000
  1114.  /*      END;                                              */ /*RAF-9*/ 00950000
  1115.       CONDSTR = CONDSCAN(#FALSE);                             /*RAF-9*/ 00951000
  1116.       IF ^RCHECK('THEN') THEN                                           00952000
  1117.          CALL ERROR('CASMIF: "THEN" INSERTED AFTER ")".');              00953000
  1118.       CALL LABPUSH;                                                     00954000
  1119.       CALL LABFLUSH;                                                    00955000
  1120.       GS1 = GENSEQSYM;                                                  00956000
  1121.       C_OPERATION = 'AIF';                                              00957000
  1122.       CONDSTR = '(NOT '||CONDSTR||')'||GS1;                             00958000
  1123.       GEN_OPERANDS(CONDSTR);                                            00959000
  1124.       CALL ESQUISH;                                                     00960000
  1125.       ELEV = EQVLEV+1;                                                  00961000
  1126.       CALL STMNT;                                                       00962000
  1127.       CALL LABPUSH;                                                     00963000
  1128.       CALL LABFLUSH;                                                    00964000
  1129.       CALL EQVFLUSH(#FALSE,ELEV);                                       00965000
  1130.       ELSEF = RCHECK('ELSE');                                           00966000
  1131.       IF ELSEF THEN                                                     00967000
  1132.          DO;                                                            00968000
  1133.             GS2 = GENSEQSYM;                                            00969000
  1134.             GEN('AGO',GS2);                                             00970000
  1135.          END;                                                           00971000
  1136.       CALL WLABEL(GS1);                                                 00972000
  1137.       IF ELSEF THEN                                                     00973000
  1138.          DO;                                                            00974000
  1139.             CALL ESQUISH;                                               00975000
  1140.             ELEV = EQVLEV+1;                                            00976000
  1141.             CALL STMNT;                                                 00977000
  1142.             CALL LABPUSH;                                               00978000
  1143.             CALL LABFLUSH;                                              00979000
  1144.             CALL EQVFLUSH(#FALSE,ELEV);                                 00980000
  1145.             CALL WLABEL(GS2);                                           00981000
  1146.          END;                                                           00982000
  1147.       GEN('ANOP','');                                                   00983000
  1148.       RETURN;                                                           00984000
  1149.                                                               /*RAF-8*/ 00984005
  1150.  END CASMIF;                                                  /*RAF-8*/ 00984010
  1151. 1                                                                       00984015
  1152.  /* ASM CASE <SETA-VAR> ;        */                           /*RAF-9*/ 00984020
  1153.  /* <ASM CASE-LIST>              */                           /*RAF-9*/ 00984025
  1154.  /* ENDCASE                      */                           /*RAF-9*/ 00984030
  1155.                                                               /*RAF-9*/ 00984035
  1156.  CASMCASE: PROCEDURE RECURSIVE;                               /*RAF-9*/ 00984040
  1157.                                                               /*RAF-9*/ 00984045
  1158.     DECLARE                                                   /*RAF-9*/ 00984050
  1159.        (TCLABEL,NCLABEL,ECLABEL) CHAR(8) VARYING,  /*RAF-25*/ /*RAF-9*/ 00984055
  1160.        (SETVAR,CLOW) CHAR(170) VARYING;            /*RAF-25*/ /*RAF-9*/ 00984060
  1161.                                                               /*RAF-9*/ 00984065
  1162.     CALL ROPANDS(#FALSE);  /* GET SET VARIABLE */  /*RAF-48*/ /*RAF-9*/ 00984070
  1163.     IF OPANDS='' THEN DO;                                     /*RAF-9*/ 00984075
  1164.        CALL ERROR('CASMCASE-1: NO SET VARIABLE FOR ASM CASE');/*RAF-9*/ 00984080
  1165.        OPANDS = '&X';                                         /*RAF-9*/ 00984085
  1166.        END;                                                   /*RAF-9*/ 00984090
  1167.     SETVAR = OPANDS;                                          /*RAF-9*/ 00984095
  1168.                                                               /*RAF-9*/ 00984100
  1169.     IF ^RCHAR(';') THEN                                       /*RAF-9*/ 00984105
  1170.        CALL ERROR('CASMCASE-2: MISSING SEMICOLON INSERTED');  /*RAF-9*/ 00984110
  1171.                                                               /*RAF-9*/ 00984115
  1172.     ECLABEL = GENSEQSYM;  /* END LABEL */                     /*RAF-9*/ 00984120
  1173.     TCLABEL = '';  /* THIS-CASE LABEL */                      /*RAF-9*/ 00984125
  1174.     NCLABEL = GENSEQSYM;  /* NEXT-CASE LABEL */               /*RAF-9*/ 00984130
  1175.                                                               /*RAF-9*/ 00984135
  1176.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00984140
  1177.     ASMDOID(ASMDOLEV) = NCLABEL;  /* "NEXT" LABEL */          /*RAF-9*/ 00984145
  1178.     ASMEXID(ASMDOLEV) = '';  /* "EXIT" LABEL */               /*RAF-9*/ 00984150
  1179.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;  /* "FROM/OF" LABEL */  /*RAF-9*/ 00984155
  1180.                                                               /*RAF-9*/ 00984160
  1181.     NESTLEV = NESTLEV+1;  /* INCREASE NESTING LEVEL */        /*RAF-9*/ 00984165
  1182.     NESTID(NESTLEV) = CIN_ID;                                 /*RAF-9*/ 00984170
  1183.                                                               /*RAF-9*/ 00984175
  1184.     CALL LABPUSH; CALL LABFLUSH;  /* CLEAR LABEL STACK */     /*RAF-9*/ 00984180
  1185.                                                               /*RAF-9*/ 00984185
  1186.     CALL ROPANDS(#TRUE);  /* SCAN FOR CASE LABEL */           /*RAF-9*/ 00984190
  1187.     DO WHILE(OPANDS^='ENDCASE');  /* LOOP UNTIL ENDCASE */    /*RAF-9*/ 00984195
  1188.        IF OPANDS='' THEN                                      /*RAF-9*/ 00984200
  1189.           CALL ERROR('CASMCASE-3: MISSING CASE LABEL');       /*RAF-9*/ 00984205
  1190.        IF TCLABEL='' THEN DO;                                 /*RAF-9*/ 00984210
  1191.           TCLABEL = GENSEQSYM;                                /*RAF-9*/ 00984215
  1192.           CALL CWLABEL(NCLABEL);  /* LABEL THIS CASE */       /*RAF-9*/ 00984220
  1193.           NCLABEL = GENSEQSYM;  /* LABEL FOR NEXT CASE */     /*RAF-9*/ 00984225
  1194.           END;                                                /*RAF-9*/ 00984230
  1195.        IF ^RCHECK('THRU') THEN DO;  /* SINGLE CASE */         /*RAF-9*/ 00984235
  1196.           GEN('AIF','('||SETVAR||' EQ '||OPANDS||')'||        /*RAF-9*/ 00984240
  1197.                     TCLABEL);                                 /*RAF-9*/ 00984245
  1198.           END;                                                /*RAF-9*/ 00984250
  1199.        ELSE DO;                                               /*RAF-9*/ 00984255
  1200.           CLOW = OPANDS;                                      /*RAF-9*/ 00984260
  1201.           CALL ROPANDS(#TRUE);  /* GET HIGH VALUE */          /*RAF-9*/ 00984265
  1202.           GEN('AIF','(('||SETVAR||' GE '||CLOW||') AND ('||   /*RAF-9*/ 00984270
  1203.                     SETVAR||' LE '||OPANDS||'))'||TCLABEL);   /*RAF-9*/ 00984275
  1204.           END;                                                /*RAF-9*/ 00984280
  1205.        IF RCHAR(',') THEN DO;  /* MORE CASES */               /*RAF-9*/ 00984285
  1206.           IF TCLABEL='' THEN                                  /*RAF-9*/ 00984290
  1207.           CALL ERROR('CASMCASE-4: EXTRANEOUS COMMA IGNORED'); /*RAF-9*/ 00984295
  1208.           CALL ROPANDS(#TRUE);  /* READ NEXT CASE VALUE */    /*RAF-9*/ 00984300
  1209.           END;                                                /*RAF-9*/ 00984305
  1210.        ELSE IF RCHAR(':') THEN DO;  /* BODY OF CASE */        /*RAF-9*/ 00984310
  1211.           IF TCLABEL='' THEN DO;                              /*RAF-9*/ 00984315
  1212.              CALL ERROR('CASMCASE-5: MISSING CASE LABEL');    /*RAF-9*/ 00984320
  1213.              END;                                             /*RAF-9*/ 00984325
  1214.           GEN('AGO',NCLABEL);  /* TRY NEXT CASE */            /*RAF-9*/ 00984330
  1215.           CALL CWLABEL(TCLABEL);  /* LABEL CASE BODY */       /*RAF-9*/ 00984335
  1216.           CALL ASMSTMNT;  /* GET A STATEMENT */               /*RAF-9*/ 00984340
  1217.           GEN('AGO',ECLABEL);  /* EXIT FROM CASE */           /*RAF-9*/ 00984345
  1218.           TCLABEL = '';  /* INDICATE NO CASE */               /*RAF-9*/ 00984350
  1219.           IF ^RCHAR(';') THEN                                 /*RAF-9*/ 00984355
  1220.           CALL ERROR('CASMCASE-6: MISSING SEMICOLON INSERTED' /*RAF-9*/ 00984360
  1221.                     );                                        /*RAF-9*/ 00984365
  1222.           CALL ROPANDS(#TRUE);  /* READ NEXT CASE VALUE */    /*RAF-9*/ 00984370
  1223.           END;                                                /*RAF-9*/ 00984375
  1224.        ELSE DO;                                               /*RAF-9*/ 00984380
  1225.           CALL RWORD; CALL RCHAR(';');                        /*RAF-9*/ 00984385
  1226.           CALL ERROR('CASMCASE-7: EXTRANEOUS '||WORD||        /*RAF-9*/ 00984390
  1227.                                   ' IGNORED');                /*RAF-9*/ 00984395
  1228.           END;                                                /*RAF-9*/ 00984400
  1229.        END;                                                   /*RAF-9*/ 00984405
  1230.                                                               /*RAF-9*/ 00984410
  1231.     NESTLEV = NESTLEV-1;                                     /*RAF-25*/ 00984412
  1232.                                                              /*RAF-25*/ 00984413
  1233.     CALL WLABEL(NCLABEL);  /* NO MATCHING CASE */             /*RAF-9*/ 00984415
  1234.     GEN('ANOP','');                                          /*RAF-23*/ 00984417
  1235.     IF RCHECK('ELSE') THEN CALL ASMSTMNT;                    /*RAF-18*/ 00984418
  1236.     ELSE GEN('MNOTE','4,''ASM CASE OUT OF RANGE''');/*RAF-9*//*RAF-18*/ 00984420
  1237.                                                               /*RAF-9*/ 00984425
  1238.     CALL WLABEL(ECLABEL);  /* ENDCASE LABEL */                /*RAF-9*/ 00984430
  1239.                                                               /*RAF-9*/ 00984435
  1240.     ECLABEL = ASMEXID(ASMDOLEV);                              /*RAF-9*/ 00984440
  1241.     ASMDOLEV = ASMDOLEV-1;                                    /*RAF-9*/ 00984445
  1242.  /* NESTLEV = NESTLEV-1; */                        /*RAF-25*/ /*RAF-9*/ 00984450
  1243.     IF NESTLEV=0 THEN PREDLABLEV=0;                           /*RAF-9*/ 00984455
  1244.     IF RCHECK('THEN') THEN                                    /*RAF-9*/ 00984460
  1245.        CALL ASMSTMNT;  /* GET A STATEMENT */                  /*RAF-9*/ 00984465
  1246.                                                               /*RAF-9*/ 00984470
  1247.     GEN('ANOP','');                                          /*RAF-22*/ 00984477
  1248.     CALL CWLABEL(ECLABEL);            /* "EXIT" LABEL */      /*RAF-9*/ 00984478
  1249.     GEN('ANOP','');                                          /*RAF-35*/ 00984479
  1250.     END CASMCASE;                                             /*RAF-9*/ 00984480
  1251. 1                                                                       00984485
  1252.  /*  ASM WHILE <COND> DO <STMNT> THEN <STMNT>  */             /*RAF-9*/ 00984490
  1253.  /*  ASM UNTIL <COND> DO <STMNT> THEN <STMNT>  */             /*RAF-9*/ 00984495
  1254.                                                               /*RAF-9*/ 00984500
  1255.  CASMWHILE: PROCEDURE(UWB) RECURSIVE;                         /*RAF-9*/ 00984505
  1256.                                                               /*RAF-9*/ 00984510
  1257.     DECLARE                                                   /*RAF-9*/ 00984515
  1258.        UWB BIT(1),  /* FALSE => WHILE */                      /*RAF-9*/ 00984520
  1259.        (TOP,FAILURE,THENPART) CHAR(8) VARYING;                /*RAF-9*/ 00984525
  1260.                                                               /*RAF-9*/ 00984530
  1261.     TOP = GENSEQSYM;  /* TOP OF LOOP */                       /*RAF-9*/ 00984535
  1262.     FAILURE = GENSEQSYM; /* END LABEL */                      /*RAF-9*/ 00984540
  1263.                                                               /*RAF-9*/ 00984545
  1264.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00984550
  1265.     ASMDOID(ASMDOLEV) = TOP;  /* "NEXT" LABEL */              /*RAF-9*/ 00984555
  1266.     ASMEXID(ASMDOLEV) = '';   /* "EXIT" LABEL */              /*RAF-9*/ 00984560
  1267.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;  /* "FROM" LABEL */     /*RAF-9*/ 00984565
  1268.                                                               /*RAF-9*/ 00984570
  1269.     CALL LABPUSH; CALL LABFLUSH;  /* FLUSH LABEL STACK */     /*RAF-9*/ 00984575
  1270.                                                               /*RAF-9*/ 00984580
  1271.     CALL WLABEL(TOP);                                         /*RAF-9*/ 00984585
  1272.     IF UWB                                                    /*RAF-9*/ 00984590
  1273.     THEN GEN('AIF',CONDSCAN(#FALSE)||FAILURE);  /* UNTIL */   /*RAF-9*/ 00984595
  1274.     ELSE GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||FAILURE);  /*RAF-9*/ 00984600
  1275.                                                               /*RAF-9*/ 00984605
  1276.     IF ^RCHECK('DO') THEN                                     /*RAF-9*/ 00984610
  1277.        CALL ERROR('CASMWHILE/UNTIL: MISSING "DO" INSERTED');  /*RAF-9*/ 00984615
  1278.                                                               /*RAF-9*/ 00984620
  1279.     CALL ASMSTMNT;  /* GET A STATEMENT */                     /*RAF-9*/ 00984625
  1280.                                                               /*RAF-9*/ 00984630
  1281.     GEN('AGO',TOP);                                           /*RAF-9*/ 00984635
  1282.     CALL WLABEL(FAILURE);                                     /*RAF-9*/ 00984640
  1283.                                                               /*RAF-9*/ 00984645
  1284.     THENPART = ASMEXID(ASMDOLEV);                             /*RAF-9*/ 00984650
  1285.     ASMDOLEV = ASMDOLEV-1;                                    /*RAF-9*/ 00984655
  1286.     IF RCHECK('THEN') THEN CALL ASMSTMNT;                     /*RAF-9*/ 00984660
  1287.                                                               /*RAF-9*/ 00984665
  1288.     CALL CWLABEL(THENPART);                                   /*RAF-9*/ 00984670
  1289.     GEN('ANOP','');                                          /*RAF-22*/ 00984672
  1290.                                                               /*RAF-9*/ 00984675
  1291.     RETURN;                                                   /*RAF-9*/ 00984680
  1292.     END CASMWHILE;                                            /*RAF-9*/ 00984685
  1293. 1                                                                       00984690
  1294.  /*  ASM FOR <SETA-VAR> FROM <SETA-EXPR> BY <SETA-EXPR>  */   /*RAF-9*/ 00984695
  1295.  /*      TO <SETA-EXPR> DO <STMNT> THEN <STMNT>          */   /*RAF-9*/ 00984700
  1296.                                                               /*RAF-9*/ 00984705
  1297.  CASMFOR: PROCEDURE RECURSIVE;                                /*RAF-9*/ 00984710
  1298.                                                               /*RAF-9*/ 00984715
  1299.     DECLARE                                                   /*RAF-9*/ 00984720
  1300.        VAR CHAR(8) VARYING,                                   /*RAF-9*/ 00984725
  1301.        (FROMVAL,BYVAL,TOVAL) CHAR(170) VARYING,               /*RAF-9*/ 00984730
  1302.        (TOP,DONE,THENPART) CHAR(8) VARYING;                   /*RAF-9*/ 00984735
  1303.                                                               /*RAF-9*/ 00984740
  1304.     TOP = GENSEQSYM;                                          /*RAF-9*/ 00984745
  1305.     DONE = GENSEQSYM;                                         /*RAF-9*/ 00984750
  1306.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00984755
  1307.     ASMDOID(ASMDOLEV) = '';                                   /*RAF-9*/ 00984760
  1308.     ASMEXID(ASMDOLEV) = '';                                   /*RAF-9*/ 00984765
  1309.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;                         /*RAF-9*/ 00984770
  1310.                                                               /*RAF-9*/ 00984775
  1311.     CALL RLABEL;  /* GET SETA VARIABLE */                     /*RAF-9*/ 00984780
  1312.     IF WORD^='' THEN DO;                                      /*RAF-9*/ 00984785
  1313.        IF SUBSTR(WORD,1,1)^='&' THEN                          /*RAF-9*/ 00984790
  1314.        CALL ERROR('CASMFOR-1: ILLEGAL SETA VARIABLE');        /*RAF-9*/ 00984795
  1315.        VAR = WORD;                                            /*RAF-9*/ 00984800
  1316.        END;                                                   /*RAF-9*/ 00984805
  1317.     ELSE DO;                                                  /*RAF-9*/ 00984810
  1318.        CALL ERROR('CASMFOR-2: MISSING SETA VARIABLE');        /*RAF-9*/ 00984815
  1319.        VAR = '&X';                                            /*RAF-9*/ 00984820
  1320.        END;                                                   /*RAF-9*/ 00984825
  1321.                                                               /*RAF-9*/ 00984830
  1322.     FROMVAL = '0'; BYVAL = '1'; TOVAL = '';  /* DEFAULTS */   /*RAF-9*/ 00984835
  1323.     DO WHILE(#TRUE);                                          /*RAF-9*/ 00984840
  1324.        IF RCHECK('DO') THEN GO TO DO_FOUND;                   /*RAF-9*/ 00984845
  1325.        IF RCHECK('FROM') THEN DO;                             /*RAF-9*/ 00984850
  1326.           CALL ROPANDS(#TRUE);                                /*RAF-9*/ 00984855
  1327.           IF OPANDS='' THEN                                   /*RAF-9*/ 00984860
  1328.              CALL ERROR('CASMFOR-3: MISSING "FROM" VALUE');   /*RAF-9*/ 00984865
  1329.           ELSE FROMVAL = OPANDS;                              /*RAF-9*/ 00984870
  1330.           END;                                                /*RAF-9*/ 00984875
  1331.        ELSE IF RCHECK('BY') THEN DO;                          /*RAF-9*/ 00984880
  1332.           CALL ROPANDS(#TRUE);                                /*RAF-9*/ 00984885
  1333.           IF OPANDS='' THEN                                   /*RAF-9*/ 00984890
  1334.              CALL ERROR('CASMFOR-4: MISSING "BY" VALUE');     /*RAF-9*/ 00984895
  1335.           ELSE BYVAL = OPANDS;                                /*RAF-9*/ 00984900
  1336.           END;                                                /*RAF-9*/ 00984905
  1337.        ELSE IF RCHECK('TO') THEN DO;                          /*RAF-9*/ 00984910
  1338.           CALL ROPANDS(#TRUE);                                /*RAF-9*/ 00984915
  1339.           IF OPANDS='' THEN                                   /*RAF-9*/ 00984920
  1340.              CALL ERROR('CASMFOR-5: MISSING "TO" VALUE');     /*RAF-9*/ 00984925
  1341.           ELSE TOVAL = OPANDS;                                /*RAF-9*/ 00984930
  1342.           END;                                                /*RAF-9*/ 00984935
  1343.        ELSE DO;                                               /*RAF-9*/ 00984940
  1344.           CALL ERROR('CASMFOR: MISSING "DO" INSERTED');       /*RAF-9*/ 00984945
  1345.           GO TO DO_FOUND;                                     /*RAF-9*/ 00984950
  1346.           END;                                                /*RAF-9*/ 00984955
  1347.        END;                                                   /*RAF-9*/ 00984960
  1348.     DO_FOUND:                                                 /*RAF-9*/ 00984965
  1349.                                                               /*RAF-9*/ 00984970
  1350.     CALL LABPUSH; CALL LABFLUSH;                              /*RAF-9*/ 00984975
  1351.     CALL WLABEL(VAR);                                         /*RAF-9*/ 00984980
  1352.     GEN('SETA',FROMVAL);                                      /*RAF-9*/ 00984985
  1353.     CALL WLABEL(TOP);                                         /*RAF-9*/ 00984990
  1354.     IF TOVAL^='' THEN DO;                                     /*RAF-9*/ 00984995
  1355.        GEN('AIF','(('||BYVAL||' GT 0) AND ('||VAR||' GT '||   /*RAF-9*/ 00985000
  1356.                  TOVAL||'))'||DONE);                          /*RAF-9*/ 00985005
  1357.        GEN('AIF','(('||BYVAL||' LT 0) AND ('||VAR||' LT '||   /*RAF-9*/ 00985010
  1358.                  TOVAL||'))'||DONE);                          /*RAF-9*/ 00985015
  1359.        END;                                                   /*RAF-9*/ 00985020
  1360.     CALL ASMSTMNT;                                            /*RAF-9*/ 00985025
  1361.     CALL CWLABEL(ASMDOID(ASMDOLEV));                          /*RAF-9*/ 00985030
  1362.     CALL WLABEL(VAR);                                         /*RAF-9*/ 00985035
  1363.     GEN('SETA',VAR||'+'||BYVAL);                              /*RAF-9*/ 00985040
  1364.     GEN('AGO',TOP);                                           /*RAF-9*/ 00985045
  1365.     CALL WLABEL(DONE);                                        /*RAF-9*/ 00985050
  1366.     GEN('ANOP','');                                          /*RAF-35*/ 00985052
  1367.                                                               /*RAF-9*/ 00985055
  1368.     THENPART = ASMEXID(ASMDOLEV);                             /*RAF-9*/ 00985060
  1369.     ASMDOLEV = ASMDOLEV-1;                                    /*RAF-9*/ 00985065
  1370.     IF RCHECK('THEN') THEN CALL ASMSTMNT;                     /*RAF-9*/ 00985070
  1371.     CALL CWLABEL(THENPART);                                   /*RAF-9*/ 00985075
  1372.     IF THENPART^='' THEN GEN('ANOP','');          /*RAF-27*/ /*RAF-22*/ 00985077
  1373.                                                               /*RAF-9*/ 00985080
  1374.     RETURN;                                                   /*RAF-9*/ 00985085
  1375.     END CASMFOR;                                              /*RAF-9*/ 00985090
  1376. 1                                                                       00985095
  1377.  /*  ASM FOREVER DO <STMNT>  */                               /*RAF-9*/ 00985100
  1378.                                                               /*RAF-9*/ 00985105
  1379.  CASMFOREVER: PROCEDURE RECURSIVE;                            /*RAF-9*/ 00985110
  1380.                                                               /*RAF-9*/ 00985115
  1381.     DECLARE TOP CHAR(8) VARYING;                              /*RAF-9*/ 00985120
  1382.                                                               /*RAF-9*/ 00985125
  1383.     IF ^RCHECK('DO') THEN                                     /*RAF-9*/ 00985130
  1384.     CALL ERROR('CASMFOREVER-1: MISSING "DO" INSERTED');       /*RAF-9*/ 00985135
  1385.                                                               /*RAF-9*/ 00985140
  1386.     TOP = GENSEQSYM;                                          /*RAF-9*/ 00985145
  1387.                                                               /*RAF-9*/ 00985150
  1388.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00985155
  1389.     ASMDOID(ASMDOLEV) = TOP;                                  /*RAF-9*/ 00985160
  1390.     ASMEXID(ASMDOLEV) = '';                                   /*RAF-9*/ 00985165
  1391.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;                         /*RAF-9*/ 00985170
  1392.                                                               /*RAF-9*/ 00985175
  1393.     CALL LABPUSH; CALL LABFLUSH;                              /*RAF-9*/ 00985180
  1394.                                                               /*RAF-9*/ 00985185
  1395.     CALL WLABEL(TOP);                                         /*RAF-9*/ 00985190
  1396.     CALL ASMSTMNT;                                            /*RAF-9*/ 00985195
  1397.     GEN('AGO',TOP);                                           /*RAF-9*/ 00985200
  1398.                                                               /*RAF-9*/ 00985205
  1399.     IF RCHECK('THEN') THEN                                    /*RAF-9*/ 00985210
  1400.     CALL ERROR('CASMFOREVER-2: IAPPROPRIATE "THEN" IGNORED'); /*RAF-9*/ 00985215
  1401.                                                               /*RAF-9*/ 00985220
  1402.     CALL CWLABEL(ASMEXID(ASMDOLEV)); /* "EXIT" LABEL */       /*RAF-9*/ 00985225
  1403.     GEN('ANOP','');                                          /*RAF-22*/ 00985227
  1404.     ASMDOLEV = ASMDOLEV-1;                                    /*RAF-9*/ 00985230
  1405.     RETURN;                                                   /*RAF-9*/ 00985235
  1406.     END CASMFOREVER;                                          /*RAF-9*/ 00985240
  1407. 1                                                                       00985245
  1408.  /*  ASM DO <STMNT> THEN <STMNT>                           */ /*RAF-9*/ 00985250
  1409.  /*  ASM DO <STMNT> WHILE/UNTIL <COND> THEN <STMNT>        */ /*RAF-9*/ 00985255
  1410.  /*  ASM DO <STMNT> FOR <SETA-VAR> BY <SETA-EXPR>          */ /*RAF-9*/ 00985260
  1411.  /*                 TO <SETA-EXPR> THEN <STMNT>            */ /*RAF-9*/ 00985265
  1412.  /*  ASM DO <STMNT> FOREVER                                */ /*RAF-9*/ 00985270
  1413.                                                               /*RAF-9*/ 00985275
  1414.  CASMDO: PROCEDURE RECURSIVE;                                 /*RAF-9*/ 00985280
  1415.                                                               /*RAF-9*/ 00985285
  1416.     DECLARE                                                   /*RAF-9*/ 00985290
  1417.        (TOP,EXIT) CHAR(8) VARYING,                            /*RAF-9*/ 00985295
  1418.        THENOK BIT(1) INIT(#TRUE);                             /*RAF-9*/ 00985300
  1419.                                                               /*RAF-9*/ 00985305
  1420.     TOP = GENSEQSYM;  /* TOP OF LOOP LABEL */                 /*RAF-9*/ 00985310
  1421.                                                               /*RAF-9*/ 00985315
  1422.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00985320
  1423.     ASMDOID(ASMDOLEV),ASMEXID(ASMDOLEV) = '';                 /*RAF-9*/ 00985325
  1424.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;                         /*RAF-9*/ 00985330
  1425.                                                               /*RAF-9*/ 00985335
  1426.     CALL LABPUSH; CALL LABFLUSH;                              /*RAF-9*/ 00985340
  1427.     CALL WLABEL(TOP);  /* LABEL TOP OF LOOP */                /*RAF-9*/ 00985345
  1428.     CALL ASMSTMNT;  /* GET BODY OF LOOP */                    /*RAF-9*/ 00985350
  1429.     CALL CWLABEL(ASMDOID(ASMDOLEV));  /* "NEXT" LABEL */      /*RAF-9*/ 00985355
  1430.                                                               /*RAF-9*/ 00985360
  1431.     IF RCHECK('WHILE') THEN DO;                               /*RAF-9*/ 00985365
  1432.        GEN('AIF',CONDSCAN(#FALSE)||TOP);                      /*RAF-9*/ 00985370
  1433.        END;                                                   /*RAF-9*/ 00985375
  1434.     ELSE IF RCHECK('UNTIL') THEN DO;                          /*RAF-9*/ 00985380
  1435.        GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||TOP);        /*RAF-9*/ 00985385
  1436.        END;                                                   /*RAF-9*/ 00985390
  1437.     ELSE IF RCHECK('FOREVER') THEN DO;                        /*RAF-9*/ 00985395
  1438.        GEN('AGO',TOP);                                        /*RAF-9*/ 00985400
  1439.        THENOK = #FALSE;                                       /*RAF-9*/ 00985405
  1440.        END;                                                   /*RAF-9*/ 00985410
  1441.     ELSE IF RCHECK('FOR') THEN BEGIN;                         /*RAF-9*/ 00985415
  1442.        DECLARE                                                /*RAF-9*/ 00985420
  1443.           VAR CHAR(8) VARYING,                                /*RAF-9*/ 00985425
  1444.           (BYVAL,TOVAL) CHAR(170) VARYING;                    /*RAF-9*/ 00985430
  1445.        CALL RLABEL;  /* GET SETA VARIABLE */                  /*RAF-9*/ 00985435
  1446.        IF WORD^='' THEN DO;                                   /*RAF-9*/ 00985440
  1447.           IF SUBSTR(WORD,1,1)^='&' THEN                       /*RAF-9*/ 00985445
  1448.           CALL ERROR('CASMDO-1: ILLEGAL SETA VARIABLE');      /*RAF-9*/ 00985450
  1449.           VAR = WORD;                                         /*RAF-9*/ 00985455
  1450.           END;                                                /*RAF-9*/ 00985460
  1451.        ELSE DO;                                               /*RAF-9*/ 00985465
  1452.           CALL ERROR('CASMDO-2: MISSING SETA VARIABLE');      /*RAF-9*/ 00985470
  1453.           VAR = '&X';                                         /*RAF-9*/ 00985475
  1454.           END;                                                /*RAF-9*/ 00985480
  1455.        BYVAL = '1'; TOVAL='';                                 /*RAF-9*/ 00985485
  1456.        DO WHILE(#TRUE);                                       /*RAF-9*/ 00985490
  1457.           IF RCHECK('FROM') THEN DO;                          /*RAF-9*/ 00985495
  1458.              CALL ERROR('CASMFOR-3: INAPPROPRIATE "FROM"'||   /*RAF-9*/ 00985500
  1459.                                     ' IGNORED');              /*RAF-9*/ 00985505
  1460.              END;                                             /*RAF-9*/ 00985510
  1461.           ELSE IF RCHECK('BY') THEN DO;                       /*RAF-9*/ 00985515
  1462.              CALL ROPANDS(#TRUE);                             /*RAF-9*/ 00985520
  1463.              IF OPANDS='' THEN                                /*RAF-9*/ 00985525
  1464.                 CALL ERROR('CASMDO-4: MISSING "BY" VALUE');   /*RAF-9*/ 00985530
  1465.              ELSE BYVAL = OPANDS;                             /*RAF-9*/ 00985535
  1466.              END;                                             /*RAF-9*/ 00985540
  1467.           ELSE IF RCHECK('TO') THEN DO;                       /*RAF-9*/ 00985545
  1468.              CALL ROPANDS(#TRUE);                             /*RAF-9*/ 00985550
  1469.              IF OPANDS='' THEN                                /*RAF-9*/ 00985555
  1470.                 CALL ERROR('CASMDO-5: MISSING "TO" VALUE');   /*RAF-9*/ 00985560
  1471.              ELSE TOVAL = OPANDS;                             /*RAF-9*/ 00985565
  1472.              END;                                             /*RAF-9*/ 00985570
  1473.           ELSE DO;                                            /*RAF-9*/ 00985575
  1474.              GO TO NO_BY_OR_TO;                               /*RAF-9*/ 00985580
  1475.              END;                                             /*RAF-9*/ 00985585
  1476.           END;                                                /*RAF-9*/ 00985590
  1477.        NO_BY_OR_TO:                                           /*RAF-9*/ 00985595
  1478.                                                               /*RAF-9*/ 00985600
  1479.        CALL WLABEL(VAR);                                      /*RAF-9*/ 00985605
  1480.        GEN('SETA',VAR||'+'||BYVAL);                           /*RAF-9*/ 00985610
  1481.        IF TOVAL^='' THEN DO;                                  /*RAF-9*/ 00985615
  1482.           GEN('AIF','(('||BYVAL||' GT 0) AND ('||VAR||        /*RAF-9*/ 00985620
  1483.                     ' LE '||TOVAL||'))'||TOP);                /*RAF-9*/ 00985625
  1484.           GEN('AIF','(('||BYVAL||' LT 0) AND ('||VAR||        /*RAF-9*/ 00985630
  1485.                     ' GE '||TOVAL||'))'||TOP);                /*RAF-9*/ 00985635
  1486.           END;                                                /*RAF-9*/ 00985640
  1487.        ELSE GEN('AGO',TOP);                                   /*RAF-9*/ 00985645
  1488.        END;                                                   /*RAF-9*/ 00985650
  1489.                                                               /*RAF-9*/ 00985655
  1490.     EXIT = ASMEXID(ASMDOLEV);                                 /*RAF-9*/ 00985660
  1491.     ASMDOLEV=ASMDOLEV-1;                                      /*RAF-9*/ 00985665
  1492.     IF RCHECK('THEN') THEN DO;                                /*RAF-9*/ 00985670
  1493.        IF ^THENOK THEN                                        /*RAF-9*/ 00985675
  1494.        CALL ERROR('CASMDO-6: INAPPROPRIATE "THEN" IGNORED');  /*RAF-9*/ 00985680
  1495.        CALL ASMSTMNT;                                         /*RAF-9*/ 00985685
  1496.        END;                                                   /*RAF-9*/ 00985690
  1497.     CALL CWLABEL(EXIT);                                       /*RAF-9*/ 00985695
  1498.     GEN('ANOP','');                                          /*RAF-22*/ 00985697
  1499.                                                               /*RAF-9*/ 00985700
  1500.     RETURN;                                                   /*RAF-9*/ 00985705
  1501.     END CASMDO;                                               /*RAF-9*/ 00985710
  1502. 1                                                                       00985715
  1503.  /*  ASM SELECT (FIRST)                                  */   /*RAF-9*/ 00985720
  1504.  /*     <COND>: STMNT; ...                               */   /*RAF-9*/ 00985725
  1505.  /*     ENDSEL (ELSE STMNT) (THEN STMNT)                 */   /*RAF-9*/ 00985730
  1506.                                                               /*RAF-9*/ 00985735
  1507.  CASMSELECT: PROCEDURE RECURSIVE;                             /*RAF-9*/ 00985740
  1508.                                                               /*RAF-9*/ 00985745
  1509.     DECLARE                                                   /*RAF-9*/ 00985750
  1510.        (THENPART,NEXTCASE,EXIT) CHAR(8) VARYING,              /*RAF-9*/ 00985755
  1511.        FIRST BIT(1);                                          /*RAF-9*/ 00985760
  1512.                                                               /*RAF-9*/ 00985765
  1513.     NESTLEV = NESTLEV+1;                                      /*RAF-9*/ 00985770
  1514.     NESTID(NESTLEV) = CIN_ID;                                 /*RAF-9*/ 00985775
  1515.                                                               /*RAF-9*/ 00985780
  1516.     FIRST = RCHECK('FIRST');                                  /*RAF-9*/ 00985785
  1517.     IF ^RCHAR(';') THEN                                       /*RAF-9*/ 00985790
  1518.     CALL ERROR('CASMSELECT-1: MISSING SEMICOLON INSERTED');   /*RAF-9*/ 00985795
  1519.                                                               /*RAF-9*/ 00985800
  1520.     THENPART = GENSEQSYM;                                     /*RAF-9*/ 00985805
  1521.     NEXTCASE = GENSEQSYM;                                     /*RAF-9*/ 00985810
  1522.     EXIT = '';                                                /*RAF-9*/ 00985815
  1523.     IF FIRST THEN EXIT = GENSEQSYM;                           /*RAF-9*/ 00985820
  1524.                                                               /*RAF-9*/ 00985825
  1525.     ASMDOLEV = ASMDOLEV+1;                                    /*RAF-9*/ 00985830
  1526.     ASMDOID(ASMDOLEV) = NEXTCASE;                             /*RAF-9*/ 00985835
  1527.     ASMEXID(ASMDOLEV) = EXIT;                                 /*RAF-9*/ 00985840
  1528.     ASMDOLABEL(ASMDOLEV) = CURSEQSYM;                         /*RAF-9*/ 00985845
  1529.                                                               /*RAF-9*/ 00985850
  1530.     CALL LABPUSH; CALL LABFLUSH;                              /*RAF-9*/ 00985855
  1531.                                                               /*RAF-9*/ 00985860
  1532.     DO WHILE(^RCHECK('ENDSEL'));                              /*RAF-9*/ 00985865
  1533.        CALL WLABEL(NEXTCASE);                                 /*RAF-9*/ 00985870
  1534.        NEXTCASE = GENSEQSYM;                                  /*RAF-9*/ 00985875
  1535.        GEN('AIF','(NOT '||CONDSCAN(#FALSE)||')'||NEXTCASE);   /*RAF-9*/ 00985880
  1536.        IF ^RCHAR(':') THEN                                    /*RAF-9*/ 00985885
  1537.        CALL ERROR('CASMSELECT-2: MISSING COLON INSERTED');    /*RAF-9*/ 00985890
  1538.        CALL ASMSTMNT;                                         /*RAF-9*/ 00985895
  1539.        IF ^RCHAR(';') THEN                                    /*RAF-9*/ 00985900
  1540.        CALL ERROR('CASMSELECT-4: MISSING SEMICOLON INSERTED');/*RAF-9*/ 00985905
  1541.        IF FIRST THEN GEN('AGO',EXIT);                         /*RAF-9*/ 00985910
  1542.        END;                                                   /*RAF-9*/ 00985915
  1543.                                                               /*RAF-9*/ 00985920
  1544.     CALL WLABEL(NEXTCASE);                                    /*RAF-9*/ 00985925
  1545.     NESTLEV = NESTLEV - 1;                                    /*RAF-9*/ 00985930
  1546.                                                               /*RAF-9*/ 00985935
  1547.     IF RCHECK('ELSE') THEN DO;                                /*RAF-9*/ 00985940
  1548.        IF ^FIRST THEN                                         /*RAF-9*/ 00985945
  1549.        CALL ERROR('CASMSELECT-3: ELSE USED WITHOUT FIRST');   /*RAF-9*/ 00985950
  1550.        CALL ASMSTMNT;                                         /*RAF-9*/ 00985955
  1551.        END;                                                   /*RAF-9*/ 00985960
  1552.                                                               /*RAF-9*/ 00985965
  1553.     EXIT = ASMEXID(ASMDOLEV);                                 /*RAF-9*/ 00985970
  1554.     ASMDOLEV = ASMDOLEV - 1;                                  /*RAF-9*/ 00985975
  1555.     CALL WLABEL(THENPART);                                    /*RAF-9*/ 00985980
  1556.     IF RCHECK('THEN') THEN CALL ASMSTMNT;                     /*RAF-9*/ 00985985
  1557.     CALL CWLABEL(EXIT);                                       /*RAF-9*/ 00985990
  1558.     GEN('ANOP','');                                          /*RAF-22*/ 00985992
  1559.     RETURN;                                                   /*RAF-9*/ 00985995
  1560.     END CASMSELECT;                                           /*RAF-9*/ 00986000
  1561. 1                                                                       00986005
  1562.  /* ASM EXIT FROM <SEQSYM> IF <COND> */                       /*RAF-9*/ 00986010
  1563.                                                               /*RAF-9*/ 00986015
  1564.  CASMEXIT: PROCEDURE;                                         /*RAF-9*/ 00986020
  1565.                                                               /*RAF-9*/ 00986025
  1566.     DECLARE                                                   /*RAF-9*/ 00986030
  1567.        EXLABEL CHAR(8) VARYING,                               /*RAF-9*/ 00986035
  1568.        I FIXED BIN;                                           /*RAF-9*/ 00986040
  1569.                                                               /*RAF-9*/ 00986045
  1570.     EXLABEL='';                                               /*RAF-9*/ 00986050
  1571.     IF ASMDOLEV<=0 THEN                                       /*RAF-9*/ 00986055
  1572.        CALL ERROR('CASMEXIT-1: NO CONTAINING ASM LOOP'||      /*RAF-9*/ 00986060
  1573.                   ' STRUCTURE FOR ASM EXIT');                 /*RAF-9*/ 00986065
  1574.     IF ^RCHECK('FROM') THEN I=ASMDOLEV;                       /*RAF-9*/ 00986070
  1575.     ELSE DO;                                                  /*RAF-9*/ 00986075
  1576.        CALL RLABEL;                                           /*RAF-9*/ 00986080
  1577.        IF WORD='' THEN                                        /*RAF-9*/ 00986085
  1578.           CALL ERROR('CASMEXIT-2: MISSING SEQUENCE SYMBOL'||  /*RAF-9*/ 00986090
  1579.                      ' FOLLOWING "FROM"');                    /*RAF-9*/ 00986095
  1580.        ELSE IF SUBSTR(WORD,1,1)^='.' THEN                     /*RAF-9*/ 00986100
  1581.           CALL ERROR('CASMEXIT-3: EXIT LABEL MUST BE '||      /*RAF-9*/ 00986105
  1582.                      'SEQUENCE SYMBOL');                      /*RAF-9*/ 00986110
  1583.        DO I=ASMDOLEV BY -1 TO 1                               /*RAF-9*/ 00986115
  1584.           WHILE(ASMDOLABEL(I)^=WORD);                         /*RAF-9*/ 00986120
  1585.           END;                                                /*RAF-9*/ 00986125
  1586.        IF I<1 THEN DO;                                        /*RAF-9*/ 00986130
  1587.           CALL ERROR('CASMEXIT-4: EXIT LABEL NOT FOUND');     /*RAF-9*/ 00986135
  1588.           I = ASMDOLEV;                                       /*RAF-9*/ 00986140
  1589.           END;                                                /*RAF-9*/ 00986145
  1590.        END;                                                   /*RAF-9*/ 00986150
  1591.     IF I>=1 THEN DO;                                          /*RAF-9*/ 00986155
  1592.        IF ASMEXID(I)='' THEN ASMEXID(I) = GENSEQSYM;          /*RAF-9*/ 00986160
  1593.        EXLABEL = ASMEXID(I);                                  /*RAF-9*/ 00986165
  1594.        END;                                                   /*RAF-9*/ 00986170
  1595.                                                               /*RAF-9*/ 00986175
  1596.     CALL LABPUSH; CALL LABFLUSH;                             /*RAF-31*/ 00986178
  1597.     IF ^RCHECK('IF') THEN GEN('AGO',EXLABEL);                 /*RAF-9*/ 00986180
  1598.     ELSE DO;                                                  /*RAF-9*/ 00986185
  1599.        OPANDS=CONDSCAN(#FALSE);                               /*RAF-9*/ 00986190
  1600.        GEN('AIF',OPANDS||EXLABEL);                            /*RAF-9*/ 00986195
  1601.        END;                                                   /*RAF-9*/ 00986200
  1602.                                                               /*RAF-9*/ 00986205
  1603.     RETURN;                                                   /*RAF-9*/ 00986210
  1604.     END CASMEXIT;                                             /*RAF-9*/ 00986215
  1605. 1                                                                       00986220
  1606.  /* ASM NEXT OF <SEQSYM> IF <COND> */                         /*RAF-9*/ 00986225
  1607.                                                               /*RAF-9*/ 00986230
  1608.  CASMNEXT: PROCEDURE;                                         /*RAF-9*/ 00986235
  1609.                                                               /*RAF-9*/ 00986240
  1610.     DECLARE                                                   /*RAF-9*/ 00986245
  1611.        NXLABEL CHAR(8) VARYING,                               /*RAF-9*/ 00986250
  1612.        I FIXED BIN;                                           /*RAF-9*/ 00986255
  1613.                                                               /*RAF-9*/ 00986260
  1614.     NXLABEL='';                                               /*RAF-9*/ 00986265
  1615.     IF ASMDOLEV<=0 THEN                                       /*RAF-9*/ 00986270
  1616.        CALL ERROR('CASMNEXT-1: NO CONTAINING ASM LOOP'||      /*RAF-9*/ 00986275
  1617.                   ' STRUCTURE FOR ASM NEXT');                 /*RAF-9*/ 00986280
  1618.     IF ^RCHECK('OF') THEN I=ASMDOLEV;                         /*RAF-9*/ 00986285
  1619.     ELSE DO;                                                  /*RAF-9*/ 00986290
  1620.        CALL RLABEL;                                           /*RAF-9*/ 00986295
  1621.        IF WORD='' THEN                                        /*RAF-9*/ 00986300
  1622.           CALL ERROR('CASMNEXT-2: MISSING SEQUENCE SYMBOL'||  /*RAF-9*/ 00986305
  1623.                      ' FOLLOWING "OF"');                      /*RAF-9*/ 00986310
  1624.        ELSE IF SUBSTR(WORD,1,1)^='.' THEN                     /*RAF-9*/ 00986315
  1625.           CALL ERROR('CASMNEXT-3: NEXT LABEL MUST BE '||      /*RAF-9*/ 00986320
  1626.                      'SEQUENCE SYMBOL');                      /*RAF-9*/ 00986325
  1627.        DO I=ASMDOLEV BY -1 TO 1                               /*RAF-9*/ 00986330
  1628.           WHILE(ASMDOLABEL(I)^=WORD);                         /*RAF-9*/ 00986335
  1629.           END;                                                /*RAF-9*/ 00986340
  1630.        IF I<1 THEN DO;                                        /*RAF-9*/ 00986345
  1631.           CALL ERROR('CASMNEXT-4: NEXT LABEL NOT FOUND');     /*RAF-9*/ 00986350
  1632.           I = ASMDOLEV;                                       /*RAF-9*/ 00986355
  1633.           END;                                                /*RAF-9*/ 00986360
  1634.        END;                                                   /*RAF-9*/ 00986365
  1635.     IF I>=1 THEN DO;                                          /*RAF-9*/ 00986370
  1636.        IF ASMDOID(I)='' THEN ASMDOID(I) = GENSEQSYM;          /*RAF-9*/ 00986375
  1637.        NXLABEL = ASMDOID(I);                                  /*RAF-9*/ 00986380
  1638.        END;                                                   /*RAF-9*/ 00986385
  1639.                                                               /*RAF-9*/ 00986390
  1640.     CALL LABPUSH; CALL LABFLUSH;                             /*RAF-31*/ 00986393
  1641.     IF ^RCHECK('IF') THEN GEN('AGO',NXLABEL);                 /*RAF-9*/ 00986395
  1642.     ELSE DO;                                                  /*RAF-9*/ 00986400
  1643.        OPANDS=CONDSCAN(#FALSE);                               /*RAF-9*/ 00986405
  1644.        GEN('AIF',OPANDS||NXLABEL);                            /*RAF-9*/ 00986410
  1645.        END;                                                   /*RAF-9*/ 00986415
  1646.                                                               /*RAF-9*/ 00986420
  1647.     RETURN;                                                   /*RAF-9*/ 00986425
  1648.     END CASMNEXT;                                             /*RAF-9*/ 00986430
  1649. 1                                                                       00986435
  1650.  /*  ASM GOTO <SEQSYM> IF <COND>          */                  /*RAF-9*/ 00986440
  1651.                                                               /*RAF-9*/ 00986445
  1652.  CASMGOTO: PROCEDURE;                                         /*RAF-9*/ 00986450
  1653.                                                               /*RAF-9*/ 00986455
  1654.     DECLARE LABEL CHAR(8) VARYING STATIC;                     /*RAF-9*/ 00986460
  1655.                                                               /*RAF-9*/ 00986465
  1656.     CALL RLABEL;                                              /*RAF-9*/ 00986470
  1657.     LABEL = WORD;                                             /*RAF-9*/ 00986475
  1658.     IF LABEL = ''                                             /*RAF-9*/ 00986480
  1659.     THEN CALL ERROR('CASMGOTO-1: MISSING SEQUENCE SYMBOL');   /*RAF-9*/ 00986485
  1660.     ELSE IF SUBSTR(LABEL,1,1)^='.'                            /*RAF-9*/ 00986490
  1661.     THEN CALL ERROR('CASMGOTO-2: ILLEGAL SEQUENCE SYMBOL');   /*RAF-9*/ 00986495
  1662.                                                               /*RAF-9*/ 00986500
  1663.     CALL LABPUSH; CALL LABFLUSH;                              /*RAF-9*/ 00986505
  1664.                                                               /*RAF-9*/ 00986510
  1665.     IF RCHECK('IF')                                           /*RAF-9*/ 00986515
  1666.     THEN GEN('AIF',CONDSCAN(#FALSE)||LABEL);                  /*RAF-9*/ 00986520
  1667.     ELSE GEN('AGO',LABEL);                                    /*RAF-9*/ 00986525
  1668.                                                               /*RAF-9*/ 00986530
  1669.     RETURN;                                                   /*RAF-9*/ 00986535
  1670.     END CASMGOTO;                                             /*RAF-9*/ 00986540
  1671. 1                                                                       00986545
  1672.   ESQUISH:                                                    /*RAF-9*/ 00986550
  1673.     PROCEDURE;                                                          00987000
  1674.        DCL                                                              00988000
  1675.           (I,J) FIXED BIN;                                              00989000
  1676.                                                                         00990000
  1677.        J = 0;                                                           00991000
  1678.        DO I = 1 TO EQVLEV;                                              00992000
  1679.           IF EQVSTK(I,1) ^= '' THEN                                     00993000
  1680.              DO;                                                        00994000
  1681.                 J = J+1;                                                00995000
  1682.                 EQVSTK(J,1) = EQVSTK(I,1);                              00996000
  1683.                 EQVSTK(J,2) = EQVSTK(I,2);                              00997000
  1684.              END;                                                       00998000
  1685.        END;                                                             00999000
  1686.        EQVLEV = J;                                                      01000000
  1687.        RETURN;                                                          01001000
  1688.   END ESQUISH;                                                          01002000
  1689.                                                                         01003000
  1690.  /* END CASMIF; */                                            /*RAF-8*/ 01004000
  1691. 1                                                                       01004010
  1692.  /* PROCEDURE TO FIND LABEL FOR ASM LOOP CONSTRUCT */         /*RAF-9*/ 01004020
  1693.                                                               /*RAF-9*/ 01004030
  1694.  CURSEQSYM: PROCEDURE RETURNS(CHAR(8) VARYING);               /*RAF-9*/ 01004040
  1695.                                                               /*RAF-9*/ 01004050
  1696.     DECLARE CLABEL CHAR(8) VARYING;                           /*RAF-9*/ 01004060
  1697.                                                               /*RAF-9*/ 01004070
  1698.     CLABEL = '';                                              /*RAF-9*/ 01004080
  1699.     IF SUBSTR(C_LABEL,1,1)='.' & SUBSTR(C_LABEL,2,1)^='@'     /*RAF-9*/ 01004090
  1700.     THEN CLABEL = C_LABEL;                                    /*RAF-9*/ 01004100
  1701.     ELSE IF C_LABEL=' ' & LABLEV>0 THEN DO;                   /*RAF-9*/ 01004110
  1702.        IF SUBSTR(LABSTK(LABLEV),1,1)='.' &                    /*RAF-9*/ 01004120
  1703.           SUBSTR(LABSTK(LABLEV),2,1)^='@'                     /*RAF-9*/ 01004130
  1704.           THEN CLABEL = LABSTK(LABLEV);                       /*RAF-9*/ 01004140
  1705.        END;                                                   /*RAF-9*/ 01004150
  1706.                                                               /*RAF-9*/ 01004160
  1707.     RETURN(CLABEL);                                           /*RAF-9*/ 01004170
  1708.     END CURSEQSYM;                                            /*RAF-9*/ 01004180
  1709. 1                                                                       01004190
  1710.  /* PROCEDURE TO SCAN FOR STATEMENT IN ASM CONSTRUCT */       /*RAF-9*/ 01004200
  1711.                                                               /*RAF-9*/ 01004210
  1712.  ASMSTMNT: PROCEDURE RECURSIVE;                               /*RAF-9*/ 01004220
  1713.                                                               /*RAF-9*/ 01004230
  1714.     DCL ELEV FIXED BIN;                                       /*RAF-9*/ 01004240
  1715.                                                               /*RAF-9*/ 01004250
  1716.     CALL ESQUISH;                                             /*RAF-9*/ 01004260
  1717.     ELEV = EQVLEV+1;                                          /*RAF-9*/ 01004270
  1718.     CALL STMNT;                                               /*RAF-9*/ 01004280
  1719.     CALL LABPUSH;                                             /*RAF-9*/ 01004290
  1720.     CALL LABFLUSH;                                            /*RAF-9*/ 01004300
  1721.     CALL EQVFLUSH(#FALSE,ELEV);                               /*RAF-9*/ 01004310
  1722.     END ASMSTMNT;                                             /*RAF-9*/ 01004320
  1723. 1                                                                       01005000
  1724.  /* MACRO (&L:) <MACRO NAME> (<PARAMETER LIST>);                        01006000
  1725.      <BODY>                                                             01007000
  1726.     MEND                               */                               01008000
  1727.                                                                         01009000
  1728.  CMACRO: PROCEDURE;                                                     01010000
  1729.       DCL                                                               01011000
  1730.          (MLABEL,MNAME) CHAR(8) VARYING,                                01012000
  1731.          (I,L,ELEV) FIXED BIN,                                /*RAF-8*/ 01013000
  1732.          DEFTYPE CHAR(8) VARYING, DEFS(7) CHAR(8) VAR                   01014000
  1733.           INIT('GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','COPY');       01015000
  1734.                                                                         01016000
  1735.       IN_MACRO = #TRUE;                                                 01017000
  1736.       MLABEL = '';                                                      01018000
  1737.       IF RCHAR('&') THEN                                                01019000
  1738.          DO;                                                            01020000
  1739.             IF ^RCHAR('&') THEN                                         01021000
  1740.                CALL ERROR('CMACRO: "&" INSERTED.');                     01022000
  1741.             CALL RWORD;                                                 01023000
  1742.             IF WORDAL THEN                                              01024000
  1743.                MLABEL = '&'||WORD;                                      01025000
  1744.             ELSE                                                        01026000
  1745.                CALL ERROR('CMACRO: INVALID MACRO LABEL.');              01027000
  1746.             IF ^RCHAR(':') THEN                                         01028000
  1747.                CALL ERROR('CMACRO: ":" ASSUMED AFTER "'||               01029000
  1748.                           MLABEL||'".');                                01030000
  1749.          END;                                                           01031000
  1750.       CALL RWORD;                                                       01032000
  1751.       IF WORDAL THEN                                                    01033000
  1752.          MNAME = WORD;                                                  01034000
  1753.       ELSE                                                              01035000
  1754.          DO;                                                            01036000
  1755.             MNAME = '???';                                              01037000
  1756.             CALL ERROR('CMACRO: MISSING MACRO NAME.');                  01038000
  1757.          END;                                                           01039000
  1758.       CALL ROPANDS(#FALSE);                                   /*RAF-9*/ 01040000
  1759.       IF ^RCHAR(';') THEN                                               01041000
  1760.          CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.');             01042000
  1761.       CALL LABPUSH;                                                     01043000
  1762.       C_DATA = ' ';                                                     01044000
  1763.       GEN('MACRO','');                                                  01045000
  1764.       C_LABEL = MLABEL;                                                 01046000
  1765.       C_OPERATION = MNAME;                                              01047000
  1766.       GEN_OPERANDS(OPANDS);                                             01048000
  1767. 1                                                                       01049000
  1768.       NESTLEV = NESTLEV+1;                                              01050000
  1769.       NESTID(NESTLEV) = CIN_ID;                                         01051000
  1770.       DEFTYPE = '?';                                                    01052000
  1771.       DO WHILE(DEFTYPE^='');                                            01053000
  1772.          DEFTYPE = '';                                                  01054000
  1773.          DO I=1 TO 7 WHILE(^RCHECK(DEFS(I)));                           01055000
  1774.          END;                                                           01056000
  1775.          IF I<8 THEN                                                    01057000
  1776.             DO;                                                         01058000
  1777.                DEFTYPE,WORD = DEFS(I);                                  01059000
  1778.                CALL ALCSTMT;                                            01060000
  1779.                IF ^RCHAR(';') THEN                                      01061000
  1780.                   CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.');    01062000
  1781.             END;                                                        01063000
  1782.       END;                                                              01064000
  1783.       GEN('LCLC','&@');                                                 01065000
  1784.       C_LABEL = '&@';                                                   01066000
  1785.       GEN('SETC','''&SYSNDX''');                                        01067000
  1786.       CALL ESQUISH;                                           /*RAF-8*/ 01067100
  1787.       ELEV = EQVLEV+1;                                        /*RAF-8*/ 01067200
  1788.       DO WHILE(IN_MACRO);                                               01068000
  1789.          IF RCHECK('MEND') THEN IN_MACRO = #FALSE;            /*RAF-8*/ 01068100
  1790.          ELSE IF RCHECK('ENDMACRO') THEN IN_MACRO = #FALSE;   /*RAF-8*/ 01068200
  1791.          ELSE DO;                                             /*RAF-8*/ 01069000
  1792.             CALL STMNT;                                       /*RAF-8*/ 01070000
  1793.             IF ^RCHAR(';') THEN                                         01071000
  1794.                CALL ERROR('CMACRO: MISSING SEMICOLON INSERTED.');       01072000
  1795.             END;                                              /*RAF-8*/ 01072500
  1796.       END;                                                              01073000
  1797.       NESTLEV = NESTLEV-1;                                              01074000
  1798.       IF NESTLEV=0 THEN PREDLABLEV=0;                         /*RAF-6*/ 01074500
  1799.       CALL LABPUSH;                                           /*RAF-8*/ 01074600
  1800.       CALL LABFLUSH;                                          /*RAF-8*/ 01074700
  1801.       CALL EQVFLUSH(#FALSE,ELEV);                             /*RAF-8*/ 01074800
  1802.       GEN('MEND','');                                         /*RAF-8*/ 01074900
  1803.       RETURN;                                                           01075000
  1804.  END CMACRO;                                                            01076000
  1805. 1                                                                       01077000
  1806.  /*  BAL;                                                               01078000
  1807.      <BAL CODING>                                                       01079000
  1808.      ALP;               */                                              01080000
  1809.                                                                         01081000
  1810.  CBAL:                                                                  01082000
  1811.    PROCEDURE;                                                           01083000
  1812.       DCL                                                               01084000
  1813.          1 BALCOM STATIC,                                               01085000
  1814.            2 ASTR CHAR(3) INIT('*  '),                       /*RAF-45*/ 01086000
  1815.            2 COMFLD CHAR(69),                                /*RAF-45*/ 01087000
  1816.            2 COMID CHAR(8);                                             01088000
  1817.                                                                         01089000
  1818.       CALL LABPUSH;                                                     01090000
  1819.       CALL LABFLUSH;                                                    01091000
  1820.       INAL = 0;                                                         01092000
  1821.       DO WHILE(#TRUE) ;                                                 01093000
  1822.          COL = 80;                                                      01094000
  1823.          CHAR = ' ';                                                    01095000
  1824.          CALL RWORD;                                                    01096000
  1825.          IF WORD = 'ALP' & CHAR = ';' THEN                              01097000
  1826.             DO ;                                                        01098000
  1827.                INAL = 1 ;                                               01099000
  1828.                IF IN_MACRO THEN ASTR='.*'; ELSE ASTR='*';    /*RAF-45*/ 01099500
  1829.                COMFLD = SUBSTR(CARDIN,1,69) ;                /*RAF-45*/ 01100000
  1830.                COMID = CIN_ID ;                                         01101000
  1831.                WRITE FILE(SYSOUT) FROM(BALCOM) ;                        01102000
  1832.                RETURN ;                                                 01103000
  1833.             END ;                                                       01104000
  1834.          WRITE FILE(SYSOUT) FROM (CARDIN);                              01105000
  1835.       END;                                                              01106000
  1836.    END CBAL ;                                                           01107000
  1837. 1                                                                       01107010
  1838.  /* COMMENT;                     */                          /*RAF-10*/ 01107020
  1839.  /*    <TEXT OF COMMENT>         */                          /*RAF-10*/ 01107030
  1840.  /*    ALP;                      */                          /*RAF-10*/ 01107040
  1841.                                                              /*RAF-10*/ 01107050
  1842.  CCOMMENT: PROCEDURE;                                        /*RAF-10*/ 01107060
  1843.                                                              /*RAF-10*/ 01107070
  1844.     DCL                                                      /*RAF-10*/ 01107080
  1845.        1 BALCOM STATIC,                                      /*RAF-10*/ 01107090
  1846.           2 ASTR CHAR(2) INIT('* '),                         /*RAF-10*/ 01107100
  1847.           2 COMFLD CHAR(70),                                 /*RAF-10*/ 01107110
  1848.           2 COMID CHAR(8);                                   /*RAF-10*/ 01107120
  1849.                                                              /*RAF-10*/ 01107130
  1850.     CALL LABPUSH; CALL LABFLUSH;                             /*RAF-10*/ 01107140
  1851.     INAL = 0;                                                /*RAF-10*/ 01107150
  1852.     DO WHILE(#TRUE);                                         /*RAF-10*/ 01107160
  1853.        COL = 80; CHAR = ' ';                                 /*RAF-10*/ 01107170
  1854.        CALL RWORD;                                           /*RAF-10*/ 01107180
  1855.                                                              /*RAF-10*/ 01107190
  1856.        COMFLD = SUBSTR(CARDIN,1,70);                         /*RAF-10*/ 01107200
  1857.        COMID = CIN_ID;                                       /*RAF-10*/ 01107210
  1858.        WRITE FILE(SYSOUT) FROM(BALCOM);                      /*RAF-10*/ 01107220
  1859.                                                              /*RAF-10*/ 01107230
  1860.        IF WORD='ALP' & CHAR=';' THEN DO;                     /*RAF-10*/ 01107240
  1861.           INAL = 1;                                          /*RAF-10*/ 01107250
  1862.           RETURN;                                            /*RAF-10*/ 01107260
  1863.           END;                                               /*RAF-10*/ 01107270
  1864.        END;                                                  /*RAF-10*/ 01107280
  1865.                                                              /*RAF-10*/ 01107290
  1866.     END CCOMMENT;                                            /*RAF-10*/ 01107300
  1867. 1                                                            /*RAF-36*/ 01107310
  1868.  /*  DATA <STATEMENT>  */                                    /*RAF-36*/ 01107320
  1869.                                                              /*RAF-36*/ 01107330
  1870.  CDATA: PROCEDURE RECURSIVE;                                 /*RAF-36*/ 01107340
  1871.     DCL AROUND CHAR(8) VARYING;                              /*RAF-36*/ 01107350
  1872.                                                              /*RAF-36*/ 01107360
  1873.     AROUND = GENSYM;                                         /*RAF-36*/ 01107370
  1874.     GEN('B',AROUND);                                         /*RAF-36*/ 01107380
  1875.     CALL STMNT;                                              /*RAF-36*/ 01107390
  1876.     CALL WLABEL(AROUND);                                     /*RAF-36*/ 01107400
  1877.     END CDATA;                                               /*RAF-36*/ 01107410
  1878. 1                                                                       01108000
  1879.  /*  SELECT;                                                            01109000
  1880.      <SELECT LIST>                                                      01110000
  1881.      ENDSEL                        */                                   01111000
  1882.                                                                         01112000
  1883.  CSELECT:                                                               01113000
  1884.    PROCEDURE RECURSIVE;                                                 01114000
  1885.    DECLARE                                                              01115000
  1886.       (CASEBODY,NEXTCASE,CLABELB,CLABELE) CHAR(8) VARYING,              01116000
  1887.       EXIT CHAR(8) VARYING,                                   /*RAF-8*/ 01116500
  1888.       (CHKFIRST,SELEND) BIT(1);                                         01117000
  1889.                                                                         01118000
  1890.       CALL SWLABEL(CLABELB);                                            01119000
  1891.       DOLEV = DOLEV+1;                                                  01120000
  1892.       DOID(DOLEV) = CLABELB;                                            01121000
  1893.       DOLABEL(DOLEV) = CURLAB;                                          01122000
  1894.       NESTLEV = NESTLEV+1;                                              01123000
  1895.       NESTID(NESTLEV) = CIN_ID;                                         01124000
  1896.                                                                         01125000
  1897.       CHKFIRST = RCHECK('FIRST');                                       01126000
  1898.       IF CHKFIRST THEN                                                  01127000
  1899.          CLABELE = GENSYM;                                              01128000
  1900.       ELSE                                                              01129000
  1901.          CLABELE = '';                                                  01130000
  1902.       EXID(DOLEV) = '';                                       /*RAF-8*/ 01131000
  1903.       IF ^RCHAR(';') THEN                                               01132000
  1904.          CALL ERROR('CSELECT: MISSING SEMICOLON INSERTED.');            01133000
  1905.                                                                         01134000
  1906.       NEXTCASE = '';                                          /*RAF-4*/ 01134900
  1907.       SELEND = RCHECK('ENDSEL');                                        01135000
  1908.       DO WHILE(^SELEND);                                                01136000
  1909.          CASEBODY = '';                                                 01137000
  1910.          NEXTCASE = GENSYM;                                             01138000
  1911.          CALL PREDICATE(CASEBODY,NEXTCASE,@OUTER_PREDICATE,#DUMMY,      01139000
  1912.                         @USE_TRUTH,#DUMMY,@B);                          01140000
  1913.          IF ^RCHAR(':') THEN                                            01141000
  1914.             CALL ERROR('CSELECT: MISSING COLON INSERTED.');             01142000
  1915.          CALL STMNT;                                                    01143000
  1916.          IF ^RCHAR(';') THEN                                            01144000
  1917.             CALL ERROR('CSELECT: MISSING SEMICOLON INSERTED.');         01145000
  1918.          SELEND = RCHECK('ENDSEL');                                     01146000
  1919.          IF CHKFIRST & ^SELEND THEN                                     01147000
  1920.             GEN('B',CLABELE);                                           01148000
  1921.          IF ^SELEND THEN                                                01149000
  1922.             CALL WLABEL(NEXTCASE);                                      01150000
  1923.       END;                                                    /*RAF-4*/ 01151000
  1924. 1                                                                       01152000
  1925.       NESTLEV = NESTLEV-1;                                    /*RAF-8*/ 01152500
  1926.       IF RCHECK('ELSE') THEN                                            01153000
  1927.          DO;                                                            01154000
  1928.             IF ^CHKFIRST THEN                                           01155000
  1929.                CALL ERROR('CSELECT: "ELSE" ILLEGAL WITHOUT "FIRST"'||   01156000
  1930.                           ' OPTION ON "SELECT" STATEMENT');             01157000
  1931.             IF NEXTCASE^='' THEN DO;                          /*RAF-4*/ 01157500
  1932.                IF CLABELE='' THEN                   /*RAF-8*/ /*RAF-4*/ 01158000
  1933.                   CLABELE = GENSYM;                 /*RAF-8*/ /*RAF-4*/ 01159000
  1934.                GEN('B',CLABELE);                    /*RAF-8*/ /*RAF-4*/ 01160000
  1935.                CALL WLABEL(NEXTCASE);                         /*RAF-4*/ 01161000
  1936.             END;                                              /*RAF-4*/ 01161500
  1937.             CALL STMNT;                                                 01162000
  1938.          END;                                                           01163000
  1939.       ELSE                                                              01164000
  1940.          CALL CWLABEL(NEXTCASE);                                        01165000
  1941.                                                                         01166000
  1942.       EXIT = EXID(DOLEV);                                     /*RAF-8*/ 01166100
  1943.       DOLEV = DOLEV-1;                                        /*RAF-8*/ 01166200
  1944.       CALL CWLABEL(CLABELE);                                  /*RAF-8*/ 01166300
  1945.       IF RCHECK('THEN') THEN CALL STMNT;                      /*RAF-8*/ 01166400
  1946.       CALL CWLABEL(EXIT);                                     /*RAF-8*/ 01167000
  1947.    /* DOLEV = DOLEV-1;        */                              /*RAF-8*/ 01168000
  1948.    /* NESTLEV = NESTLEV-1;    */                              /*RAF-8*/ 01169000
  1949.       IF NESTLEV=0 THEN PREDLABLEV=0;                         /*RAF-6*/ 01169500
  1950.       RETURN;                                                           01170000
  1951.    END CSELECT;                                                         01171000
  1952. 1                                                                       01172000
  1953.  ALCSTMT: PROCEDURE;                                                    01173000
  1954.    DCL                                                                  01174000
  1955.       ( BLANKS72 CHAR(72) INIT(' '),                                    01175000
  1956.         L FIXED BIN,                                                    01176000
  1957.         TLABEL CHAR(8) ) STATIC;                                        01177000
  1958.    DCL                                                                  01178000
  1959.       SPECOPS(39) CHAR(8) VAR STATIC INIT(                              01179000
  1960.        'DC','DS','CSECT','DSECT','COM',                                 01180000
  1961.        'TITLE','LTORG','CNOP',                                          01181000
  1962.        'DROP','USING','ENTRY',                                          01182000
  1963.        'SUBTITLE','PRINT','EJECT','SPACE',                              01183000
  1964.        'ICTL','ISEQ','PUNCH','REPRO',                                   01184000
  1965.        'ORG','COPY','END',                                              01185000
  1966.        'MACRO','MEND','MNOTE','AIF','ANOP','AGO','ACTR','MEXIT',        01186000
  1967.        'GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','SETA','SETB','SETC'   01187000
  1968.       );                                                                01188000
  1969.                                                                         01189000
  1970.       IF C_LABEL=' ' & LABLEV>0 THEN                                    01190000
  1971.          DO;                                                            01191000
  1972.             C_LABEL = LABSTK(LABLEV);                                   01192000
  1973.             LABLEV = LABLEV-1;                                          01193000
  1974.          END;                                                           01194000
  1975.       IF C_LABEL^=' ' THEN                                              01195000
  1976.          DO;                                                            01196000
  1977.             DO L=39 TO 1 BY -1 WHILE(WORD^=SPECOPS(L));                 01197000
  1978.             END;                                                        01198000
  1979.             IF (L>0 & SUBSTR(C_LABEL,1,1)='@') |                        01199000
  1980.                (L>8 & SUBSTR(C_LABEL,1,1)^='&') THEN                    01200000
  1981.                   CALL LABPUSH;                                         01201000
  1982.          END;                                                           01202000
  1983.       TLABEL = C_LABEL;                                                 01203000
  1984.       CALL ROPANDS(#FALSE);                                   /*RAF-9*/ 01204000
  1985.       IF WORD ^= 'CC' THEN                                              01205000
  1986.          DO ;                                                           01206000
  1987.             C_OPERATION = WORD ;                                        01207000
  1988.             IF IN_MACRO THEN                                            01208000
  1989.           /*   IF C_OPERATION = 'MEND' THEN   */              /*RAF-8*/ 01209000
  1990.           /*      IN_MACRO = #FALSE;          */              /*RAF-8*/ 01210000
  1991.           /*   ELSE                           */              /*RAF-8*/ 01211000
  1992.                   IF C_OPERATION = 'SPACE' THEN                         01212000
  1993.                      DO;                                                01213000
  1994.                         C_DATA = '.*';                                  01214000
  1995.                         OPANDS = '';                                    01215000
  1996.                      END;                                               01216000
  1997.                                                                         01217000
  1998.             IF WORD='SUBTITLE' THEN                                     01218000
  1999.                DO;                                                      01219000
  2000.                   C_OPERATION = 'TITLE' ;                               01220000
  2001.                   SUBTITL = #TRUE;                                      01221000
  2002.                   SUBTITLE = SUBSTR(BLANKS72,1,(73-LENGTH(OPANDS)-2)/2) 01222000
  2003.                              ||SUBSTR(OPANDS,2,LENGTH(OPANDS)-2);       01223000
  2004.                END;                                                     01224000
  2005.                                                                         01225000
  2006.             GEN_OPERANDS(OPANDS);                                       01226000
  2007.          END ;                                                          01227000
  2008. 1                                                                       01228000
  2009.       IF WORD = 'SPACE' THEN                                            01229000
  2010.          PUT SKIP(2) FILE(SYSPRINT);                                    01230000
  2011.       ELSE                                                              01231000
  2012.          IF WORD='TITLE' | WORD='EJECT' THEN                            01232000
  2013.             DO;                                                         01233000
  2014.                IF WORD='TITLE' THEN                                     01234000
  2015.                   DO;                                                   01235000
  2016.                    DECKNAME = TLABEL;                                   01236000
  2017.                    TITLE = SUBSTR(BLANKS72,1,(73-LENGTH(OPANDS)-2)/2)   01237000
  2018.                            ||SUBSTR(OPANDS,2,LENGTH(OPANDS)-2);         01238000
  2019.                   END;                                                  01239000
  2020.                SIGNAL ENDPAGE(SYSPRINT);                                01240000
  2021.             END;                                                        01241000
  2022.       INAL = 1 ;                                                        01242000
  2023.       RETURN;                                                           01243000
  2024.    END ALCSTMT;                                                         01244000
  2025. 1                                                                       01245000
  2026.  /* GENERATE CODE FOR PREDICATES */                                     01246000
  2027.  PREDICATE:                                                             01247000
  2028.    PROCEDURE(THRULABEL,BRLABEL,OUTER,PREDFOUND,GLOBALNEG,HANGNOT,BTYPE) 01248000
  2029.      RECURSIVE;                                                         01249000
  2030.                                                                         01250000
  2031.   /* THRULABEL = FALL-THROUGH LABEL                                     01251000
  2032.      BRLABEL = BRANCH LABEL                                             01252000
  2033.      OUTER=#TRUE => PREDICATE IS AN OUTER ONE                           01253000
  2034.      PREDFOUND => SET IF WE FIND WE ARE IN A PREDICATE, ELSE FALSE      01254000
  2035.      GLOBALNEG=#TRUE => GLOBAL NEGATION OF PREDICATE                    01255000
  2036.      BTYPE=#TRUE => BR FORM         */                                  01256000
  2037.                                                                         01257000
  2038.   DCL (THRULABEL,BRLABEL) CHAR(*) VARYING,                              01258000
  2039.       (OUTER,PREDFOUND,GLOBALNEG,HANGNOT,BTYPE) BIT(1);                 01259000
  2040.   DCL (BTRUTH,PREDNEST,ANDFLG,ORFLG) BIT(1),                            01260000
  2041.       (THRULAB,BRLAB) CHAR(8) VARYING,                                  01261000
  2042.       PREDID CHAR(8);                                                   01262000
  2043.                                                                         01263000
  2044.   PREDFOUND = #FALSE;                                                   01264000
  2045.   THRULAB,BRLAB = '';                                                   01265000
  2046.                                                                         01266000
  2047.   BTRUTH = ^GLOBALNEG;                                                  01267000
  2048.   DO WHILE(RCHAR('^'));                                                 01268000
  2049.    BTRUTH = ^BTRUTH;                                                    01269000
  2050.    PREDFOUND = #TRUE;                                                   01270000
  2051.   END;                                                                  01271000
  2052.                                                                         01272000
  2053.   IF ^RCHAR('<') THEN                                                   01273000
  2054.      CALL STMNT;                                                        01274000
  2055.   ELSE                                                                  01275000
  2056.      DO;                                                                01276000
  2057.         NESTLEV = NESTLEV+1; NESTID(NESTLEV) = CIN_ID;       /*RAF-28*/ 01276500
  2058.         PREDID = CIN_ID;                                                01277000
  2059.         CALL PREDICATE(THRULAB,BRLAB,@INNER_PREDICATE,PREDNEST,         01278000
  2060.                   ^BTRUTH,HANGNOT,BTYPE);                               01279000
  2061.         IF ^PREDNEST THEN                                               01280000
  2062.            DO;                                                          01281000
  2063.               IF RCHAR(';') THEN                                        01282000
  2064.                  DO;                                                    01283000
  2065.                     NESTLEV = NESTLEV-1;                     /*RAF-28*/ 01283500
  2066.                     CALL GROUP(#FALSE,PREDID);                          01284000
  2067.                     GOTO PREDTST;                                       01285000
  2068.                  END;                                                   01286000
  2069.               ELSE                                                      01287000
  2070.                  IF ^RCHAR('>') THEN                                    01288000
  2071.                     DO;                                                 01289000
  2072.                        CALL ERROR('CPRED: MISSING SEMICOLON INSERTED.');01290000
  2073.                     NESTLEV = NESTLEV-1;                     /*RAF-28*/ 01290500
  2074.                        CALL GROUP(#FALSE,PREDID);                       01291000
  2075.                        GOTO PREDTST;                                    01292000
  2076.                     END;                                                01293000
  2077.                  ELSE DO;                                    /*RAF-28*/ 01293100
  2078.                     NESTLEV = NESTLEV-1;                     /*RAF-28*/ 01293200
  2079.                     IF NESTLEV=0 THEN PREDLABLEV=0;          /*RAF-28*/ 01293300
  2080.                     END;                                     /*RAF-28*/ 01293400
  2081.            END;                                                         01294000
  2082.         ELSE                                                            01295000
  2083.            DO;                                                          01296000
  2084.               PREDFOUND = #TRUE;                                        01297000
  2085.               IF ^RCHAR('>') THEN                                       01298000
  2086.                  CALL ERROR('CPRED: MISSING ">" INSERTED.');            01299000
  2087.                  ELSE DO;                                    /*RAF-28*/ 01299100
  2088.                     NESTLEV = NESTLEV-1;                     /*RAF-28*/ 01299200
  2089.                     IF NESTLEV=0 THEN PREDLABLEV=0;          /*RAF-28*/ 01299300
  2090.                     END;                                     /*RAF-28*/ 01299400
  2091.            END;                                                         01300000
  2092.      END;                                                               01301000
  2093. 1                                                                       01302000
  2094.  PREDTST:                                                               01303000
  2095.   ANDFLG,ORFLG = #FALSE;                                                01304000
  2096.   IF RCHAR('&') THEN                                                    01305000
  2097.      IF GLOBALNEG THEN ORFLG = #TRUE;                                   01306000
  2098.      ELSE ANDFLG = #TRUE;                                               01307000
  2099.   ELSE                                                                  01308000
  2100.      IF RCHAR('|') THEN                                                 01309000
  2101.         IF GLOBALNEG THEN ANDFLG = #TRUE;                               01310000
  2102.         ELSE ORFLG = #TRUE;                                             01311000
  2103.   IF ANDFLG THEN                                                        01312000
  2104.      DO;                                                                01313000
  2105.        PREDFOUND = #TRUE;                                               01314000
  2106.        CALL GB(^XOR(BTRUTH,HANGNOT),BRLABEL,BTYPE);                     01315000
  2107.        HANGNOT = #FALSE;                                                01316000
  2108.        CALL EQU(BRLAB,BRLABEL);                                         01317000
  2109.        CALL CWLABEL(THRULAB);                                           01318000
  2110.        CALL PREDICATE(THRULABEL,BRLABEL,OUTER,#DUMMY,GLOBALNEG,HANGNOT, 01319000
  2111.                       BTYPE);                                           01320000
  2112.      END;                                                               01321000
  2113.   ELSE                                                                  01322000
  2114.      IF ORFLG THEN                                                      01323000
  2115.         DO;                                                             01324000
  2116.           PREDFOUND = #TRUE;                                            01325000
  2117.           CALL GB(XOR(BTRUTH,HANGNOT),THRULABEL,BTYPE);                 01326000
  2118.           HANGNOT = #FALSE;                                             01327000
  2119.           CALL EQU(THRULAB,THRULABEL);                                  01328000
  2120.           CALL CWLABEL(BRLAB);                                          01329000
  2121.           CALL PREDICATE(THRULABEL,BRLABEL,OUTER,#DUMMY,GLOBALNEG,      01330000
  2122.                          HANGNOT,BTYPE);                                01331000
  2123.         END;                                                            01332000
  2124.      ELSE                                                               01333000
  2125.         DO;                                                             01334000
  2126.           IF THRULABEL='' & THRULAB^='' THEN                            01335000
  2127.              DO;                                                        01336000
  2128.                 THRULABEL = THRULAB;                                    01337000
  2129.                 THRULAB = '';                                           01338000
  2130.              END;                                                       01339000
  2131.           IF BRLABEL='' & BRLAB^='' THEN                                01340000
  2132.              DO;                                                        01341000
  2133.                 BRLABEL = BRLAB;                                        01342000
  2134.                 BRLAB = '';                                             01343000
  2135.              END;                                                       01344000
  2136.           CALL EQU(THRULAB,THRULABEL);                                  01345000
  2137.           CALL EQU(BRLAB,BRLABEL);                                      01346000
  2138.           IF OUTER THEN                                                 01347000
  2139.               DO;                                                       01348000
  2140.                  CALL GB(^XOR(BTRUTH,HANGNOT),BRLABEL,BTYPE);           01349000
  2141.                  HANGNOT = #FALSE;                                      01350000
  2142.                  CALL CWLABEL(THRULABEL);                               01351000
  2143.               END;                                                      01352000
  2144.            ELSE                                                         01353000
  2145.               HANGNOT = HANGNOT | XOR(BTRUTH,^GLOBALNEG);               01354000
  2146.         END;                                                            01355000
  2147.                                                                         01356000
  2148.   RETURN;                                                               01357000
  2149. 1                                                                       01358000
  2150.   EQU: PROCEDURE(L1,L2);                                                01359000
  2151.    DCL (L1,L2) CHAR(*) VARYING;                                         01360000
  2152.    DCL ( (I,PREVOP) FIXED BIN,                                          01361000
  2153.          REG_DISP BIT(1) ) STATIC;                                      01362000
  2154.                                                                         01363000
  2155.     PREVOP = 0;                                                         01364000
  2156.     IF L2^='' THEN IF SUBSTR(L2,LENGTH(L2),1)=')' THEN        /*RAF-3*/ 01365000
  2157.        DO I=1 TO LENGTH(L2);                                            01366000
  2158.           IF SUBSTR(L2,I,1)='(' & PREVOP=0 THEN                         01367000
  2159.              DO;                                                        01368000
  2160.                 REG_DISP = #TRUE;                                       01369000
  2161.                 GOTO PREDLABCHK;                                        01370000
  2162.              END;                                                       01371000
  2163.           PREVOP = INDEX('+-*/',SUBSTR(L2,I,1));                        01372000
  2164.        END;                                                             01373000
  2165.     REG_DISP = #FALSE;                                                  01374000
  2166.                                                                         01375000
  2167.    PREDLABCHK:                                                          01376000
  2168.     DO I=PREDLABLEV TO 1 BY -1 WHILE(L1^=PREDLABSTK(I,2));              01377000
  2169.     END;                                                                01378000
  2170.     IF I>0 THEN                                                         01379000
  2171.        REG_DISP = PREDBTYPE(I)='R';                                     01380000
  2172.     IF I=0 | ^REG_DISP THEN                                             01381000
  2173.        DO;                                                              01382000
  2174.           IF L1^='' & L2^='' THEN                                       01383000
  2175.              CALL EQVADD((L1),(L2));                                    01384000
  2176.        END;                                                             01385000
  2177.     ELSE                                                                01386000
  2178.        DO;                                                              01387000
  2179.           CALL WLABEL(L1);                                              01388000
  2180.           GEN('DS','0H');                                               01389000
  2181.           GEN('ORG',PREDLABSTK(I,1)||'+2');                             01390000
  2182.           IF PREDBTYPE(I)='R' THEN                                      01391000
  2183.              GEN('DC','S(0('||L2||'))');                                01392000
  2184.           ELSE                                                          01393000
  2185.              GEN('DC','S('||L2||')');                                   01394000
  2186.           GEN('ORG',L1);                                                01395000
  2187.        END;                                                             01396000
  2188.                                                                         01397000
  2189.     IF I>0 THEN                                                         01398000
  2190.        DO;                                                              01399000
  2191.           DO I=I+1 TO PREDLABLEV;                                       01400000
  2192.              PREDLABSTK(I-1,1) = PREDLABSTK(I,1);                       01401000
  2193.              PREDLABSTK(I-1,2) = PREDLABSTK(I,2);                       01402000
  2194.           END;                                                          01403000
  2195.           PREDLABLEV = PREDLABLEV-1;                                    01404000
  2196.        END;                                                             01405000
  2197.     RETURN;                                                             01406000
  2198.   END EQU;                                                              01407000
  2199.                                                                         01408000
  2200.   XOR: PROCEDURE(B1,B2) RETURNS(BIT(1));                                01409000
  2201.    DCL (B1,B2) BIT(1);                                                  01410000
  2202.     RETURN((B1 & ^B2) | (^B1 & B2));                                    01411000
  2203.   END XOR;                                                              01412000
  2204.                                                                         01413000
  2205.  /* END PREDICATE; */                                         /*RAF-6*/ 01414000
  2206. 1                                                                       01415000
  2207.  GB:                                                                    01416000
  2208.    PROCEDURE (B,LABLST,BRT);                                            01417000
  2209.  /* GENERATE CONDITIONAL BRANCH (ON TRUTH IF B) TO LABLST   */          01418000
  2210.    DCL                                                                  01419000
  2211.       (B,BRT) BIT(1),                                                   01420000
  2212.       LABLST CHAR(*) VARYING;                                           01421000
  2213.    DCL                                                                  01422000
  2214.       LABLADDR CHAR(8) VARYING STATIC,                       /*RAF-41*/ 01423000
  2215.       (I,J) FIXED BIN STATIC,                                /*RAF-41*/ 01424000
  2216.       CCCODE CHAR(8) STATIC,                                 /*RAF-41*/ 01425000
  2217.       CCODE FIXED BIN STATIC;                                /*RAF-41*/ 01426000
  2218.                                                              /*RAF-41*/ 01426100
  2219.       CCODE = 0;                                             /*RAF-41*/ 01426200
  2220.                                                                         01427000
  2221.       IF LABLST='' THEN                                                 01428000
  2222.          DO;                                                            01429000
  2223.             CALL SWLABEL(LABLADDR);                                     01430000
  2224.             PREDLABLEV = PREDLABLEV+1;                                  01431000
  2225.             PREDLABSTK(PREDLABLEV,1) = LABLADDR;                        01432000
  2226.             LABLST = GENSYM;                                            01433000
  2227.             PREDLABSTK(PREDLABLEV,2) = LABLST;                          01434000
  2228.             IF BRT THEN                                                 01435000
  2229.                PREDBTYPE(PREDLABLEV) = 'R';                             01436000
  2230.             ELSE                                                        01437000
  2231.                PREDBTYPE(PREDLABLEV) = '';                              01438000
  2232.          END;                                                           01439000
  2233.                                                                         01440000
  2234.       IF WORD = 'CC' THEN                                               01441000
  2235.          DO;                                                            01442000
  2236.             IF LENGTH(OPANDS)>8 THEN                                    01443000
  2237.                CALL ERROR('GB: CONDITION CODE STRING TOO LONG.');       01444000
  2238.             CCCODE = OPANDS;                                            01445000
  2239.          END;                                                           01446000
  2240.       ELSE                                                              01447000
  2241.          DO;                                                            01448000
  2242.             DO I = 1 TO 17 WHILE(PREDICATES(I,1) ^= WORD);              01449000
  2243.             END;                                                        01450000
  2244.             CCCODE = PREDICATES(I,2);                                   01451000
  2245.          END;                                                           01452000
  2246. 1                                                                       01453000
  2247.  /*  CCCODE IS NOW A SET OF MNEMONIC COND CODE CHARACTERS  */           01454000
  2248.       DO I = 1 TO 8;                     /* FOR EACH CHAR ..  */        01455000
  2249.          J = INDEX(CCTAB.LET, SUBSTR(CCCODE, I, 1));                    01456000
  2250.          IF J = 0 THEN                                                  01457000
  2251.             CALL                                                        01458000
  2252.             ERROR('UNDEF COND CODE CHAR: ' || SUBSTR(CCCODE,I,1) );     01459000
  2253.          ELSE                                                           01460000
  2254.             CCODE = CCODE+CCTAB.IVAL(J);                                01461000
  2255.       END;                                                              01462000
  2256.       IF INDEX(CCCODE, 'N') | INDEX(CCCODE,'^') THEN                    01463000
  2257.          CCODE = 15-CCODE;                                              01464000
  2258.       IF ^B THEN                                                        01465000
  2259.          CCODE = 15-CCODE;                                              01466000
  2260.       SUBSTR(CARDOUT,10,10) = OPTAB(CCODE+1);                           01467000
  2261.       IF BRT & SUBSTR(LABLST,1,1)^='@' THEN                             01468000
  2262.          IF SUBSTR(C_OPERATION,3,1)=' ' THEN                            01469000
  2263.             SUBSTR(C_OPERATION,3,1)='R';                                01470000
  2264.          ELSE                                                           01471000
  2265.             SUBSTR(C_OPERATION,4,1)='R';                                01472000
  2266.       C_OPERANDS = LABLST;                                              01473000
  2267.       CALL WFLUSH;                                                      01474000
  2268.       RETURN;                                                           01475000
  2269.                                                                         01476000
  2270.    END GB;                                                              01477000
  2271.  END PREDICATE;                                               /*RAF-6*/ 01477500
  2272. 1                                                                       01478000
  2273.  /*  WRITE LABEL  */                                                    01479000
  2274.  WLABEL:                                                                01480000
  2275.    PROCEDURE (ALABL);                                                   01481000
  2276.    DCL                                                                  01482000
  2277.       ALABL CHAR(*) VARYING;                                            01483000
  2278.    DCL                                                                  01484000
  2279.       I FIXED BIN STATIC;                                               01485000
  2280.                                                                         01486000
  2281.       GOTO WLABELX;                                                     01487000
  2282. 0                                                                       01488000
  2283.  SWLABEL:                                                               01489000
  2284.    ENTRY(ALABL);                                                        01490000
  2285.                                                                         01491000
  2286.       IF C_LABEL ^= ' ' THEN                                            01492000
  2287.          ALABL = C_LABEL;                                               01493000
  2288.       ELSE                                                              01494000
  2289.          IF LABLEV>0 THEN                                               01495000
  2290.             ALABL = LABSTK(LABLEV);                                     01496000
  2291.          ELSE                                                           01497000
  2292.             ALABL = '';                                                 01498000
  2293.       IF ALABL^='' THEN IF SUBSTR(ALABL,1,1)^='.' THEN        /*RAF-3*/ 01499000
  2294.          RETURN;                                                        01500000
  2295.    /* ELSE */                                                 /*RAF-3*/ 01501000
  2296.          DO;                                                            01502000
  2297.             ALABL = GENSYM;                                             01503000
  2298.             GOTO WLABELX;                                               01504000
  2299.          END;                                                           01505000
  2300. 0                                                                       01506000
  2301.  CWLABEL:                                                               01507000
  2302.    ENTRY(ALABL);                                                        01508000
  2303.                                                                         01509000
  2304.       IF ALABL='' THEN RETURN;                                          01510000
  2305. 0                                                                       01511000
  2306.      WLABELX: IF C_LABEL ^= ' ' THEN                                    01512000
  2307.       DO; /* LABEL ALREADY IN BUFFER */                                 01513000
  2308.          LABLEV = LABLEV+1;                                             01514000
  2309.          LABSTK(LABLEV) = C_LABEL;                                      01515000
  2310.       END;                                                              01516000
  2311.       DO I = 1 TO EQVLEV;                                               01517000
  2312.          IF EQVSTK(I,2) = ALABL THEN                                    01518000
  2313.             DO;                                                         01519000
  2314.                LABLEV = LABLEV+1;                                       01520000
  2315.                LABSTK(LABLEV) = EQVSTK(I,1);                            01521000
  2316.                EQVSTK(I,*) = '';                                        01522000
  2317.             END;                                                        01523000
  2318.       END;                                                              01524000
  2319.       C_LABEL = ALABL ;                                                 01525000
  2320.       IF COL_1^='&' & COL_1^='.' THEN                        /*RAF-12*/ 01526000
  2321.          DO;                                                            01527000
  2322.             SYMLEV = SYMLEV+1;                                          01528000
  2323.             SYMSTK(SYMLEV) = ALABL;                                     01529000
  2324.          END;                                                           01530000
  2325.       CALL PERPUSH;                                                     01531000
  2326.       RETURN;                                                           01532000
  2327.    END WLABEL ;                                                         01533000
  2328. 1                                                                       01534000
  2329.  /*   FLUSH OUTPUT LINE  */                                             01535000
  2330.  WFLUSH:                                                                01536000
  2331.    PROCEDURE ;                                                          01537000
  2332.    DCL ( (I,J) FIXED BIN,                                               01538000
  2333.         (FLUSH,LAST_WAS_BRANCH,NOWRITE) BIT(1),                         01539000
  2334.         TLABEL CHAR(8) VARYING,                                         01540000
  2335.         CH CHAR(1) ) STATIC;                                            01541000
  2336.                                                                         01542000
  2337.       IF C_OPERATION='ANOP' & C_LABEL='' THEN RETURN;        /*RAF-29*/ 01542100
  2338.                                                              /*RAF-29*/ 01542200
  2339.       LAST_WAS_BRANCH = BRANCH_LAST;                                    01543000
  2340.       BRANCH_LAST,NOWRITE = #FALSE;                                     01544000
  2341.       IF REQFLUSH(C_OPERATION) THEN                                     01545000
  2342.        DO;                                                              01546000
  2343.         FLUSH = #TRUE;                                                  01547000
  2344.         IF C_OPERATION = 'B' THEN                                       01548000
  2345.            DO;                                                          01549000
  2346.               DO I = 1 TO 52                                 /*RAF-41*/ 01550000
  2347.                  WHILE(ALPHANUM(SUBSTR(C_OPERANDS,I,1)));    /*RAF-41*/ 01550100
  2348.               END;                                                      01551000
  2349.               CH = SUBSTR(C_OPERANDS,I,1);                              01552000
  2350.               IF (I>1 & I<=9) &                                         01553000
  2351.                  (CH = ' ' | CH = ';' | CH = '%' | CH = '>') THEN       01554000
  2352.                  DO; /* BRANCH TO SIMPLE LABEL */                       01555000
  2353.                     FLUSH = #FALSE;                                     01556000
  2354.                     BRANCH_LAST = #TRUE;                                01557000
  2355.                     IF C_LABEL = ' ' & LABLEV>0 THEN DO;      /*RAF-2*/ 01557100
  2356.                        C_LABEL = LABSTK(LABLEV);              /*RAF-2*/ 01557200
  2357.                        LABLEV = LABLEV-1;                     /*RAF-2*/ 01557300
  2358.                        END;                                   /*RAF-2*/ 01557400
  2359.                     IF C_LABEL ^= ' ' & (^IN_MACRO           /*RAF-43*/ 01558000
  2360.                     | SUBSTR(C_OPERANDS,1,1)='@')            /*RAF-43*/ 01558500
  2361.                     THEN DO;                                 /*RAF-43*/ 01559000
  2362.                           LABLEV = LABLEV+1;                            01560000
  2363.                           LABSTK(LABLEV) = C_LABEL;                     01561000
  2364.                           TLABEL = SUBSTR(C_OPERANDS,1,I-1);            01562000
  2365.                           DO I=LABLEV TO 1 BY -1                        01563000
  2366.                            WHILE(LABSTK(I)^=TLABEL);                    01564000
  2367.                           END;                                          01565000
  2368.                           IF I>0 THEN                                   01566000
  2369.                              DO;                                        01567000
  2370.                                 LABLEV = LABLEV-1;                      01568000
  2371.                                 CALL LABFLUSH;                          01569000
  2372.                              END;                                       01570000
  2373.                           ELSE                                          01571000
  2374.                              DO;                                        01572000
  2375.                                 C_LABEL = ' ';                          01573000
  2376.                                 DO J = 1 TO LABLEV;                     01574000
  2377.                                    CALL EQVADD((LABSTK(J)),(TLABEL));   01575000
  2378.                                 END;                                    01576000
  2379.                                 LABLEV = 0;                             01577000
  2380.                              END;                                       01578000
  2381.                        END;                                             01579000
  2382.                     NOWRITE = LAST_WAS_BRANCH & ^LABEL_WRITTEN ;        01580000
  2383.                  END;                                                   01581000
  2384.            END;                                                         01582000
  2385.         IF FLUSH THEN                                                   01583000
  2386.            CALL LABFLUSH;                                               01584000
  2387.        END;                                                             01585000
  2388. 1                                                                       01586000
  2389.       IF ^NOWRITE THEN                                                  01587000
  2390.          WRITE FILE(SYSOUT) FROM(CARDOUT) ;                             01588000
  2391.       LABEL_WRITTEN = #FALSE;                                           01589000
  2392.       C_DATA = ' ';                                                     01590000
  2393.       IF INAL = 2 THEN                                                  01591000
  2394.          INAL = 1 ;                                                     01592000
  2395.       RETURN;                                                           01593000
  2396.                                                                         01594000
  2397.  /* PROCEDURE TO SIGNAL WHEN STACK FLUSH IS REQUIRED */                 01595000
  2398.  REQFLUSH: PROC(OPCODE) RETURNS(BIT(1));                                01596000
  2399.   DCL OPCODE CHAR(8);                                                   01597000
  2400.   DCL I FIXED BIN STATIC,                                               01598000
  2401.       NOFLUSH(26) CHAR(8) STATIC INIT(                                  01599000
  2402.        ' ','DROP','USING','EQU',                                        01600000
  2403.        'TITLE','SUBTITLE','PRINT','EJECT','SPACE',                      01601000
  2404.        'ICTL','ISEQ','PUNCH',                                           01602000
  2405.        'MNOTE','AIF','ANOP','AGO','ACTR',                               01603000
  2406.        'GBLA','GBLB','GBLC','LCLA','LCLB','LCLC','SETA','SETB','SETC'   01604000
  2407.       );                                                                01605000
  2408.                                                                         01606000
  2409.   DO I=1 TO 26;                                                         01607000
  2410.    IF OPCODE=NOFLUSH(I) THEN RETURN(#FALSE);                            01608000
  2411.   END;                                                                  01609000
  2412.   RETURN(#TRUE);                                                        01610000
  2413.  END REQFLUSH;                                                          01611000
  2414.  END WFLUSH ;                                                           01612000
  2415. 1                                                                       01613000
  2416.  /* FLUSH LABEL EQUIVALENCING STACK */                                  01614000
  2417.  EQVFLUSH:                                                              01615000
  2418.    PROCEDURE(LEVZ,ELEVL);                                               01616000
  2419.    DCL                                                                  01617000
  2420.       LEVZ BIT(1),                                                      01618000
  2421.       ELEVL FIXED BIN,                                                  01619000
  2422.       I FIXED BIN STATIC;                                    /*RAF-41*/ 01619500
  2423.    DCL                                                                  01620000
  2424.       EQVBUF CHAR(80) STATIC INIT('         EQU') UNALIGNED, /*RAF-46*/ 01621000
  2425.       E_LABEL CHAR(8) POS(1) DEF EQVBUF UNALIGNED,           /*RAF-46*/ 01622000
  2426.       E_OPERAND CHAR(61) POS(20) DEF EQVBUF UNALIGNED;       /*RAF-46*/ 01623000
  2427.       IF EQVLEV>0 THEN                                                  01624000
  2428.          DO;                                                            01625000
  2429.             DO I = ELEVL TO EQVLEV;                                     01626000
  2430.                E_LABEL = EQVSTK(I,1);                                   01627000
  2431.                IF E_LABEL ^= ' ' THEN                                   01628000
  2432.                   DO;                                                   01629000
  2433.                      E_OPERAND = EQVSTK(I,2);                           01630000
  2434.                  /*  IF ((SUBSTR(E_OPERAND,1,1)='@') |   */  /*RAF-12*/ 01631000
  2435.                  /*      (SUBSTR(E_OPERAND,1,1)^='@' &   */  /*RAF-12*/ 01632000
  2436.                      IF LEVZ | SYMDEF(EQVSTK(I,2)) THEN      /*RAF-12*/ 01633000
  2437.                           DO;                                           01634000
  2438.                              EQVSTK(I,*) = '';                          01635000
  2439.                              WRITE FILE(SYSOUT) FROM(EQVBUF);           01636000
  2440.                           END;                                          01637000
  2441.                   END;                                                  01638000
  2442.             END;                                                        01639000
  2443.             IF LEVZ THEN                                                01640000
  2444.                EQVLEV = 0;                                              01641000
  2445.          END;                                                           01642000
  2446.       RETURN;                                                           01643000
  2447.                                                                         01644000
  2448.  SYMDEF: PROCEDURE(SYMBOL) RETURNS(BIT(1));                             01645000
  2449.   DCL SYMBOL CHAR(*) VARYING;                                           01646000
  2450.   DCL I FIXED BIN STATIC;                                               01647000
  2451.                                                                         01648000
  2452.    DO I=SYMLEV TO 1 BY -1;                                              01649000
  2453.     IF SYMSTK(I)=SYMBOL THEN RETURN(#TRUE);                             01650000
  2454.    END;                                                                 01651000
  2455.    RETURN(#FALSE);                                                      01652000
  2456.   END SYMDEF;                                                           01653000
  2457.                                                                         01654000
  2458.  END EQVFLUSH;                                                          01655000
  2459. 1                                                                       01656000
  2460.  LABFLUSH: PROCEDURE;                                                   01657000
  2461.    DCL                                                                  01658000
  2462.       I FIXED BIN STATIC,                                               01659000
  2463.       FLUSHBUF CHAR(80) STATIC UNALIGNED                     /*RAF-46*/ 01660000
  2464.             INIT('         DS        0H'),                   /*RAF-46*/ 01660100
  2465.       F_LABEL CHAR(8) POS(1) DEF FLUSHBUF UNALIGNED,         /*RAF-46*/ 01661000
  2466.       F_ID CHAR(8) POS(73) DEF FLUSHBUF UNALIGNED;           /*RAF-46*/ 01662000
  2467.                                                                         01663000
  2468.    F_ID = CIN_ID;                                                       01664000
  2469.    IF LABLEV>0 THEN                                                     01665000
  2470.       DO;                                                               01666000
  2471.          LABEL_WRITTEN = #TRUE;                                         01667000
  2472.          DO I = 1 TO LABLEV;                                            01668000
  2473.             F_LABEL = LABSTK(I);                                        01669000
  2474.             WRITE FILE(SYSOUT) FROM(FLUSHBUF);                          01670000
  2475.          END;                                                           01671000
  2476.          LABLEV = 0;                                                    01672000
  2477.       END;                                                              01673000
  2478.    RETURN;                                                              01674000
  2479.  END LABFLUSH;                                                          01675000
  2480. 1                                                                       01676000
  2481.  /* PUSH NON-SEQUENCE LABELS */                                         01677000
  2482.  LABPUSH: PROCEDURE;                                                    01678000
  2483.    DCL                                                                  01679000
  2484.       (I,J) FIXED BIN STATIC,                                /*RAF-41*/ 01680000
  2485.       SEQBUF CHAR(80) STATIC INIT('         ANOP') UNAL,     /*RAF-46*/ 01681000
  2486.       S_LABEL CHAR(8) POS(1) DEF SEQBUF UNALIGNED,           /*RAF-46*/ 01682000
  2487.       S_ID CHAR(8) POS(73) DEF SEQBUF UNALIGNED,             /*RAF-46*/ 01683000
  2488.       S_COL1 CHAR(1) POS(1) DEF SEQBUF UNALIGNED;            /*RAF-46*/ 01684000
  2489.                                                                         01685000
  2490.    IF C_LABEL^=' ' & SUBSTR(C_LABEL,1,1)^='.' THEN                      01686000
  2491.       DO;                                                               01687000
  2492.          LABLEV = LABLEV+1;                                             01688000
  2493.          LABSTK(LABLEV) = C_LABEL;                                      01689000
  2494.          C_LABEL = '';                                                  01690000
  2495.       END;                                                              01691000
  2496.                                                                         01692000
  2497.  PERPUSH: ENTRY;                                                        01693000
  2498.    IF LABLEV>0 THEN                                                     01694000
  2499.       DO;                                                               01695000
  2500.          S_ID = CIN_ID;                                                 01696000
  2501.          J = 0;                                                         01697000
  2502.          DO I=1 TO LABLEV;                                              01698000
  2503.             S_LABEL = LABSTK(I);                                        01699000
  2504.             IF S_COL1='.' THEN                                          01700000
  2505.                WRITE FILE(SYSOUT) FROM(SEQBUF);                         01701000
  2506.             ELSE                                                        01702000
  2507.                DO;                                                      01703000
  2508.                   J = J+1;                                              01704000
  2509.                   LABSTK(J) = LABSTK(I);                                01705000
  2510.                END;                                                     01706000
  2511.          END;                                                           01707000
  2512.          IF LABLEV^=J THEN                                              01708000
  2513.             DO;                                                         01709000
  2514.                LABLEV = J;                                              01710000
  2515.                LABEL_WRITTEN = #TRUE;                                   01711000
  2516.             END;                                                        01712000
  2517.       END;                                                              01713000
  2518.    RETURN;                                                              01714000
  2519.  END LABPUSH;                                                           01715000
  2520. 0                                                                       01716000
  2521.  /* GENERATE A LABEL SYMBOL */                                          01717000
  2522.  GENSYM: PROCEDURE RETURNS(CHAR(8) VARYING);                            01718000
  2523.       GENNUM = GENNUM+1;                                                01719000
  2524.       IF IN_MACRO THEN                                                  01720000
  2525.          RETURN('@&@.'||SUBSTR(GENNUM,6));                              01721000
  2526.       ELSE                                                              01722000
  2527.          RETURN('@'||SUBSTR(GENNUM,5));                                 01723000
  2528.                                                                         01724000
  2529.  /* GENERATE A SEQUENCE SYMBOL */                                       01725000
  2530.  GENSEQSYM: ENTRY RETURNS(CHAR(8) VARYING);                             01726000
  2531.       GENNUM = GENNUM+1;                                                01727000
  2532.       RETURN('.@'||SUBSTR(GENNUM,5));                                   01728000
  2533.                                                                         01729000
  2534.  END GENSYM;                                                            01730000
  2535. 1                                                                       01731000
  2536.  /* PROCEDURE TO ADD A LABEL AND TARGET TO THE EQUIVALENCING STACK */   01732000
  2537.  EQVADD: PROCEDURE(EQLABEL,EQTARGET);                                   01733000
  2538.     DCL (EQLABEL,EQTARGET) CHAR(*) VARYING;                             01734000
  2539.     DCL I FIXED BIN STATIC,                                  /*RAF-41*/ 01735000
  2540.         HIT BIT(1) STATIC;                                   /*RAF-41*/ 01736000
  2541.                                                                         01737000
  2542.     HIT = #FALSE;                                            /*RAF-41*/ 01737500
  2543.     DO I=1 TO EQVLEV;                                                   01738000
  2544.        IF EQVSTK(I,1)='' THEN                                           01739000
  2545.           DO;                                                           01740000
  2546.              IF ^HIT THEN                                               01741000
  2547.                 DO;                                                     01742000
  2548.                    HIT = #TRUE;                                         01743000
  2549.                    EQVSTK(I,1) = EQLABEL;                               01744000
  2550.                    EQVSTK(I,2) = EQTARGET;                              01745000
  2551.                 END;                                                    01746000
  2552.           END;                                                          01747000
  2553.        ELSE                                                             01748000
  2554.           DO;                                                           01749000
  2555.              IF EQVSTK(I,2)=EQLABEL THEN                                01750000
  2556.                 EQVSTK(I,2) = EQTARGET;                                 01751000
  2557.              IF EQTARGET=EQVSTK(I,1) THEN                               01752000
  2558.                 EQTARGET = EQVSTK(I,2);                                 01753000
  2559.           END;                                                          01754000
  2560.     END;                                                                01755000
  2561.     IF ^HIT THEN                                                        01756000
  2562.        DO;                                                              01757000
  2563.           EQVLEV = EQVLEV+1;                                            01758000
  2564.           EQVSTK(I,1) = EQLABEL;                                        01759000
  2565.           EQVSTK(I,2) = EQTARGET;                                       01760000
  2566.        END;                                                             01761000
  2567.     RETURN;                                                             01762000
  2568.                                                                         01763000
  2569.  END EQVADD;                                                            01764000
  2570. 1                                                                       01765000
  2571.  /* INPUT: */ /* ALP INPUT ROUTINES */                       /*RAF-41*/ 01766000
  2572.  /*  PROCEDURE ;   */                                        /*RAF-41*/ 01767000
  2573.                                                                         01768000
  2574.  /*                                                                     01769000
  2575.          RWORD                   READ WORD INTO 'WORD'                  01770000
  2576.              SKIP,INC                                                   01771000
  2577.              ALPHANUM                                                   01772000
  2578.          RLABEL                  READ LABEL INTO 'WORD'                 01773000
  2579.              SKIP,INC                                                   01774000
  2580.              ALPHANUM                                                   01775000
  2581.          ROPANDS                 READ OPERANDS INTO 'OPANDS'            01776000
  2582.              SKIP,INC                                                   01777000
  2583.          RCHAR('C')              READ CHAR IF IT IS 'C'                 01778000
  2584.              SKIP,INC                                                   01779000
  2585.          RCHECK(CHKWORD)         READ 'CHKWORD' IF PRESENT              01780000
  2586.              SKIP,INC                                                   01781000
  2587.              ALPHANUM                                                   01782000
  2588.  */                                                                     01783000
  2589.                                                                         01784000
  2590.  /*DECLARE                             */                    /*RAF-41*/ 01785000
  2591.  /*   STARTCOL FIXED BIN STATIC,       */                    /*RAF-41*/ 01786000
  2592.  /*   I FIXED BIN STATIC;              */                    /*RAF-41*/ 01787000
  2593. 1                                                                       01788000
  2594.  RWORD: PROCEDURE;                                           /*RAF-41*/ 01789000
  2595.                  /* READ NEXT TOKEN INTO 'WORD'. A TOKEN IS A SINGLE    01790000
  2596.                     SPECIAL CHARACTER OR 1-8 ALPHANUMERICS. 'WORDAL'    01791000
  2597.                     IS SET TO #TRUE IFF 'WORD' IS ALPHANUMERIC. */      01792000
  2598.        DCL (STARTCOL,I) FIXED BIN STATIC;                    /*RAF-41*/ 01792500
  2599.       CALL SKIP;                                                        01793000
  2600.       IF COL<71 & SUBSTR(CARDIN,COL,2)='&&'                             01794000
  2601.        & ALPHANUM(SUBSTR(CARDIN,COL+2,1)) THEN                          01795000
  2602.          DO;                                                            01796000
  2603.             COL = COL+1 ;                                               01797000
  2604.             CHAR = 'A' ;                                                01798000
  2605.          END;                                                           01799000
  2606.       IF ^ALPHANUM(CHAR) THEN                                           01800000
  2607.          DO ;                          /* WORD IS NOT ALPHANUMERIC */   01801000
  2608.             WORD = CHAR ;                                               01802000
  2609.             IF CHAR ^= ';' THEN                                         01803000
  2610.                CALLINC;                                                 01804000
  2611.             WORDAL = #FALSE ;                                           01805000
  2612.          END;                                                           01806000
  2613.       ELSE                                                              01807000
  2614.          DO ;                                                           01808000
  2615.             WORDAL = #TRUE ;             /* WORD IS ALPHANUMERIC */     01809000
  2616.             STARTCOL = COL ;                                            01810000
  2617.             DO I = 0 BY 1 WHILE(ALPHANUM(CHAR)) ;                       01811000
  2618.                CALLINC;                                                 01812000
  2619.             END;                                                        01813000
  2620.             WORD = SUBSTR(CARDIN,STARTCOL,I) ;                          01814000
  2621.             IF I>8 & INAL^=0 THEN                            /*RAF-10*/ 01815000
  2622.                CALL ERROR('RW40: TOO MANY CHARACTERS IN WORD "'||       01816000
  2623.                     SUBSTR(CARDIN,STARTCOL,I)||'".');                   01817000
  2624.          END;                                                           01818000
  2625.       RETURN;                                                           01819000
  2626.  END RWORD;                                                  /*RAF-41*/ 01819500
  2627. 1                                                                       01820000
  2628.  RLABEL: PROCEDURE;                                          /*RAF-41*/ 01821000
  2629.                   /* SCAN OFF A LABEL : BEGINS WITH 'A'-'Z','@','#','$',01822000
  2630.                     AND '.' OR '&' AS SPECIAL CASES. ENDS WITH BLANK OR 01823000
  2631.                     ANY NON-ALPHANUMERIC OTHER THAN '.' '&' '(' ')' */  01824000
  2632.       DCL LABEL CHAR(20) VARYING STATIC;                     /*RAF-41*/ 01825000
  2633.       DCL STARTCOL FIXED BIN STATIC;                         /*RAF-41*/ 01825500
  2634.       CALL SKIP;                                                        01826000
  2635.       IF ^ALPHANUM(CHAR) & CHAR^='.' & CHAR^='&' THEN                   01827000
  2636.          DO ;                  /* WORD IS NOT ALPHANUMERIC */           01828000
  2637.             WORDAL = #FALSE ;                                           01829000
  2638.             WORD = CHAR ;                                               01830000
  2639.             IF CHAR ^= ';' THEN                                         01831000
  2640.                CALLINC;                                                 01832000
  2641.             RETURN ;                                                    01833000
  2642.          END;                                                           01834000
  2643.                                                                         01835000
  2644.       WORDAL = #TRUE;                                                   01836000
  2645.       IF CHAR='.' THEN                                                  01837000
  2646.          DO;                                                            01838000
  2647.             LABEL = '.';                                                01839000
  2648.             CALLINC;                                                    01840000
  2649.          END;                                                           01841000
  2650.       ELSE                                                              01842000
  2651.          LABEL = '';                                                    01843000
  2652.       STARTCOL = COL;                                                   01844000
  2653.       DO WHILE(ALPHANUM(CHAR) | CHAR='&' | CHAR='.'          /*RAF-26*/ 01845000
  2654.              | (CHAR='('                                                01846000
  2655.  /*RAF-3*/ /* & (SUBSTR(LABEL,1,1)='&' & SUBSTR(CARDIN,COL+1,1)='&')) */01847000
  2656.              | (CHAR=')'                                                01848000
  2657.  /*RAF-3*/ /* & (SUBSTR(LABEL,1,1)='&') */  )));                        01849000
  2658.          IF CHAR='&' THEN                                               01850000
  2659.             DO;                                                         01851000
  2660.                CALLINC;                                                 01852000
  2661.                LABEL = LABEL||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);     01853000
  2662.                IF CHAR='&' THEN                                         01854000
  2663.                   CALLINC;                                              01855000
  2664.                ELSE                                                     01856000
  2665.                   CALL ERROR('LB40: "&" INSERTED.');                    01857000
  2666.                STARTCOL = COL;                                          01858000
  2667.             END;                                                        01859000
  2668.          ELSE                                                           01860000
  2669.             CALLINC;                                                    01861000
  2670.       END;                                                              01862000
  2671.       LABEL = LABEL||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL) ;             01863000
  2672.       IF LENGTH(LABEL)>8 THEN                                           01864000
  2673.         CALL ERROR('LB60: TOO MANY CHARACTERS IN LABEL "'||LABEL||'".');01865000
  2674.       WORD = LABEL;                                                     01866000
  2675.       IF CHAR^=' ' & CHAR^=':' & CHAR^=';' & CHAR^='>' THEN             01867000
  2676.          CALL ERROR('LB50: BLANK INSERTED.');                           01868000
  2677.       RETURN;                                                           01869000
  2678.  END RLABEL;                                                 /*RAF-41*/ 01869500
  2679. 1                                                                       01870000
  2680.  ROPANDS:                                                               01871000
  2681.       PROCEDURE(COMMASW);                          /*RAF-41*/ /*RAF-9*/ 01872000
  2682.  /* BUILD OPERANDS OF A NON-ALP INSTRUCTION IN "OPANDS"  */             01873000
  2683.     DCL COMMASW BIT(1),                                       /*RAF-9*/ 01873100
  2684.         TERMCHAR CHAR(8) VARYING STATIC;           /*RAF-41*/ /*RAF-9*/ 01873200
  2685.     DCL STARTCOL FIXED BIN STATIC;                           /*RAF-41*/ 01873250
  2686.     IF COMMASW THEN TERMCHAR=' %;|&>:,';                      /*RAF-9*/ 01873300
  2687.     ELSE TERMCHAR = ' %;|&>';                                 /*RAF-9*/ 01873400
  2688.       OPANDS = '';                                                      01874000
  2689.  ROA: CALL SKIP;                                                        01875000
  2690.       STARTCOL = COL;                                                   01876000
  2691.  RO_CHARLOOP:                                                           01877000
  2692.       DO WHILE(#TRUE);                                                  01878000
  2693.          IF INDEX(TERMCHAR, CHAR) /* TERMINAL CHARS  */ THEN  /*RAF-9*/ 01879000
  2694.             DO;                                                         01880000
  2695.                IF OPANDS = '' THEN                                      01881000
  2696.                   OPANDS = SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);        01882000
  2697.                ELSE                                                     01883000
  2698.                   OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);01884000
  2699.                IF CHAR='&' & COL<72 & SUBSTR(CARDIN,COL+1,1)='&' THEN   01885000
  2700.                   DO;                                                   01886000
  2701.                      STARTCOL,COL = COL+1;                              01887000
  2702.                      CALLINC;                                           01888000
  2703.                      GO TO RO_CHARLOOP;                                 01889000
  2704.                   END;                                                  01890000
  2705.                GO TO OPTRUNC;                                           01891000
  2706.             END;                                                        01892000
  2707.          IF CHAR = '_' /* INPUT CONTINUATION */ THEN                    01893000
  2708.             DO;                                                         01894000
  2709.                IF OPANDS = '' THEN                                      01895000
  2710.                   OPANDS = SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);        01896000
  2711.                ELSE                                                     01897000
  2712.                   OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);01898000
  2713.                CALLINC;                                                 01899000
  2714.                GO TO ROA;                                               01900000
  2715.             END;                                                        01901000
  2716.          IF CHAR = '''' THEN                                            01902000
  2717.             DO;                                                         01903000
  2718.                IF COL>1 THEN                                            01904000
  2719.                   DO;                                                   01905000
  2720.                      IF VERIFY(SUBSTR(CARDIN,COL-1,1),       /*RAF-14*/ 01906000
  2721.                                'LKNTSI')^=0 THEN             /*RAF-14*/ 01906500
  2722.                         GO TO RO_PRIMES;                                01907000
  2723.                   END;                                                  01908000
  2724.                ELSE                                                     01909000
  2725.                   DO;                                                   01910000
  2726.                      IF SUBSTR(OPANDS,LENGTH(OPANDS),1) ^= 'L' THEN     01911000
  2727.                         GO TO RO_PRIMES;                                01912000
  2728.                   END;                                                  01913000
  2729.             END;                                                        01914000
  2730.          CALLINC ;                                                      01915000
  2731.       END RO_CHARLOOP ;                                                 01916000
  2732.                                                                         01917000
  2733.  OPTRUNC:                                                               01918000
  2734.           RETURN;                                                       01919000
  2735. 1                                                                       01920000
  2736.  RO_PRIMES:                                                             01921000
  2737.       CALLINC;                                                          01922000
  2738.  RO_PRIMELOOP:                                                          01923000
  2739.       DO WHILE(CHAR ^= '''');                                           01924000
  2740.          IF COL > 72 THEN                                               01925000
  2741.             DO ;                                                        01926000
  2742.                CALL ERROR('RO30: MISSING QUOTE IN "'||CARDIN||'".');    01927000
  2743.                RETURN;                                                  01928000
  2744.             END;                                                        01929000
  2745.          CALLINC;                                                       01930000
  2746.       END RO_PRIMELOOP;                                                 01931000
  2747.       CALLINC ;                       /* SKIP PRIME */                  01932000
  2748.                                                                         01933000
  2749.  /* IF NOT  LITERAL CONTINUE */                                         01934000
  2750.       IF SUBSTR(CARDIN, COL ,1) ^= '_' THEN                             01935000
  2751.          GO TO RO_CHARLOOP;                                             01936000
  2752.  /* CONTINUED LITERAL :  */                                             01937000
  2753.       COL = COL - 1 ;                                                   01938000
  2754.       OPANDS = OPANDS||SUBSTR(CARDIN,STARTCOL,COL-STARTCOL);            01939000
  2755.       CALLINC;                                                          01940000
  2756.       CALLINC;                                                          01941000
  2757.       CALL SKIP;                                                        01942000
  2758.       STARTCOL = COL + 1 ;                                              01943000
  2759.       IF CHAR = '''' THEN                                               01944000
  2760.          GO TO RO_PRIMES ;                                              01945000
  2761.       CALL ERROR('RO50: IMPROPERLY CONTINUED LITERAL.');                01946000
  2762.       RETURN;                                                           01947000
  2763.  END ROPANDS;                                                /*RAF-41*/ 01947500
  2764. 1                                                                       01948000
  2765.  /* ENTRY TO SCAN OFF CONDITION CLAUSE FOR CONDITIONAL ASM */           01949000
  2766.  CONDSCAN: PROCEDURE(PARSW) RETURNS(CHAR(170) VAR); /*RAF-41*//*RAF-9*/ 01950000
  2767.   DCL                                                                   01951000
  2768.      PARSW BIT(1),                                            /*RAF-9*/ 01951500
  2769.      PLEV FIXED BIN STATIC,                                             01952000
  2770.      CONDSTR CHAR(170) VAR STATIC;                                      01953000
  2771.   DCL                                                                   01954000
  2772.      (CSTATE,INDX) FIXED BIN STATIC,                                    01955000
  2773.      STATE(3,4) LABEL /* STATIC */ INIT                                 01956000
  2774.       (S11,S12,S13,S14,                                                 01957000
  2775.        S21,S22,S23,S24,                                                 01958000
  2776.        S31,S32,S33,S34);                                                01959000
  2777.                                                                         01960000
  2778.         IF ^PARSW THEN DO;                                    /*RAF-9*/ 01960100
  2779.            IF ^RCHAR('(') THEN DO;                            /*RAF-9*/ 01960200
  2780.              CALL ERROR('CONDSCAN: MISSING CONDITION CLAUSE');/*RAF-9*/ 01960300
  2781.              RETURN('');                                      /*RAF-9*/ 01960400
  2782.              END;                                             /*RAF-9*/ 01960500
  2783.            END;                                               /*RAF-9*/ 01960600
  2784.                                                               /*RAF-9*/ 01960700
  2785.         PLEV = 1;                                                       01961000
  2786.         CONDSTR = '(';                                                  01962000
  2787.         GO TO NXT2;                                                     01963000
  2788.   NXT1: CALLINC;                                                        01964000
  2789.   NXT2: IF CHAR = '(' THEN                                              01965000
  2790.          PLEV = PLEV+1;                                                 01966000
  2791.         ELSE                                                            01967000
  2792.          IF CHAR = ')' THEN                                             01968000
  2793.           DO;                                                           01969000
  2794.            PLEV = PLEV-1;                                               01970000
  2795.            IF PLEV = 0 THEN                                             01971000
  2796.             DO;                                                         01972000
  2797.              CONDSTR = CONDSTR||')';                                    01973000
  2798.              CALLINC;                                                   01974000
  2799.              RETURN(CONDSTR);                                           01975000
  2800.             END;                                                        01976000
  2801.           END;                                                          01977000
  2802.          ELSE                                                           01978000
  2803.           IF CHAR = '_' | CHAR = '%' THEN                               01979000
  2804.            DO;                                                          01980000
  2805.             IF CHAR = '_' THEN                                          01981000
  2806.              CALLINC;                                                   01982000
  2807.             CALL SKIP;                                                  01983000
  2808.             GO TO NXT2;                                                 01984000
  2809.            END;                                                         01985000
  2810.           ELSE                                                          01986000
  2811.            IF CHAR = '&' THEN                                           01987000
  2812.             DO;                                                         01988000
  2813.              IF SUBSTR(CONDSTR,LENGTH(CONDSTR),1) = '&' THEN            01989000
  2814.               GO TO NXT1;                                               01990000
  2815.             END;                                                        01991000
  2816.            ELSE                                                         01992000
  2817.             IF CHAR = '''' THEN                                         01993000
  2818.              IF VERIFY(SUBSTR(CONDSTR,LENGTH(CONDSTR),1),    /*RAF-14*/ 01994000
  2819.                        'LKNTSI')^=0 THEN                     /*RAF-14*/ 01994500
  2820.                DO;                                                      01995000
  2821.                 CONDSTR = CONDSTR||CHAR;                                01996000
  2822.                 CSTATE = 1;                                             01997000
  2823.                  NC: CALLINC;                                           01998000
  2824.                 NC2: IF COL = 73 THEN                                   01999000
  2825.                       INDX = 1;                                         02000000
  2826.                      ELSE                                               02001000
  2827.                       IF CHAR = '''' THEN                               02002000
  2828.                        INDX = 2;                                        02003000
  2829.                       ELSE                                              02004000
  2830.                        IF CHAR = '_' THEN                               02005000
  2831.                         INDX = 3;                                       02006000
  2832.                        ELSE                                             02007000
  2833.                         INDX = 4;                                       02008000
  2834.                      GO TO STATE(CSTATE,INDX);                          02009000
  2835.                 S11: /* IN STRING == EOL */                             02010000
  2836.                      CALL ERROR('COND: MISSING TERMINATING QUOTE.');    02011000
  2837.                      CONDSTR = CONDSTR||'''';                           02012000
  2838.                      GO TO CONDX;                                       02013000
  2839.                 S12: /* IN STRING == QUOTE */                           02014000
  2840.                      CSTATE = 2;                                        02015000
  2841.                 S13: /* IN STRING == UNDERSCORE */                      02016000
  2842.                 S14: /* IN STRING == OTHER */                           02017000
  2843.                 ADC: CONDSTR = CONDSTR||CHAR;                           02018000
  2844.                      GO TO NC;                                          02019000
  2845.                 S21: /* TERMINATE TEST == EOL */                        02020000
  2846.                      GO TO NXT1;                                        02021000
  2847.                 S22: /* TERMINATE TEST == QUOTE */                      02022000
  2848.                      CSTATE = 1;                                        02023000
  2849.                      GO TO ADC;                                         02024000
  2850.                 S23: /* TERMINATE TEST == UNDERSCORE */                 02025000
  2851.                      CSTATE = 3;                                        02026000
  2852.                      CALLINC;                                           02027000
  2853.                      CALL SKIP;                                         02028000
  2854.                      GO TO NC2;                              /*RAF-21*/ 02028500
  2855.                 S24: /* TERMINATE TEST == OTHER */                      02029000
  2856.                      GO TO CONDX;                                       02030000
  2857.                 S31: /* CONTINUATION TEST == EOL */                     02031000
  2858.                      GO TO CONDX;                                       02032000
  2859.                 S32: /* CONTINUATION TEST == QUOTE */                   02033000
  2860.                      CONDSTR = SUBSTR(CONDSTR,1,LENGTH(CONDSTR)-1);     02034000
  2861.                      CSTATE = 1;                             /*RAF-21*/ 02034500
  2862.                      GO TO NC;                                          02035000
  2863.                 S33: /* CONTINUATION TEST == UNDERSCORE */              02036000
  2864.                      CALLINC;                                           02037000
  2865.                      CALL SKIP;                                         02038000
  2866.                      GO TO NC2;                                         02039000
  2867.                 S34: /* CONTINUATION TEST == OTHER */                   02040000
  2868.                 CONDX: GO TO NXT2;                                      02041000
  2869.                END;                                                     02042000
  2870.          CONDSTR = CONDSTR||CHAR;                                       02043000
  2871.          GO TO NXT1;                                                    02044000
  2872.  END CONDSCAN;                                               /*RAF-41*/ 02044500
  2873. 1                                                                       02045000
  2874.  RCHAR:                                                                 02046000
  2875.       PROCEDURE(CH) RETURNS(BIT(1));                         /*RAF-41*/ 02047000
  2876.    DCL                                                                  02048000
  2877.       CH CHAR(1);                                                       02049000
  2878.  /*  TEST INPUT FOR CHARACTER: ADVANCE INDEX IF PRESENT */              02050000
  2879.       CALL SKIP ;                                                       02051000
  2880.       IF CH = CHAR THEN                                                 02052000
  2881.          DO;                                                            02053000
  2882.             CALLINC;                                                    02054000
  2883.             RETURN(#TRUE);                                              02055000
  2884.          END ;                                                          02056000
  2885.       ELSE                                                              02057000
  2886.          RETURN (#FALSE) ;                                              02058000
  2887.  END RCHAR;                                                  /*RAF-41*/ 02058500
  2888. -                                                                       02059000
  2889.  /* VALUE TRUE AND SKIP WORD IFF NEXT WORD IS 'CHKWORD' */              02060000
  2890.  RCHECK:                                                                02061000
  2891.       PROCEDURE(CHKWORD) RETURNS(BIT(1));                    /*RAF-41*/ 02062000
  2892.       DCL                                                               02063000
  2893.          CHKWORD CHAR(*) VARYING;                                       02064000
  2894.       DCL                                                               02065000
  2895.          LEN FIXED BIN STATIC;                                          02066000
  2896.       LEN=LENGTH(CHKWORD);                                              02067000
  2897.       CALL SKIP ;                                                       02068000
  2898.       IF COL+LEN<=73 THEN                                    /*RAF-41*/ 02068500
  2899.       IF SUBSTR(CARDIN,COL,LEN) = CHKWORD & (COL+LEN=73 |    /*RAF-41*/ 02069000
  2900.       ^ALPHANUM(SUBSTR(CARDIN,COL+LEN,1))) THEN              /*RAF-41*/ 02070000
  2901.          DO;                                                            02071000
  2902.          /* DO I = 1 TO LEN ;  */                            /*RAF-41*/ 02072000
  2903.             COL = COL+LEN-1;                                 /*RAF-41*/ 02072500
  2904.                CALLINC;                                                 02073000
  2905.          /* END;               */                            /*RAF-41*/ 02074000
  2906.             RETURN(#TRUE) ;                                             02075000
  2907.          END;                                                           02076000
  2908.    /* ELSE */                                                /*RAF-47*/ 02077000
  2909.          RETURN (#FALSE) ;                                              02078000
  2910.  END RCHECK;                                                 /*RAF-41*/ 02078500
  2911. -                                                                       02079000
  2912.  /*ALPHATST:                                              */ /*RAF-41*/ 02080000
  2913.  /*ENTRY(CHR) RETURNS(BIT(1));                            */ /*RAF-41*/ 02081000
  2914.  /*DCL                                                    */ /*RAF-41*/ 02082000
  2915.  /*   CHR CHAR(1);                                        */ /*RAF-41*/ 02083000
  2916.  /*   RETURN(ALPHANUM(CHR));                              */ /*RAF-41*/ 02084000
  2917. 1                                                                       02085000
  2918.  INC: PROCEDURE;                                                        02086000
  2919.    DCL ( (NSP,NTB) FIXED BIN,                                /*RAF-17*/ 02087000
  2920.          FORMCON BIT(1),                                                02088000
  2921.          SPLINE CHAR(80) INIT('         SPACE') ) STATIC,               02089000
  2922.        1 MSPLINE STATIC,                                                02090000
  2923.          2 PERSTAR CHAR(2) INIT('.*'),                                  02091000
  2924.          2 MSP CHAR(70) INIT(' '),                                      02092000
  2925.          2 MSPID CHAR(8),                                               02093000
  2926.        1 BALCOM STATIC,                                                 02094000
  2927.          2 ASTR CHAR(3) INIT('*  '),                                    02095000
  2928.          2 COMFLD CHAR(68),                                             02096000
  2929.          2 COMBLK CHAR(1) INIT(' '),                                    02097000
  2930.          2 COMID CHAR(8);                                               02098000
  2931.    DECLARE DOTSLSW BIT(1) STATIC;                 /*RAF-41*/ /*RAF-20*/ 02098500
  2932.                                                                         02099000
  2933.       COL = 0;                                                          02100000
  2934.       DOTSLSW = #FALSE;                                      /*RAF-20*/ 02100500
  2935.       READ FILE(SYSIN) INTO(CARDIN) ;                                   02101000
  2936.       DO WHILE(CIN_2COLS='./');                               /*RAF-9*/ 02101100
  2937.           IF NESTLEV^=0 THEN                                  /*RAF-9*/ 02101110
  2938.           CALL ERROR('INC: ./ CONTROL CARD NOT AT LEVEL 0');  /*RAF-9*/ 02101120
  2939.           CALL LABPUSH; CALL LABFLUSH;                        /*RAF-9*/ 02101200
  2940.           CALL EQVFLUSH(#TRUE,1);                             /*RAF-9*/ 02101300
  2941.           SPLINE = '*';                                       /*RAF-9*/ 02101350
  2942.           IF ^DOTSLSW THEN SIGNAL ENDPAGE(SYSPRINT);/*RAF-20*//*RAF-9*/ 02101400
  2943.           PUT FILE(SYSPRINT) EDIT (NESTLEV,CIN_ID,CIN_DATA)   /*RAF-9*/ 02101500
  2944.              (COL(1),X(2),P'Z9',X(2),A,X(1),A);               /*RAF-9*/ 02101600
  2945.           WRITE FILE(SYSOUT) FROM(CARDIN);                    /*RAF-9*/ 02101700
  2946.           READ FILE(SYSIN) INTO(CARDIN);                      /*RAF-9*/ 02101800
  2947.           DOTSLSW = #TRUE;                                   /*RAF-20*/ 02101850
  2948.           END;                                                /*RAF-9*/ 02101900
  2949.       IF CIN_DATA=' ' THEN DO;                               /*RAF-17*/ 02102000
  2950.          FORMCON = #FALSE;                                              02103000
  2951.          NSP = 1;                                            /*RAF-17*/ 02103100
  2952.          END;                                                /*RAF-17*/ 02103200
  2953.       ELSE                                                              02104000
  2954.          DO;                                                            02105000
  2955.             NSP = VERIFY(CIN_DATA,' ');                                 02106000
  2956.             FORMCON = SUBSTR(CIN_DATA,NSP,5)='SPACE' |                  02107000
  2957.                       SUBSTR(CIN_DATA,NSP,5)='EJECT' |                  02108000
  2958.                       SUBSTR(CIN_DATA,NSP,5)='TITLE' |                  02109000
  2959.                       SUBSTR(CIN_DATA,NSP,8)='SUBTITLE' ;               02110000
  2960.          END;                                                           02111000
  2961.       IF SUBTITL THEN SIGNAL ENDPAGE(SYSPRINT);                         02112000
  2962.       IF ^FORMCON | INAL=0 THEN                                         02113000
  2963.          DO;                                                            02114000
  2964.             IF INAL=0 THEN NSP = 1;                          /*RAF-17*/ 02114100
  2965.             NTB = 0;                                         /*RAF-17*/ 02114200
  2966.             IF NESTLEV*3<117-(72-NSP)                        /*RAF-17*/ 02114300
  2967.             THEN DO WHILE(SUBSTR(CIN_DATA,72-NTB,1)=' '      /*RAF-17*/ 02114400
  2968.             & NTB<72); NTB = NTB+1; END;                     /*RAF-17*/ 02114500
  2969.             PUT FILE(SYSPRINT) EDIT (NESTLEV,CIN_ID,         /*RAF-17*/ 02115000
  2970.                 SUBSTR(CIN_DATA,NSP,73-NSP-NTB))             /*RAF-17*/ 02115100
  2971.              (COL(1),X(2),P'Z9',X(2),A,X(1),                 /*RAF-17*/ 02116000
  2972.              X(MIN(NESTLEV*3,117-(72-NSP-NTB))),A);          /*RAF-17*/ 02116100
  2973.             IF INAL > 0 THEN                                            02117000
  2974.                DO;                                                      02118000
  2975.                   COMFLD = SUBSTR(CARDIN,1,68);                         02119000
  2976.                   COMID = CIN_ID;                                       02120000
  2977.                   IF INAL = 1 THEN                                      02121000
  2978.                      DO;                                                02122000
  2979.                         INAL = 2;                                       02123000
  2980.                         IF ^IN_MACRO THEN                               02124000
  2981.                            DO;                                          02125000
  2982.                               WRITE FILE(SYSOUT) FROM(SPLINE);          02126000
  2983.                               ASTR = '*  ';                             02127000
  2984.                            END;                                         02128000
  2985.                         ELSE                                            02129000
  2986.                            DO;                                          02130000
  2987.                               MSPID = CIN_ID;                           02131000
  2988.                               WRITE FILE(SYSOUT) FROM(MSPLINE);         02132000
  2989.                               ASTR = '.* ';                             02133000
  2990.                            END;                                         02134000
  2991.                      END;                                               02135000
  2992.                   WRITE FILE(SYSOUT) FROM(BALCOM);                      02136000
  2993.                END;                                                     02137000
  2994.          END;                                                           02138000
  2995.       COUT_ID = CIN_ID;          /* COPY SEQUENCE FIELD */              02139000
  2996.       RETURN;                                                           02140000
  2997.    END INC ;                                                            02141000
  2998. 1                                                                       02142000
  2999.  /*ALPHANUM:                                              */ /*RAF-41*/ 02143000
  3000.  /*PROCEDURE(A) RETURNS(BIT(1));                          */ /*RAF-41*/ 02144000
  3001.  /*DCL                                                    */ /*RAF-41*/ 02145000
  3002.  /*   A CHAR(1);                                          */ /*RAF-41*/ 02146000
  3003.  /* VALUE IS TRUE IFF ARGUMENT CHARACTER IS "ALPHANUMERIC" */           02147000
  3004.  /* NOTE THAT $,# AND @ ARE ALPHABETIC IN BAL AND THEREFORE IN AL. */   02148000
  3005.  /*   IF A >= 'A' | A = '$' | A = '@' | A = '#' THEN      */ /*RAF-41*/ 02149000
  3006.  /*      RETURN(#TRUE);                                   */ /*RAF-41*/ 02150000
  3007.  /*   ELSE                                                */ /*RAF-41*/ 02151000
  3008.  /*      RETURN(#FALSE);                                  */ /*RAF-41*/ 02152000
  3009.  /*END ALPHANUM ;                                         */ /*RAF-41*/ 02153000
  3010. -                                                                       02154000
  3011.  SKIP:                                                                  02155000
  3012.    PROCEDURE;     /* SKIP TO NEXT DATUM (PAST BLANKS AND COMMENTS */    02156000
  3013.  /*   DO WHILE(CHAR = ' ' | CHAR = '%');                  */ /*RAF-41*/ 02157000
  3014.  /*      IF CHAR = ' ' THEN                               */ /*RAF-41*/ 02158000
  3015.  /*         CALLINC;                                      */ /*RAF-41*/ 02159000
  3016.  /*      ELSE                                             */ /*RAF-41*/ 02160000
  3017.  /*         DO; */ /* SKIP TO "EOL" */                       /*RAF-41*/ 02161000
  3018.  /*            COL = 73;                                  */ /*RAF-41*/ 02162000
  3019.  /*            CALLINC;                                   */ /*RAF-41*/ 02163000
  3020.  /*         END;                                          */ /*RAF-41*/ 02164000
  3021.  /*   END;                                                */ /*RAF-41*/ 02165000
  3022.  /*   RETURN;                                             */ /*RAF-41*/ 02166000
  3023.                                                              /*RAF-41*/ 02166010
  3024.     DCL NBLANKS FIXED BIN(31) STATIC;                        /*RAF-41*/ 02166020
  3025.                                                              /*RAF-41*/ 02166030
  3026.     DO WHILE('1'B);                                          /*RAF-41*/ 02166040
  3027.        DO WHILE(CHAR=' ');                                   /*RAF-41*/ 02166050
  3028.           IF COL>=72 THEN DO;                                /*RAF-41*/ 02166060
  3029.              CALL INC;                                       /*RAF-41*/ 02166070
  3030.              COL = 1;                                        /*RAF-41*/ 02166080
  3031.              CHAR = SUBSTR(CARDIN,1,1);                      /*RAF-41*/ 02166090
  3032.              END;                                            /*RAF-41*/ 02166100
  3033.           ELSE DO;                                           /*RAF-41*/ 02166110
  3034.              NBLANKS = VERIFY(SUBSTR(CIN_DATA,COL),' ')-1;   /*RAF-41*/ 02166120
  3035.              IF NBLANKS>0 THEN DO;                           /*RAF-41*/ 02166130
  3036.                 COL = COL+NBLANKS;                           /*RAF-41*/ 02166140
  3037.                 CHAR = SUBSTR(CARDIN,COL,1);                 /*RAF-41*/ 02166150
  3038.                 END;                                         /*RAF-41*/ 02166160
  3039.              ELSE DO;                                        /*RAF-41*/ 02166170
  3040.                 CALL INC;                                    /*RAF-41*/ 02166180
  3041.                 COL = 1;                                     /*RAF-41*/ 02166190
  3042.                 CHAR = SUBSTR(CARDIN,1,1);                   /*RAF-41*/ 02166200
  3043.                 END;                                         /*RAF-41*/ 02166210
  3044.              END;                                            /*RAF-41*/ 02166220
  3045.           END;                                               /*RAF-41*/ 02166230
  3046.        IF CHAR='%' THEN DO;                                  /*RAF-41*/ 02166240
  3047.           CALL INC;                                          /*RAF-41*/ 02166250
  3048.           COL = 1;                                           /*RAF-41*/ 02166260
  3049.           CHAR = SUBSTR(CARDIN,1,1);                         /*RAF-41*/ 02166270
  3050.           END;                                               /*RAF-41*/ 02166280
  3051.        ELSE RETURN;                                          /*RAF-41*/ 02166290
  3052.        END;                                                  /*RAF-41*/ 02166300
  3053.  END SKIP;                                                              02167000
  3054. -                                                                       02168000
  3055.  /* END INPUT;   */                                       /*RAF-41*/    02169000
  3056. 1                                                                       02170000
  3057.  ERROR:  /* ALP ERROR MESSAGE OUTPUT ROUTINES */                        02171000
  3058.    PROCEDURE(MSG) ;                                                     02172000
  3059.    DCL                                                                  02173000
  3060.       MSG CHAR(*) VAR ;                                                 02174000
  3061.   PUT SKIP(2) FILE(SYSTERM) EDIT(CIN_ID,CIN_DATA,MSG) (A,X(1),A,SKIP,A);02175000
  3062.       PUT SKIP FILE(SYSTERM) EDIT('INPUT AT CHARACTER ''',CHAR,'''',    02176000
  3063.        ', COLUMN ',COL,'    LINE ',CIN_ID,                              02177000
  3064.        ',  LAST WORD WAS ''',WORD,'''') (A,A,A,A,F(3),A,A,A,A,A);       02178000
  3065.   PUT SKIP(2) FILE(SYSPRINT) EDIT('ERROR: ',MSG) (A,A);                 02179000
  3066.       PUT SKIP FILE(SYSPRINT) EDIT('INPUT AT CHARACTER ''',CHAR,'''',   02180000
  3067.        ', COLUMN ',COL,'    LINE ',CIN_ID,                              02181000
  3068.        ',  LAST WORD WAS ''',WORD,'''') (A,A,A,A,F(3),A,A,A,A,A);       02182000
  3069.       PUT SKIP(2) FILE(SYSPRINT) ;                                      02183000
  3070.       ERRCNT=ERRCNT+1;                                                  02184000
  3071.       RETCODE=8;                                                        02185000
  3072.       RETURN ;                                                          02186000
  3073. 0OUTPUT:                                                                02187000
  3074.    ENTRY (MSG) ;                                                        02188000
  3075.      PUT SKIP FILE(SYSPRINT) EDIT(MSG) (A);                             02189000
  3076.      PUT SKIP FILE(SYSTERM) EDIT(MSG) (A);                              02190000
  3077.      RETURN;                                                            02191000
  3078.  END ERROR ;                                                            02192000
  3079. -                                                                       02193000
  3080.  END ALP;                                                               02194000
  3081.