          CTEXT  DSI$PP MACROS.
 DSIPMAC  SPACE  4,10
***       DSI$PP MACROS.
*         G. R. MANSFIELD.  09/27/69.
*         W. E. GOEBEL.      78/07/12.
 DSIPMAC  SPACE  4,10
***              DEFINES SEVERAL MACROS WHICH ARE USED IN THE
*         SYSTEM PP PACKAGES.
 DSIPMAC  SPACE  4,10
***       SCRATCH SYMBOLS.
*
*
*         THE FOLLOWING SYMBOLS ARE USED IN MACROS FOR SCRATCH.
*         .1, .2, .3, .4, .5.


          NOREF  .1,.2,.3,.4
 MACREF   SPACE  4,10
**        MACREF - GENERATE MACRO SYMBOLIC REFERENCE TABLE LISTING.
*
*         CAUSES THE MACRO NAME TO BE LISTED IN THE SYMBOLIC
*         REFERENCE TABLE UNDER THE QUALIFIER *MACRO$*.
*
*         MACREF MNAME
*                MNAME    MACRO NAME FOR REFERENCE TABLE.


          PURGMAC  MACREF
 MACREF   MACRO  N
  QUAL MACRO$
N SET *
  QUAL *
  ENDM
 ADK      SPACE  4,10
***       ADK - ADD CONSTANT TO (A).
*
*         GENERATES EITHER AN *ADC*, *ADN*, OR *SBN* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE OPERAND.  IF THE VALUE
*         OF THE OPERAND REDUCES TO ZERO, NO INSTRUCTION WILL BE
*         GENERATED.
*
*         ADK    K
*
*         ENTRY  K = CONSTANT TO BE ADDED TO (A).
*
*         NOTE   BECAUSE OF THE VARIABILITY OF THE CODE
*                GENERATED BY THIS MACRO, IT MUST NOT BE
*                CHANGED BY ON-LINE CODE MODIFICATION.


          PURGMAC  ADK
 ADK      MACRO  K
  LOCAL B
  IF DEF,K,10D
B SET K
  IFMI K,4
  IFGE K,-77B,7
  IFNE K,-0,7
  SBN -B
  SKIP 5
  IFLE K,77B,3
  IFNE K,0,3
  ADN K
  SKIP 1
  ADC K
 ADK      ENDM
 BITSET   SPACE  4,10
***       BITSET - GENERATE BIT CONSTANT.
*
*
*NAME     BITSET (P1,P2,...,PN)
*         ENTRY  *NAME* = NAME OF BIT CONSTANT.
*                (PN) = BITS TO SET.


          PURGMAC  BITSET
          MACRO  BITSET,N,P
N SET 0
  IRP P
.1 DECMIC P
N SET N+1S".1"
  IRP
  BSS     0
  ENDM
          SPACE  4,10
***       DEFINE ABSOLUTE MEMORY INSTRUCTIONS.
*
*
*         LJP    ADDRESS
*         RJP    ADDRESS
*         LDP    ADDRESS
*         ADP    ADDRESS
*         SBP    ADDRESS
*         LMP    ADDRESS
*         STP    ADDRESS
*         RAP    ADDRESS
*         AOP    ADDRESS
*         SOP    ADDRESS
*
*         DEFINE ABSOLUTE MEMORY INSTRUCTION FOR USE BY OTHER MACROS.
*         ENTRY  (ADDRESS) = ABSOLUTE MEMORY ADDRESS.


 LJP      PPOP   5,0100B
 RJP      PPOP   5,0200B
 LDP      PPOP   5,5000B
 ADP      PPOP   5,5100B
 SBP      PPOP   5,5200B
 LMP      PPOP   5,5300B
 STP      PPOP   5,5400B
 RAP      PPOP   5,5500B
 AOP      PPOP   5,5600B
 SOP      PPOP   5,5700B
 LDBC     SPACE  4,10
***       LDBC - LOAD (A) WITH BIT CONSTANT.
*
*
*         LDBC   (P1,P2,...,PN)
*         LOAD (A) WITH A CONSTANT CONTAINING BITS PN.


          PURGMAC  LDBC
 LDBC     MACRO  P
  .1 (P)
  LDK .1
  ENDM
 ADBC     SPACE  4,10
