EPICS Controls 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  2018  2019  2020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  <20022003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  2020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: genSub for EPICS 314?
From: Andy Foster <[email protected]>
To: Rozelle Wright <[email protected]>
Cc: [email protected]
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
> [email protected]
>
>
>

--------------------------------------------------------------------
Observatory Sciences Limited    Email: [email protected]
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  2018  2019  2020  2021  2022  2023  2024 
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  2018  2019  2020  2021  2022  2023  2024 
ANJ, 10 Aug 2010 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·