*COMDECK  COMPMAC 
          CTEXT  COMPMAC - PP SYSTEM MACROS.
 COMPMAC  SPACE  4
***       COMPMAC - PP SYSTEM MACROS. 
*         G. R. MANSFIELD.  09/27/69. 
*         W. E. GOEBEL.      78/07/12.
 COMPMAC  SPACE  4
***              COMPMAC DEFINES SEVERAL MACROS WHICH ARE USED IN THE 
*         SYSTEM PP PACKAGES. 
 COMPMAC  SPACE  4
***       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
***       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 
  ENDM
 LDP      SPACE  4,10 
***       LDP - DEFINE ABSOLUTE LOAD MEMORY INSTRUCTION.
* 
* 
*         LDP    ADDRESS
*         DEFINE AN ABSOLUTE LONG JUMP INSTRUCTION FOR USE BY OTHER 
*         MACROS. 
*         ENTRY  (ADDRESS) = MEMORY ADDRESS.
  
  
 LDP      PPOP   5,5000B
 LJP      SPACE  4
***       LJP - DEFINE ABSOLUTE LONG JUMP INSTRUCTION.
* 
* 
*         LJP    ADDRESS
*         DEFINE AN ABSOLUTE LONG JUMP INSTRUCTION FOR USE BY OTHER 
*         MACROS. 
*         ENTRY  (ADDRESS) = JUMP ADDRESS.
  
  
 LJP      PPOP   5,0100B
 RJP      SPACE  4
***       RJP - DEFINE ABSOLUTE RETURN JUMP INSTRUCTION.
* 
* 
*         RJP    ADDRESS
*         DEFINE AN ABSOLUTE RETURN JUMP INSTRUCTION FOR USE BY OTHER 
*         MACROS. 
*         ENTRY  (ADDRESS) = JUMP ADDRESS.
  
  
 RJP      PPOP   5,0200B
 LDBC     SPACE  4
***       LDBC - LOAD (A) WITH BIT CONSTANT.
* 
* 
*         LDBC   (P1,P2,...,PN) 
*         LOAD (A) WITH A CONSTANT CONTAINING BITS PN.
  
  
          PURGMAC  LDBC 
  
 LDBC     MACRO  P
.1 BITSET (P) 
  LDC .1
  ENDM
 ADBC     SPACE  4
***       ADBC - ADD BIT CONSTANT TO (A). 
* 
* 
*         ADBC   (P1,P2,...,PN) 
*         ADD A CONSTANT CONTAINING BITS PN TO (A). 
  
  
          PURGMAC  ADBC 
  
 ADBC     MACRO  P
.1 BITSET (P) 
  ADC .1
  ENDM
 LPBC     SPACE  4
***       LPBC - ADD BIT CONSTANT TO (A). 
* 
* 
*         LPBC   (P1,P2,...,PN) 
*         LOGICAL PRODUCT OF (A) AND CONSTANT CONTAINING BITS PN. 
  
  
          PURGMAC  LPBC 
  
 LPBC     MACRO  P
.1 BITSET (P) 
  LPC .1
  ENDM
 LMBC     SPACE  4
***       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 BITSET (P) 
  LMC .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
 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 
.1 SET *
  INSTR 
  ERRNZ *-.1-1  TWO WORD INSTRUCTIONS NOT PROCESSED BY ISTORE 
  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
 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
 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
***       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
 BITCON   SPACE  4
***       BITCON - SET BIT CONSTANT.
* 
* 
*         BITCON (P1,P2,...,PN) 
*         ENTRY  (PN) = BIT NUMBERS TO SET. 
  
  
          PURGMAC  BITCON 
  
 BITCON   MACRO  P
.1 BITSET (P) 
  CON .1
  ENDM
 INDEX    SPACE  4
***       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
          ENDX