***       ADBC - ADD BIT CONSTANT TO (A).
*
*
*         ADBC   (P1,P2,...,PN)
*         ADD A CONSTANT CONTAINING BITS PN TO (A).


          PURGMAC  ADBC
 ADBC     MACRO  P
  .1 (P)
  ADK .1
  ENDM
 LPBC     SPACE  4,10
***       LPBC - LOGICAL PRODUCT BIT CONSTANT WITH (A).
*
*
*         LPBC   (P1,P2,...,PN)
*         LOGICAL PRODUCT OF (A) AND CONSTANT CONTAINING BITS PN.


          PURGMAC  LPBC
 LPBC     MACRO  P
  .1 (P)
  LPK .1
  ENDM
 LMBC     SPACE  4,10
***       LMBC - ADD BIT CONSTANT TO (A).
*
*
*         LMBC   (P1,P2,...,PN)
*         LOGICAL DIFFERENCE OF (A) AND CONSTANT CONTAINING BITS PN.


          PURGMAC  LMBC
 LMBC     MACRO  P
  .1 (P)
  LMK .1
  ENDM
 BSSN     SPACE  4,10
***       BSSN - SEQUENTIAL TAG DEFINITION WITHOUT RESERVING SPACE.
*
*
* BEGIN   BSSN   A           BEGIN TAG DEFINITION SEQUENCE
* TAG1    BSSN   N
* .       .      .
* .       .      .
*
* TAGN    BSSN   N
* END     BSSN               END TAG DEFINITION SEQUENCE
*
*         TO GET THE TAG VALUES PRINTED ON A LISTING A *LIST G*
*         CARD MUST BE PRESENT BEFORE THIS MACRO IS CALLED.
*
*                A = NUMBER TO START TAG DEFINITION AT.
*                N = NUMBER OF LOCATIONS RESERVED TO THIS TAG.


          PURGMAC  BSSN
          MACRO  BSSN,T,N
.1 IFC EQ,*T*BEGIN*
.2 IFC NE,*N**
  LOC N
.2 ELSE 1
  LOC 0
.3 SKIP
.1 ENDIF
.2 IFC EQ,*T*END*
  LOC *O
.3 SKIP
.2 ENDIF
  IFC NE,*T**,1
T EQU *
  LOC *+N
.3 ENDIF
  ENDM
 DEFC     SPACE  4,10
***       DEFC - CONDITIONALLY DEFINE SYMBOL.
*
*
* SYM     DEFC   VAL


          PURGMAC  DEFC
          MACRO  DEFC,SYM,VAL
  MACREF DEFC
  IF -DEF,SYM,1
 SYM = VAL
  ENDM
 DFIM     SPACE  4,10
***       DFIM - DEFINE INSTRUCTION MODIFICATION.
*
*TAG      DFIM   (OPC),ADR
*
*         ENTRY  *OPC* = COMPASS OP CODE AND VARIABLE FIELD.
*                *ADR* = ADDRESS TO BE MODIFIED WITH *OPC*.
*                      = * IF NOT SPECIFIED.
*                *TAG* = OPTIONAL LOCATION FIELD SYMBOL.
*
*         EXIT   *OPC* PLACED IN REMOTE BLOCK NAMED BY
*                *R$* MICRO (DEFAULT IS *SRMT*).


          PURGMAC  DFIM
          MACRO  DFIM,TAG,OPC,ADR
  LOCAL X,Y,Z
  MACREF DFIM
Z MICRO 1,, "QUAL"
X SET ADR *
Y EQU *O-*L+X
  IF -MIC,R$,1
R$ MICRO 1,4, SRMT
"R$" RMT
  IF DEF,"R$"A,1
  IFEQ "R$"A,10000,3
"R$" EQU *O
  QUAL
"R$"A SET 10000
  IFNE /"Z"/Y,"R$"A,4
"R$"B SET *O
"R$"C SET 0
  ORG *O+1
  CON /"Z"/Y
"R$"A SET /"Z"/Y
  QUAL "Z"
  LOC X+"R$"C
  IFC NE,$TAG$$,1
TAG BSS 0
  OPC
  QUAL
"R$"C SET *O-"R$"B-2
  ORG "R$"B
  CON "R$"C
  ORG *O+"R$"C+1
  RMT
 DFIM     ENDM
 DIMB     SPACE  4,10
