*COMDECK  COMACPU - GENERAL CPU MACROS. 
          CTEXT  COMACPU - GENERAL CPU MACROS.
 COMACPU  SPACE  4,10 
***       COMACPU - GENERAL CPU MACROS. 
* 
*         G. R. MANSFIELD.   70/09/21.
*         R. H. GOODELL.     73/04/05.
*         T. R. RAMSEY.      76/05/05. MODIFIED FOR JETTEXT.
* 
*         COPYRIGHT CONTROL DATA CORPORATION. 1970-1976.
 COMACPU  SPACE  4,10 
***              THE GENERAL CPU MACROS PROVIDE THE USER WITH COMMONLY
*         USED MACRO AND OPDEF DEFINITIONS. 
* 
*         USERS SHOULD AVOID NAMES OF THE FORM *'?CPU#XX* WHERE *XX* IS 
*         ANY TWO CHARACTERS. NAMES OF THIS FORM ARE USED INTERNALLY. 
* 
*         ALL NUMERIC CONSTANTS GREATER THAN 7 IN THESE MACROS HAVE 
*         AN EXPLICIT RADIX, SO THE *BASE* MODE IS IMMATERIAL.
* 
*         THIS COMMON DECK CONTAINS NO UNLABELED *ELSE* OR *ENDIF*
*         STATEMENTS, SO IT CAN BE ASSEMBLED CONDITIONALLY. 
          TITLE  COMACPU - GENERAL CPU MACROS.
 BITMIC   SPACE  4,10 
***       BITMIC - MACRO TO GENERATE BIT MASKS FOR CHARACTER STRINGS. 
* 
* MIKE    BITMIC (BITS),OFFSET
* MIKE    LETMIC (LETS),OFFSET          (ALTERNATE FORM)
* 
*         ENTRY  *MIKE* = THE NAME OF THE MICRO TO BE GENERATED 
*                *BITS* = (BIT1,BIT2,...,BITN)  WHERE EACH BIT(I) IS A
*                         VALUE OF A BIT THAT IS TO BE SET
*                *LETS* = A CHARACTER STRING, (ABC...N) IMPLIES THAT
*                         THE BIT VALUES ARE (1RA,1RB,1RC,...,1RN)
*                *OFFSET* = OFFSET, IF OTHER THAN 59
* 
*         EXIT   GENERATES A MICRO WHICH IS A 20 OCTAL DIGIT INTEGER
*                (WITH *B* SUFFIX PRESENT) WHICH REPRESENTS THE SUM OF
*                2**(OFFSET-BIT(N))  TAKEN OVER ALL *N* PARAMETERS
* 
*         NOTE   SUPPOSE, FOR EXAMPLE, IT IS DESIRED TO TEST IF THE 
*                CHARACTER IN B7 IS A LEGAL COMPASS LIST OPTION 
*                CHARACTER. THE FOLLOWING WOULD ACCOMPLISH THIS TEST -
* 
*         LOP    LETMIC (ABCDEFGLMNRSTX)
*                SA1    ="LOP"
*                LX2    X1,B7 
*                MI     X2,O.K.        IF LEGAL LIST OPTION 
* 
*                ALTERNATIVELY, THE MICRO COULD HAVE BEEN DEFINED 
*                (EQUIVALENTLY, ALBEIT MORE CUMBERSOME) AS -
*         LOP    BITMIC (1RA,1RB,1RC,1RD,1RE,1RF,1RG,1RL,1RM,...,1RX) 
* 
*                *BITMIC* IS USUALLY MORE CONVENIENT WHEN THE BITS TO 
*                BE SET HAVE SYMBOLIC DEFINITIONS.
  
  
          PURGMAC BITMIC,LETMIC 
  
          MACRO  BITMIC,LOC,BITS,OFF
 '?CPU#LO OCTMIC ,10D 
 '?CPU#HI OCTMIC ,10D 
 '?CPU#OF SET    OFF 59D
          IRP    BITS 
 '?CPU#.2 IFLE   '?CPU#OF-BITS,29D
 '?CPU#DD DECMIC '?CPU#OF-BITS,2
 '?CPU#LO OCTMIC 1S"'?CPU#DD"+"'?CPU#LO"B,10D 
 '?CPU#.2 ELSE
 '?CPU#DD DECMIC '?CPU#OF-30D-BITS,2
 '?CPU#HI OCTMIC 1S"'?CPU#DD"+"'?CPU#HI"B,10D 
 '?CPU#.2 ENDIF 
          IRP 
 LOC      MICRO  1,, "'?CPU#HI""'?CPU#LO"B
 BITMIC   ENDM
  
  
          MACRO  LETMIC,LOC,BITS,OFF
 '?CPU#CH MICRO  1,,^_BITS_^
 '?CPU#LO OCTMIC ,10D 
 '?CPU#HI OCTMIC ,10D 
 '?CPU#OF SET    OFF 59D
 '?CPU#CX MICCNT '?CPU#CH 
 '?CPU#CN SET    0
 '?CPU#.1 DUP    '?CPU#CX 
 '?CPU#CN SET    '?CPU#CN+1 
 '?CPU#CH MICRO  '?CPU#CN,1,^_BITS_^
 '?CPU#.2 IFLE   '?CPU#OF-1R"'?CPU#CH",29D
 '?CPU#DD DECMIC '?CPU#OF-1R"'?CPU#CH",2
 '?CPU#LO OCTMIC 1S"'?CPU#DD"+"'?CPU#LO"B,10D 
 '?CPU#.2 ELSE
 '?CPU#DD DECMIC '?CPU#OF-30D-1R"'?CPU#CH",2
 '?CPU#HI OCTMIC 1S"'?CPU#DD"+"'?CPU#HI"B,10D 
 '?CPU#.2 ENDIF 
 '?CPU#.1 ENDD
 LOC      MICRO  1,, "'?CPU#HI""'?CPU#LO"B
 LETMIC   ENDM
 BXQ      SPACE  4,10 
