Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  <20022003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  Index 1994  1995  1996  1997  1998  1999  2000  2001  <20022003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
<== Date ==> <== Thread ==>

Subject: Re: genSub for EPICS 314?
From: Andy Foster <ajf@observatorysciences.co.uk>
To: Rozelle Wright <rwright@lanl.gov>
Cc: tech-talk@aps.anl.gov
Date: Fri, 19 Jul 2002 14:50:36 +0100 (BST)
Hi Rozelle,

Please find attached, a version for 3.14.
Please note this is untested as we are not using 3.14
in anger yet!

Cheers,

Andy


On Thu, 18 Jul 2002, Rozelle Wright wrote:

> Has anyone modified genSubRecord.c so that it will build for EPICS 314?
> If so, could you share it with me please.
> Thanks,
> Rozelle Wright
> rwright@losalamos.com
>
>
>

--------------------------------------------------------------------
Observatory Sciences Limited    Email: ajf@observatorysciences.co.uk
William James House             Tel: 44 - (0)1223 - 508259
Cowley Road                     Fax: 44 - (0)1223 - 508258
Cambridge, CB4 0WX, UK          http://www.observatorysciences.co.uk
/* genSubRecord.c - Record Support Routines for
 *                  General Subroutine Records
 *
 *      Author: Andy Foster
 *
 *	History
 *	-------
 *	Version 1.0  12/11/96  ajf  Created.
 *	Version 1.1  18/04/97  ajf  Fixed get_value, pvdes->pvalue, field.
 *      Version 1.2  18/06/97  ajf  Changed number of fields from 10 to 21.
 *      Version 1.3  05/04/00  cjm  Fixed bug where fldnames was defined as
 *                                  a static array. Cannot do this since there
 *                                  are many instances of the genSub record.
 *	Version 1.4  15/03/01  ajf  Changes for 3.13.
 *                                  Set precision of VERS field to 1.
 *                                  Initialise "string" constants to 0.
 *                                  Replace "symFindbyName" by "symFindbyNameEPICS"
 *                                  for architectures which do not prepend an
 *                                  "_" (i.e. PPC).
 *
 */

#define DEBUG   0
#define VERSION 1.4

#include	<stdlib.h>
#include	<stdio.h>
#include	<string.h>

#include	<alarm.h>
#include	<dbDefs.h>
#include        <registryFunction.h>
#include	<dbEvent.h>
#include	<dbAccess.h>
#include	<dbFldTypes.h>
#include	<errMdef.h>
#include	<recSup.h>
#include	<devSup.h>
#include 	<special.h>
#include        <recGbl.h>

#define GEN_SIZE_OFFSET
#include	<genSubRecord.h>
#undef  GEN_SIZE_OFFSET


/* Create RSET - Record Support Entry Table*/

static long init_record();
static long process();
static long get_value();
static long get_precision();
static long cvt_dbaddr();
static long get_array_info();
static long put_array_info();
static long special();
#define report             NULL
#define initialize         NULL
#define get_units          NULL
#define get_graphic_double NULL
#define get_control_double NULL
#define get_alarm_double   NULL
#define get_enum_str       NULL
#define get_enum_strs      NULL
#define put_enum_str       NULL

struct rset genSubRSET={
	RSETNUMBER,
	report,
	initialize,
	init_record,
	process,
	special,
	get_value,
	cvt_dbaddr,
	get_array_info,
	put_array_info,
	get_units,
	get_precision,
	get_enum_str,
	get_enum_strs,
	put_enum_str,
	get_graphic_double,
	get_control_double,
	get_alarm_double };

static void monitor( genSubRecord *, int );
static long do_sub( genSubRecord * );
static long findField( int, struct dbAddr *, long *, long );

#define ARG_MAX        21
#define MAX_ARRAY_SIZE 16383    /* 16kB Channel Access Limit for data communication */

typedef long (*SUBFUNCPTR)();

/* These are the names of the Input fields */
static char Ifldnames[ARG_MAX][FLDNAME_SZ+1] =
  { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
    "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U" };

/* These are the names of the Output fields */
static char Ofldnames[ARG_MAX][FLDNAME_SZ+1] =
  { "VALA", "VALB", "VALC", "VALD", "VALE", "VALF", "VALG", 
    "VALH", "VALI", "VALJ", "VALK", "VALL", "VALM", "VALN",
    "VALO", "VALP", "VALQ", "VALR", "VALS", "VALT", "VALU" };

/* Sizes of field types */
static int sizeofTypes[] = {0, 1, 1, 2, 2, 4, 4, 4, 8, 2};


