home *** CD-ROM | disk | FTP | other *** search
-
- *IF-THEN-ELSE-ENDIF CONSTRUCTIONS
- *USES: AC, AND RESOURCES NEED BY LET
- *
- * IF <COND>
- * [COMPUTE EXPRESSION IN AC]
- * THEN
- * [IF AC TEST FAILS TO BRANCH DO THIS]
- * [ ELSE
- * [IF AC TEST BRANCHES DO THIS] ] <---OPTIONAL
- * ENDIF
- *OR:
- * IF <COND>,<LET EXPRESSION>
- * THEN
- * [IF LET EXPRESSION TEST FAILS TO BRANCH DO THIS]
- * [ ELSE
- * [IF LET EXPRESSION BRANCHES DO THIS] <---OPTIONAL
- * ENDIF
- *
- *IF'S MAY BE NESTED
- *<COND> IS:
- * EQ AC(EXPR) IS =0
- * NE AC(EXPR) IS NOT =0
- * LT AC(EXPR) IS <0
- * GT AC(EXPR) IS >0
- * GE AC(EXPR) IS NOT <0
- * LE AC(EXPR) IS NOT >0
- * OR:
- * ANY 320 BRANCH INSTRUCTION
-
- IF $MACRO C,EE
- $VAR I,E,Q,W,T
- $ASG '$$IFS' TO I.S GET IS STACK INDEX
- $ASG I.SV+1 TO I.SV PUSH
- $ASG '$$IF' TO Q.S
- $ASG :Q::I.SV: TO I.SS MAKE CNTEXT VAR NAME
- $ASG '$$LAB' TO E.S GET LABEL GEN
- $ASG E.SV+1 TO E.SV NEXT LABEL
- $ASG :I.SS: TO W.S MAKE THE CNTEXT NAME SYMBOL
- $ASG E.SV TO W.SV SAVE LABEL INDEX AS VALUE
- $ASG 'EQ' TO T.S
- $IF C.SV=T.SV EQUAL
- $ASG 'BNZ' TO W.SS
- $ELSE
- $ASG 'NE' TO T.S
- $IF C.SV=T.SV NOT EQUAL
- $ASG 'BZ' TO W.SS
- $ELSE
- $ASG 'GT' TO T.S
- $IF C.SV=T.SV GT
- $ASG 'BLEZ' TO W.SS
- $ELSE
- $ASG 'LT' TO T.S
- $IF C.SV=T.SV LT
- $ASG 'BGEZ' TO W.SS
- $ELSE
- $ASG 'GE' TO T.S
- $IF C.SV=T.SV GE
- $ASG 'BLZ' TO W.SS
- $ELSE
- $ASG 'LE' TO T.S
- $IF C.SV=T.SV LE
- $ASG 'BGZ' TO W.SS
- $ELSE
- $ASG :C: TO W.SS SAVE THE BRANCH
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $IF EE.L#=0
- LET :EE: PROCSS LET EXPR
- $ENDIF
- $END
-
- THEN $MACRO
- $VAR I,W
- $ASG '$$IFS' TO I.S GET CNTEXT VAR
- $ASG :I.SS: TO W.S MAKE THIS CNTEXT VAR
- :W.SS: A$:W.SV: BRANCH TO ELSE CLAUSE
- $END
-
- ELSE $MACRO
- $VAR I,W
- $ASG '$$IFS' TO I.S GET CNTEXT VAR
- $ASG :I.SS: TO W.S MAKE THIS CNTEXT VAR
- B B$:W.SV: BRANCH TO ENDIF
- A$:W.SV: EQU $ BEGIN ELSE CLAUSE
- $END
-
- ENDIF $MACRO
- $VAR I,W,T,Q
- $ASG '$$IFS' TO I.S GET CNTEXT VAR
- $ASG 'A$' TO Q.S
- $ASG :I.SS: TO W.S MAKE THIS CNTEXT VAR
- $ASG :Q::W.SV: TO T.S CHECK FOR ELSE
- $IF T.SA&$UNDF IF NONE, DO IT
- A$:W.SV: EQU $ DUMMY ELSE CLAUSE
- $ENDIF
- B$:W.SV: EQU $ END OF IF
- $ASG I.SV-1 TO I.SV POP CNTEXT STACK
- $ASG '$$IF' TO Q.S
- $ASG :Q::I.SV: TO I.SS BACK TO LAST CNTEXT VAR
- $END