*DECK ST5TEXT 
          IDENT  ST5TEXT
          TITLE  ST5TEXT -  TEXT FOR BUILDING SORT 5
          COMMENT  TEXT FOR BUILDING SORT 5 
          STEXT 
          LIST   F
  
  
  
  
**        ST5TEXT -  TEXT FOR BUILDING SORT/MERGE 5 
* 
*     TYPICAL ASSEMBLY: 
*         COMPASS(I,B=ST5TEXT,PC=ABCD)
* 
*     GIVEN:  
*         A = 1 OR BLANK FOR NOS ASSEMBLY 
*           = B FOR NOS/BE ASSEMBLY 
*             (CONTROLS -IFNOS- AND -IFNOSBE- MACROS) 
*         B = 2 OR BLANK FOR NO DEBUG CODE
*           = D FOR DEBUG CODE
*               (CONTROLS -IFDEBUG- MACRO)
*         C = 3 OR BLANK FOR NO PERFORMANCE MEASUREMENT CODE
*           = P FOR PERFORMANCE MEASUREMENT CODE
*             (CONTROLS -IFPERFM- MACRO)
*         D = 4 OR BLANK FOR NO DYNAMIC MEMORY MAP WRITTEN
*           = M FOR DYNAMIC MEMORY MAP WRITTEN TO -SPYLIST- 
*             (CONTROLS -IFMAP- MACRO)
* 
*     DOES: 
*         DEFINES VARIOUS MACROS TO BE USED DURING BUILDING.
  
  
  
  
**        CALL -  CALL A SUBROUTINE 
* 
*     CALLING SEQUENCE- 
*         CALL   SUBR 
* 
*     GENERATES-
*         RJ     =X_SUBR
  
  
          PURGMAC  CALL 
 CALL     MACRO  SUBR 
          RJ     =X_SUBR
 CALL     ENDM
  
  
  
  
**        COM -  DECLARE A COMDECK
* 
*     USAGE-
* #<NAME># COM    # <DESCRIPTION>                                      #
*          ...
* #<NAME># ENDCOM 
  
  
 COM      OPSYN  CTEXT
  
 ENDCOM   OPSYN  ENDX 
  
  
  
  
**        CONTAINS -  DECLARE THAT THIS CAPSULE CONTAINS A MODULE 
* 
*     CALLING SEQUENCE- 
*         CONTAINS  <ENTRY-POINT-NAME>
* 
*     DOES- 
*         GENERATES A REFERENCE TO <ENTRY-POINT-NAME> SO LOADER WILL
*         LOAD IT.
  
  
          PURGMAC  CONTAINS 
 CONTAINS MACRO  EPT
*  GENERATE ONLY ONE WORD FOR ALL *CONTAINS*
          IF     -DEF,'?CONTN,1 
 '?CONTN  BSS    0
          ORG    '?CONTN
          SA1    =X_EPT 
 CONTAINS 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
  
  
  
  
**        EXTERNAL -  DECLARE A NAME AS EXTERNAL
* 
*     CALLING SEQUENCE- 
* <NAME>  EXTERNAL
* 
*     DOES- 
*         DECLARES THE <NAME> AS EXTERNAL.
*         THIS IS USED SO THE NAME FOR EXTERNAL DECLARATIONS APPEARS
*         IN THE SAME COLUMN AS THE NAME FOR LOCAL DECLARATIONS.
  
  
          PURGMAC  EXTERNAL 
          MACRO  EXTERNAL,NAME
          EXT    NAME 
 EXTERNAL ENDM
  
  
  
  
**        GEN -  GENERATE AN INSTRUCTION
* 
*     CALLING SEQUENCE- 
*         GEN    (INSTR),MOD
*                            INSTR IS COMPASS INSTRUCTION 
*                            MOD IS NULL, REGISTER, OR LBLPTR 
* 
*     DOES- 
*         GENERATES THE INSTRUCTION AT (S$LOC) AND POSITION S$POS.
* 
*     NOTE- 
*         THE MODIFIER IS ADDED TO THE RIGHT-JUSTIFIED INSTRUCTION. 
*         THE USER MUST ENSURE THAT THE MODIFIER DOES NOT OVERFLOW
*         ITS INTENDED FIELD BY BEING TOO LARGE, OR DOES NOT BORROW 
*         THE WRONG BIT BY BEING TOO NEGATIVE.
* 
*     USES-      B    * - - - - 6 -    *B1=1
*                X  0 1 2 3 - - 6 - 
*                A  - 1 2 3 - - 6 - 
  
  
          PURGMAC  GEN
 GEN      MACRO  INSTR,MOD
 M        SET    0
