*FILE MEMBER=ADC_CONVERT LIBRARY=SNOMAN LANGUAGE=FORTRAN77 DATE=16:Oct:1997
 <<<      SUBROUTINE ADC_CONVERT(CON_TYPE,ADC_WORD,CON_WORD)
     
    *     SNOMAN: Convert ADC 2's complement into range 0-4095, or visa versa.
     
    *     Contact:  R.G. Van de Water (Penn)
     
    *     Parameters:-
    *     ==========
     
    *     Common Block Access:-
    *     ===================
    *     (ignoring internal and environmental access)
     
    *     None.
     
    *     Specification:-
    *     =============
     
    * o   For CON_TYPE= CON_FROM_ADC, convert ADC_WORD (2s complement) to
    *                                 CON_WORD (0-4095).
    * o   For CON_TYPE= CON_TO_ADC,   convert CON_WORD (0-4095) to ADC_WORD
    *                                 (2s complement).
     
    *     Program Notes:-
    *     =============
     
    * o   CERNLIB:  CALL SBYT(IA,IX,J,NBITS)  COPIES THE BYTE (OF LENGTH NBITS)
    *                                         AT 1 OF IA INTO THE BYTE AT J OF IX
     
    * o   CERNLIB:  IX= JBYT(IW,J,NBITS)  RETURNS IN IX THE RIGHT-JUSTIFIED
    *                                     BYTE (OF LENGTH NBITS) AT J IN IW
     
    *     Revision History:-
    *     ================
     
    *    3.01  R.G. Van de Water    First Version.
    *
     
          IMPLICIT NONE
     
          INCLUDE 'bank_zdab_pmt.inc'
          INCLUDE 'zunit.inc'
     
    *     Argument Declarations:-
    *     =====================
     
          INTEGER CON_TYPE
          INTEGER ADC_WORD    !ADC 2s COMPLEMENT WORD
          INTEGER CON_WORD    !CONVERTED WORD FOR ANALYSIS, RANGE 0-4095
     
     
    *     Local Variable Declarations:-
    *     ===========================
     
          INTEGER JBYT
          INTEGER SIGN1,SIGN2,VAL1,VAL2
          INTEGER TVAL1,TVAL2,TEMP
     
    *     ENDHEADER
     
          IF(CON_TYPE .EQ. CON_FROM_ADC)THEN
     
             TEMP= ADC_WORD
     
    C        UNPACK ADC WORDS
             SIGN1= JBYT(TEMP,12,1) !LOWER WORD SIGN BIT
             SIGN2= JBYT(TEMP,28,1) !UPPER WORD SIGN BIT
             VAL1=  JBYT(TEMP,1,11) !LOWER WORD VALUE
             VAL2=  JBYT(TEMP,17,11) !UPPER WORD VALUE
     
    C        FIND NEGATIVE IF SIGN BIT SET
             IF(SIGN1.EQ.1)VAL1= VAL1-2048
             IF(SIGN2.EQ.1)VAL2= VAL2-2048
     
    C        ADD OFFSET SO RANGE IS 0 TO 4095
             VAL1= VAL1+2048
             VAL2= VAL2+2048
     
    C        REPACK
             CON_WORD= ADC_WORD
             CALL SBYT(VAL1,CON_WORD,1,12)
             CALL SBYT(VAL2,CON_WORD,17,12)
     
          ELSE IF(CON_TYPE .EQ. CON_TO_ADC)THEN
     
             TEMP= CON_WORD
     
    C        UNPACK CON WORDS
             TVAL1=  JBYT(TEMP,1,12)  !LOWER WORD VALUE
             TVAL2=  JBYT(TEMP,17,12) !UPPER WORD VALUE
     
    C        SUBTRACT OFFSET SO RANGE IS -2048 TO 2047
             TVAL1= TVAL1-2048
             TVAL2= TVAL2-2048
     
    C        SET SIGN BIT
             SIGN1= 0
             SIGN2= 0
             IF(TVAL1.LT.0)SIGN1= 1
             IF(TVAL2.LT.0)SIGN2= 1
     
    C        PEEL OFF THE VALUE
             VAL1= JBYT(TVAL1,1,11)
             VAL2= JBYT(TVAL2,1,11)
     
    C        REPACK
             ADC_WORD= CON_WORD
             CALL SBYT(SIGN1,ADC_WORD,12,1)
             CALL SBYT(SIGN2,ADC_WORD,28,1)
             CALL SBYT(VAL1,ADC_WORD,1,11)
             CALL SBYT(VAL2,ADC_WORD,17,11)
     
          ELSE
     
             WRITE(IQLOG,*) ' ADC_CONVERT: NO CONVERSION TYPE SPECIFIED.'
     
          ENDIF
     
          RETURN
     
          END
     
    *ENDFILE MEMBER=ADC_CONVERT