static long init_record( genSubRecord *pgsub, int pass )
{
  SUBFUNCPTR     psubroutine;
  void           *sub_addr;
  long	         status;
  long           error;
  int            i;
  int            j;
  char           *ufunct;
  unsigned short *typptr;
  void           **valptr;
  void           **ovlptr;
  unsigned long  *nelptr;
  unsigned long  *totptr;
  unsigned long  num;
  struct link    *plinkin;
  struct link    *plinkout;
  char           fldnames[ARG_MAX][FLDNAME_SZ+1];

  status = 0;
  if( pass == 0 )
  {
    pgsub->vers = VERSION;
    for( j=0; j<2; j++ )
    {
      if( j == 0 )    /* Input fields */
      {
        ufunct = pgsub->ufa;
        typptr = &pgsub->fta;
        valptr = &pgsub->a;
        ovlptr = NULL;
        nelptr = &pgsub->noa;
        memcpy( fldnames, Ifldnames, ARG_MAX*(FLDNAME_SZ+1) );
      }
      else           /* Output fields */
      {
        ufunct = pgsub->ufva;
        typptr = &pgsub->ftva;
        valptr = &pgsub->vala;
        ovlptr = &pgsub->ovla;
        nelptr = &pgsub->nova;
        memcpy( fldnames, Ofldnames, ARG_MAX*(FLDNAME_SZ+1) );
      }
      totptr = &pgsub->tova;

      for( i=0; i<ARG_MAX; i++, ufunct+=40, typptr++, valptr++, nelptr++, totptr++ )
      {
        if( *nelptr <= 0 )
          *nelptr = 1;

        if( strlen(ufunct) != 0 ) 
        {
          /* convert the user function subroutine name  */
          sub_addr = (void *)registryFunctionFind(ufunct);
          if( sub_addr == 0 )
          {
            recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(init_record)");
            status = S_db_BadSub;
          }
          else
          {
            psubroutine = (SUBFUNCPTR)(sub_addr);
            *totptr     = psubroutine(pgsub);

            if( *typptr != DBF_CHAR )
              *typptr = DBF_CHAR;

            num = (*nelptr)*(*totptr);
            if( num > MAX_ARRAY_SIZE )
            {
              printf("Link %s - Array too large! %ld Bytes\n", fldnames[i], num);
              status = S_db_errArg;
            }
            else
            {
              *valptr   = (char *)calloc( *nelptr, *totptr );
              if( j == 1 )
                *ovlptr = (char *)calloc( *nelptr, *totptr );
              *nelptr = num;
              *totptr = num;
#if DEBUG
              printf("Link(%s): Address = 0x%x, Bytes = %d\n", fldnames[i], (unsigned int)(*valptr), *totptr );
#endif
            }
          }
        }
        else
        {
          if( *typptr == DBF_STRING )
          {
            num = (*nelptr)*MAX_STRING_SIZE;
            if( num > MAX_ARRAY_SIZE )
            {
              printf("Link %s - Array too large! %ld Bytes\n", fldnames[i], num);
              status = S_db_errArg;
            }
            else
            {
              *valptr   = (char *)calloc( *nelptr, MAX_STRING_SIZE );
              if( j == 1 )
                *ovlptr = (char *)calloc( *nelptr, MAX_STRING_SIZE );
              *totptr = num;
#if DEBUG
              printf("Link(%s): Address = 0x%x, Bytes = %d\n", fldnames[i], (unsigned int)(*valptr), *totptr);
#endif
            }
          }
          else
          {
            if( *typptr > DBF_ENUM )
              *typptr = 2;
            num = (*nelptr)*sizeofTypes[*typptr];
            if( num > MAX_ARRAY_SIZE )
            {
              printf("Link %s - Array too large! %ld Bytes\n", fldnames[i], num);
              status = S_db_errArg;
            }
            else
            {
              *valptr   = (char *)calloc( *nelptr, sizeofTypes[*typptr] );
              if( j == 1 )
                *ovlptr = (char *)calloc( *nelptr, sizeofTypes[*typptr] );
              *totptr = num;
#if DEBUG
              printf("Link(%s): Address = 0x%x, Bytes = %d\n", fldnames[i], (unsigned int)(*valptr), *totptr);
#endif
            }
          }
        }
        if( j == 1 )
          ovlptr++;
      }
      if( status )
        return(status);
    }
    return(status);
  }
  else if( pass == 1 )
  {
    /* Deal with the Subroutine Input Link */

    switch( pgsub->subl.type )
    {
      case (CONSTANT):
        if( pgsub->lflg == genSubLFLG_READ )
        {
          recGblInitConstantLink( &pgsub->subl, DBF_STRING, pgsub->snam );
          if( !strncmp(pgsub->snam, "0.0", 3) )
            strcpy(pgsub->snam, " ");
        }
        break;

      case (PV_LINK):
      case (DB_LINK):
      case (CA_LINK):
        break;

      default:
        recGblRecordError( S_db_badField, (void *)pgsub, 
                           "genSubRecord(init_record) Illegal SUBROUTINE LINK" );
        status = S_db_badField;
        break;
    }

    if( !status )
    {
      /* Initialise Input Links */

      plinkin = &pgsub->inpa;
      typptr  = &pgsub->fta;
      valptr  = &pgsub->a;
      nelptr  = &pgsub->noa;
      for( i=0; i<ARG_MAX; i++, plinkin++, typptr++, valptr++, nelptr++ )
      {
        switch( (*plinkin).type ) 
        {
          case (CONSTANT):
#if DEBUG
            printf("Input Link %s is a CONSTANT\n", Ifldnames[i] );
#endif
            if( *nelptr < 2 )
            {
              if( recGblInitConstantLink(plinkin, *typptr, *valptr) )
              {
                if( (*typptr == DBF_STRING) && (!strncmp((char *)(*valptr), "0.0", 3)) )
                  strcpy((char *)(*valptr), " ");
                pgsub->udf = FALSE;
              }
              else
                pgsub->udf = TRUE;
            }
            break;

          case (PV_LINK):
#if DEBUG
            printf("Input Link %s is a PV_LINK\n", Ifldnames[i] );
#endif
            break;

          case (CA_LINK):
#if DEBUG
            printf("Input Link %s is a CA_LINK\n", Ifldnames[i] );
#endif
            break;

          case (DB_LINK):
#if DEBUG
            printf("Input Link %s is a DB_LINK\n", Ifldnames[i] );
#endif
            break;

          default:
            recGblRecordError( S_db_badField, (void *)pgsub, 
                               "genSubRecord(init_record) Illegal INPUT LINK" );
            status = S_db_badField;
            break;
        }
      }

      if( status )
        return(status);

      /* Initialise Output Links */

      plinkout = &pgsub->outa;
      typptr   = &pgsub->ftva;
      valptr   = &pgsub->vala;
      for( i=0; i<ARG_MAX; i++, plinkout++, typptr++, valptr++ )
      {
        switch( (*plinkout).type ) 
        {
          case (CONSTANT):
#if DEBUG
            printf("Output Link %s is a CONSTANT\n", Ofldnames[i] );
#endif
            break;

          case (PV_LINK):
#if DEBUG
            printf("Output Link %s is a PV_LINK\n", Ofldnames[i] );
#endif
            break;

          case (CA_LINK):
#if DEBUG
            printf("Output Link %s is a CA_LINK\n", Ofldnames[i] );
#endif
            break;

          case (DB_LINK):
#if DEBUG
            printf("Output Link %s is a DB_LINK\n", Ofldnames[i] );
#endif
            break;

          default:
            recGblRecordError( S_db_badField, (void *)pgsub, 
                               "genSubRecord(init_record) Illegal OUTPUT LINK" );
            status = S_db_badField;
            break;
        }
      }
    
      if( !status )
      {
        if(strlen(pgsub->inam)!=0) 
        { 
          /* convert the initialization subroutine name  */

          sub_addr = (void *)registryFunctionFind(pgsub->inam);
          if( sub_addr == 0 )
          {
	    recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(init_record)");
	    status = S_db_BadSub;
          }
          else
          {
            psubroutine = (SUBFUNCPTR)(sub_addr);
            error       = psubroutine(pgsub);
          }
        }
      }

      if( !status )
      {
        if( pgsub->lflg == genSubLFLG_IGNORE )
        {
          if(strlen(pgsub->snam)!=0) 
          { 
            /* convert the process subroutine name  */

            sub_addr = (void *)registryFunctionFind(pgsub->snam);
            if( sub_addr == 0 )
            {
              recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(init_record)");
              status = S_db_BadSub;
            }
            else
              pgsub->sadr = (long)sub_addr;
          }
        }
      }
    }
  }
  return( status );
}


