The Concept 14 macros were written by Marvin Kessler while at IBM, Federal Systems Division. I've included them here in IEBUPDTE fashion for convenience. For coding instructions, see Appendix III of Kessler's original paper.
./ ADD NAME=CASE MACRO CASE COPY GBLVARS LCLA &NBR,&CASENO PUSHLAB AIF (N'&SYSLIST EQ 1).LDSUBL &NBR SETA N'&SYSLIST AGO .LDAIND .LDSUBL ANOP &NBR SETA N'&SYSLIST(1) .LDAIND AIF (&NBR LE 0).NOPRMS &AIND(&AI) SETA &AIND(&AI)+&NBR .TSTSUBL AIF (T'&SYSLIST(1,2) EQ 'O' AND &NBR NE 1).NOTSUBL &CASENO SETA &SYSLIST(1,&NBR) AGO .TSTMULT .NOTSUBL ANOP &CASENO SETA &SYSLIST(&NBR) .TSTMULT AIF (&CASENO-(&CASENO/&MULT(&AI))*&MULT(&AI) NE 0).NOTMULT AIF (&CASENO EQ 0).NOTMULT AIF (&CI GE 200).OVER &CI SETA &CI+1 &CIND1(&CI) SETA &CASENO &CIND2(&CI) SETC '&LIND(&LI)' .RETRNPT ANOP &NBR SETA &NBR-1 AIF (&NBR NE 0).TSTSUBL .FRSTIME AIF ('&NEST(&NI)'(3,1) NE ' ').BCGEN1 &NEST(&NI) SETC ' Y'.'&NEST(&NI)'(4,5) AGO .EQUGN1 .BCGEN1 AIF ('&NEST(&NI)'(4,1) EQ 'B').BCINST L &RIND(&AI),&LIND(&LI-2) BCR 15,&RIND(&AI) AGO .EQUGN1 .BCINST BC 15,&LIND(&LI-1) .EQUGN1 ANOP &LIND(&LI) EQU * &LI SETA &LI-1 MEXIT .NOTMULT MNOTE 8,'CASE &CASENO DELETED. NOT MULTIPLE OF &MULT(&AI).' &AIND(&AI) SETA &AIND(&AI)-1 AGO .RETRNPT .NOPRMS MNOTE 'NO PARAMETERS FOUND WITH CASE MACRO' AGO .FRSTIME .OVER MNOTE 8,'CASE NUMBER STK EXCEEDED. FURTHER EXPANSIONS INVALID' MEND ./ ADD NAME=CASENTRY MACRO CASENTRY &P1,&VECTOR=,&POWER=0 COPY GBLVARS PUSHNEST CASE PUSHLAB PUSHLAB AIF (&AI GE 50).OVER &AI SETA &AI+1 &AIND(&AI) SETA 0 &RIND(&AI) SETC '&P1' &MULT(&AI) SETA 1 &CTR SETA &POWER .SHIFTLP AIF (&CTR LE 0).GENSHFT &MULT(&AI) SETA &MULT(&AI)+&MULT(&AI) &CTR SETA &CTR-1 AGO .SHIFTLP .GENSHFT AIF (&MULT(&AI) EQ 4).TESTVEC AIF (&MULT(&AI) GT 4).RTSHIFT SLA &P1,2-&POWER AGO .TESTVEC .RTSHIFT SRA &P1,&POWER-2 .TESTVEC AIF ('&VECTOR' EQ 'B' OR '&VECTOR' EQ 'BR').BRVEC PUSHLAB A &P1,&LIND(&LI) L &P1,0(&P1) BCR 15,&P1 &LIND(&LI) DC A(&LIND(&LI-2)) &LI SETA &LI-1 MEXIT .BRVEC BC 15,&LIND(&LI-1)(&P1) &NEST(&NI) SETC ' B'.'&NEST(&NI)'(5,4) MEXIT .OVER MNOTE 8,'TOTAL CASES STK EXCEEDED. FURTHER EXPANSIONS INVALID' MEND ./ ADD NAME=CHKSTACK MACRO CHKSTACK GBLA &AI,&CI,&II,&LI,&NI LCLA &SI LCLC &STACK(5) AIF (&AI LE 0).FIXC &SI SETA &SI+1 &STACK(&SI) SETC 'TOTLCASE' .FIXC AIF (&CI LE 0).FIXI &SI SETA &SI+1 &STACK(&SI) SETC 'CASELABL' .FIXI AIF (&II LE 0).FIXL &SI SETA &SI+1 &STACK(&SI) SETC 'INSTRCTN' .FIXL AIF (&LI LE 0).FIXN &SI SETA &SI+1 &STACK(&SI) SETC 'LABEL' .FIXN AIF (&NI LE 0).TEST &SI SETA &SI+1 &STACK(&SI) SETC 'NESTING' .TEST AIF (&SI EQ 0).END MNOTE 8,'&STACK(&SI) STACK NOT EMPTY' &SI SETA &SI-1 AGO .TEST .END MEND ./ ADD NAME=DO MACRO DO &P1,&FROM=,&TO=,&BY=,&UNTIL=,&WHILE= PUSHNEST DO DOPROC &FROM,&TO,&BY,&UNTIL,&WHILE,&P1 MEND ./ ADD NAME=DOEXIT MACRO DOEXIT &P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,&P13,X &P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&P24,&X P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&P35,&PX 36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P46,&P4X 7,&P48,&P49,&P50,&CC= COPY GBLVARS PUSHLAB &NEST(&NI) SETC ' Y'.'&NEST(&NI)'(5,4) IFPROC &CC,&P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,X &P13,&P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&X P24,&P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&PX 35,&P36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P4X 6,&P47,&P48,&P49,&P50 MEND ./ ADD NAME=DOPROC MACRO DOPROC &FROM,&TO,&BY,&UNTIL,&WHILE,&P1 COPY GBLVARS LCLA &I LCLC &LCLWK1 PUSHLAB PUSHINS (EQU,*,,,,&LIND(&LI)) &ST(&NI) SETA &II+1 PUSHLAB AIF (T'&FROM EQ 'O').NOIND AIF ('&FROM(3)' EQ '').INCR LA &FROM(3),&LIND(&LI) .INCR ANOP &I SETA &I+1 AIF ('&SYSLIST(&I,2)' EQ '').TEST AIF ('&SYSLIST(&I,2)' EQ '0').GENSR AIF ('&SYSLIST(&I,2)'(1,1) EQ '-').NEGVAL AIF (T'&SYSLIST(&I,2) EQ 'N').POSVAL AIF ('&SYSLIST(&I,2)'(1,1) EQ '(').GENLR L &SYSLIST(&I,1),&SYSLIST(&I,2) AGO .TEST .GENLR LR &SYSLIST(&I,1),&SYSLIST(&I,2) AGO .TEST .POSVAL AIF (&SYSLIST(&I,2) GE 4096).TSTMAG LA &SYSLIST(&I,1),&SYSLIST(&I,2) AGO .TEST .TSTMAG AIF (&SYSLIST(&I,2) GE 32768).FULLIT AGO .HALFLIT .NEGVAL ANOP &LCLWK1 SETC '&SYSLIST(&I,2)'(2,7) AIF (&LCLWK1 GE 32768).FULLIT .HALFLIT LH &SYSLIST(&I,1),=H'&SYSLIST(&I,2)' AGO .TEST .FULLIT L &SYSLIST(&I,1),=F'&SYSLIST(&I,2)' AGO .TEST .GENSR SR &SYSLIST(&I,1),&SYSLIST(&I,1) .TEST AIF (&I LT 3).INCR AIF (T'&UNTIL NE 'O').ERRMG2 .CKWHILE AIF (T'&WHILE NE 'O').COMPGEN &LIND(&LI) EQU * .POSTIND AIF (T'&P1 EQ 'O').GETIND AIF (T'&BY NE 'O').PFB AIF (T'&TO NE 'O').PFT AIF ('&FROM(3)' NE '').BCTRZ PUSHINS (BCT,&FROM(1),&LIND(&LI)) AGO .ERRMG .BCTRZ PUSHINS (BCTR,&FROM(1),&FROM(3)) AGO .ERRMG .PFT PUSHINS (&P1,&FROM(1),&TO(1),&LIND(&LI)) MEXIT .PFB PUSHINS (&P1,&FROM(1),&BY(1),&LIND(&LI)) MEXIT .GETIND AIF ('&FROM(3)' EQ '').BCTR1 PUSHINS (BCTR,&FROM(1),&FROM(3)) MEXIT .BCTR1 AIF (T'&BY NE 'O').FB AIF (T'&TO EQ 'O').FONLY PUSHINS (BXLE,&FROM(1),&TO(1),&LIND(&LI)) MEXIT .FONLY PUSHINS (BCT,&FROM(1),&LIND(&LI)) MEXIT .FB AIF (T'&TO NE 'O').FTB AIF ('&BY(2)' EQ '').GENBXLE AIF ('&BY(2)'(1,1) NE '-').GENBXLE AGO .GENBXH .FTB AIF ('&TO(2)' EQ '' OR '&FROM(2)' EQ '').GENBXLE AIF ('&FROM(2)'(1,1) EQ '-').TRYTNEG AIF (T'&FROM(2) NE 'N').GENBXLE AIF ('&TO(2)'(1,1) EQ '-').GENBXH AIF (T'&TO(2) NE 'N').GENBXLE AIF (&FROM(2) GT &TO(2)).GENBXH .GENBXLE PUSHINS (BXLE,&FROM(1),&BY(1),&LIND(&LI)) MEXIT .TRYTNEG AIF ('&TO(2)'(1,1) NE '-').GENBXLE AIF ('&FROM(2)'(2,7) GE '&TO(2)'(2,7)).GENBXLE .GENBXH PUSHINS (BXH,&FROM(1),&BY(1),&LIND(&LI)) MEXIT .NOIND AIF (T'&WHILE EQ 'O').NOWHILE AIF (T'&UNTIL NE 'O').COMPGEN BC 15,&LIND(&LI) PUSHLAB &LI SETA &LI-1 &LIND(&LI+1) EQU * AIF ('&WHILE(6)' EQ '').OKSUBL STKINS &WHILE MEXIT .OKSUBL STKINS (&WHILE(1),&WHILE(2),&WHILE(3),&WHILE(4), X &WHILE(5),&LIND(&LI)) AIF ('&WHILE(2)' EQ '').LABEL PUSHINS (BC,&CCVAL,&LIND(&LI+1)) MEXIT .LABEL PUSHINS (BC,&CCVAL,&LIND(&LI+1),,,&LIND(&LI)) MEXIT .NOWHILE AIF (T'&UNTIL EQ 'O').TRYINF &LIND(&LI) EQU * .UNT STKINS &UNTIL PUSHINS (BC,15-&CCVAL,&LIND(&LI)) MEXIT .TRYINF AIF ('&P1' NE 'INF').ERRMG1 &LIND(&LI) EQU * PUSHINS (BC,15,&LIND(&LI)) MEXIT .COMPGEN AIF ('&WHILE(6)' EQ '').OK STKINS &WHILE AGO .BCHINST .OK STKINS (&WHILE(1),&WHILE(2),&WHILE(3),&WHILE(4), X &WHILE(5),&LIND(&LI)) AIF (N'&WHILE GT 1).ENDCOMP &LIND(&LI) BC 15-&CCVAL,&LIND(&LI-1) AGO .FLAGEQU .ENDCOMP ANOP &ST(&NI+1) SETA &II POPINS &ST(&NI+1) .BCHINST BC 15-&CCVAL,&LIND(&LI-1) .FLAGEQU ANOP &NEST(&NI) SETC ' Y'.'&NEST(&NI)'(5,4) AIF (T'&FROM NE 'O').POSTIND AGO .UNT .ERRMG MNOTE 4,'POSITIONAL PARAMETER IGNORED. BCT/BCTR LOOP END USED' MEXIT .ERRMG2 MNOTE 4,'UNTIL KEYWORD INVALID WITH INDEXING GROUP. IGNORED' AGO .CKWHILE .ERRMG1 MNOTE 4,'NO WHILE,UNTIL, OR INDEXING PARAMETERS ON DO MACRO.' MEND ./ ADD NAME=ELSE MACRO ELSE COPY GBLVARS &LIND(&LI+1) SETC '&LIND(&LI)' &LI SETA &LI-1 PUSHLAB BC 15,&LIND(&LI) &LIND(&LI+1) EQU * MEND ./ ADD NAME=ENDCASE MACRO ENDCASE COPY GBLVARS LCLA &K,&I AIF ('&NEST(&NI)'(4,1) EQ 'B').BVECT1 L &RIND(&AI),&LIND(&LI-1) BCR 15,&RIND(&AI) &LIND(&LI-1) DC A(&LIND(&LI)) AGO .BLDVECT .BVECT1 ANOP &LIND(&LI-1) BC 15,&LIND(&LI) .BLDVECT AIF (&AIND(&AI) LE 0).TESTCI &K SETA &MULT(&AI) .LOOPIN ANOP &I SETA 1 .LOOP1 AIF (&K EQ &CIND1(&CI-&I+1)).ELEND AIF (&I EQ &AIND(&AI)).GENTRY &I SETA &I+1 AGO .LOOP1 .GENTRY AIF ('&NEST(&NI)'(4,1) EQ 'B').BVECT2 DC A(&LIND(&LI)) AGO .INCRK .ELEND AIF ('&NEST(&NI)'(4,1) EQ 'B').BVECT3 DC A(&CIND2(&CI-&I+1)) AGO .DECSTK .BVECT3 BC 15,&CIND2(&CI-&I+1) .DECSTK ANOP &AIND(&AI) SETA &AIND(&AI)-1 &CI SETA &CI-1 AIF (&AIND(&AI) EQ 0).TESTCI .LOOP2 AIF (&I EQ 1).INCRK &I SETA &I-1 &CIND1(&CI-&I+1) SETA &CIND1(&CI-&I+2) &CIND2(&CI-&I+1) SETC '&CIND2(&CI-&I+2)' AGO .LOOP2 .BVECT2 BC 15,&LIND(&LI) .INCRK ANOP &K SETA &K+&MULT(&AI) AGO .LOOPIN .TESTCI AIF (&CI LT 0).ASTKERR &LIND(&LI) EQU * &LI SETA &LI-2 &AI SETA &AI-1 POPNEST CASE AIF (&AI LT 0).ASTKERR MEXIT .ASTKERR MNOTE 8,'NEGATIVE CASE MACRO STACK PTR. EXPANSION INVALID.' MEND ./ ADD NAME=ENDDO MACRO ENDDO GBLA &ST(51),&NI,&LI,&II POPINS &ST(&NI) &II SETA &II-1 POPNEST DO &LI SETA &LI-2 MEND ./ ADD NAME=ENDIF MACRO ENDIF COPY GBLVARS POPNEST IF &LIND(&LI) EQU * &LI SETA &LI-1 MEND ./ ADD NAME=ENDLOOP MACRO ENDLOOP COPY GBLVARS AIF ('&NEST(&NI)'(3,1) EQ 'P').CALLEND BC 15,&LIND(&LI-3) &LIND(&LI) EQU * .CALLEND ANOP &NEST(&NI) SETC ' '.'&NEST(&NI)'(4,5) POPINS &ST(&NI) &II SETA &II-1 &LI SETA &LI-3 MEND ./ ADD NAME=ENDSRCH MACRO ENDSRCH COPY GBLVARS POPNEST SRCH &LIND(&LI) EQU * &LI SETA &LI-1 MEND ./ ADD NAME=EXITIF MACRO EXITIF &P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,&P13,X &P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&P24,&X P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&P35,&PX 36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P46,&P4X 7,&P48,&P49,&P50,&CC= IFPROC &CC,&P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,X &P13,&P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&X P24,&P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&PX 35,&P36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P4X 6,&P47,&P48,&P49,&P50 MEND ./ ADD NAME=GBLVARS GBLA &CCVAL COND CODE VARIABLE GBLA &CTR MACRO PARAMETER COUNTER GBLA &SEQ LABEL NUMBER GENERATOR GBLA &AI INDEX FOR TOTAL NO. CASES STK GBLA &CI INDEX FOR CASE AND LBL NO.STKS GBLA &II PTR TO INST STKS GBLA &LI INDEX FOR LABEL NUMBER STK GBLA &NI PTR TO NEST STK GBLA &AIND(50) TOTAL CASES STK GBLA &CIND1(200) CASE NUMBER STK GBLA &MULT(50) CASE NUMBER MULTIPLIER GBLA &ST(51) INST STK INCREASE AT EACH LEVEL GBLC &CIND2(200) LABEL NUMBER STK FOR CASES GBLC &IIND1(100) INSTRUCTION STK 1 GBLC &IIND2(100) INSTRUCTION STK 2 GBLC &I22(100) INSTRUCTION STK 2, 2ND PART GBLC &I23(100) INSTRUCTION STK 2, 3RD PART GBLC &I24(100) INSTRUCTION STK 2, 4TH PART GBLC &IIND3(100) INSTRUCTION STK 3 GBLC &I32(100) INSTRUCTION STK 3, 2ND PART GBLC &I33(100) INSTRUCTION STK 3, 3RD PART GBLC &I34(100) INSTRUCTION STK 3, 4TH PART GBLC &IIND4(100) INSTRUCTION STK 4 GBLC &I42(100) INSTRUCTION STK 4, 2ND PART GBLC &I43(100) INSTRUCTION STK 4, 3RD PART GBLC &IIND5(100) INSTRUCTION NAME STACK GBLC &LIND(101) LABEL NUMBER STK GBLC &NEST(50) NESTING STK GBLC &RIND(50) REG STK FOR CASENTRY MACRO ./ ADD NAME=GETCC MACRO GETCC &COND GBLA &CCVAL LCLC &LWK1 AIF ('&COND'(1,1) LT '0' OR '&COND'(1,1) GT '9').NOTNUM &CCVAL SETA &COND MEXIT .NOTNUM AIF (K'&COND NE 1).TWOCHAR &LWK1 SETC '&COND' AGO .CALCC .TWOCHAR AIF (K'&COND NE 2).INVCOND AIF ('&COND'(1,1) NE 'N').OTHERMN &LWK1 SETC '&COND'(2,1) AGO .CALCC .OTHERMN AIF ('&COND' EQ 'EQ').BC8 AIF ('&COND' EQ 'LT').BC4 AIF ('&COND' NE 'LE').TRYGT &CCVAL SETA 13 MEXIT .TRYGT AIF ('&COND' EQ 'GT').BC2 AIF ('&COND' NE 'GE').INVCOND &CCVAL SETA 11 MEXIT .CALCC AIF ('&LWK1' NE 'O').TRYH &CCVAL SETA 1 AGO .TSTN .TRYH AIF ('&LWK1' EQ 'P' OR '&LWK1' EQ 'H').BC2 AIF ('&LWK1' EQ 'L' OR '&LWK1' EQ 'M').BC4 AIF ('&LWK1' EQ 'E' OR '&LWK1' EQ 'Z').BC8 AGO .INVCOND .BC8 ANOP &CCVAL SETA 8 AGO .TSTN .BC4 ANOP &CCVAL SETA 4 AGO .TSTN .BC2 ANOP &CCVAL SETA 2 .TSTN AIF ('&COND'(1,1) NE 'N').DONE &CCVAL SETA 15-&CCVAL .DONE MEXIT .INVCOND ANOP &CCVAL SETA 15 MNOTE 4,'INVALID CONDITION MNEMONIC. NOP GENERATED' MEND ./ ADD NAME=IF MACRO IF &P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,&P13,X &P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&P24,&X P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&P35,&PX 36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P46,&P4X 7,&P48,&P49,&P50,&CC= PUSHNEST IF PUSHLAB IFPROC &CC,&P1,&P2,&P3,&P4,&P5,&P6,&P7,&P8,&P9,&P10,&P11,&P12,X &P13,&P14,&P15,&P16,&P17,&P18,&P19,&P20,&P21,&P22,&P23,&X P24,&P25,&P26,&P27,&P28,&P29,&P30,&P31,&P32,&P33,&P34,&PX 35,&P36,&P37,&P38,&P39,&P40,&P41,&P42,&P43,&P44,&P45,&P4X 6,&P47,&P48,&P49,&P50 MEND ./ ADD NAME=IFPROC MACRO IFPROC COPY GBLVARS LCLB &ANDIND,&ORIND PUSHLAB &CTR SETA 2 &ST(&NI+1) SETA &II+1 &NEST(&NI) SETC ' R'.'&NEST(&NI)'(4,5) AIF (T'&SYSLIST(1) EQ 'O').LOOP AIF (&SYSLIST(1) LE 0 OR &SYSLIST(1) GE 15).INVALCC &CCVAL SETA &SYSLIST(1) AIF ('SYSLIST(2)' EQ '').ENDBOOL MNOTE 4,'CC KEYWORD USED. OTHER PARAMETERS IGNORED' AGO .ENDBOOL .INVALCC MNOTE 4,'CC OUTSIDE VALID RANGE OF 1 TO 14. NOP GENERATED' &CCVAL SETA 15 AGO .ENDBOOL .LOOP STKINS &SYSLIST(&CTR),&SYSLIST(&CTR+1),&SYSLIST(&CTR+2), X &SYSLIST(&CTR+3),&SYSLIST(&CTR+4) AIF ('&SYSLIST(&CTR+1)' EQ 'AND').ANDPROC AIF ('&SYSLIST(&CTR+1)' NE 'ANDIF').TESTOR .ANDPROC PUSHINS (BC,15-&CCVAL,&LIND(&LI-1)) &ANDIND SETB 1 AIF ('&SYSLIST(&CTR+1)' NE 'ANDIF' OR NOT &ORIND).TESTLP POPINS &ST(&NI+1) &LIND(&LI) EQU * &ORIND SETB 0 &LI SETA &LI-1 PUSHLAB AGO .TESTLP .TESTOR AIF ('&SYSLIST(&CTR+1)' EQ 'OR').ORPROC AIF ('&SYSLIST(&CTR+1)' NE 'ORIF').TESTLP .ORPROC PUSHINS (BC,&CCVAL,&LIND(&LI)) &ORIND SETB 1 AIF ('&SYSLIST(&CTR+1)' NE 'ORIF' OR NOT &ANDIND).TESTLP PUSHINS (EQU,*,,,,&LIND(&LI-1)) &ANDIND SETB 0 PUSHLAB &LI SETA &LI-1 &LIND(&LI-1) SETC '&LIND(&LI+1)' .TESTLP ANOP &CTR SETA &CTR+2 AIF ('&SYSLIST(&CTR-1)' NE '').LOOP .ENDBOOL AIF ('&NEST(&NI)'(5,4) EQ 'DO').DOEND POPINS &ST(&NI+1) BC 15-&CCVAL,&LIND(&LI-1) AIF (NOT &ORIND).POPLBL &LIND(&LI) EQU * .POPLBL ANOP &LI SETA &LI-1 MEXIT .DOEND ANOP &CTR SETA &ST(&NI+1) AGO .ENDLBL .NXTLBL AIF ('&IIND3(&CTR)' NE '&LIND(&LI)').INCTR &IIND3(&CTR) SETC '&LIND(&LI-3)' .INCTR ANOP &CTR SETA &CTR+1 .ENDLBL AIF (&CTR LE &II).NXTLBL POPINS &ST(&NI+1) BC &CCVAL,&LIND(&LI-3) AIF (NOT &ANDIND).POP2LBL &LIND(&LI-1) EQU * .POP2LBL ANOP &LI SETA &LI-2 &NEST(&NI) SETC ' Y'.'&NEST(&NI)'(5,4) MEND ./ ADD NAME=MACROS COPY CASE COPY CASENTRY COPY CHKSTACK COPY DO COPY DOEXIT COPY DOPROC COPY ELSE COPY ENDCASE COPY ENDDO COPY ENDIF COPY ENDLOOP COPY ENDSRCH COPY EXITIF COPY GETCC COPY IF COPY IFPROC COPY ORELSE COPY POPINS COPY POPNEST COPY PUSHINS COPY PUSHLAB COPY PUSHNEST COPY STKINS COPY STRTSRCH ./ ADD NAME=ORELSE MACRO ORELSE COPY GBLVARS &LIND(&LI+1) SETC '&LIND(&LI)' &LI SETA &LI-1 PUSHLAB BC 15,&LIND(&LI-3) &LIND(&LI+1) EQU * &NEST(&NI) SETC ' P'.'&NEST(&NI)'(4,5) MEND ./ ADD NAME=POPINS MACRO POPINS &P COPY GBLVARS LCLA &W &W SETA &P AGO .TEST .UNSTACK AIF ('&IIND3(&W)' EQ '').ONEOP AIF ('&IIND4(&W)' NE '').THREEOP &IIND5(&W) &IIND1(&W) &IIND2(&W)&I22(&W)&I23(&W)&I24(&W),&IIND3(&W)X &I32(&W)&I33(&W)&I34(&W) AGO .INCTR .THREEOP ANOP &IIND5(&W) &IIND1(&W) &IIND2(&W)&I22(&W)&I23(&W)&I24(&W),&IIND3(&W)X &I32(&W)&I33(&W)&I34(&W),&IIND4(&W)&I42(&W)&I43(&W) AGO .INCTR .ONEOP ANOP &IIND5(&W) &IIND1(&W) &IIND2(&W)&I22(&W)&I23(&W)&I24(&W) .INCTR ANOP &W SETA &W+1 .TEST AIF (&W LE &II).UNSTACK &II SETA &P-1 AIF ('&NEST(&NI)'(3,1) NE ' ' OR '&NEST(&NI)'(4,1) EQ ' ').NEQ &IIND5(&II) &IIND1(&II) &IIND2(&II) .NEQ AIF (&II GT 0 OR (&II EQ 0 AND '&NEST(&NI)'(5,4) EQ 'IF')).END MNOTE 8,'NEGATIVE INSTRUCTION STACK PTR. EXPANSION INVALID.' .END MEND ./ ADD NAME=POPNEST MACRO POPNEST &P1 COPY GBLVARS LCLC &SUFFIX &SUFFIX SETC '&NEST(&NI)'(5,4) AIF ('&NEST(&NI)'(5,4) EQ '&P1').GOOD MNOTE 8,'&SUFFIX MACRO AT SAME LEVEL AS &P1 TERMINATOR.' .GOOD ANOP &NI SETA &NI-1 AIF (&NI GE 0).OK MNOTE 8,'NEGATIVE NEST STACK POINTER. CHECK NUMBER OF ENDS.' .OK MEND ./ ADD NAME=PUSHINS MACRO PUSHINS &PAM COPY GBLVARS LCLA &WK,&I,&J,&K &I SETA 3 &J SETA 4 &K SETA 4 AIF ('&PAM(1)' NE 'TS').NOTTS &J SETA 3 &I SETA 5 AGO .SETK .NOTTS AIF ('&PAM(1)' EQ 'BAL' OR '&PAM(1)' EQ 'BALR').SETK AIF ('&PAM(1)'(1,1) EQ 'B' OR '&PAM(1)' EQ 'EQU').BCH AIF ('&PAM(5)' EQ '').TWOPERS AIF ('&PAM(1)'(1,1) EQ 'C').SETK &J SETA 5 AGO .GETCOND .TWOPERS AIF ('&PAM(1)'(1,1) NE 'C').SETK &I SETA 4 &J SETA 3 .SETK ANOP &K SETA 5 .GETCOND GETCC &PAM(&J) .BCH AIF (&II GE 100).OVERI &II SETA &II+1 &IIND1(&II) SETC '&PAM(1)' &IIND2(&II) SETC '&PAM(2)'(1,8) &WK SETA K'&SYSLIST(1,2) AIF (&WK GE 25).LD24 &I24(&II) SETC '' AIF (&WK GE 17).LD23 &I23(&II) SETC '' AIF (&WK GE 9).LD22 &I22(&II) SETC '' AGO .PAM3 .LD24 ANOP &I24(&II) SETC '&PAM(2)'(25,8) .LD23 ANOP &I23(&II) SETC '&PAM(2)'(17,8) .LD22 ANOP &I22(&II) SETC '&PAM(2)'(9,8) .PAM3 AIF ('&PAM(&I)' NE '').LD31 &IIND3(&II) SETC '' AGO .BLKOUT3 .LD31 ANOP &IIND3(&II) SETC '&PAM(&I)'(1,8) .BLKOUT3 ANOP &WK SETA K'&SYSLIST(1,&I) AIF (&WK GE 25).LD34 &I34(&II) SETC '' AIF (&WK GE 17).LD33 &I33(&II) SETC '' AIF (&WK GE 9).LD32 &I32(&II) SETC '' AGO .PAM4 .LD34 ANOP &I34(&II) SETC '&PAM(&I)'(25,8) .LD33 ANOP &I33(&II) SETC '&PAM(&I)'(17,8) .LD32 ANOP &I32(&II) SETC '&PAM(&I)'(9,8) .PAM4 AIF ('&PAM(&K)' NE '').LD41 &IIND4(&II) SETC '' AGO .BLKOUT4 .LD41 ANOP &IIND4(&II) SETC '&PAM(&K)'(1,8) .BLKOUT4 ANOP &WK SETA K'&SYSLIST(1,&K) AIF (&WK GE 17).LD43 &I43(&II) SETC '' AIF (&WK GE 9).LD42 &I42(&II) SETC '' AGO .PAM5 .LD43 ANOP &I43(&II) SETC '&PAM(&K)'(17,8) .LD42 ANOP &I42(&II) SETC '&PAM(&K)'(9,8) .PAM5 AIF ('&PAM(6)' EQ '').BLKOUT5 AIF ('&PAM(6)'(1,4) NE '#@LB').BLKOUT5 &IIND5(&II) SETC '&PAM(6)' MEXIT .BLKOUT5 ANOP &IIND5(&II) SETC '' MEXIT .OVERI MNOTE 8,'INSTRN STK SIZE EXCEEDED. FURTHER EXPANSIONS INVALID' MEND ./ ADD NAME=PUSHLAB MACRO PUSHLAB COPY GBLVARS AIF (&LI GE 100).OVER &SEQ SETA &SEQ+1 &LI SETA &LI+1 &LIND(&LI) SETC '#@LB&SEQ' MEXIT .OVER MNOTE 8,' LABEL STK SIZE EXCEEDED. FURTHER EXPANSIONS INVALID' MEND ./ ADD NAME=PUSHNEST MACRO PUSHNEST &P1 COPY GBLVARS &NI SETA &NI+1 AIF (&NI GE 50).OVER &NEST(&NI) SETC ' '.'&P1' MEXIT .OVER MNOTE 8,'NEST STACK SIZE EXCEEDED. FURTHER EXPANSIONS INVALID' MEND ./ ADD NAME=STKINS MACRO STKINS &P1,&P2,&P3,&P4,&P5,&P6 COPY GBLVARS AIF ('&P1(2)' EQ '').NOTSUBL AIF ('&P1(6)' EQ '' OR '&P1(6)' EQ '&LIND(&LI)').OKSUBL MNOTE 12,'TOO MANY OPERANDS INSIDE PARENTHESES' MEXIT .OKSUBL PUSHINS (&P1(1),&P1(2),&P1(3),&P1(4),&P1(5),&P1(6)) MEXIT .NOTSUBL AIF ('&P2' EQ '' OR '&P2' EQ 'OR' OR '&P2' EQ 'AND' OR '&P2'X EQ 'ORIF' OR '&P2' EQ 'ANDIF').SGLOPR AIF ('&P5' EQ 'OR' OR '&P5' EQ 'AND' OR '&P5' EQ 'ORIF' OR X '&P5' EQ 'ANDIF').TWOPER2 PUSHINS (&P1,&P2,&P3,&P4,&P5,&P6) &CTR SETA &CTR+4 MEXIT .TWOPER2 PUSHINS (&P1,&P2,&P3,&P4,,&P6) &CTR SETA &CTR+3 MEXIT .SGLOPR GETCC &P1(1) MEND ./ ADD NAME=STRTSRCH MACRO STRTSRCH &P1,&FROM=,&TO=,&BY=,&UNTIL=,&WHILE= PUSHLAB PUSHNEST SRCH DOPROC &FROM,&TO,&BY,&UNTIL,&WHILE,&P1 PUSHLAB MEND /*