***       DIMB - DUMP INSTRUCTION MODIFICATION BLOCK.
*
*         DIMB   BN
*
*         ENTRY  *BN* = NAME OF REMOTE BLOCK.
*                     = *SRMT* IF NOT SPECIFIED.


          PURGMAC  DIMB
 DIMB     MACRO  BN
  LOCAL Q
  MACREF DIMB
Q MICRO 1,, "QUAL"
  IFC EQ,*BN**,2
TN MICRO 1,4, SRMT
  ELSE 1
TN MICRO 1,, BN
  QUAL
  NOREF "TN"A,"TN"B,"TN"C
  QUAL *
"TN" HERE
  CON 0
"TN"A SET 10000
  QUAL "Q"
 DIMB     ENDM
 ISTORE   SPACE  4,15
***       ISTORE - INSTRUCTION STORE.
*
*         BUILDS AND STORES PP INSTRUCTION VIA IN-LINE CODE
*         MODIFICATION.  LOCATION TO BE MODIFIED MUST BE
*         PREVIOUSLY DEFINED.
*
*         ISTORE CADDR,(INSTR)
*
*         ENTRY  CADDR = ADDRESS OF CODE TO BE MODIFIED.
*                INSTR = INSTRUCTION (OPERATION CODE AND ADDRESS
*                        FIELD) TO BE STORED.


          PURGMAC  ISTORE
 ISTORE   MACRO  CADDR,INSTR
  MACREF ISTORE
  LDC **
  ORG *-1
  LOC CADDR
  INSTR
  LOC *O
  STM CADDR
 ISTORE   ENDM
 LDK      SPACE  4,10
***       LDK - LOAD CONSTANT INTO (A).
*
*         GENERATES EITHER A *LDC*, *LDN*, OR *LCN* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE OPERAND.
*
*         LDK    K
*
*         ENTRY  K = CONSTANT TO BE LOADED INTO (A).
*
*         NOTE   BECAUSE OF THE VARIABILITY OF THE CODE
*                GENERATED BY THIS MACRO, IT MUST NOT BE
*                CHANGED BY ON-LINE CODE MODIFICATION.


          PURGMAC  LDK
 LDK      MACRO  K
  IF DEF,K,8D
  IFMI K,4
  IFGE K,-77B,6
.1 SET K
  LCN -.1
  SKIP 4
  IFLE K,77B,2
  LDN K
  SKIP 1
  LDC K
 LDK      ENDM
 LMK      SPACE  4,10
***       LMK - LOGICAL MINUS CONSTANT WITH (A).
*
*         GENERATES EITHER AN *LMC* OR AN *LMN* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE OPERAND. IF THE
*         VALUE OF THE OPERAND REDUCES TO ZERO, NO INSTRUCTION
*         WILL BE GENERATED.
*
*         LMK    K
*
*         ENTRY  K = CONSTANT TO BE MINUSED WITH (A).
*
*         NOTE   BECAUSE OF THE VARIABILITY OF THE CODE
*                GENERATED BY THIS MACRO, IT MUST NOT BE
*                CHANGED BY ON-LINE CODE MODIFICATION.


          PURGMAC  LMK
 LMK      MACRO  K
  LOCAL B
  IF DEF,K,6
B SET K
  IFPL K,4
  IFLE K,77B,3
  IFNE K,0,3
  LMN K
  SKIP 1
  LMC K
 LMK      ENDM
 LPK      SPACE  4,10
***       LPK - LOGICAL PRODUCT CONSTANT WITH (A).
*
*         GENERATES EITHER AN *LPC*, *LPN*, OR *SCN* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE OPERAND.  IF THE VALUE
*         OF THE OPERARND REDUCES TO ZERO, NO INSTRUCTION WILL BE
*         GENERATED.
*
*         LPK    K
*
*         ENTRY  K = CONSTANT TO BE *ANDED* WITH (A).
*
*         NOTE   BECAUSE OF THE VARIABILITY OF THE CODE
*                GENERATED BY THIS MACRO, IT MUST NOT BE
*                CHANGED BY ON-LINE CODE MODIFICATION.


          PURGMAC  LPK
 LPK      MACRO  K
  IF DEF,K,9D
  IFMI K,5
  IFGE K,-77B,7
  IFNE K,0,7