1         IFC    NE, MOD
          IF     REG,MOD,4
          IFC    NE, MOD B7 ,1
          SB7    MOD
 M        SET    -1 
          SKIP   1
 M        SET    /LBLPTR/MOD
          RJ     =X_S$GEN 
+         INSTR 
 L        SET    1
          IFEQ   *P,45,2
-         VFD    15/0 
 L        SET    0
-         VFD    1/L,11/0,18/M
1         ELSE
          BSS    0
 L        SET    *
          ORG    EXIT 
+         INSTR 
          IFEQ   *P,45,2
 SGEN3015 MICRO  1,, S$GEN15
          SKIP   1
 SGEN3015 MICRO  1,, S$GEN30
          ORG    L
+         RJ     =X"SGEN3015" 
-         INSTR 
          IFC    EQ, "SGEN3015" S$GEN15 ,1
-         VFD    15/0 
1         ENDIF 
 GEN      ENDM
  
  
  
  
**        GENLBL -  GENERATE LABEL
* 
*     CALLING SEQUENCE- 
*         GENLBL LBLPTR 
* 
*     DOES- 
*         FORCES UPPER A LA COMPASS.
*         DEFINES THE LABEL AS THE NEW ADDRESS. 
*         LINKS BACK TO PREVIOUS REFERENCES, SETTING THE ADDRESS. 
* 
*     USES-      B    * - - - - 6 7    *B1=1
*                X  - 1 2 3 - - 6 - 
*                A  - 1 2 3 - - 6 - 
  
  
          PURGMAC  GENLBL 
 GENLBL   MACRO  PTR
          SX1    /LBLPTR/PTR
          RJ     =X_S$GNLBL 
 GENLBL   ENDM
  
  
  
  
**        GENMAC -  GENERATE A MACRO CALL 
* 
*     CALLING SEQUENCE- 
*         GENMAC (<MACRO CALL>) 
* 
*     GIVEN-
*         <MACRO CALL> = MACRO CALL.
* 
*     DOES- 
*         WHEN *GENMAC* IS EXECUTED IT GENERATES CODE CONSISTING OF 
*          THE <MACRO CALL>.  THE MACRO CANNOT REFERENCE A LBLPTR OF
*          A MODIFICATION REGISTER.  FOR EXAMPLE, 
*             GENMAC (STORE A0,DX="ENDFILE")
*          IS ILLEGAL, ALTHOUGH POSSIBLE IS 
*             GEN    (SX6 "ENDFILE")
*             GENMAC (STORE A0,DX=X6) 
  
  
          PURGMAC  GENMAC 
 GENMAC   MACRO  MACCALL
          LOCAL  START,NWORDS,NEWPOS
          SX1    NWORDS*100B+NEWPOS 
          RJ     =X_S$GNMAC 
 START    BSS    0
 SB6      OPSYN  GENMACB6 
          MACCALL 
          VFD    0/0
          PURGMAC  SB6
 #HAVEB6  SET    1
 NWORDS   EQU    *-START+1-*P/60
 NEWPOS   EQU    *P-*P/60*60
          IFNE   *P,60,1
          VFD    *P/0 
 GENMAC   ENDM
 GENMACB6 MACRO  OP 
          IF     -DEF,#HAVEB6,2 
          IFEQ   #HAVEB6,0,1
  ERR    (SB6    OP)    MUST BE SIMULATED 
 GENMACB6 ENDM
  
  
  
  
**        GENWD -  GENERATE A WORD
* 
*     CALLING SEQUENCE- 
*         GENWD  <X-REGISTER> 
* 
*     DOES- 
*         FORCES UPPER. 
*         INSERTS THE WORD IN <X-REGISTER>. 
* 
*     USES-      B    * - - - - 6 7    *B1=1
*                X  - 1 2 3 - - 6 - 
*                A  - 1 2 3 - - 6 - 
  
  
 GENWD    MACRO  XN 
          IFC    NE, XN X1 ,1 
          BX1    XN 
          RJ     =X_S$GENWD 
 GENWD    ENDM
  
  
  
  
