*COMDECK STRUCT 
 STRUCT   CTEXT  STRUCTURED PROGRAMMING MACROS FOR COMPASS
  
  
  
  
 $BEGIN   OPSYN  NIL
 $END     OPSYN  NIL
  
  
  
  
**        CALL -  CALL A SUBROUTINE 
* 
*     CALLING SEQUENCE- 
*         CALL   SUBR 
* 
*     GENERATES-
*         RJ     =X_SUBR
  
  
          PURGMAC  SUBR 
 CALL     MACRO  SUBR 
          RJ     =X_SUBR
 CALL     ENDM
  
  
  
  
**        EXIT -  EXIT FROM A SUBROUTINE
* 
*     CALLING SEQUENCE
*         EXIT
*      OR 
* LBL     EXIT
*      OR 
* ...     EXIT
* 
*     DOES- 
*         EXITS TO WORD DECLARED IN *SUBR* MACRO. 
*         THE ... IS A COMMENT. 
  
  
          PURGMAC  EXIT 
          MACRO  EXIT,L 
          IFC    NE, L  ,2
          IFC    NE, L ... ,1 
 L        BSS    0
          EQ     EXIT 
 EXIT     ENDM
  
  
  
  
**        IFTHEN -  CONDITIONALLY EXECUTE CODE
* 
*     CALLING SEQUENCE- 
*         IFTHEN <REG><REL><REG> OR <REG><REL>0 
*          ANDIF <REG><REL><REG> OR <REG><REL>0   (OPTIONAL)
*           ... 
*         ELSE-                    (OPTIONAL) 
*           ... 
*           ENDIF.
* 
*     NOTE- 
*         <REG> MUST BE OF THE FORM B.XYZ OR X.XYZ. 
*         <REL> MUST BE ONE OF < @ = \ > OR ".
  
  
          PURGMAC  IFTHEN 
 IFTHEN   MACRO  COND 
 IFLVL    SET    IFLVL+1
 M        MICRO  6,1, COND
 REL      SET    REL"M" 
 M        MICRO  1,1, COND
 OP1      MICRO  1,5, COND
 OP2      MICRO  7,, COND 
 IFLVL    DECMIC IFLVL,1
 IFLBL"IFLVL"   SET    IFLBL"IFLVL"+1 
 IFLBL    DECMIC IFLBL"IFLVL",3 
          IFC    EQ,*"OP2"*0*,1 
 OP2      MICRO  1,, B0 
          IFC    EQ, "M" B ,3 
 M        MICRO  REL,2, GEGTNELTLEEQ
          "M"     "OP1","OP2",IF"IFLVL""IFLBL"
          SKIP   2
 M        MICRO  REL,2, PL**NZNG**ZR
          "M"     "OP1",IF"IFLVL""IFLBL"
 IFTHEN   ENDM
  
  
          PURGMAC  ANDIF
 ANDIF    MACRO  COND 
 M        MICRO  6,1, COND
 REL      SET    REL"M" 
 M        MICRO  1,1, COND
 OP1      MICRO  1,5, COND
 OP2      MICRO  7,, COND 
 IFLVL    DECMIC IFLVL,1
 IFLBL    DECMIC IFLBL"IFLVL",3 
          IFC    EQ,*"OP2"*0*,1 
 OP2      MICRO  1,, B0 
          IFC    EQ, "M" B ,3 
 M        MICRO  REL,2, GEGTNELTLEEQ
          "M"     "OP1","OP2",IF"IFLVL""IFLBL"
          SKIP   2
 M        MICRO  REL,2, PL**NZNG**ZR
          "M"     "OP1",IF"IFLVL""IFLBL"
 ANDIF    ENDM
  
  
 ELSE-    MACRO 
 IFLVL    DECMIC IFLVL,1
 M        DECMIC IFLBL"IFLVL"+1,3 
          EQ     IF"IFLVL""M" 
 IFLBL    DECMIC IFLBL"IFLVL",3 
 IF"IFLVL""IFLBL"   BSS    0
 IFLBL"IFLVL"   SET    IFLBL"IFLVL"+1 
 ELSE-    ENDM
  
          PURGMAC  ENDIF. 
 ENDIF.   MACRO 
 IFLVL    DECMIC IFLVL,1
 IFLBL    DECMIC IFLBL"IFLVL",3 
 IF"IFLVL""IFLBL"   BSS    0
 IFLVL    SET    IFLVL-1
 ENDIF.   ENDM
  
  
 REL<     SET    1
 REL@     SET    3
 REL=     SET    5
 REL\     SET    7
 REL>     SET    9
 REL"     SET    11 
  
 IFLVL    SET    0
 IFLBL1   SET    0
 IFLBL2   SET    0
          NOREF  IFLVL,IFLBL1,IFLBL2,REL,IFLBL
  
  
  
  
**        LABEL -  DEFINE A LABEL FOR A WORD
* 
*     USAGE-
* NAME    LABEL 
  
  
          PURGMAC  LABEL
 LABEL    MACRO 
          BSS    0
 LABEL    ENDM
  
  
  
  
**        LOOP1 -  DECLARE A LOOP LABEL 
* 
*     USAGE-
* 1       LOOP1 
*           ... 
* _         (NZ B3,)LOOP1 
  
  
          PURGMAC  LOOP1
          MACRO  LOOP1,ONE
          IFC    NE, ONE 1 ,1 
          ERR    LABEL FIELD MUST CONTAIN A 1    "SEQUENCE" 
          BSS    0
 LOOP1    SET    *
 LOOP1    ENDM
  
  
  
  
**        SUBR -  DECLARE A SUBROUTINE
* 
*     USAGE-
* NAME    SUBR
*      OR 
* NAME    SUBR   (LOCAL)
* 
*     DOES- 
*         IF NOT (LOCAL), DECLARES THE ENTRY POINT. 
*         RESERVES THE ENTRY/EXIT WORD. 
*         SETS SYMBOL *EXIT*. 
  
  
          PURGMAC  SUBR 
          MACRO  SUBR,NAME,LCL
          IFC    NE, LCL LOCAL ,1 
          ENTRY  NAME 
 NAME     BSS    1
 EXIT     SET    NAME 
 SUBR     ENDM
**        * -  COMMENT
* 
*     USAGE-
*         * <COMMENTS>
  
 *        OPSYN  NIL
  
  
  
  
**       *USES -  INDICATE REGISTERS USED AFTER A SUBROUTINE/MACRO CALL 
* 
*     CALLING SEQUENCE- 
*         (SUBROUTINE/MACRO CALL) 
*        *USES <REGISTER LIST>
  
  
 *USES    OPSYN  NIL
  
  
  
  
**       *SAVES -  INDICATE REGISTERS SAVED AFTER SUBROUTINE/MACRO CALLS
* 
*     CALLING SEQUENCE- 
*         (SUBROUTINE/MACRO CALL) 
*        *SAVES <REGISTER LIST> 
  
  
 *SAVES   OPSYN  NIL
  
  
  
  
 STRUCT   ENDX