.1 SET K
  SCN -.1
  SKIP 4
  IFLE K,77B,2
  LPN K
  SKIP 1
  LPC K
 LPK      ENDM
 MDIN     SPACE  4,20
***       MDIN - MODIFY INSTRUCTIONS FROM REMOTE LIST.
*
*         MDIN   BN
*
*         ENTRY  *BN* = NAME OF REMOTE BLOCK.
*                    = *SRMT* IF NOT SPECIFIED.
*
*         EXIT   (A) = 0.
*
*         USES   T0 - T2.
*
*         FORMAT OF REMOTE BLOCK SEGMENT =
*
*                VFD    12  / BYTE COUNT (N).
*                VFD    12  / LOCATION FOR CODE.
*                VFD    N*12/ (N) BYTES OF CODE.


          PURGMAC  MDIN
 MDIN     MACRO  BN
  LOCAL L1,L2,L3
  MACREF MDIN
  IFC EQ,*BN**,2
TN MICRO 1,4, SRMT
  ELSE 1
TN MICRO 1,, BN
  LDC "TN"-1
  STD T1
  UJN L3

L1 STD T0
  AOD T1
  LDI T1
  STD T2
L2 AOD T1
  LDI T1
  STI T2
  AOD T2
  SOD T0
  NJN L2
L3 AOD T1
  LDI T1
  NJN L1
 MDIN     ENDM
 MJP      SPACE  4,10
***       MJP - CONDITIONAL NEGATIVE SHORT OR LONG JUMP.
*
*         GENERATES EITHER AN *MJN* OR THE EQUIVALENT LONG JUMP
*         SERIES, DEPENDING UPON THE VALUE OF THE ADDRESS FIELD,
*         AND UPON WHETHER THE ADDRESS HAS OR HAS NOT YET BEEN
*         DEFINED.
*
*         MJP    ADDR
*
*         ENTRY  ADDR = BRANCH ADDRESS.
*
*         NOTE   DISCRETION SHOULD BE EXERCISED IN THE USE OF
*                THIS MACRO AS IT WILL ALWAYS GENERATE A LONG
*                JUMP SEQUENCE WHEN BRANCHING FORWARD.


          PURGMAC  MJP
 MJP      MACRO  A
.J IF DEF,A
.J IFLE *-A,37B
  MJN A
.J ELSE
  PJN *+3
  LJM A
.J ENDIF
 MJP      ENDM
 NJP      SPACE  4,10
***       NJP - CONDITIONAL NONZERO SHORT OR LONG JUMP.
*
*         GENERATES EITHER AN *NJN* OR THE EQUIVALENT LONG JUMP
*         SERIES, DEPENDING UPON THE VALUE OF THE ADDRESS FIELD,
*         AND UPON WHETHER THE ADDRESS HAS OR HAS NOT YET BEEN
*         DEFINED.
*
*         NJP    ADDR
*
*         ENTRY  ADDR = BRANCH ADDRESS.
*
*         NOTE   DISCRETION SHOULD BE EXERCISED IN THE USE OF
*                THIS MACRO AS IT WILL ALWAYS GENERATE A LONG
*                JUMP SEQUENCE WHEN BRANCHING FORWARD.


          PURGMAC  NJP
 NJP      MACRO  A
.J IF DEF,A
.J IFLE *-A,37B
  NJN A
.J ELSE
  ZJN *+3
  LJM A
.J ENDIF
 NJP      ENDM
 OVERFLOW SPACE  4,20
***       OVERFLOW - TEST FOR PP MEMORY OVERFLOW.
*
*         THIS MACRO IS INTENDED TO TEST FOR PP MEMORY OVERFLOW WHEN
*         LOADING OVERLAYS FROM MASS STORAGE.  THIS MACRO SHOULD
*         BE PLACED AT THE END OF THE OVERLAY BEING TESTED.  IT REPORTS
*         AN OVERFLOW IF *+7 EXCEEDS *ADDR*.  SINCE PP-S ARE ASSEMBLED
*         ON THE C170 SIDE AND THEN MOVED TO THE C180 SIDE (60 BIT TO
*         64 BIT CONVERSION), THE +7 ACCOUNTS FOR THE WORST CASE FILL
*         THAT MAY BE REQUIRED TO MAKE A 64 BIT WORD.
*
*         OVERFLOW ADDR
*
*         ENTRY  ADDR = ADDRESS THAT IS NOT TO BE DESTROYED.  (I.E.
*                   LWA+1 OF AREA BEING LOADED INTO.)
*
*         NOTE.  THIS MACRO USES A *USE OVERFLOW* PSEUDO OP TO FORCE
*                THE LITERALS BLOCK TO BE DEFINED.  IF THE PROGRAM HAS
*                A USE BLOCK CALLED *OVERFLOW* THE TEST WILL BE
*                INCORRECT.


          PURGMAC  OVERFLOW

 OVERFLOW MACRO  ADDR
          MACREF OVERFLOW
          USE    OVERFLOW
          LIST   M
          ERRPL  *+7-ADDR    CODE OVERFLOWS INTO *ADDR*
          LIST   *
 OVERFLOW ENDM
 PJP      SPACE  4,10