***       BXQ - CONVENIENCE OPDEF TO ZERO AN *X* REGISTER.
* 
*         BXI    Q
* 
*         ENTRY  *Q* = 0  SET XI TO ALL ZEROS 
*                *Q* = -0  SET XI TO ALL ONES 
  
  
          PURGDEF BXQ 
  
 BXQ      OPDEF  I,V
  ERRNZ V   BXQ - Q MUST BE ZERO, IS (V)
  IFMI V,2
  BX.I -X.I+X.I 
  SKIP 1
  BX.I X.I-X.I
  ENDM
 IXX/X    SPACE  4,10 
***       IXI XJ/XK - INTEGER DIVISION. 
* 
*         IXI    XJ/XK
* 
*         USES   B7  XJ,XK
  
  
          PURGDEF IXX/X 
  
 IXX/X    OPDEF  I,J,K
  PX.J
  PX.K
  NX.J
  NX.K
  FX.I X.J/X.K
  UX.I,B7 
  AX.I -B7
  ENDM
 IXX/X,B  SPACE  4,10 
***       IXI XJ/XK,BN - INTEGER DIVISION.
* 
*         IXI    XJ/XK,BN 
* 
*         USES   BN  XJ,XK
  
  
          PURGDEF IXX/X,B 
  
 IXX/X,B  OPDEF  I,J,K,N
  PX.J
  PX.K
  NX.J
  NX.K
  FX.I X.J/X.K
  UX.I,B.N
  AX.I -B.N 
  ENDM
 MOVE     SPACE  4,10 
***       MOVE - MOVE DATA BLOCK. 
* 
*         MOVE   COUNT,FROM,TO
* 
*         ENTRY  *COUNT* = WORD COUNT OF BLOCK TO BE MOVED
*                *FROM* = ADDRESS OF FIRST WORD OF BLOCK
*                *TO* = ADDRESS OF FIRST WORD OF DESTINATION
* 
*         USES   X1,X2,X3 
* 
*         CALLS  MVE=  (COMCMVE)
  
  
          PURGMAC MOVE
  
 MOVE     MACRO  C,F,T
  =X1 C 
  =X2 F 
  =X3 T 
  RJ =XMVE= 
  ENDM
 SUBR     SPACE  4,10 
***       SUBR - SUBROUTINE ENTRY/EXIT DEFINITION.
* 
* TAG     SUBR               DEFINE *EXIT.* AND *TAG_X* 
* TAG     SUBR   0           SAME 
* TAG     SUBR   =           SAME, AND DECLARE *TAG* AS ENTRY POINT 
* TAG     SUBR   -           DEFINE *EXIT.* BUT NOT *TAG_X* 
* TAG     SUBR   LETTER      DEFINE *TAG_LETTER* BUT NOT *EXIT.*
* 
*         ENTRY  *TAG* = SUBROUTINE ENTRY NAME
* 
*         EXIT   CODE GENERATED - 
*                TAG    EQ    *+1S17    ALWAYS
*                       ENTRY TAG       IF = SPECIFIED
*                EXIT.  SET   *         IF BLANK, 0, =, OR - SPECIFIED
*                       NOREF EXIT.     IF BLANK, 0, =, OR - SPECIFIED
*                TAG_X  EQU   *         IF BLANK, 0, OR = SPECIFIED 
*                       NOREF TAG_X     IF BLANK, 0, OR = SPECIFIED 
*                TAG_LETTER  EQU  *     IF LETTER SPECIFIED 
  
  
          PURGMAC SUBR
  
          MACRO  SUBR,T,A 
T  EQ *+1S17D 
'?CPU#EN MICRO 1,,=T= 
  IFC NE, A  ,3 
  IFC LT, A 0 ,2
"'?CPU#EN"A EQU * 
  SKIP 7
  IFC NE, A - ,4
  IFC EQ, A = ,1
  ENTRY T 
"'?CPU#EN"X EQU * 
  NOREF "'?CPU#EN"X 
EXIT. SET * 
  NOREF EXIT. 
  ENDM
  
  
 COMACPU  ENDX
