*COMDECK NFETCHM
*#
*1DC  NFETCH MACRO
* 
*     PURPOSE 
*         FETCH A FIELD FROM CM INTO A REGISTER OR
*         FETCH THE VALUE OF A NAM PREDEFINED SYBMOL. 
*     CALLING SEQUENCE
*         [LABEL]   NFETCH       ARRAY,FIELD,REG
*     PARAMETERS
*         <ARRAY>-  AN ADDRESS LABEL OR,
*                   THE NAME OF A REGISTER, 
*                   ZERO (FETCH THE VALUE OF A NAM PREDEFINED SYMBOL) 
*         <FIELD>-  THE PREDEFINED SYMBOLIC FIELD NAME, 
*                   IF <ARRAY> IS ZERO, THE PREDEFINED SYBMOL NAME. 
*         <REG>-    REGISTER NAME, CAN BE A X OR B REGISTER.
*                   IF IT IS A B REGISTER, IT CANNOT BE ZERO AND
*                   THE SYMBOLIC FIELD SPECIFIED CANNOT BE LONGER 
*                   THAN 18 BITS IN LENGTH, OR IF <ARRAY> IS ZERO 
*                   THE SYMBOLIC NAME CANNOT BE GREATER THAN
*                   7777777B IN VALUE.
*     ACTIONS 
*         VALUE OF THE SPECIFIED FIELD IS EXTRACTED FROM THE
*         SPECIFIED WORD, OR IF <ARRAY> IS ZERO, VALUE OF THE 
*         SYMBOLIC NAME IS RETURNED.
*         IT IS ALWAYS RIGHT JUSTIFIED BEFORE RETURNED TO 
*         CALLER. 
*     REGISTERS 
*         A5, X5, X6. 
*#
* 
          PURGMAC NFETCH
* 
 NFETCH   MACRO  P1,P2,P3 
          IF     -REG,P1,5   NOT A REGISTER 
          IFNE   0,P1,4      NOT ZERO 
          IF     -LOC,P1,3   NOT ADDRESS LABEL
          IF     -ABS,P1,2
          IF     -REL,P1,1
          ERR    P1          ERROR IN 1ST PARAMETER 
  
          IFEQ   0,P1,3 
          IF     -DEF,'_P2,1
          SKIP   2
          SKIP   2
          IF     -DEF,P2_#,1
          ERR    P2          ERROR IN FEILD MNEMONICS 
  
          IF     REG,P3,6 
 P31#     MICRO  1,1, P3
 P32#     MICRO  2,, P3 
 #NF1#    SET    0
 NF1      ECHO   ,A1=(X,B)
          IFC    EQ,*"P31#"*A1*,13D 
          IFC    -LT,*"P32#"*0*,11D 
          IFC    -GT,*"P32#"*7*,10D 
          IFC    EQ,*B*"P31#"*,8D 
          IFC    -LT,*"P32#"*1*,8D
 NF1A     IFEQ   0,P1 
          IFGT   P2,777777B,1 
          SKIP   5
 NF1A     ELSE
          IFGT   P2_$,18D,1 
          SKIP   2
 NF1A     ENDIF 
 #NF1#    SET    1
          STOPDUP 
 NF1      ENDD
          IFEQ   #NF1#,0,1
          ERR    P3          ILLEGAL REGISTER NAME
  
 NFETCH1  IFEQ   P1,0 
          S_P3    P2
 NFETCH1  ELSE
          SA5    P1+P2_#
          MX6    -P2_$
          LX6    P2_?-P2_$+1
          BX5    -X6*X5 
          LX5    -P2_?+P2_$-1 
 NF2      IFC    EQ,*"P31#"*X*
          B_P3   X5 
 NF2      ELSE
          S_P3   X5 
 NF2      ENDIF 
 NFETCH1  ENDIF 
 NFETCH   ENDM
