home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / macrosrc.arc / IF.ASM < prev    next >
Encoding:
Assembly Source File  |  1983-11-17  |  3.0 KB  |  105 lines

  1.  
  2. *IF-THEN-ELSE-ENDIF CONSTRUCTIONS
  3. *USES: AC, AND RESOURCES NEED BY LET
  4. *
  5. *      IF   <COND>
  6. *      [COMPUTE EXPRESSION IN AC]
  7. *      THEN
  8. *      [IF AC TEST FAILS TO BRANCH DO THIS]
  9. *   [  ELSE
  10. *      [IF AC TEST BRANCHES DO THIS]   ] <---OPTIONAL
  11. *      ENDIF
  12. *OR:
  13. *      IF   <COND>,<LET EXPRESSION>
  14. *      THEN
  15. *      [IF LET EXPRESSION TEST FAILS TO BRANCH DO THIS]
  16. *  [   ELSE
  17. *      [IF LET EXPRESSION BRANCHES DO THIS]  <---OPTIONAL
  18. *      ENDIF
  19. *
  20. *IF'S MAY BE NESTED
  21. *<COND> IS:
  22. *           EQ     AC(EXPR) IS =0
  23. *           NE     AC(EXPR) IS NOT =0
  24. *           LT     AC(EXPR) IS <0
  25. *           GT     AC(EXPR) IS >0
  26. *           GE     AC(EXPR) IS NOT <0
  27. *           LE     AC(EXPR) IS NOT >0
  28. *      OR:
  29. *           ANY 320 BRANCH INSTRUCTION
  30.  
  31. IF     $MACRO      C,EE
  32.        $VAR I,E,Q,W,T
  33.        $ASG '$$IFS' TO I.S      GET IS STACK INDEX
  34.        $ASG I.SV+1 TO I.SV      PUSH
  35.        $ASG '$$IF' TO Q.S
  36.        $ASG :Q::I.SV: TO I.SS   MAKE CNTEXT VAR NAME
  37.        $ASG '$$LAB' TO E.S      GET LABEL GEN
  38.        $ASG E.SV+1 TO E.SV      NEXT LABEL
  39.        $ASG :I.SS: TO W.S       MAKE THE CNTEXT NAME SYMBOL
  40.        $ASG E.SV TO W.SV        SAVE LABEL INDEX AS VALUE
  41.        $ASG 'EQ' TO T.S
  42.        $IF  C.SV=T.SV           EQUAL
  43.        $ASG 'BNZ' TO W.SS
  44.        $ELSE
  45.        $ASG 'NE' TO T.S
  46.        $IF  C.SV=T.SV           NOT EQUAL
  47.        $ASG 'BZ' TO W.SS
  48.        $ELSE
  49.        $ASG 'GT' TO T.S
  50.        $IF  C.SV=T.SV           GT
  51.        $ASG 'BLEZ' TO W.SS
  52.        $ELSE
  53.        $ASG 'LT' TO T.S
  54.        $IF  C.SV=T.SV           LT
  55.        $ASG 'BGEZ' TO W.SS
  56.        $ELSE
  57.        $ASG 'GE' TO T.S
  58.        $IF  C.SV=T.SV           GE
  59.        $ASG 'BLZ' TO W.SS
  60.        $ELSE
  61.        $ASG 'LE' TO T.S
  62.        $IF  C.SV=T.SV           LE
  63.        $ASG 'BGZ' TO W.SS
  64.        $ELSE
  65.        $ASG :C: TO W.SS         SAVE THE BRANCH
  66.        $ENDIF
  67.        $ENDIF
  68.        $ENDIF
  69.        $ENDIF
  70.        $ENDIF
  71.        $ENDIF
  72.        $IF  EE.L#=0
  73.        LET  :EE:                PROCSS LET EXPR
  74.        $ENDIF
  75.        $END
  76.  
  77. THEN   $MACRO
  78.        $VAR I,W
  79.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR
  80.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR
  81.        :W.SS: A$:W.SV:          BRANCH TO ELSE CLAUSE
  82.        $END
  83.  
  84. ELSE   $MACRO
  85.        $VAR I,W
  86.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR
  87.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR
  88.        B    B$:W.SV:            BRANCH TO ENDIF
  89. A$:W.SV: EQU $                  BEGIN ELSE CLAUSE
  90.        $END
  91.  
  92. ENDIF  $MACRO
  93.        $VAR I,W,T,Q
  94.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR
  95.        $ASG 'A$' TO Q.S
  96.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR
  97.        $ASG :Q::W.SV: TO T.S    CHECK FOR ELSE
  98.        $IF  T.SA&$UNDF          IF NONE, DO IT
  99. A$:W.SV: EQU $                  DUMMY ELSE CLAUSE
  100.        $ENDIF
  101. B$:W.SV: EQU $                  END OF IF
  102.        $ASG I.SV-1 TO I.SV      POP CNTEXT STACK
  103.        $ASG '$$IF' TO Q.S
  104.        $ASG :Q::I.SV: TO I.SS   BACK TO LAST CNTEXT VAR
  105.        $END