static long process( genSubRecord *pgsub )
{
  int            i;
  void           *sub_addr;
  long           status;
  struct link    *plinkin;
  struct link    *plinkout;
  unsigned short *typptr;
  unsigned long  *nelptr;
  long           nRequest;
  long           options;
  void           **valptr;

  pgsub->pact = TRUE;
  status      = 0;
  options     = 0;

  if( pgsub->lflg == genSubLFLG_READ )
  {
    /* Get the Subroutine Name from the Link and look it up */

    nRequest = 1;
    status   = dbGetLink( &(pgsub->subl), DBR_STRING, pgsub->snam, &options, &nRequest );
    if( !status )
    {
      if( pgsub->snam[0] != '\0' )
      {
        if( strcmp(pgsub->snam, pgsub->onam) )  
        {
          /* To save time, only look up the routine if it has a different name */

          strcpy(pgsub->onam, pgsub->snam);

          sub_addr = (void *)registryFunctionFind(pgsub->snam);
          if( sub_addr == 0 )
          {
            recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(process) registryFunctionFind failed");
            status = S_db_BadSub;
          }
          else
            pgsub->sadr = (long)sub_addr;
        }
      }
    }
  }

  /* Get the Values from the input links */

  if( !status )
  {
    plinkin  = &pgsub->inpa;
    valptr   = &pgsub->a;
    nelptr   = &pgsub->noa;
    typptr   = &pgsub->fta;
    for( i=0; i<ARG_MAX; i++, plinkin++, valptr++, nelptr++, typptr++ )
    {
      nRequest = *nelptr;
      status   = dbGetLink( plinkin, *typptr, *valptr, &options, &nRequest );
      if( status )
      {
        printf("Status %ld from dbGetLink (%s)\n", status, Ifldnames[i]);
        break;
      }
    }
  }

  /* Call the user routine */

  if( !status )
    pgsub->val = do_sub(pgsub);

  /* Put the values on the output links */

  if( !status )
  {
    plinkout = &pgsub->outa;
    valptr   = &pgsub->vala;
    nelptr   = &pgsub->nova;
    typptr   = &pgsub->ftva;
    for( i=0; i<ARG_MAX; i++, plinkout++, valptr++, nelptr++, typptr++ )
    {
      nRequest = *nelptr;
      status   = dbPutLink( plinkout, *typptr, *valptr, nRequest );
      status   = 0;

/*
      Do not check this because dbPutLink returns -1 if channel not connected!
      if( status )
      {
        printf("Status %d from recGblPutLinkValue (%s)\n", status, Ofldnames[i]);
        break;
      }
*/
    }
  }

  if( !status )
  {
    recGblGetTimeStamp(pgsub);
    monitor(pgsub, 1);
    recGblFwdLink(pgsub);
  } 

  pgsub->pact = FALSE;
  return(status);
}


static long get_precision( struct dbAddr *paddr, long *precision )
{
    genSubRecord *pgsub;
    int          fieldIndex;

    fieldIndex = dbGetFieldIndex(paddr);
    if( fieldIndex == genSubRecordVERS )
    {
      *precision = 1;
      return 0;
    }

    pgsub      = (genSubRecord *)paddr->precord;
    *precision = pgsub->prec;
    if( paddr->pfield == (void *)&pgsub->val ) 
      return(0);
    recGblGetPrec(paddr,precision);
    return(0);
}


static long get_value( genSubRecord *pgsub, struct valueDes *pvdes )
{
#if DEBUG
    printf("Calling get_value...\n");
#endif
    pvdes->no_elements = 1;
    pvdes->pvalue      = (void *)(&pgsub->val);
    pvdes->field_type  = DBF_LONG;
    return(0);
}


static void monitor( genSubRecord *pgsub, int reset )
{
  int            i;
  unsigned short monitor_mask;
  unsigned long  *totptr;
  void           **valptr;
  void           **ovlptr;

  if( reset )
    monitor_mask = recGblResetAlarms(pgsub);
  else
    monitor_mask = 0;

  monitor_mask |= DBE_VALUE | DBE_LOG;

  /* Post events for SADR (subroutine address) whenever this routine is called */

  if( monitor_mask )
  {
    if( pgsub->sadr != pgsub->osad )
    {
      db_post_events(pgsub, &pgsub->sadr, monitor_mask);
      pgsub->osad = pgsub->sadr;
    }
  }

  /* Post events for VAL and output fields when this routine called from process */
  /* Event posting on output arrays depends on the setting of pgsub->eflg        */

  if( reset )
  {
    if( monitor_mask )
    {
      if( pgsub->val != pgsub->oval )
      {
        db_post_events(pgsub, &pgsub->val, monitor_mask);
        pgsub->oval = pgsub->val;
      }
    }
    if( pgsub->eflg == genSubEFLG_NEVER )
      return;
    else if( pgsub->eflg == genSubEFLG_ON_CHANGE )
    {
      if(monitor_mask)
      {
        valptr = &pgsub->vala;
        ovlptr = &pgsub->ovla;
        totptr = &pgsub->tova;
        for( i=0; i<ARG_MAX; i++, valptr++, ovlptr++, totptr++ )
        {
          if( memcmp(*ovlptr, *valptr, *totptr) )
          {
#if DEBUG
            printf("Differences in field %s were found. Total Bytes = %d\n", Ofldnames[i], *totptr);
#endif
            memcpy( *ovlptr, *valptr, *totptr );
            db_post_events(pgsub, *valptr, monitor_mask);
          }
        }
      }
    }
    else if( pgsub->eflg == genSubEFLG_ALWAYS )
    {
      if(monitor_mask)
      {
        valptr = &pgsub->vala;
        for( i=0; i<ARG_MAX; i++, valptr++ )
          db_post_events(pgsub, *valptr, monitor_mask);
      }
    }
  }
  return;
}


static long do_sub( genSubRecord *pgsub )
{
  long       status;
  SUBFUNCPTR psubroutine;

  /* If there is a routine, call it */

  if( pgsub->snam[0] != '\0' )
  {
    psubroutine = (SUBFUNCPTR)((void *)pgsub->sadr);
    if( psubroutine == NULL)
    {
      recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(process) NO SUBROUTINE");
      status = S_db_BadSub;
    }
    else
    {
      status = psubroutine(pgsub);
      if( status < 0 )
        recGblSetSevr(pgsub, SOFT_ALARM, pgsub->brsv);
      else
        pgsub->udf = FALSE;
    }
  }
  else
    status = 0;

  return( status );
}


static long cvt_dbaddr( struct dbAddr *paddr )
{
  int  error;
  int  flag;
  long no_elements;
  long nNew;

#if DEBUG
  printf("Calling cvt_dbaddr...\n");
#endif

  flag  = 1;
  nNew  = 0;
  error = findField( flag, paddr, &no_elements, nNew );
  if( error )
    printf("cvt_dbaddr: Could not find field\n");
  return(0);
}


static long get_array_info( struct dbAddr *paddr, long *no_elements, long *offset )
{
  int  error;
  int  flag;
  long nNew;

#if DEBUG
  printf("Calling get_array_info...\n");
#endif
  *offset = 0;
  nNew    = 0;
  flag    = 2;
  error   = findField( flag, paddr, no_elements, nNew );
  if( error )
    printf("get_array_info: Could not find field\n");
  return(0);
}