**        GNAPN -  GENERATE CODE TO APPEND BITS 
* 
*     CALLING SEQUENCE: 
*         GNAPN  <OFFSET>,<LENGTH>
* 
*     DOES: 
*         APPENDS <LENGTH> BITS FROM *X4 WHICH HAS <OFFSET> UNUSED BITS 
*         ON THE LEFT.
  
  
          PURGMAC  GNAPN
 GNAPN    MACRO  OFFSET,LENGTH
          SB5    OFFSET 
          SB7    LENGTH 
          CALL   S$GNAPN
 GNAPN    ENDM
  
  
  
  
**        IFDEBUG -  ASSEMBLE LINES IF DEBUG VERSION WANTED 
* 
*     CALLING SEQUENCE: 
*         IFDEBUG            IF DEBUG CODE WANTED,
*           ... 
*           ENDIF 
  
  
          PURGMAC  IFDEBUG
 M        MICRO  2,1,$"PCOMMENT"$      SECOND CHARACTER 
          IFC    NE,$"M"$ $,1          IF BLANK 
          IFC    EQ,$"M"$2$,2           OR 2, 
 IFDEBUG  OPSYN  IFPP                    THEN -IFDEBUG- SKIPS 
          SKIP   4                     ELSE,
          IFC    EQ,$"M"$D$,2          IF D,
 IFDEBUG  OPSYN  IFCP                    THEN -IFDEBUG- ASSEMBLES 
          SKIP   1                     ELSE,
          ERR    SECOND CHARACTER OF PC= PARAMETER MUST BE 2, D OR BLANK
  
  
  
  
**        IFMAP -  ASSEMBLE LINES IF DYNAMIC MEMORY MAPPING WANTED
* 
*     CALLING SEQUENCE: 
*         IFMAP                        IF DYNAMIC MEMORY MAP WANTED,
*           ... 
*           ENDIF 
  
  
          PURGMAC  IFMAP
 M        MICRO  4,1,$"PCOMMENT"$      FOURTH CHARACTER 
          IFC    NE,$"M"$ $,1          IF BLANK 
          IFC    EQ,$"M"$4$,2           OR 4, 
 IFMAP    OPSYN  IFPP                    THEN -IFMAP- SKIPS 
          SKIP   4                     ELSE,
          IFC    EQ,$"M"$M$,2          IF M,
 IFMAP    OPSYN  IFCP                    THEN -IFMAP- ASSEMBLES 
          SKIP   1                     ELSE,
          ERR    FOURTH CHARACTER OF PC= PARAMETER MUST BE 3, M OR BLANK
  
  
  
  
**        IFNOS -  CONDITIONALLY ASSEMBLE CODE IF NOS OPERATING SYSTEM
* 
*     CALLING SEQUENCE- 
*         IFNOS 
*           ... 
*         ELSE               (OPTIONAL) 
*           ... 
*           ENDIF 
  
  
          PURGMAC  IFNOS
 M        MICRO  1,1,$"PCOMMENT"$      FIRST CHARACTER
          IFC    NE,$"M"$ $,1          IF BLANK 
          IFC    EQ,$"M"$1$,2           OR 1, 
 IFNOS    OPSYN  IFCP                    THEN -IFNOS- ASSEMBLES 
          SKIP   4                     ELSE 
          IFC    EQ,$"M"$B$,2          IF B,
 IFNOS    OPSYN  IFPP                    THEN -IFNOS- SKIPS 
          SKIP   1                     ELSE,
          ERR    FIRST CHARACTER OF PC PARAMETER MUST BE 1, B OR BLANK
  
  
  
  
**        IFNOSBE -  CONDITIONALLY ASSEMBLE CODE IF NOS/BE OPERATING SYSTEM 
* 
*     CALLING SEQUENCE- 
*         IFNOSBE 
*           ... 
*         ELSE               (OPTIONAL) 
*           ... 
*           ENDIF 
  
  
          IFNOS                        IF NOS,
 IFNOSBE    OPSYN  IFPP                  THEN -IFNOSBE- SKIPS 
          ELSE                         ELSE,
 IFNOSBE    OPSYN  IFCP                  THEN -IFNOSBE- ASSEMBLES 
            ENDIF 
  
  
  
  
