%EXTRINSICINTEGERARRAY A(1:255) %EXTRINSICINTEGER CONDOPT !----------------------------------------------------------------------- %EXTERNALROUTINESPEC EXPR(%INTEGER EXPRP) %EXTERNALROUTINESPEC DUMP(%STRING(7) OPN,REG,BASE,%INTEGER DISP) %EXTERNALROUTINESPEC FILLLABEL(%INTEGER LABEL) %EXTERNALINTEGERFNSPEC FILLBRANCH(%INTEGER LABEL) %EXTERNALINTEGERFNSPEC NEXTPLABEL %EXTERNALROUTINESPEC FAULT(%STRING(63) MESS) !----------------------------------------------------------------------- %EXTERNALINTEGER CONDFLAG=0 !----------------------------------------------------------------------- %EXTERNALINTEGERFN COND(%INTEGER CONDP,TLABEL,FLABEL) %ROUTINESPEC PROCESSCOND(%INTEGER CONDP) %ROUTINESPEC TEST(%INTEGER LTESTP) %ROUTINESPEC CONDREST(%INTEGER CONDRESTP) %ROUTINESPEC STORE(%INTEGER TESTP,LEVEL,ANDOR) %ROUTINESPEC SHOW(%STRING(7) AN,%INTEGERARRAYNAME A,%INTEGER P) %CONSTSTRING(3)%ARRAY TRUE(1:6)="BZ","BNZ","BNG","BL","BNL","BG" %CONSTSTRING(3)%ARRAY FALSE(1:6)="BNZ","BZ","BG","BNL","BL","BNG" %STRING(3) OPN %CONSTINTEGERARRAY INDEX(1:17)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 %INTEGERARRAY TESTPA,LEVELA,ANDORA,BRANCHA(1:16),LABELA(1:17) %INTEGER P,PP,PPP,TESTP,LEVEL,ANDOR,COMP LEVEL=0 P=1 PROCESSCOND(CONDP) STORE(TESTP,-1,1) ;! PSEUDO-%AND STORE(0,-2,2) ;! PSEUDO-%OR P=P-2 %CYCLE PP=1,1,P ;! FIND BRANCH DESTINATIONS LEVEL=LEVELA(PP) ANDOR=ANDORA(PP) %CYCLE PPP=PP+1,1,P+1 %IF LEVELA(PPP)=0 %THEN %START ANDORA(P)=2 ;! CHANGE LAST BRANCH TO BRANCH ON TRUE BRANCHA(P)=P+1 LABELA(P+1)=TLABEL %FINISH LABELA(P+2)=FLABEL %CYCLE PP=1,1,P ;! ASSIGN PRIVATE LABELS WHERE NEEDED %IF LABELA(BRANCHA(PP))<0 %THEN LABELA(BRANCHA(PP))=NEXTPLABEL %REPEAT %IF CONDOPT=1 %THEN %START NEWLINE SHOW(" ",INDEX,P+2) SHOW("TESTP ",TESTPA,P) SHOW("LEVEL ",LEVELA,P+1) SHOW("ANDOR ",ANDORA,P+1) SHOW("BRANCH",BRANCHA,P) SHOW("LABEL ",LABELA,P+2) NEWLINE %FINISH %CYCLE PP=1,1,P ;! GENERATE TEST CODE AND FILL LABELS %IF LABELA(PP)>=0 %THEN FILLLABEL(LABELA(PP)) CONDFLAG=1 EXPR(TESTPA(PP)) COMP=A(A(TESTPA(PP)+2)) %IF ANDORA(PP)=1 %THEN OPN=FALSE(COMP) %ELSE OPN=TRUE(COMP) DUMP(OPN,"ACC","",FILLBRANCH(LABELA(BRANCHA(PP)))) %REPEAT %IF LABELA(P+1)>=0 %AND TLABEL<0 %THEN FILLLABEL(LABELA(P+1)) %IF FLABEL>=0 %THEN %RESULT=-1 %ELSE %RESULT=LABELA(P+2) !----------------------------------------------------------------------- %ROUTINE PROCESSCOND(%INTEGER CONDP) TEST(A(CONDP+1)) CONDREST(A(CONDP+2)) %END !----------------------------------------------------------------------- %ROUTINE TEST(%INTEGER LTESTP) %IF A(LTESTP)=1 %THEN TESTP=LTESTP %ELSE LEVEL=LEVEL+1 %AND %C PROCESSCOND(A(LTESTP+1)) %AND LEVEL=LEVEL-1 %END !----------------------------------------------------------------------- %ROUTINE CONDREST(%INTEGER CONDRESTP) %INTEGER ANDOR ANDOR=A(CONDRESTP) %UNLESS ANDOR=3 %THEN %START STORE(TESTP,LEVEL,ANDOR) %AND TEST(A(CONDRESTP+1)) %AND %C CONDRESTP=A(CONDRESTP+2) %UNTIL A(CONDRESTP)=2 %FINISH %END !----------------------------------------------------------------------- %ROUTINE STORE(%INTEGER TESTP,LEVEL,ANDOR) %IF P>16 %THEN FAULT("CONDITION TOO LONG") %AND %STOP TESTPA(P)=TESTP LEVELA(P)=LEVEL ANDORA(P)=ANDOR LABELA(P)=-1 P=P+1 %END !----------------------------------------------------------------------- %ROUTINE SHOW(%STRING(7) AN,%INTEGERARRAYNAME A,%INTEGER P) %INTEGER PP PRINT STRING(AN." ") %CYCLE PP=1,1,P WRITE(A(PP),5) %REPEAT NEWLINE %END %END %ENDOFFILE