static long put_array_info( struct dbAddr *paddr, long nNew )
{
  int  error;
  int  flag;
  long no_elements;

#if DEBUG
  printf("Calling put_array_info...\n");
#endif
  flag  = 3;
  error = findField( flag, paddr, &no_elements, nNew );
  if( error )
    printf("put_array_info: Could not find field\n");
  return(0);
}


static long special( struct dbAddr *paddr, int after )
{
  genSubRecord *pgsub;
  void         *sub_addr;

  pgsub = (genSubRecord *)paddr->precord;
  if( after )
  {
    if( pgsub->lflg == genSubLFLG_IGNORE )
    {
      if( pgsub->snam[0] != '\0' )
      {
        sub_addr = (void *)registryFunctionFind(pgsub->snam);
        if( sub_addr == 0 )
        {
          recGblRecordError(S_db_BadSub,(void *)pgsub,"genSubRecord(special) registryFunctionFind failed");
          return(S_db_BadSub);
        }
        else
        {
          pgsub->sadr = (long)sub_addr;
          monitor(pgsub, 0);
        }
      }
    }
  }
  return(0);
}


static long findField( int flag, struct dbAddr *paddr, long *no_elements, long nNew )
{
  long         error;
  int          fieldIndex;
  genSubRecord *pgsub;

  pgsub      = (genSubRecord *)paddr->precord;
  error      = 0;
  fieldIndex = dbGetFieldIndex(paddr);
  switch( fieldIndex )
  {
    case genSubRecordA:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->a;
        paddr->no_elements = pgsub->noa;
        paddr->field_type  = pgsub->fta;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noa;
      else if( flag == 3 )
        pgsub->noa = nNew;
      break;

    case genSubRecordB:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->b;
        paddr->no_elements = pgsub->nob;
        paddr->field_type  = pgsub->ftb;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nob;
      else if( flag == 3 )
        pgsub->nob = nNew;
      break;

    case genSubRecordC:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->c;
        paddr->no_elements = pgsub->noc;
        paddr->field_type  = pgsub->ftc;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noc;
      else if( flag == 3 )
        pgsub->noc = nNew;
      break;

    case genSubRecordD:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->d;
        paddr->no_elements = pgsub->nod;
        paddr->field_type  = pgsub->ftd;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nod;
      else if( flag == 3 )
        pgsub->nod = nNew;
      break;

    case genSubRecordE:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->e;
        paddr->no_elements = pgsub->noe;
        paddr->field_type  = pgsub->fte;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noe;
      else if( flag == 3 )
        pgsub->noe = nNew;
      break;

    case genSubRecordF:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->f;
        paddr->no_elements = pgsub->nof;
        paddr->field_type  = pgsub->ftf;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nof;
      else if( flag == 3 )
        pgsub->nof = nNew;
      break;

    case genSubRecordG:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->g;
        paddr->no_elements = pgsub->nog;
        paddr->field_type  = pgsub->ftg;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nog;
      else if( flag == 3 )
        pgsub->nog = nNew;
      break;

    case genSubRecordH:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->h;
        paddr->no_elements = pgsub->noh;
        paddr->field_type  = pgsub->fth;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noh;
      else if( flag == 3 )
        pgsub->noh = nNew;
      break;

    case genSubRecordI:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->i;
        paddr->no_elements = pgsub->noi;
        paddr->field_type  = pgsub->fti;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noi;
      else if( flag == 3 )
        pgsub->noi = nNew;
      break;

    case genSubRecordJ:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->j;
        paddr->no_elements = pgsub->noj;
        paddr->field_type  = pgsub->ftj;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noj;
      else if( flag == 3 )
        pgsub->noj = nNew;
      break;

    case genSubRecordK:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->k;
        paddr->no_elements = pgsub->nok;
        paddr->field_type  = pgsub->ftk;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nok;
      else if( flag == 3 )
        pgsub->nok = nNew;
      break;

    case genSubRecordL:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->l;
        paddr->no_elements = pgsub->nol;
        paddr->field_type  = pgsub->ftl;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nol;
      else if( flag == 3 )
        pgsub->nol = nNew;
      break;

    case genSubRecordM:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->m;
        paddr->no_elements = pgsub->nom;
        paddr->field_type  = pgsub->ftm;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nom;
      else if( flag == 3 )
        pgsub->nom = nNew;
      break;

    case genSubRecordN:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->n;
        paddr->no_elements = pgsub->non;
        paddr->field_type  = pgsub->ftn;
      }
      else if( flag == 2 )
        *no_elements = pgsub->non;
      else if( flag == 3 )
        pgsub->non = nNew;
      break;

    case genSubRecordO:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->o;
        paddr->no_elements = pgsub->noo;
        paddr->field_type  = pgsub->fto;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noo;
      else if( flag == 3 )
        pgsub->noo = nNew;
      break;

    case genSubRecordP:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->p;
        paddr->no_elements = pgsub->nop;
        paddr->field_type  = pgsub->ftp;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nop;
      else if( flag == 3 )
        pgsub->nop = nNew;
      break;

    case genSubRecordQ:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->q;
        paddr->no_elements = pgsub->noq;
        paddr->field_type  = pgsub->ftq;
      }
      else if( flag == 2 )
        *no_elements = pgsub->noq;
      else if( flag == 3 )
        pgsub->noq = nNew;
      break;

    case genSubRecordR:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->r;
        paddr->no_elements = pgsub->nor;
        paddr->field_type  = pgsub->ftr;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nor;
      else if( flag == 3 )
        pgsub->nor = nNew;
      break;

    case genSubRecordS:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->s;
        paddr->no_elements = pgsub->nos;
        paddr->field_type  = pgsub->fts;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nos;
      else if( flag == 3 )
        pgsub->nos = nNew;
      break;

    case genSubRecordT:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->t;
        paddr->no_elements = pgsub->not;
        paddr->field_type  = pgsub->ftt;
      }
      else if( flag == 2 )
        *no_elements = pgsub->not;
      else if( flag == 3 )
        pgsub->not = nNew;
      break;

    case genSubRecordU:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->u;
        paddr->no_elements = pgsub->nou;
        paddr->field_type  = pgsub->ftu;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nou;
      else if( flag == 3 )
        pgsub->nou = nNew;
      break;

    case genSubRecordVALA:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vala;
        paddr->no_elements = pgsub->nova;
        paddr->field_type  = pgsub->ftva;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nova;
      else if( flag == 3 )
        pgsub->nova = nNew;
      break;

    case genSubRecordVALB:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valb;
        paddr->no_elements = pgsub->novb;
        paddr->field_type  = pgsub->ftvb;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novb;
      else if( flag == 3 )
        pgsub->novb = nNew;
      break;

    case genSubRecordVALC:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valc;
        paddr->no_elements = pgsub->novc;
        paddr->field_type  = pgsub->ftvc;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novc;
      else if( flag == 3 )
        pgsub->novc = nNew;
      break;

    case genSubRecordVALD:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vald;
        paddr->no_elements = pgsub->novd;
        paddr->field_type  = pgsub->ftvd;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novd;
      else if( flag == 3 )
        pgsub->novd = nNew;
      break;

    case genSubRecordVALE:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vale;
        paddr->no_elements = pgsub->nove;
        paddr->field_type  = pgsub->ftve;
      }
      else if( flag == 2 )
        *no_elements = pgsub->nove;
      else if( flag == 3 )
        pgsub->nove = nNew;
      break;

    case genSubRecordVALF:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valf;
        paddr->no_elements = pgsub->novf;
        paddr->field_type  = pgsub->ftvf;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novf;
      else if( flag == 3 )
        pgsub->novf = nNew;
      break;

    case genSubRecordVALG:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valg;
        paddr->no_elements = pgsub->novg;
        paddr->field_type  = pgsub->ftvg;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novg;
      else if( flag == 3 )
        pgsub->novg = nNew;
      break;

    case genSubRecordVALH:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valh;
        paddr->no_elements = pgsub->novh;
        paddr->field_type  = pgsub->ftvh;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novh;
      else if( flag == 3 )
        pgsub->novh = nNew;
      break;

    case genSubRecordVALI:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vali;
        paddr->no_elements = pgsub->novi;
        paddr->field_type  = pgsub->ftvi;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novi;
      else if( flag == 3 )
        pgsub->novi = nNew;
      break;

    case genSubRecordVALJ:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valj;
        paddr->no_elements = pgsub->novj;
        paddr->field_type  = pgsub->ftvj;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novj;
      else if( flag == 3 )
        pgsub->novj = nNew;
      break;

    case genSubRecordVALK:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valk;
        paddr->no_elements = pgsub->novk;
        paddr->field_type  = pgsub->ftvk;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novk;
      else if( flag == 3 )
        pgsub->novk = nNew;
      break;

    case genSubRecordVALL:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vall;
        paddr->no_elements = pgsub->novl;
        paddr->field_type  = pgsub->ftvl;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novl;
      else if( flag == 3 )
        pgsub->novl = nNew;
      break;

    case genSubRecordVALM:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valm;
        paddr->no_elements = pgsub->novm;
        paddr->field_type  = pgsub->ftvm;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novm;
      else if( flag == 3 )
        pgsub->novm = nNew;
      break;

    case genSubRecordVALN:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valn;
        paddr->no_elements = pgsub->novn;
        paddr->field_type  = pgsub->ftvn;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novn;
      else if( flag == 3 )
        pgsub->novn = nNew;
      break;

    case genSubRecordVALO:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valo;
        paddr->no_elements = pgsub->novo;
        paddr->field_type  = pgsub->ftvo;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novo;
      else if( flag == 3 )
        pgsub->novo = nNew;
      break;

    case genSubRecordVALP:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valp;
        paddr->no_elements = pgsub->novp;
        paddr->field_type  = pgsub->ftvp;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novp;
      else if( flag == 3 )
        pgsub->novp = nNew;
      break;

    case genSubRecordVALQ:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valq;
        paddr->no_elements = pgsub->novq;
        paddr->field_type  = pgsub->ftvq;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novq;
      else if( flag == 3 )
        pgsub->novq = nNew;
      break;

    case genSubRecordVALR:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valr;
        paddr->no_elements = pgsub->novr;
        paddr->field_type  = pgsub->ftvr;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novr;
      else if( flag == 3 )
        pgsub->novr = nNew;
      break;

    case genSubRecordVALS:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->vals;
        paddr->no_elements = pgsub->novs;
        paddr->field_type  = pgsub->ftvs;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novs;
      else if( flag == 3 )
        pgsub->novs = nNew;
      break;

    case genSubRecordVALT:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valt;
        paddr->no_elements = pgsub->novt;
        paddr->field_type  = pgsub->ftvt;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novt;
      else if( flag == 3 )
        pgsub->novt = nNew;
      break;

    case genSubRecordVALU:
      if( flag == 1 )
      {
        paddr->pfield      = pgsub->valu;
        paddr->no_elements = pgsub->novu;
        paddr->field_type  = pgsub->ftvu;
      }
      else if( flag == 2 )
        *no_elements = pgsub->novu;
      else if( flag == 3 )
        pgsub->novu = nNew;
      break;

    default:
      error = 1;
      break;
  }

  if( !error && flag == 1 )
  {
    paddr->dbr_field_type = paddr->field_type;
    if( paddr->field_type == DBF_STRING )
      paddr->field_size = MAX_STRING_SIZE;
    else
      paddr->field_size = sizeofTypes[paddr->field_type];
  }

  return(error);
}
include "menuGenSub.dbd"
recordtype(genSub) {
	include "dbCommon.dbd" 
        field(VERS,DBF_DOUBLE) {
                prompt("Version Number")
                promptgroup(GUI_DISPLAY)
                special(SPC_NOMOD)
                interest(1)
        }
	field(VAL,DBF_LONG) {
		prompt("Subr. return value")
		asl(ASL0)
	}
	field(OVAL,DBF_LONG) {
		prompt("Old return value")
		special(SPC_NOMOD)
		interest(1)
	}
	field(SADR,DBF_LONG) {
		prompt("Subroutine Address")
		special(SPC_NOMOD)
		interest(1)
	}
	field(OSAD,DBF_LONG) {
		prompt("Old Subr. Address")
		special(SPC_NOMOD)
		interest(1)
	}
	field(LFLG,DBF_MENU) {
		prompt("Link Flag")
		promptgroup(GUI_OUTPUT)
		interest(1)
		menu(genSubLFLG)
	}
	field(EFLG,DBF_MENU) {
		prompt("Event Flag")
		promptgroup(GUI_OUTPUT)
		interest(1)
		menu(genSubEFLG)
	}
	field(SUBL,DBF_INLINK) {
		prompt("Subroutine Input Link")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INAM,DBF_STRING) {
		prompt("Init Routine Name")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(SNAM,DBF_STRING) {
		prompt("Process Subr. Name")
		promptgroup(GUI_SUB)
		special(SPC_MOD)
		interest(1)
		size(40)
	}
	field(ONAM,DBF_STRING) {
		prompt("Old Subroutine Name")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(STYP,DBF_SHORT) {
		prompt("Subr symbol type")
		special(SPC_NOMOD)
		interest(3)
	}
	field(BRSV,DBF_MENU) {
		prompt("Bad Return Severity")
		promptgroup(GUI_SUB)
		pp(TRUE)
		interest(1)
		menu(menuAlarmSevr)
	}
	field(PREC,DBF_SHORT) {
		prompt("Display Precision")
		promptgroup(GUI_DISPLAY)
		interest(1)
	}
	field(INPA,DBF_INLINK) {
		prompt("Input Link A")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPB,DBF_INLINK) {
		prompt("Input Link B")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPC,DBF_INLINK) {
		prompt("Input Link C")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPD,DBF_INLINK) {
		prompt("Input Link D")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPE,DBF_INLINK) {
		prompt("Input Link E")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPF,DBF_INLINK) {
		prompt("Input Link F")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPG,DBF_INLINK) {
		prompt("Input Link G")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPH,DBF_INLINK) {
		prompt("Input Link H")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPI,DBF_INLINK) {
		prompt("Input Link I")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPJ,DBF_INLINK) {
		prompt("Input Link J")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPK,DBF_INLINK) {
		prompt("Input Link K")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPL,DBF_INLINK) {
		prompt("Input Link L")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPM,DBF_INLINK) {
		prompt("Input Link M")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPN,DBF_INLINK) {
		prompt("Input Link N")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPO,DBF_INLINK) {
		prompt("Input Link O")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPP,DBF_INLINK) {
		prompt("Input Link P")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPQ,DBF_INLINK) {
		prompt("Input Link Q")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPR,DBF_INLINK) {
		prompt("Input Link R")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPS,DBF_INLINK) {
		prompt("Input Link S")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPT,DBF_INLINK) {
		prompt("Input Link T")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(INPU,DBF_INLINK) {
		prompt("Input Link U")
		promptgroup(GUI_INPUTS)
		special(SPC_NOMOD)
		interest(1)
	}
	field(UFA,DBF_STRING) {
		prompt("Input Structure A")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFB,DBF_STRING) {
		prompt("Input Structure B")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFC,DBF_STRING) {
		prompt("Input Structure C")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFD,DBF_STRING) {
		prompt("Input Structure D")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFE,DBF_STRING) {
		prompt("Input Structure E")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFF,DBF_STRING) {
		prompt("Input Structure F")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFG,DBF_STRING) {
		prompt("Input Structure G")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFH,DBF_STRING) {
		prompt("Input Structure H")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFI,DBF_STRING) {
		prompt("Input Structure I")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFJ,DBF_STRING) {
		prompt("Input Structure J")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFK,DBF_STRING) {
		prompt("Input Structure K")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFL,DBF_STRING) {
		prompt("Input Structure L")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFM,DBF_STRING) {
		prompt("Input Structure M")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFN,DBF_STRING) {
		prompt("Input Structure N")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFO,DBF_STRING) {
		prompt("Input Structure O")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFP,DBF_STRING) {
		prompt("Input Structure P")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFQ,DBF_STRING) {
		prompt("Input Structure Q")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFR,DBF_STRING) {
		prompt("Input Structure R")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFS,DBF_STRING) {
		prompt("Input Structure S")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFT,DBF_STRING) {
		prompt("Input Structure T")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFU,DBF_STRING) {
		prompt("Input Structure U")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(A,DBF_NOACCESS) {
		prompt("Value of Input A")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *a")
	}
	field(B,DBF_NOACCESS) {
		prompt("Value of Input B")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *b")
	}
	field(C,DBF_NOACCESS) {
		prompt("Value of Input C")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *c")
	}
	field(D,DBF_NOACCESS) {
		prompt("Value of Input D")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *d")
	}
	field(E,DBF_NOACCESS) {
		prompt("Value of Input E")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *e")
	}
	field(F,DBF_NOACCESS) {
		prompt("Value of Input F")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *f")
	}
	field(G,DBF_NOACCESS) {
		prompt("Value of Input G")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *g")
	}
	field(H,DBF_NOACCESS) {
		prompt("Value of Input H")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *h")
	}
	field(I,DBF_NOACCESS) {
		prompt("Value of Input I")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *i")
	}
	field(J,DBF_NOACCESS) {
		prompt("Value of Input J")
		asl(ASL0)
		special(SPC_DBADDR)
		pp(TRUE)
		interest(1)
		size(4)
		extra("void *j")
	}
	field(K,DBF_NOACCESS) {
		prompt("Value of Input K")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *k")
	}
	field(L,DBF_NOACCESS) {
		prompt("Value of Input L")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *l")
	}
	field(M,DBF_NOACCESS) {
		prompt("Value of Input M")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *m")
	}
	field(N,DBF_NOACCESS) {
		prompt("Value of Input N")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *n")
	}
	field(O,DBF_NOACCESS) {
		prompt("Value of Input O")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *o")
	}
	field(P,DBF_NOACCESS) {
		prompt("Value of Input P")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *p")
	}
	field(Q,DBF_NOACCESS) {
		prompt("Value of Input Q")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *q")
	}
	field(R,DBF_NOACCESS) {
		prompt("Value of Input R")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *r")
	}
	field(S,DBF_NOACCESS) {
		prompt("Value of Input S")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *s")
	}
	field(T,DBF_NOACCESS) {
		prompt("Value of Input T")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *t")
	}
	field(U,DBF_NOACCESS) {
		prompt("Value of Input U")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *u")
	}
	field(FTA,DBF_MENU) {
		prompt("Type of A")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTB,DBF_MENU) {
		prompt("Type of B")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTC,DBF_MENU) {
		prompt("Type of C")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTD,DBF_MENU) {
		prompt("Type of D")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTE,DBF_MENU) {
		prompt("Type of E")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTF,DBF_MENU) {
		prompt("Type of F")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTG,DBF_MENU) {
		prompt("Type of G")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTH,DBF_MENU) {
		prompt("Type of H")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTI,DBF_MENU) {
		prompt("Type of I")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTJ,DBF_MENU) {
		prompt("Type of J")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTK,DBF_MENU) {
		prompt("Type of K")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTL,DBF_MENU) {
		prompt("Type of L")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTM,DBF_MENU) {
		prompt("Type of M")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTN,DBF_MENU) {
		prompt("Type of N")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTO,DBF_MENU) {
		prompt("Type of O")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTP,DBF_MENU) {
		prompt("Type of P")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTQ,DBF_MENU) {
		prompt("Type of Q")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTR,DBF_MENU) {
		prompt("Type of R")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTS,DBF_MENU) {
		prompt("Type of S")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTT,DBF_MENU) {
		prompt("Type of T")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTU,DBF_MENU) {
		prompt("Type of U")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(NOA,DBF_ULONG) {
		prompt("No. in A")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOB,DBF_ULONG) {
		prompt("No. in B")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOC,DBF_ULONG) {
		prompt("No. in C")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOD,DBF_ULONG) {
		prompt("No. in D")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOE,DBF_ULONG) {
		prompt("No. in E")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOF,DBF_ULONG) {
		prompt("No. in F")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOG,DBF_ULONG) {
		prompt("No. in G")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOH,DBF_ULONG) {
		prompt("No. in H")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOI,DBF_ULONG) {
		prompt("No. in I")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOJ,DBF_ULONG) {
		prompt("No. in J")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOK,DBF_ULONG) {
		prompt("No. in K")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOL,DBF_ULONG) {
		prompt("No. in L")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOM,DBF_ULONG) {
		prompt("No. in M")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NON,DBF_ULONG) {
		prompt("No. in N")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOO,DBF_ULONG) {
		prompt("No. in O")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOP,DBF_ULONG) {
		prompt("No. in P")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOQ,DBF_ULONG) {
		prompt("No. in Q")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOR,DBF_ULONG) {
		prompt("No. in R")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOS,DBF_ULONG) {
		prompt("No. in S")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOT,DBF_ULONG) {
		prompt("No. in T")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOU,DBF_ULONG) {
		prompt("No. in U")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(OUTA,DBF_OUTLINK) {
		prompt("Output Link A")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTB,DBF_OUTLINK) {
		prompt("Output Link B")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTC,DBF_OUTLINK) {
		prompt("Output Link C")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTD,DBF_OUTLINK) {
		prompt("Output Link D")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTE,DBF_OUTLINK) {
		prompt("Output Link E")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTF,DBF_OUTLINK) {
		prompt("Output Link F")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTG,DBF_OUTLINK) {
		prompt("Output Link G")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTH,DBF_OUTLINK) {
		prompt("Output Link H")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTI,DBF_OUTLINK) {
		prompt("Output Link I")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTJ,DBF_OUTLINK) {
		prompt("Output Link J")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTK,DBF_OUTLINK) {
		prompt("Output Link K")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTL,DBF_OUTLINK) {
		prompt("Output Link L")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTM,DBF_OUTLINK) {
		prompt("Output Link M")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTN,DBF_OUTLINK) {
		prompt("Output Link N")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTO,DBF_OUTLINK) {
		prompt("Output Link O")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTP,DBF_OUTLINK) {
		prompt("Output Link P")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTQ,DBF_OUTLINK) {
		prompt("Output Link Q")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTR,DBF_OUTLINK) {
		prompt("Output Link R")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTS,DBF_OUTLINK) {
		prompt("Output Link S")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTT,DBF_OUTLINK) {
		prompt("Output Link T")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(OUTU,DBF_OUTLINK) {
		prompt("Output Link U")
		promptgroup(GUI_OUTPUT)
		special(SPC_NOMOD)
		interest(1)
	}
	field(UFVA,DBF_STRING) {
		prompt("Output Structure A")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVB,DBF_STRING) {
		prompt("Output Structure B")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVC,DBF_STRING) {
		prompt("Output Structure C")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVD,DBF_STRING) {
		prompt("Output Structure D")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVE,DBF_STRING) {
		prompt("Output Structure E")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVF,DBF_STRING) {
		prompt("Output Structure F")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVG,DBF_STRING) {
		prompt("Output Structure G")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVH,DBF_STRING) {
		prompt("Output Structure H")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVI,DBF_STRING) {
		prompt("Output Structure I")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVJ,DBF_STRING) {
		prompt("Output Structure J")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVK,DBF_STRING) {
		prompt("Output Structure K")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVL,DBF_STRING) {
		prompt("Output Structure L")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVM,DBF_STRING) {
		prompt("Output Structure M")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVN,DBF_STRING) {
		prompt("Output Structure N")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVO,DBF_STRING) {
		prompt("Output Structure O")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVP,DBF_STRING) {
		prompt("Output Structure P")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVQ,DBF_STRING) {
		prompt("Output Structure Q")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVR,DBF_STRING) {
		prompt("Output Structure R")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVS,DBF_STRING) {
		prompt("Output Structure S")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVT,DBF_STRING) {
		prompt("Output Structure T")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(UFVU,DBF_STRING) {
		prompt("Output Structure U")
		promptgroup(GUI_SUB)
		special(SPC_NOMOD)
		interest(1)
		size(40)
	}
	field(VALA,DBF_NOACCESS) {
		prompt("Value of Output A")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vala")
	}
	field(VALB,DBF_NOACCESS) {
		prompt("Value of Output B")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valb")
	}
	field(VALC,DBF_NOACCESS) {
		prompt("Value of Output C")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valc")
	}
	field(VALD,DBF_NOACCESS) {
		prompt("Value of Output D")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vald")
	}
	field(VALE,DBF_NOACCESS) {
		prompt("Value of Output E")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vale")
	}
	field(VALF,DBF_NOACCESS) {
		prompt("Value of Output F")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valf")
	}
	field(VALG,DBF_NOACCESS) {
		prompt("Value of Output G")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valg")
	}
	field(VALH,DBF_NOACCESS) {
		prompt("Value of Output H")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valh")
	}
	field(VALI,DBF_NOACCESS) {
		prompt("Value of Output I")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vali")
	}
	field(VALJ,DBF_NOACCESS) {
		prompt("Value of Output J")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valj")
	}
	field(VALK,DBF_NOACCESS) {
		prompt("Value of Output K")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valk")
	}
	field(VALL,DBF_NOACCESS) {
		prompt("Value of Output L")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vall")
	}
	field(VALM,DBF_NOACCESS) {
		prompt("Value of Output M")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valm")
	}
	field(VALN,DBF_NOACCESS) {
		prompt("Value of Output N")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valn")
	}
	field(VALO,DBF_NOACCESS) {
		prompt("Value of Output O")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valo")
	}
	field(VALP,DBF_NOACCESS) {
		prompt("Value of Output P")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valp")
	}
	field(VALQ,DBF_NOACCESS) {
		prompt("Value of Output Q")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valq")
	}
	field(VALR,DBF_NOACCESS) {
		prompt("Value of Output R")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valr")
	}
	field(VALS,DBF_NOACCESS) {
		prompt("Value of Output S")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *vals")
	}
	field(VALT,DBF_NOACCESS) {
		prompt("Value of Output T")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valt")
	}
	field(VALU,DBF_NOACCESS) {
		prompt("Value of Output U")
		asl(ASL0)
		special(SPC_DBADDR)
		interest(1)
		size(4)
		extra("void *valu")
	}
	field(OVLA,DBF_NOACCESS) {
		prompt("Old Output A")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovla")
	}
	field(OVLB,DBF_NOACCESS) {
		prompt("Old Output B")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlb")
	}
	field(OVLC,DBF_NOACCESS) {
		prompt("Old Output C")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlc")
	}
	field(OVLD,DBF_NOACCESS) {
		prompt("Old Output D")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovld")
	}
	field(OVLE,DBF_NOACCESS) {
		prompt("Old Output E")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovle")
	}
	field(OVLF,DBF_NOACCESS) {
		prompt("Old Output F")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlf")
	}
	field(OVLG,DBF_NOACCESS) {
		prompt("Old Output G")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlg")
	}
	field(OVLH,DBF_NOACCESS) {
		prompt("Old Output H")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlh")
	}
	field(OVLI,DBF_NOACCESS) {
		prompt("Old Output I")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovli")
	}
	field(OVLJ,DBF_NOACCESS) {
		prompt("Old Output J")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlj")
	}
	field(OVLK,DBF_NOACCESS) {
		prompt("Old Output K")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlk")
	}
	field(OVLL,DBF_NOACCESS) {
		prompt("Old Output L")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovll")
	}
	field(OVLM,DBF_NOACCESS) {
		prompt("Old Output M")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlm")
	}
	field(OVLN,DBF_NOACCESS) {
		prompt("Old Output N")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovln")
	}
	field(OVLO,DBF_NOACCESS) {
		prompt("Old Output O")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlo")
	}
	field(OVLP,DBF_NOACCESS) {
		prompt("Old Output P")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlp")
	}
	field(OVLQ,DBF_NOACCESS) {
		prompt("Old Output Q")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlq")
	}
	field(OVLR,DBF_NOACCESS) {
		prompt("Old Output R")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlr")
	}
	field(OVLS,DBF_NOACCESS) {
		prompt("Old Output S")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovls")
	}
	field(OVLT,DBF_NOACCESS) {
		prompt("Old Output T")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlt")
	}
	field(OVLU,DBF_NOACCESS) {
		prompt("Old Output U")
		asl(ASL0)
		special(SPC_NOMOD)
		interest(1)
		size(4)
		extra("void *ovlu")
	}
	field(FTVA,DBF_MENU) {
		prompt("Type of VALA")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVB,DBF_MENU) {
		prompt("Type of VALB")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVC,DBF_MENU) {
		prompt("Type of VALC")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVD,DBF_MENU) {
		prompt("Type of VALD")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVE,DBF_MENU) {
		prompt("Type of VALE")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVF,DBF_MENU) {
		prompt("Type of VALF")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVG,DBF_MENU) {
		prompt("Type of VALG")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVH,DBF_MENU) {
		prompt("Type of VALH")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVI,DBF_MENU) {
		prompt("Type of VALI")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVJ,DBF_MENU) {
		prompt("Type of VALJ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVK,DBF_MENU) {
		prompt("Type of VALK")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVL,DBF_MENU) {
		prompt("Type of VALL")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVM,DBF_MENU) {
		prompt("Type of VALM")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVN,DBF_MENU) {
		prompt("Type of VALN")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVO,DBF_MENU) {
		prompt("Type of VALO")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVP,DBF_MENU) {
		prompt("Type of VALP")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVQ,DBF_MENU) {
		prompt("Type of VALQ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVR,DBF_MENU) {
		prompt("Type of VALR")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVS,DBF_MENU) {
		prompt("Type of VALS")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVT,DBF_MENU) {
		prompt("Type of VALT")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(FTVU,DBF_MENU) {
		prompt("Type of VALU")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		menu(menuFtype)
	}
	field(NOVA,DBF_ULONG) {
		prompt("No. in VALA")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVB,DBF_ULONG) {
		prompt("No. in VALB")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVC,DBF_ULONG) {
		prompt("No. in VALC")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVD,DBF_ULONG) {
		prompt("No. in VALD")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVE,DBF_ULONG) {
		prompt("No. in VALE")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVF,DBF_ULONG) {
		prompt("No. in VALF")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVG,DBF_ULONG) {
		prompt("No. in VALG")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVH,DBF_ULONG) {
		prompt("No. in VAlH")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVI,DBF_ULONG) {
		prompt("No. in VALI")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVJ,DBF_ULONG) {
		prompt("No. in VALJ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVK,DBF_ULONG) {
		prompt("No. in VALK")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVL,DBF_ULONG) {
		prompt("No. in VALL")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVM,DBF_ULONG) {
		prompt("No. in VALM")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVN,DBF_ULONG) {
		prompt("No. in VALN")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVO,DBF_ULONG) {
		prompt("No. in VALO")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVP,DBF_ULONG) {
		prompt("No. in VALP")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVQ,DBF_ULONG) {
		prompt("No. in VALQ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVR,DBF_ULONG) {
		prompt("No. in VALR")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVS,DBF_ULONG) {
		prompt("No. in VALS")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVT,DBF_ULONG) {
		prompt("No. in VALT")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(NOVU,DBF_ULONG) {
		prompt("No. in VALU")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVA,DBF_ULONG) {
		prompt("Total bytes for VALA")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVB,DBF_ULONG) {
		prompt("Total bytes for VALB")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVC,DBF_ULONG) {
		prompt("Total bytes for VALC")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVD,DBF_ULONG) {
		prompt("Total bytes for VALD")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVE,DBF_ULONG) {
		prompt("Total bytes for VALE")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVF,DBF_ULONG) {
		prompt("Total bytes for VALF")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVG,DBF_ULONG) {
		prompt("Total bytes for VALG")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVH,DBF_ULONG) {
		prompt("Total bytes for VAlH")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVI,DBF_ULONG) {
		prompt("Total bytes for VALI")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVJ,DBF_ULONG) {
		prompt("Total bytes for VALJ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVK,DBF_ULONG) {
		prompt("Total bytes for VALK")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVL,DBF_ULONG) {
		prompt("Total bytes for VALL")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVM,DBF_ULONG) {
		prompt("Total bytes for VALM")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVN,DBF_ULONG) {
		prompt("Total bytes for VALN")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVO,DBF_ULONG) {
		prompt("Total bytes for VALO")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVP,DBF_ULONG) {
		prompt("Total bytes for VALP")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVQ,DBF_ULONG) {
		prompt("Total bytes for VALQ")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVR,DBF_ULONG) {
		prompt("Total bytes for VALR")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVS,DBF_ULONG) {
		prompt("Total bytes for VALS")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVT,DBF_ULONG) {
		prompt("Total bytes for VALT")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
	field(TOVU,DBF_ULONG) {
		prompt("Total bytes for VALU")
		promptgroup(GUI_WAVE)
		special(SPC_NOMOD)
		interest(1)
		initial("1")
	}
}

References:
genSub for EPICS 314? Rozelle Wright

Navigate by Date:
Prev: CA Proxy Gateway (performance tweak release 1.3.3) Ralph . Lange
Next: How to set the correct IOC time Cheng Weixing@ssrc
Index: 1994  1995  1996  1997  1998  1999  2000  2001  <20022003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
Navigate by Thread:
Prev: genSub for EPICS 314? Rozelle Wright
Next: seq-1.9.6-beta Laznovsky, Michael
Index: 1994  1995  1996  1997  1998  1999  2000  2001  <20022003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
ANJ, 10 Aug 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·