***       PJP - CONDITIONAL POSITIVE SHORT OR LONG JUMP.
*
*         GENERATES EITHER A *PJN* OR THE EQUIVALENT LONG JUMP
*         SERIES, DEPENDING UPON THE VALUE OF THE ADDRESS FIELD,
*         AND UPON WHETHER THE ADDRESS HAS OR HAS NOT YET BEEN
*         DEFINED.
*
*         PJP    ADDR
*
*         ENTRY  ADDR = BRANCH ADDRESS.
*
*         NOTE   DISCRETION SHOULD BE EXERCISED IN THE USE OF
*                THIS MACRO AS IT WILL ALWAYS GENERATE A LONG
*                JUMP SEQUENCE WHEN BRANCHING FORWARD.


          PURGMAC  PJP
 PJP      MACRO  A
.J IF DEF,A
.J IFLE *-A,37B
  PJN A
.J ELSE
  MJN *+3
  LJM A
.J ENDIF
 PJP      ENDM
 SBK      SPACE  4,10
***       SBK - SUBTRACT CONSTANT FROM (A).
*
*         GENERATES EITHER AN *ADC*, *SBN*, OR *ADN* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE OPERAND.  IF THE VALUE
*         OF THE OPERAND REDUCES TO ZERO, NO INSTRUCTION WILL BE
*         GENERATED.
*
*         SBK    K
*
*         ENTRY  K = CONSTANT TO BE SUBTRACTED FROM (A).
*
*         NOTE   BECAUSE OF THE VARIABILITY OF THE CODE
*                GENERATED BY THIS MACRO, IT MUST NOT BE
*                CHANGED BY ON-LINE CODE MODIFICATION.


          PURGMAC  SBK
 SBK      MACRO  K
  LOCAL B
  IF DEF,K,3
.1 SET K
  ADK -.1
  SKIP 5
  RMT
B EQU K
  RMT
.1 MICRO 1,,*B*
  ADC -".1"
 SBK      ENDM
 SUBR     SPACE  4,10
***       SUBR - DEFINE SUBROUTINE ENTRY/EXIT LINE.
*
*
*NAME     SUBR
*         DECLARE *NAME* TO BE THE ENTRY POINT TO A PP SUBROUTINE.
*         THIS SUBROUTINE IS ENTERED VIA RETURN JUMP TO *NAME*.
*
*         THE FOLLOWING CODE IS GENERATED -
*NAMEX    LJM    *
*NAME     EQU    *-1


          PURGMAC  SUBR
          MACRO  SUBR,A
A_X LJP *
A EQU *-1
  ENDM
 UJP      SPACE  4,10
***       UJP - UNCONDITIONAL SHORT OR LONG JUMP.
*
*         GENERATES EITHER A *UJN* OR AN *LJM* INSTRUCTION,
*         DEPENDING UPON THE VALUE OF THE ADDRESS FIELD,
*         AND UPON WHETHER THE ADDRESS HAS OR HAS NOT YET
*         BEEN DEFINED.
*
*         UJP    ADDR
*
*         ENTRY  ADDR = BRANCH ADDRESS.
*
*         NOTE   DISCRETION SHOULD BE EXERCISED IN THE USE OF
*                THIS MACRO AS IT WILL ALWAYS GENERATE A LONG
*                JUMP SEQUENCE WHEN BRANCHING FORWARD.


          PURGMAC  UJP
 UJP      MACRO  A
.J IF DEF,A
.J IFLE *-A,37B
  UJN A