**        IFPERFM-  CONDITIONALLY ASSEMBLE PERFORMANCE MEASUREMENT CODE 
* 
*     CALLING SEQUENCE: 
*         IFPERFM 
*           ... 
*           ENDIF 
  
  
 M        MICRO  3,1,$"PCOMMENT"$      THIRD CHARACTER
          IFC    NE,$"M"$ $,1          IF BLANK 
          IFC    EQ,$"M"$3$,2           OR 3, 
 IFPERFM  OPSYN  IFPP                    THEN -IFPERFM- SKIPS 
          SKIP   4                     ELSE 
          IFC    EQ,$"M"$P$,2          IF P,
 IFPERFM  OPSYN  IFCP                    THEN -IFPERFM- ASSEMBLES 
          SKIP   1                     ELSE,
          ERR    THIRD CHARACTER OF PC= PARAMETER MUST BE 2, P OR BLANK 
  
  
  
  
**        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.
  
  
          PURGMAC  IFTHEN 
 IFTHEN   MACRO  COND 
 IFLVL    SET    IFLVL+1
 REL      SET    11 
 M        MICRO  3,1, COND
          IFC    EQ, "M" < ,1 
 REL      SET    1
          IFC    EQ, "M" @ ,1 
 REL      SET    3
          IFC    EQ, "M" = ,1 
 REL      SET    5
          IFC    EQ, "M" \ ,1 
 REL      SET    7
          IFC    EQ, "M" > ,1 
 REL      SET    9
 M        MICRO  1,1, COND
 OP1      MICRO  1,2, COND
 OP2      MICRO  4,2,*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 
 REL      SET    11 
 M        MICRO  3,1, COND
          IFC    EQ, "M" < ,1 
 REL      SET    1
          IFC    EQ, "M" @ ,1 
 REL      SET    3
          IFC    EQ, "M" = ,1 
 REL      SET    5
          IFC    EQ, "M" \ ,1 
 REL      SET    7
          IFC    EQ, "M" > ,1 
 REL      SET    9
 M        MICRO  1,1, COND
 OP1      MICRO  1,2, COND
 OP2      MICRO  4,2,*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
  
  
          PURGMAC  ELSE-
 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
  
  
  
  
**        LOAD -  LOAD A CAPSULE
* 
*     CALLING SEQUENCE- 
*         LOAD   (NAME) 
* 
*     DOES- 
*         LOADS THE CAPSULE NAMED (NAME). 
  
  
 LOAD     MACRO  NAME 
          SA2    =0L_NAME    42/0L_CAPSULENAME, 18/0
          CALL   S.LOADC     LOAD THE NAME CAPSULE
 LOAD     ENDM
  
  
  
  
**        LOADX -  LOAD AND EXECUTE A CAPSULE 
* 
*     CALLING SEQUENCE- 
*         LOADX  (NAME),(EPT) 
* 
*     DOES- 
*         LOADS AND EXECUTES THE CAPSULE NAMED (NAME).
  
  
 LOADX    MACRO  NAME,EPT 
          SA2    =0L_NAME    42/0L_CAPSULENAME, 18/0
          CALL   S.LOADC     LOAD THE NAME CAPSULE
          IFC    NE, EPT  ,2
          CALL   EPT
          SKIP   1
          CALL   NAME        EXECUTE THE NAME CAPSULE 
 LOADX    ENDM
  
  
  
  
**        LOADXU -  LOAD, EXECUTE AND UNLOAD A CAPSULE
* 
*     CALLING SEQUENCE- 
*         LOADXU (NAME) 
*       OR
*         LOADXU (NAME),(EPT) 
* 
*     DOES- 
*         LOADS, EXECUTES AND UNLOADS THE CAPSULE NAMED (NAME). 
  
  
 LOADXU   MACRO  NAME,EPT 
          SA2    =0L_NAME    42/0LCAPSULENAME, 18/0 
          CALL   S.LOADC     LOAD THE NAME CAPSULE
          IFC    NE, EPT  ,2
          CALL   EPT         EXECUTE THE NAME CAPSULE 
          SKIP   1
          CALL   NAME        EXECUTE THE NAME CAPSULE 
          SA2    =0L_NAME    42/0L_CAPSULENAME, 18/0
          CALL   S.ULOAD     UNLOAD THE NAME CAPSULE
 LOADXU   ENDM
  
  
  
  
**        NEWLBL -  REFERENCE A NEW LABEL 
* 
*     CALLING SEQUENCE- 
*         NEWLBL PTR
* 
*     DOES- 
*         POINTS  PTR  TO A NEW LABEL.
*         THE NEW LABEL WILL BE INITIALIZED AS NOT-YET-DEFINED
*           WITH A LINK FIELD OF ZERO.
* 
*     USES-      B    * - - - - 6 7    *B1=1
*                X  - 1 - - - - 6 - 
*                A  - 1 - - - - 6 - 
  
  
          PURGMAC  NEWLBL 
 NEWLBL   MACRO  PTR
          SB6    /LBLPTR/PTR
          RJ     =X_S$NWLBL 
 NEWLBL   ENDM
  
  
  
  
