         MACRO                                                          00050000
&NAME    NIL   &BYTE,&MASK,&REF=,&WREGS=(0,1,2)                         00100000
.*             AND IMMEDIATE LOCKED                                     00150000
.*             04/26/72, LEVEL=1                                        00200000
.*                                                                      00250000
.*       THIS MACRO IS USED IN A MULTIPROCESSING ENVIRONMENT TO         00300000
.*       PROVIDE A LOCK ON A WORD CONTAINING THE BYTE WHICH IS THE      00350000
.*       TARGET OF AN NI INSTRUCTION.                                   00400000
.*                                                                      00450000
.*       &BYTE      SYMBOL NAMING THE BYTE TO WHICH THE AND IMMEDIATE   00500000
.*                  FUNCTION IS TO BE APPLIED.                          00550000
.*       &MASK      A ONE-BYTE SELF-DEFINING TERM OR SYMBOL EQUATED     00600000
.*                  TO SUCH A TERM WHICH SPECIFIES A MASK AS IN         00650000
.*                  IMMEDIATE OPERAND OF NI INSTRUCTION.                00700000
.*       &REF       LABEL OF A FULL WORD IN STORAGE.  ADDRESS OF REF    00750000
.*                  LABEL MUST BE LESS THAN OR EQUAL TO THAT OF BYTE    00800000
.*                  (FIRST OPERAND).  LABEL MUST BE ADDRESSABLE WHEN    00850000
.*                  THE MACRO IS ISSUED, AND USING MUST HAVE BEEN       00900000
.*                  ISSUED ON A FULL-WORD LABEL.                        00950000
.* NOTE  &BYTE, &MASK AND &REF MUST BE SPECIFIED ON MACRO CALL.         01000000
.*       &WREGS     DECIMAL NUMBERS OR SYMBOLS EQUATED TO DECIMAL       01050000
.*                  NUMBERS OF THREE WORK REGISTERS TO BE USED BY THIS  01100000
.*                  MACRO.  REGISTERS 0, 1 AND 2 ARE DEFAULT VALUES.    01150000
.*                  THE SECOND WORK REGISTER MUST NOT BE 0 BECAUSE IT   01200000
.*                  IS USED IN AN EXECUTE INSTRUCTION.                  01250000
         LCLC  &XREGS(3)      FOR WREGS VALUES                          01300000
         AIF   ('&BYTE' NE '').NIL10    BRANCH IF BYTE SPECIFIED        01350000
         IHBERMAC 1006,BYTE   BYTE REQUIRED BUT NOT SPECIFIED           01400000
         MEXIT                                                          01450000
.NIL10   AIF   ('&MASK' NE '').NIL20    BRANCH IF MASK SPECIFIED        01500000
         IHBERMAC 1006,MASK   MASK REQUIRED BUT NOT SPECIFIED           01550000
         MEXIT                                                          01600000
.NIL20   AIF   ('&REF' NE '').NIL30     BRANCH IF REF SPECIFIED         01650000
         IHBERMAC 1006,REF    REF REQUIRED BUT NOT SPECIFIED            01700000
         MEXIT                                                          01750000
.NIL30   AIF   ('&WREGS(1)' NE '').NIL35 BRANCH IF FIRST REG SPECIFIED  01800000
&XREGS(1) SETC '0'            USE REGISTER 0 AS DEFAULT                 01850000
         AGO   .NIL40                                                   01900000
.NIL35   ANOP                                                           01950000
&XREGS(1) SETC '&WREGS(1)'                                              02000000
.NIL40   AIF   ('&WREGS(2)' NE '').NIL45 BRANCH IF SECOND REG SPECIFIED 02050000
&XREGS(2) SETC '1'            USE REGISTER 1 AS DEFAULT                 02100000
         AGO   .NIL50                                                   02150000
.NIL45   ANOP                                                           02200000
&XREGS(2) SETC '&WREGS(2)'                                              02250000
.NIL50   AIF   ('&WREGS(3)' NE '').NIL55 BRANCH IF THIRD REG SPECIFIED  02300000
&XREGS(3) SETC '2'            USE REGISTER 2 AS DEFAULT                 02350000
         AGO   .NIL60                                                   02400000
.NIL55   ANOP                                                           02450000
&XREGS(3) SETC '&WREGS(3)'                                              02500000
.NIL60   ANOP  ,              ALL OPERANDS SPECIFIED                    02550000
&NAME    B     *+10           BRANCH TO LA INSTRUCTION                  02600000
         DC    2AL1(&MASK)    HALF WORD OF MASK BYTES                   02650000
         ICM   &XREGS(3),0,*-2 INSERT MASK BYTE IN REGISTER             02700000
         LA    &XREGS(2),1(0,0)  LOAD ONE IN REGISTER FOR USE IN        02750002
*                             SETTING UP MASK REGISTER           YM1995 02800002
         LNR   &XREGS(3),&XREGS(2) SET REGISTER TO ALL ONES             02850000
         SLL   &XREGS(2),3-((&BYTE-&REF)-(((&BYTE-&REF)/4)*4))(0)       02900002
*                             SHIFT THE ONE TO PROPER POSITION FOR      02950000
*                             4-BIT MASK FOR ICM INSTRUCTION     YM1995 03000002
         EX    &XREGS(2),*-14 EXECUTE ICM INSTRUCTION TO PUT MASK BYTE  03050000
*                             IN PROPER POSITION IN REGISTER WITH       03100000
*                             ALL ONES                                  03150000
         L     &XREGS(1),&REF+(((&BYTE-&REF)/4)*4)                      03200000
*                             LOAD WORD CONTAINING BYTE TO BE SET       03250000
         LR    &XREGS(2),&XREGS(1) LOAD WORD CONTAINING BYTE TO BE SET  03300000
         NR    &XREGS(2),&XREGS(3) AND MASK INTO BYTE IN REGISTER       03350000
*                             USE COMPARE AND SWAP TO STORE UPDATED     03400000
*                             REGISTER IN STORAGE IF STORAGE WORD WAS   03450000
*                             NOT MODIFIED                              03500000
         CS    &XREGS(1),&XREGS(2),&REF+(((&BYTE-&REF)/4)*4)            03550000
         BNE   *-8            DO AGAIN FROM LR IF WORD WAS MODIFIED     03600000
         MEND                                                           03650000
