m8260IntrCtl.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:18k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* m8260Int.c - Motorola Voyager MPC 8260 interrupt controller driver */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01p,28mar02,dtr  Fix typo.
  8. 01o,28mar02,jrs  Correct loop bounds check for attaching ISR's to int no's.
  9. 01n,12jan02,g_h  Remove calling to intLock() in m8260IntrDeMux()
  10. 01m,07dec01,rcs  masked vxImmrGet() value with IMMR_ISB_MASK SPR# 72027 
  11. 01l,22oct01,g_h  Change the m8260IntrDeMux function to check for interrupt 0 
  12.  as indecation for no interrupt. As long as reading the SIVEC 
  13.  register defrent from 0 we have panding interrupt and we need
  14.  to server it, this fix SPR 71119.
  15. 01k,22oct01,g_h  Clean compilation warning from m8260IntDisable function, and 
  16.  change the declaration of intVec in m8260IntrDeMux to VINT32
  17.  from UINT32 to prevent optimization problem.
  18. 01j,16sep99,ms_  m8260IntrCtl.h comes from h/drv/intrCtl
  19. 01i,16sep99,ms_  rename m8260Int.h to m8260IntrCtl.h
  20. 01h,15jul99,ms_  make compliant with our coding standards
  21. 01g,13may99,ms_  minor fixes
  22. 01f,17apr99,ms_  final cleanup for EAR
  23. 01e,15apr99,ms_  disable only lower priority interrupts while processing
  24.                  interrupt
  25. 01d,13apr99,ms_  redefine IVEC_TO_INUM and INUM_TO_IVEC to use the numbers as
  26.                  shown in the MPC8260 user's manaul
  27. 01c,12apr99,ms_  remove any sio specific items; that is handled in the sio
  28.                  driver
  29. 01b,29mar99,ms_  add ability to mask out lower priority interrupts when
  30.                  processing an interrupt
  31. 01a,22feb99,ms_  adapted from ppc8260Intr.c version 01f
  32. */
  33. /*
  34. DESCRIPTION
  35. The PowerPC 8260 CPU is divided in three units: PowerPC core, System
  36. Interface Unit (SIU) and Communication Processor Unit (CPM). The PowerPC
  37. core accepts only one external interrupt exception (vector 0x500). The SIU
  38. provides an interrupt controller which provides 55 interrupt sources
  39. The Interrupt controller is connected to the PowerPC core external 
  40. interrupt. This library provides the routines to manage this interrupt 
  41. controllers.
  42. m8260IntrInit() connects the default demultiplexer, m8260IntrDeMux(), to the 
  43. external interrupt vector and initializes a table containing a function pointer
  44. and an associated parameter for each interrupt source. m8260IntrInit() is called
  45. by sysHwInit() from sysLib.c.
  46. The default demultimplexer, m8260IntrDeMux() detects which peripheral or 
  47. controller has raised an interrupt and calls the associated routine with its 
  48. parameter. 
  49. INCLUDE FILES: m8260IntrCtl.h
  50. */
  51. /* includes */
  52. #include "intLib.h"
  53. #include "iv.h"
  54. #include "drv/intrCtl/m8260IntrCtl.h"
  55. #ifdef  INCLUDE_WINDVIEW
  56. #include "private/funcBindP.h"
  57. #include "private/eventP.h"
  58. #endif /* INCLUDE_WINDVIEW */
  59. /* local */
  60. LOCAL INTR_HANDLER intrVecTable[IVEC_MAX+1]; /*  Intr vector table */
  61. /* SIU Interrupt Mask structure; a value for the high and low parts */
  62. typedef struct siu_int_mask
  63.     {
  64.     UINT32 simr_h;
  65.     UINT32 simr_l;
  66.     } SIU_INT_MASK;
  67. /* 
  68.  * for a give inum, return a pair of masks, one for SIMR_H and one for SIMR_L,
  69.  * which will enable only higher priority interrupts.
  70.  */
  71. LOCAL SIU_INT_MASK enableHighPriInts[] =
  72.     {
  73.     {0x00000000, 0x00000000}, /* interrupt 0 error - enable nothing */
  74.     {0x003F7C06, 0xECF02658}, /* I2C */
  75.     {0x0FFF7F06, 0xECF0A7DE}, /* SPI */
  76.     {0x003F7C06, 0xECF00658}, /* RISC Timer Table */
  77.     {0x3FFF7F06, 0xECF0E7DE}, /* SMC1 */
  78.     {0x3FFF7F06, 0xECF0F7DE}, /* SMC2 */
  79.     {0x00077C06, 0xECF00050}, /* IDMA1 */
  80.     {0x001F7C06, 0xECF00450}, /* IDMA2 */
  81.     {0x00FF7E06, 0xECF0A658}, /* IDMA3 */
  82.     {0x0FFF7F06, 0xECF0A75E}, /* IDMA4 */
  83.     {0x00077C06, 0xECF00010}, /* SDMA Bus Error */
  84.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 11 reserved - enable everything */
  85.     {0x00017C06, 0xECF00000}, /* Timer 1 */
  86.     {0x001F7C06, 0xECF00650}, /* Timer 2 */
  87.     {0x00FF7F06, 0xECF0A758}, /* Timer 3 */
  88.     {0x07FF7F06, 0xECF0A75C}, /* Timer 4 */
  89.     {0x00000000, 0x00000000}, /* TMCNT */
  90.     {0x00000004, 0x00000000}, /* PIT */
  91.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 18 reserved - enable everything */
  92.     {0x00000006, 0x00000000}, /* IRQ1 XXXX */
  93.     {0x00004006, 0xEC000000}, /* IRQ2 */
  94.     {0x00006006, 0xEC000000}, /* IRQ3 */
  95.     {0x00007006, 0xEC000000}, /* IRQ4 */
  96.     {0x00007806, 0xEC000000}, /* IRQ5 */
  97.     {0x00FF7C06, 0xECF0A658}, /* IRQ6 */
  98.     {0x00FF7E06, 0xECF0A758}, /* IRQ7 */
  99.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 26 reserved - enable everything */
  100.     {0x00004006, 0x00000000}, /* FCC1 */
  101.     {0x00004006, 0x80000000}, /* FCC2 */
  102.     {0x00004006, 0xC0000000}, /* FCC3 */
  103.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 30 reserved - enable everything */
  104.     {0x00004006, 0xE0000000}, /* MCC1 */
  105.     {0x00004006, 0xE8000000}, /* MCC2 */
  106.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 33 reserved - enable everything */
  107.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 34 reserved - enable everything */
  108.     {0x00007C06, 0xEC000000}, /* SCC1 */
  109.     {0x00007C06, 0xEC800000}, /* SCC2 */
  110.     {0x00007C06, 0xECC00000}, /* SCC3 */
  111.     {0x00007C06, 0xECE00000}, /* SCC4 */
  112.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 39 reserved - enable everything */
  113.     {0x00007C06, 0xECF00000}, /* PC15 */
  114.     {0x00017C06, 0xECF00010}, /* PC14 */
  115.     {0x00037C06, 0xECF00010}, /* PC13 */
  116.     {0x00077C06, 0xECF00450}, /* PC12 */
  117.     {0x000F7C06, 0xECF00450}, /* PC11 */
  118.     {0x001F7C06, 0xECF00658}, /* PC10 */
  119.     {0x003F7C06, 0xECF0A658}, /* PC9 */
  120.     {0x007F7C06, 0xECF0A658}, /* PC8 */
  121.     {0x00FF7F06, 0xECF0A75C}, /* PC7 */
  122.     {0x01FF7F06, 0xECF0A75C}, /* PC6 */
  123.     {0x03FF7F06, 0xECF0A75C}, /* PC5 */
  124.     {0x07FF7F06, 0xECF0A75E}, /* PC4 */
  125.     {0x0FFF7F06, 0xECF0E7DE}, /* PC3 */
  126.     {0x1FFF7F06, 0xECF0E7DE}, /* PC2 */
  127.     {0x3FFF7F06, 0xECF0FFDE}, /* PC1 */
  128.     {0x7FFF7F06, 0xECF0FFDE}, /* PC0 */
  129.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 56 reserved - enable everything */
  130.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 57 reserved - enable everything */
  131.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 58 reserved - enable everything */
  132.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 59 reserved - enable everything */
  133.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 60 reserved - enable everything */
  134.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 61 reserved - enable everything */
  135.     {0xFFFFFFFF, 0xFFFFFFFF}, /* interrupt 62 reserved - enable everything */
  136.     {0xFFFFFFFF, 0xFFFFFFFF} /* interrupt 63 reserved - enable everything */
  137.     };
  138. LOCAL UINT32 iNumToMaskPattern[] = 
  139.     {
  140.     0x00000000, /* interrupt number 0: Error */
  141.     0x00008000, /* interrupt number 1: I2C */
  142.     0x00004000, /* interrupt number 2: SPI */
  143.     0x00002000, /* interrupt number 3: Risc Timer Table */
  144.     0x00001000, /* interrupt number 4: SMC 1 */
  145.     0x00000800, /* interrupt number 5: SMC 2 */
  146.     0x00000400, /* interrupt number 6: IDMA1 */
  147.     0x00000200, /* interrupt number 7: IDMA2 */
  148.     0x00000100, /* interrupt number 8: IDMA3 */
  149.     0x00000080, /* interrupt number 9: IDMA4 */
  150.     0x00000040, /* interrupt number 10: SDMA */
  151.     0x00000000, /* interrupt number 11: reserved */
  152.     0x00000010, /* interrupt number 12: Timer 1 */
  153.     0x00000008, /* interrupt number 13: Timer 2 */
  154.     0x00000004, /* interrupt number 14: Timer 3 */
  155.     0x00000002, /* interrupt number 15: Timer 4 */
  156.     0x00000004, /* interrupt number 16: TMCNT */
  157.     0x00000002, /* interrupt number 17: PIT */
  158.     0x00000000, /* interrupt number 18: reserved */
  159.     0x00004000, /* interrupt number 19: IRQ 1 interrupt */
  160.     0x00002000, /* interrupt number 20: IRQ 2 interrupt */
  161.     0x00001000, /* interrupt number 21: IRQ 3 interrupt */
  162.     0x00000800, /* interrupt number 22: IRQ 4 interrupt */
  163.     0x00000400, /* interrupt number 23: IRQ 5 interrupt */
  164.     0x00000200, /* interrupt number 24: IRQ 6 interrupt */
  165.     0x00000100, /* interrupt number 25: IRQ 7 interrupt */
  166.     0x00000000, /* interrupt number 26: reserved */
  167.     0x80000000, /* interrupt number 27: FCC1 */
  168.     0x40000000, /* interrupt number 28: FCC2 */
  169.     0x20000000, /* interrupt number 29: FCC3 */
  170.     0x00000000, /* interrupt number 30: reserved */
  171.     0x08000000, /* interrupt number 31: MCC1 */
  172.     0x04000000, /* interrupt number 32: MCC2 */
  173.     0x00000000, /* interrupt number 33: reserved */
  174.     0x00000000, /* interrupt number 34: reserved */
  175.     0x00800000, /* interrupt number 35: SCC1 */
  176.     0x00400000, /* interrupt number 36: SCC2 */
  177.     0x00200000, /* interrupt number 37: SCC3 */
  178.     0x00100000, /* interrupt number 38: SCC4 */
  179.     0x00000000, /* interrupt number 39: reserved */
  180.     0x00010000, /* interrupt number 40: Parallel I/O [15] */
  181.     0x00020000, /* interrupt number 41: Parallel I/O [14] */
  182.     0x00040000, /* interrupt number 42: Parallel I/O [13] */
  183.     0x00080000, /* interrupt number 43: Parallel I/O [12] */
  184.     0x00100000, /* interrupt number 44: Parallel I/O [11] */
  185.     0x00200000, /* interrupt number 45: Parallel I/O [10] */
  186.     0x00400000, /* interrupt number 46: Parallel I/O [9] */
  187.     0x00800000, /* interrupt number 47: Parallel I/O [8] */
  188.     0x01000000, /* interrupt number 48: Parallel I/O [7] */
  189.     0x02000000, /* interrupt number 49: Parallel I/O [6] */
  190.     0x04000000, /* interrupt number 50: Parallel I/O [5] */
  191.     0x08000000, /* interrupt number 51: Parallel I/O [4] */
  192.     0x10000000, /* interrupt number 52: Parallel I/O [3] */
  193.     0x20000000, /* interrupt number 53: Parallel I/O [2] */
  194.     0x40000000, /* interrupt number 54: Parallel I/O [1] */
  195.     0x80000000, /* interrupt number 55: Parallel I/O [0] */
  196.     0x00000000, /* interrupt number 56: reserved */
  197.     0x00000000, /* interrupt number 57: reserved */
  198.     0x00000000, /* interrupt number 58: reserved */
  199.     0x00000000, /* interrupt number 59: reserved */
  200.     0x00000000, /* interrupt number 60: reserved */
  201.     0x00000000, /* interrupt number 61: reserved */
  202.     0x00000000, /* interrupt number 62: reserved */
  203.     0x00000000 /* interrupt number 63: reserved */
  204.     };
  205. /* forward declarations */
  206. LOCAL void m8260IntrDeMux (void);
  207. LOCAL STATUS m8260IntConnect (VOIDFUNCPTR *, VOIDFUNCPTR, int);
  208. /*******************************************************************************
  209. *
  210. * m8260IntrInit - initialize the interrupt manager for the PowerPC 8260
  211. *
  212. * This routine connects the default demultiplexer, m8260IntrDeMux(), to the 
  213. * external interrupt vector and associates all 
  214. * interrupt sources with the default interrupt handler.  This routine is
  215. * called by sysHwInit() in sysLib.c.
  216. *
  217. * NOTE: All interrupt from the SIU unit are enabled, CICR is setup so
  218. * that SCC1 has the highest relative interrupt priority, through SCC4 with the
  219. * lowest.
  220. *
  221. * RETURN : OK always
  222. */
  223. STATUS m8260IntrInit 
  224.     (
  225.     )
  226.     {
  227.     VOIDFUNCPTR defaultVec;      /* INTR3 default vector */
  228.     int vector;
  229.     UINT32 immrVal = (vxImmrGet()& IMMR_ISB_MASK);
  230.     /* Get the default vector connected to the External Interrupt (0x500) */
  231.     defaultVec = (VOIDFUNCPTR) excVecGet ((FUNCPTR *) _EXC_OFF_INTR);
  232.     /* Connect the interrupt demultiplexer to External Interrupt (0x500) */
  233.     excIntConnect ((VOIDFUNCPTR *) _EXC_OFF_INTR, m8260IntrDeMux);
  234.     /* Install `system' intConnect routine */
  235.     if (_func_intConnectRtn == NULL)
  236.         _func_intConnectRtn = m8260IntConnect;
  237.     if (_func_intEnableRtn == NULL)
  238.         _func_intEnableRtn = m8260IntEnable;
  239.     if (_func_intDisableRtn == NULL)
  240.         _func_intDisableRtn = m8260IntDisable;
  241.     /* Set all vectors to default handler */
  242.     for (vector = 0; vector <= IVEC_MAX; vector++)
  243. intConnect (INUM_TO_IVEC(vector), (VOIDFUNCPTR) defaultVec, 0); 
  244.     /* disable all interrupts */
  245.     *M8260_SIMR_L(immrVal) = 0x00000000;
  246.     *M8260_SIMR_H(immrVal) = 0x00000000;
  247.     return (OK);
  248.  
  249.     }
  250. /*******************************************************************************
  251. *
  252. * m8260IntConnect - connect a routine to an interrupt 
  253. *
  254. * This routine connects any C or assembly routine to one of the multiple 
  255. * sources of interrupts.
  256. *
  257. * The connected routine can be any normal C code, except that it must not 
  258. * invoke certain operating system functions that may block or perform I/O
  259. * operations.
  260. *
  261. * <vector> types are defined in h/drv/intrClt/m8260Intr.h.
  262. *
  263. * RETURNS: OK, or ERROR if <vector> is unknown.
  264. *
  265. * SEE ALSO: m8260Intr.h
  266. */
  267. LOCAL STATUS m8260IntConnect
  268.     (
  269.     VOIDFUNCPTR * vector, /* interrupt vector to attach to */
  270.     VOIDFUNCPTR routine, /* routine to be called */
  271.     int  parameter /* parameter to be passed to routine */
  272.     )
  273.     {
  274.     /* test the vector */
  275.     if ((int)(vector) > IVEC_MAX)
  276. return (ERROR);
  277.     intrVecTable[(int)(vector)].vec = routine;
  278.     intrVecTable[(int)(vector)].arg = parameter;
  279.     return (OK);
  280.     }
  281. /*******************************************************************************
  282. *
  283. * m8260IntrDeMux - SIU interrupt demultiplexer 
  284. *
  285. * This routine must be bound to external interrupt exception (vector 0x500). 
  286. * It is used to call the appropriate handler with its argument when an
  287. * interrupt occurs. 
  288. *
  289. * The interrupts are prioritized in the following order:
  290. *
  291. * NOTE: when this function is called the interrupts are still locked. It's
  292. * this function responsability to unlock the interrupt.
  293. *
  294. * RETURNS: N/A
  295. */
  296. void m8260IntrDeMux (void)
  297.     {
  298.     VINT32  intVec; /* interrupt vector */
  299.     UINT32 oldIntMask_L; /* current interrupt mask */
  300.     UINT32 oldIntMask_H; /* current interrupt mask */
  301.     UINT32 immrVal = (vxImmrGet() & IMMR_ISB_MASK);
  302.     while(WAIT_FOREVER)
  303.         {
  304.    
  305.      /* read the interrupt vector register */
  306.      intVec = (0x0000003f & ((* M8260_SIVEC(immrVal)) >> 26));
  307.     
  308.      if(!intVec)
  309.          {
  310.             break;
  311.          }
  312. #ifdef  INCLUDE_WINDVIEW
  313.      WV_EVT_INT_ENT(intVec)
  314. #endif /* INCLUDE_WINDVIEW */
  315.      /* save the current interrupt mask */ 
  316.      oldIntMask_L = * M8260_SIMR_L(immrVal);
  317.      oldIntMask_H = * M8260_SIMR_H(immrVal);
  318.      /* enable only the higher priority interrupts */
  319.      * M8260_SIMR_L(immrVal)&= 
  320. enableHighPriInts[IVEC_TO_INUM((VOIDFUNCPTR *)intVec)].simr_l;
  321.      * M8260_SIMR_H(immrVal)&= 
  322. enableHighPriInts[IVEC_TO_INUM((VOIDFUNCPTR *)intVec)].simr_h;
  323.      /* unlock the interrupt */
  324.      intUnlock (_PPC_MSR_EE);
  325.      /* call the Interrupt Handler */
  326.      /* table is indexed by vector */
  327.      intrVecTable[intVec].vec (intrVecTable[intVec].arg); 
  328.      /* restore the interrupt mask */
  329.      * M8260_SIMR_L(immrVal) = oldIntMask_L;
  330.      * M8260_SIMR_H(immrVal) = oldIntMask_H;
  331.         }
  332.     return;
  333.     }
  334. /*******************************************************************************
  335. *
  336. * m8260IntEnable - enable the indicated interrupt
  337. *
  338. * This routine will enable the indicated interrupt by setting the appropriate
  339. * bit in the SIU Interrupt Mask Registers.
  340. *
  341. * The design of the 8260 presents the following design requirements:
  342. *
  343. * 1. the mapping from interrupt number to mask bit can not be represented by 
  344. *    a function. An array, indexed by interrupt number (INUM), is used to map
  345. *    the interrupt number to the appropriate mask. 
  346. *
  347. * 2. There are two 32 bit mask registers (SIMR_L and SIMR_H). The interrupt
  348. *    number must be compared to 4 ranges to determine which register contains
  349. *    its mask bit:
  350. *
  351. * .CS
  352. * interrupt number
  353. * in m8260IntrCtl.h       register
  354. * ----------------        -------
  355. * 0-15                    SIMR_L
  356. * 16-31                   SIMR_H
  357. * 32-47                   SIMR_L
  358. * 48-63                   SIMR_H
  359. * .CE
  360. *
  361. * RETURNS: 0, always.
  362. */
  363. int m8260IntEnable
  364.     (
  365.     int intNum /* interrupt level to enable */
  366.     )
  367.     {
  368.     UINT32 immrVal = (vxImmrGet() & IMMR_ISB_MASK);
  369.     if ((intNum > 0) && (intNum <= IVEC_MAX))
  370. {
  371. if (((intNum >= 0) && (intNum <= 15)) || 
  372.     ((intNum >= 27) && (intNum <= 38)))
  373.     *M8260_SIMR_L(immrVal) |= iNumToMaskPattern[intNum];
  374. else
  375.     *M8260_SIMR_H(immrVal) |= iNumToMaskPattern[intNum];
  376. }
  377.     return 0;
  378.     }
  379. /*******************************************************************************
  380. *
  381. * m8260IntDisable - Disable one of the Level or IRQ interrupts into the SIU
  382. *
  383. * This routine will mask the bit in the SIMASK register corresponding to
  384. * the requested interrupt level.  
  385. * RETURNS: 0, always.
  386. */
  387. int m8260IntDisable
  388.     (
  389.     int intNum          /* interrupt level to disable */
  390.     )
  391.     {
  392.     UINT32 immrVal = (vxImmrGet() & IMMR_ISB_MASK);
  393.     if ((intNum >= 0) && (intNum <= IVEC_MAX))
  394.         { 
  395. if (((intNum >= 0) && (intNum <= 15)) || 
  396.     ((intNum >= 27) && (intNum <= 38)))
  397.     *M8260_SIMR_L(immrVal) &= ~iNumToMaskPattern[intNum];   
  398. else
  399.     *M8260_SIMR_H(immrVal) &= ~iNumToMaskPattern[intNum];
  400.         }
  401.     return 0;
  402.     }
  403. VOIDFUNCPTR * m8260InumToIvec 
  404.     (
  405.     int intNum
  406.     )
  407.     {
  408.     if (intNum <0)  /* error */
  409. return ((VOIDFUNCPTR *) 0);
  410.     else if (intNum <= 25)
  411. return ((VOIDFUNCPTR *) intNum);
  412.     else if (intNum == 26)  /* error */
  413. return ((VOIDFUNCPTR *) 0);
  414.     else if (intNum <= 38)
  415. return ((VOIDFUNCPTR *) (intNum + 5));
  416.     else if (intNum == 39)  /* error */
  417. return ((VOIDFUNCPTR *) 0);
  418.     else if (intNum <= 55)
  419. return ((VOIDFUNCPTR *) (intNum + 8));
  420.     else /* error */
  421. return ((VOIDFUNCPTR *) 0);
  422.     }
  423. /*******************************************************************************
  424. *
  425. * m8260IvecToInum - get the relevant interrupt number
  426. *
  427. * This routine finds out the interrupt number associated with the vector
  428. * in <vector>.
  429. *
  430. * <vector> types are defined in h/drv/intrClt/m8260Intr.h.
  431. *
  432. * RETURNS: the interrupt number for the vector
  433. *
  434. * SEE ALSO: m8260Intr.h
  435. */
  436.  
  437. int m8260IvecToInum
  438.     (
  439.     VOIDFUNCPTR *       vector         /* interrupt vector to attach to */
  440.     )
  441.     {
  442.  
  443.     /* test the vector */
  444.  
  445.     if ((int) (vector) <= 0)
  446.         return ((int ) 0);
  447.  
  448.     else if ((int) vector < INUM_RESERVED26)
  449.         return ((int) vector);
  450.  
  451.     else if ((int) vector < 32)
  452.         return (INUM_RESERVED26);
  453.     else if ((int) vector < 44)
  454.         return ((int) vector - 5);
  455.     else if ((int) vector < 48)
  456.         return ((int) INUM_RESERVED39);
  457.     else if ((int) vector <= IVEC_MAX)
  458.         return ((int) vector - 8);
  459.  
  460.     else 
  461.         return (0);
  462.     }