**        PASSLOC -  DEFINE A *PASSLOC* TABLE FOR FDL 
* 
*     CALLING SEQUENCE- 
* NAME    PASSLOC 
*         PL.EPT NAME1
*         ... 
*         PL.EPT NAMEN
*         PL. 
  
  
          MACRO  PASSLOC,NAME 
          NOREF  PL.WC       (USED BY PL.EPT MACRO) 
PASSLOC   RMT 
 NAME     VFD    12/0024B,12/PL.WC,36/0 
          RMT 
 PL.EPT   MICRO  1,, A
 PL.WC    SET    0
 PASSLOC  ENDM
  
  
          MACRO  PL.EPT,LOC,EPTNAME,REF 
          IFC    EQ, REF X ,1 
          EXT    EPTNAME
          IFC    GE, "PL.EPT" EPTNAME ,1
          ERR    PASSLOC NAMES MUST BE IN ALPHANUMERIC ORDER
 PL.EPT   MICRO  1,, EPTNAME
PASSLOC   RMT 
 LOC      VFD    42/0L_EPTNAME,18/0 
          IF     DEF,EPTNAME,2
          VFD    42/0,18/EPTNAME
          SKIP   4
          IFC    EQ, REF Y ,2 
          VFD    42/0,18/=Y_EPTNAME 
          SKIP   1
          VFD    42/0,18/0
          RMT 
 PL.WC    SET    PL.WC+2
 PL.EPT   ENDM
  
  
  
 PL.      MACRO 
 PASSLOC  HERE
 PL.      ENDM
  
  
  
  
**        STATUS -  INTERPRET A SYMPL STATUS LIST 
* 
*     USAGE-
*         STATUS <STATNAME> 
*              ,  <MNEMONIC-1>
*             ... 
*              ,  <MNEMONIC-N>
*               ; 
* 
*     DOES- 
*         /<STATNAME>/<MNEMONIC-1> EQU 1
*         ... 
*         /<STATNAME>/<MNEMONIC-N> EQU N
  
  
          PURGMAC  STATUS 
 STATUS   MACRO  STATNAME 
          ORG    1
          QUAL   STATNAME 
 STATUS   ENDM
  
 ,        MACRO  MNEMONIC 
 MNEMONIC  BSS   1
 MNEMONIC MICRO  1,,*0),MNEMONIC *
 ,        ENDM
  
 ;        MACRO 
          QUAL   *
          USE    *
 ;        ENDM
  
  
  
  
**        SUBR -  DECLARE A SUBROUTINE
* 
*      USAGE- 
* NAME    SUBR
* 
*     DOES- 
*         RESERVES THE ENTRY/EXIT WORD. 
*         (THIS WORD IS ALSO USED BY *GEN* MACRO.)
*         SETS SET-SYMBOL *EXIT* FOR THE EXIT AND GEN MACROS. 
  
  
          PURGMAC  SUBR 
          MACRO  SUBR,NAME
 NAME     BSS    1
 EXIT     SET    NAME 
1         IF     -DEF,IFLVL 
 IFLVL    SET    0
 IFLBL1   SET    0
 IFLBL2   SET    0
 IFLBL3  SET 0
          NOREF  IFLVL,IFLBL1,IFLBL2,REL,IFLBL,L,M,S$GEN
1         ENDIF 
 SUBR     ENDM
  
  
  
  
**       *USES -  INDICATE REGISTER USED AFTER A SUBROUTINE CALL
* 
*     CALLING SEUQENCE- 
*         (SUBROUTINE CALL) 
*        *USES   REGISTERS
  
  
 *USES    OPSYN  NIL
  
  
  
  
**        *SAVES -  INDICATE REGISTERS SAVED AFTER A SUBROUTINE CALL
* 
*     CALLING SEQUENCE- 
*         CALL   <SUBROUTINE> 
*        *SAVES  <REGISTERS>
  
  
 *SAVES   OPSYN  NIL
  
  
  
  
**        $BEGIN/$END -  DELIMIT DEBUG-ONLY CODE
* 
*     CALLING SEQUENCE- 
*         $BEGIN
*         ... 
*         $END
  
  
 $BEGIN   OPSYN  NIL
  
 $END     OPSYN  ENDIF
  
  
  
  
          END 
