# include $int nims_expand_hrs(work,ibkg,idata)O/******************************************************************************O*_Title NIMS_EXPAND_HRS Expand NIMS HRS (background & data) into 16-bit words@*_Args Type Variable I/O Description */I unsigned char work[90]; /* !I Buffer of 72 10-bit data items*/I unsigned short int ibkg[4]; /* !O Buffer of 4 background items */I unsigned short int idata[68]; /* !O Buffer of 17*4 sensor items *//*J*_Descr Expand NIMS HRS background and sensor data from packed 10-bit formB* to 16-bit signed integers: 4 background items and 17*4=68 sensorD* items. Each contiguous 5-byte segment containing 4 10-bit numbers"* is expanded to 4 16-bit numbers.-*_Calls NIMS_EXPAND4 (not generally portable)*_Keys NIMS, STRINGF*_Hist 16feb90 R Mehlman UCLA/IGPP Original Version (VAX/VMS Fortran)G* 26may92 RMX Fixed incorrect WORK dimension: (18.5) should have been9* (5,18) but didn't actually matter. Made it WORK(90).I* 02nov92 RMX Renamed from HRS_EXPAND. NIMEXP changed to NIMS_EXPAND4.C* 28feb93 RMX Portable C version (calls C or Assembler version of3* NIMS_EXPAND4, which is not generally portable)*_EndP*******************************************************************************/ {A unsigned char *ip; /* Address of current 5-byte input set */F unsigned short int *jp; /* Address of current 4-word output set */. long k; /* Index of 4-word output set */= nims_expand4(work, ibkg); /* Expand 4 background items */< ip = work+5; /* Point to start of input sensor items */7 jp = idata; /* Point to start of output buffer */G for (k = 0; k < 17; k++) { /* Loop on 17 sets of 4 sensor items */- nims_expand4(ip, jp); /* Expand set */2 ip = ip + 5; /* Increment input pointer */3 jp = jp + 4; /* Increment output pointer */9 } /* End loop on 17 sets of 4 sensor items */ return (0); }P/*******************************************************************************P* In SunOS systems, the fortran compiler will insert an underscore character (_)J* at the end of all subroutine names. The code enclosed by the "ifdef sun"?* preprocesser statement will fortran routines to also call the* nims_expand routine.P*******************************************************************************/ #ifdef sunint nims_expand_hrs_(ibuf,obuf)I unsigned char work[90]; /* !I Buffer of 72 10-bit data items*/I unsigned short int ibkg[4]; /* !O Buffer of 4 background items */I unsigned short int idata[68]; /* !O Buffer of 17*4 sensor items */{$ nims_expand_hrs(work,ibkg,idata); return(0);}#endif# include int nims_expand4(ibuf,obuf)O/******************************************************************************E* The definition of these sub-scripts takes care of the byte swapping* required on VAX systems.O******************************************************************************/ #ifdef vax#define SCP1 0#define SCP2 1#else#define SCP1 1#define SCP2 0#endifP/*******************************************************************************E*_Title NIMS_EXPAND4 Expand NIMS data: 5-byte input to 4 INT*2 wordsA*_Args Type Variable I/O Description */I unsigned char ibuf[5]; /* !I Input buffer of 4 10-bit items */I unsigned short int obuf[4]; /* !O Output buffer of 4 16-bit items *//*G*_Desc Expand 5-byte data or background segment of NIMS HRS packet fromD* Galileo/NIMS EDR: 4 10-bit items into 4 16-bit (INTEGER*2) items.*_Lims VAX-specific version*_Keys NIMS, STRINGC*_Hist 17oct83 R. Mehlman UCLA/IGPP ORIGINAL VAX ASSEMBLER VERSION* Used by NIMS SE programs.9* Recoded for VAX from WDS PDP-11 XPND rtne in DESE.MAC8* 16feb90 RMX NIMS EDR processing version: documented$* 02nov92 RMX Renamed from NIMEXP.6* 26feb93 RMX VAX C version (not generally portable)@* 18mar93 EME Make routine compatible with SunOS systems*_EndO******************************************************************************/ {' unsigned short int mask10 = 0x03ff; union { unsigned char work1[4][2]; unsigned short int work2[4]; } work;" work.work1[0][SCP1] = ibuf[1];" work.work1[0][SCP2] = ibuf[0];, obuf[0] = (work.work2[0] >> 6) & mask10;" work.work1[1][SCP1] = ibuf[2];" work.work1[1][SCP2] = ibuf[1];, obuf[1] = (work.work2[1] >> 4) & mask10;" work.work1[2][SCP1] = ibuf[3];" work.work1[2][SCP2] = ibuf[2];, obuf[2] = (work.work2[2] >> 2) & mask10;" work.work1[3][SCP1] = ibuf[4];" work.work1[3][SCP2] = ibuf[3];% obuf[3] = work.work2[3] & mask10; return (0); }P/*******************************************************************************P* In SunOS systems, the fortran compiler will insert an underscore character (_)J* at the end of all subroutine names. The code enclosed by the "ifdef sun"?* preprocesser statement will fortran routines to also call the* nims_expand routine.P*******************************************************************************/ #ifdef sunint nims_expand4_(ibuf,obuf)K unsigned char ibuf[5]; /* !I Input buffer of 4 10-bit items */K unsigned short int obuf[4]; /* !O Output buffer of 4 16-bit items */{ nims_expand4(ibuf,obuf); return(0);}#endif