.J ELSE
  LJM A
.J ENDIF
 UJP      ENDM
 ZJP      SPACE  4,10
***       ZJP - CONDITIONAL ZERO SHORT OR LONG JUMP.
*
*         GENERATES EITHER A *ZJN* OR THE EQUIVALENT LONG JUMP
*         SERIES, DEPENDING UPON THE VALUE OF THE ADDRESS FIELD,
*         AND UPON WHETHER THE ADDRESS HAS OR HAS NOT YET BEEN
*         DEFINED.
*
*         ZJP    ADDR
*
*         ENTRY  ADDR = BRANCH ADDRESS.
*
*         NOTE   DISCRETION SHOULD BE EXERCISED IN THE USE OF
*                THIS MACRO AS IT WILL ALWAYS GENERATE A LONG
*                JUMP SEQUENCE WHEN BRANCHING FORWARD.


          PURGMAC  ZJP
 ZJP      MACRO  A
.J IF DEF,A
.J IFLE *-A,37B
  ZJN A
.J ELSE
  NJN *+3
  LJM A
.J ENDIF
 ZJP      ENDM
 .1       SPACE  4,10
**        .1 - GENERATE BIT CONSTANT.
*
*
*         .1     (P1,P2,...,PN)
*         ENTRY  (PN) = BIT CONSTANT TO SET.


          PURGMAC  .1
 .1       MACRO  P
.1 SET 0
  IRP P
.2 DECMIC P
.1 SET .1+1S".2"
  IRP
  ENDM
 BITCON   SPACE  4,10
***       BITCON - SET BIT CONSTANT.
*
*
*         BITCON (P1,P2,...,PN)
*         ENTRY  (PN) = BIT NUMBERS TO SET.


          PURGMAC  BITCON
 BITCON   MACRO  P
  NOREF   .1
.1 BITSET (P)
  CON .1
  ENDM
 INDEX    SPACE  4,10
***       INDEX - GENERATE INDEXED TABLE.
*
*
*NAME     INDEX  TYPE,ADDRESS
*         THIS MACRO IS INTENDED TO GENERATE TABLES WHICH ARE INDEXED
*         BY SYMBOLIC CONSTANTS SUCH AS FILE AND JOB ORIGIN CODES.
*         IT HAS 3 CALLING SEQUENCES.
*         IF *NAME* IS PRESENT, THE FWA OF THE TABLE IS SET TO *NAME*.
*
*         IF *ADDRESS* IS MISSING, THE TABLE IS TERMINATED WITH AN
*         *ORG* TO THE END OF THE TABLE.  THIS RESULTS IN ZERO ENTRIES
*         FOR UNDEFINED ENTRIES IN THE TABLE.
*
*         OTHERWISE, A TABLE ENTRY IS MADE AT *INDEX* + *TYPE* OF
*         *ADDRESS*.
*
*         EXAMPLE - TO GENERATE A TABLE FOR PROCESSING FILE TYPES.
*
*TFTP     INDEX              BEGIN TABLE
*
*         INDEX  PRFT,PRP    PROCESS PRINT FILE AT *PRP*
*         INDEX  LOFT,LOP    PROCESS LOCAL FILE AT *LOP*
*
*         INDEX  MXFT        TERMINATE TABLE AT *TFTP*+*MXFT*
*
*         THE CODE PROCESSING THIS TABLE NOTES THAT -
*         A FILE TYPE \ *MXFT* CANNOT BE PROCESSED,
*         A TABLE ENTRY = 0, CANNOT BE PROCESSED.
*
*         USES   SYMBOL NAME *INDEX*.
*         CALLS  NONE.


          PURGMAC  INDEX
          MACRO  INDEX,A,B,C
  IFC NE,$A$$
A BSS 0
.2 SET A
  ELSE 5
  ORG .2+B
  IFC NE,$C$$,2
  LOC B
  CON C
  BSS 0
  ENDM
 ASCII    SPACE  4,10
***       ASCII - DEFINE ASCII DATA.
*
*         ASCII  (ASCII STRING),SIZE


          PURGMAC  ASCII
 ASCII    MACRO  STRING,SIZE
    LOCAL  C,CH,CV,SZ,FW,LC,SH
    CODE N
 CH MICRO  1,,$STRING$
 SZ MICCNT CH
 SH SET 2Ra/0#100
 C  SET 1
 LC SET 0
 FW SET SIZE 8D
    DUP SZ
 CH MICRO  C,1,$STRING$
 CV SET 1R"CH"
 .2 IFEQ CV,SH
 LC SET 0#20
 .2 ELSE
    VFD FW/CV+LC
 LC SET 0
 .2 ENDIF
 C  SET C+1
    ENDD
    VFD 8/0
    BSS 0
    CODE *
          ENDM
 SSRE     SPACE  4,10
**        SSRE - FETCH SSR ENTRY.
*
*         SSRE NAME


          PURGMAC  SSRE
 SSRE     MACRO  NAME
  LOCAL C
  CODE N
  LDC =4R_NAME
  RJM FSE
  CODE *
          ENDM
 FINDCM   SPACE  4,10
***       FINDCM - FIND CIP MODULE.
*
*         FINDCM  (MODULE NAME)


          PURGMAC  FINDCM
 FINDCM   MACRO  NAME
  CODE D
  LDC  =C*NAME*
  RJM  FCM
  CODE *
          ENDM
 OVERLAY  SPACE  4,10
**        OVERLAY - DEFINE OVERLAY TITLE AND LOAD ADDRESS
*
*         OVERLAY  (DESCRIPTION),LOAD ADDRESS


          PURGMAC  OVERLAY
 ALPHABET MICRO  1,25,*ABCDEFGHIJKLMNOP*
 SCI      MICRO  1,4,*SCIO*
 DFT      MICRO  1,4,*DFTO*
 PRGMS    MICRO  1,,*"SCI""DFT"*
 OVERLAY  MACRO  DESC,LOADADD
          LOCAL  AD
          QUAL   *
          NOREF  OVLN
 OVLL     SET    OVLL+1
          IFEQ   OVLL,21,2
 OVLL     SET    1
 OVLU     SET    OVLU+1
 OVLN     SET    OVLU*20+OVLL-21
 PRGNAM   MICRO  PRGM*4-3,4,*"PRGMS"*
 CHL      MICRO  OVLL,1,*"ALPHABET"*
 CHU      MICRO  OVLU,1,*"ALPHABET"*
 NU       OCTMIC OVLN,2
 AD       OCTMIC LOADADD OVLA
          TITLE  "PRGNAM""CHU""CHL" ("NU") - DESC.
          IDENT  "PRGNAM""CHU""CHL","AD"  "NU"  DESC
          QUAL   "PRGNAM""CHU""CHL"
          ORG    "AD"
          ENDM
 OVLL     SET    1           INITIALIZE OVERLAY NUMBER
 OVLU     SET    1
 ROUTINE  SPACE  4,10
***       ROUTINE - SET UP CALL TO AN OVERLAY ROUTINE.
*
*         RNAME  ROUTINE.
*
*         MACRO WHICH ESTABLISHES AN ENTRY POINT FOR THE CALL MACRO.
*
*         RNAME  = NAMED ENTRY POINT.


          PURGMAC  ROUTINE
          MACRO  ROUTINE,RNAME
          QUAL
 RNAME    BSS    0
 RNAME_O  EQU    OVLN
          QUAL   *
 RNAME_X  EQU    LNOF
          ENDM
 CALL     SPACE  4,10
**        CALL - CALL A SUBROUTINE BY FIRST LOADING ITS OVERLAY.
*
*         GIVES CONTROL TO A ROUTINE IN THE SAME OR DIFFERENT
*         OVERLAY.  WHEN THAT ROUTINE COMPLETES CONTROL RETURNS
*         TO THE STATEMENTS FOLLOWING THIS MACRO.
*
*         PARAMETERS:
*         RTN    = NAME OF CORRESPONDING ROUTINE TO CALL.


          PURGMAC  CALL
 CALL     MACRO  NAME
          LDC    NAME+NAME_O*10000
          RJM    LNO
          ENDM
 EQUAL    SPACE  4,10
***       EQUAL - SET UP EQUATE FOR QUALIFIER
*
*         PNAME  EQUAL


          PURGMAC  EQUAL
          MACRO  EQUAL,PNAME
          QUAL   *
 PNAME    EQU    /"PRGNAM""CHU""CHL"/PNAME
          ENDM
          ENDX
