PC.C
上传用户:jyxpgd88
上传日期:2013-04-13
资源大小:90k
文件大小:24k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                          PC SUPPORT FUNCTIONS
  4. *
  5. *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
  6. *                                           All Rights Reserved
  7. *
  8. * File : PC.C
  9. * By   : Jean J. Labrosse
  10. *********************************************************************************************************
  11. */
  12. #include "ucos_ii.h"
  13. #include "pc.h"
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <setjmp.h>
  17. /*
  18. PC display by KC51 emulation
  19. */
  20. #define interrupt
  21. #define far xdata
  22. #define MK_FP(s, o) ((INT8U xdata *)(INT16U)(o))
  23. #define getvect(vect) ((vect=vect),((void*)NULL))
  24. #define setvect(vect, isr) (vect=vect, isr=isr)
  25. int OSTickDOSCtr;
  26. const char code * const code ExitNotice[]=
  27. {
  28. "Exit program",
  29. "Program has terminated",
  30. "Reset the processor to restart the program"
  31. };
  32. bit kbhit() KCREENTRANT;
  33. INT8U getch() KCREENTRANT;
  34. void exit(INT8U ec) KCREENTRANT
  35. {
  36. static char str[64];
  37. #if OS_CRITICAL_METHOD == 3
  38.     OS_CPU_SR cpu_sr;
  39. #endif
  40.     OS_ENTER_CRITICAL();
  41. for(;;)
  42. {
  43. INT8U i;
  44. for(i=0; i<sizeof(ExitNotice)/sizeof(ExitNotice[0]); i++)
  45. {
  46. PC_DispStr (0, 8+i, ExitNotice[i], DISP_FGND_WHITE + DISP_BGND_BLACK);
  47. }
  48. sprintf(str, "Exit code = %bd", ec);
  49. PC_DispStr (0, 24, str, DISP_FGND_WHITE + DISP_BGND_BLACK);
  50. while(! kbhit());
  51. getch();
  52. TR0=0;
  53. ET0=0;
  54. ((void(*)(void))0)();
  55. }
  56. OS_EXIT_CRITICAL();
  57. }
  58. /*
  59. INT8U inp(INT8U p)
  60. {
  61.     INT8U  far *pscr;
  62.     pscr = MK_FP(DISP_BASE, 0x1000+p);
  63. return * pscr;
  64. }
  65. */
  66. void outp(INT8U p, INT8U d)
  67. {
  68.     INT8U  far *pscr;
  69.     pscr = MK_FP(DISP_BASE, 0x1000+p);
  70. *pscr = d;
  71. }
  72. struct time
  73. {
  74. INT8U ti_hour, ti_min, ti_sec;
  75. };
  76. struct date
  77. {
  78. INT8U da_year, da_mon, da_day;
  79. };
  80. void gettime(struct time * pti) KCREENTRANT
  81. {
  82.     INT8U  far *pscr;
  83.     pscr = MK_FP(DISP_BASE, 0x2010);
  84. pti->ti_hour =* pscr ++;
  85. pti->ti_min =* pscr ++;
  86. pti->ti_sec =* pscr;
  87. }
  88. void getdate(struct date * pdt) KCREENTRANT
  89. {
  90.     INT8U  far *pscr;
  91.     pscr = MK_FP(DISP_BASE, 0x2020);
  92. pdt->da_year = * pscr ++;
  93. pdt->da_mon = * pscr ++;
  94. pdt->da_day = * pscr;
  95. }
  96. /*
  97. INT8U random(INT8U seed) KCREENTRANT
  98. {
  99. INT8U xdata * p;
  100. p=MK_FP(0, 0x2032);
  101. return ((*p)^((INT16U) rand())) % (INT16U)seed;
  102. }
  103. */
  104. INT8U random(INT8U seed) KCREENTRANT
  105. {
  106.     INT8U i;
  107. i=(((INT16U) rand())^((INT16U) rand())+TL0) % (INT16U)seed;
  108. return i;
  109. }
  110. bit kbhit() KCREENTRANT
  111. {
  112.     INT8U  far *pscr;
  113.     pscr = MK_FP(DISP_BASE, 0x2030);
  114. return *pscr;
  115. }
  116. INT8U getch() KCREENTRANT
  117. {
  118.     INT8U  far *pscr;
  119.     pscr = MK_FP(DISP_BASE, 0x2031);
  120. return *pscr;
  121. }
  122. /*
  123. *********************************************************************************************************
  124. *                                               CONSTANTS
  125. *********************************************************************************************************
  126. */
  127. #define  DISP_BASE                  0xB800       /* Base segment of display (0xB800=VGA, 0xB000=Mono)  */
  128. #define  DISP_MAX_X                     80       /* Maximum number of columns                          */
  129. #define  DISP_MAX_Y                     25       /* Maximum number of rows                             */
  130. #define  TICK_T0_8254_CWR             0x43       /* 8254 PIT Control Word Register address.            */
  131. #define  TICK_T0_8254_CTR0            0x40       /* 8254 PIT Timer 0 Register address.                 */
  132. #define  TICK_T0_8254_CTR1            0x41       /* 8254 PIT Timer 1 Register address.                 */
  133. #define  TICK_T0_8254_CTR2            0x42       /* 8254 PIT Timer 2 Register address.                 */
  134. #define  TICK_T0_8254_CTR0_MODE3      0x36       /* 8254 PIT Binary Mode 3 for Counter 0 control word. */
  135. #define  TICK_T0_8254_CTR2_MODE0      0xB0       /* 8254 PIT Binary Mode 0 for Counter 2 control word. */
  136. #define  TICK_T0_8254_CTR2_LATCH      0x80       /* 8254 PIT Latch command control word                */
  137. #define  VECT_TICK                    0x08       /* Vector number for 82C54 timer tick                 */
  138. #define  VECT_DOS_CHAIN               0x81       /* Vector number used to chain DOS                    */
  139. /*
  140. *********************************************************************************************************
  141. *                                       LOCAL GLOBAL VARIABLES
  142. *********************************************************************************************************
  143. */
  144.              
  145. static INT16U    PC_ElapsedOverhead;
  146. static jmp_buf   PC_JumpBuf;
  147. static BOOLEAN   PC_ExitFlag;
  148. void           (*PC_TickISR)(void);
  149. /*$PAGE*/
  150. /*
  151. *********************************************************************************************************
  152. *                                              CLEAR SCREEN
  153. *
  154. * Description : This function clears the PC's screen by directly accessing video RAM instead of using
  155. *               the BIOS.  It assumed that the video adapter is VGA compatible.  Video RAM starts at
  156. *               absolute address 0x000B8000.  Each character on the screen is composed of two bytes:
  157. *               the ASCII character to appear on the screen followed by a video attribute.  An attribute
  158. *               of 0x07 displays the character in WHITE with a black background.
  159. *
  160. * Arguments   : color   specifies the foreground/background color combination to use 
  161. *                       (see PC.H for available choices)
  162. *
  163. * Returns     : None
  164. *********************************************************************************************************
  165. */
  166. void PC_DispClrScr (INT8U color) KCREENTRANT
  167. {
  168.     INT8U  far *pscr;
  169.     INT16U      i;
  170.     pscr = MK_FP(DISP_BASE, 0x0000);
  171.     for (i = 0; i < (DISP_MAX_X * DISP_MAX_Y); i++) { /* PC display has 80 columns and 25 lines        */
  172.         *pscr++ = ' ';                                /* Put ' ' character in video RAM                */
  173.         *pscr++ = color;                              /* Put video attribute in video RAM              */
  174.     }
  175. }
  176. /*$PAGE*/
  177. /*
  178. *********************************************************************************************************
  179. *                                             CLEAR A LINE
  180. *
  181. * Description : This function clears one of the 25 lines on the PC's screen by directly accessing video 
  182. *               RAM instead of using the BIOS.  It assumed that the video adapter is VGA compatible.  
  183. *               Video RAM starts at absolute address 0x000B8000.  Each character on the screen is 
  184. *               composed of two bytes: the ASCII character to appear on the screen followed by a video 
  185. *               attribute.  An attribute of 0x07 displays the character in WHITE with a black background.
  186. *
  187. * Arguments   : y            corresponds to the desired line to clear.  Valid line numbers are from 
  188. *                            0 to 24.  Line 0 corresponds to the topmost line.
  189. *
  190. *               color        specifies the foreground/background color combination to use 
  191. *                            (see PC.H for available choices)
  192. *
  193. * Returns     : None
  194. *********************************************************************************************************
  195. */
  196. void PC_DispClrLine (INT8U y, INT8U color) KCREENTRANT
  197. {
  198.     INT8U far *pscr;
  199.     INT8U      i;
  200.     pscr = MK_FP(DISP_BASE, (INT16U)y * DISP_MAX_X * 2);
  201.     for (i = 0; i < DISP_MAX_X; i++) {
  202.         *pscr++ = ' ';                           /* Put ' ' character in video RAM                     */
  203.         *pscr++ = color;                         /* Put video attribute in video RAM                   */
  204.     }
  205. }
  206. /*$PAGE*/
  207. /*
  208. *********************************************************************************************************
  209. *                           DISPLAY A SINGLE CHARACTER AT 'X' & 'Y' COORDINATE
  210. *
  211. * Description : This function writes a single character anywhere on the PC's screen.  This function
  212. *               writes directly to video RAM instead of using the BIOS for speed reasons.  It assumed 
  213. *               that the video adapter is VGA compatible.  Video RAM starts at absolute address 
  214. *               0x000B8000.  Each character on the screen is composed of two bytes: the ASCII character 
  215. *               to appear on the screen followed by a video attribute.  An attribute of 0x07 displays 
  216. *               the character in WHITE with a black background.
  217. *
  218. * Arguments   : x      corresponds to the desired column on the screen.  Valid columns numbers are from
  219. *                      0 to 79.  Column 0 corresponds to the leftmost column.
  220. *               y      corresponds to the desired row on the screen.  Valid row numbers are from 0 to 24.
  221. *                      Line 0 corresponds to the topmost row.
  222. *               c      Is the ASCII character to display.  You can also specify a character with a 
  223. *                      numeric value higher than 128.  In this case, special character based graphics
  224. *                      will be displayed.
  225. *               color  specifies the foreground/background color to use (see PC.H for available choices)
  226. *                      and whether the character will blink or not.
  227. *
  228. * Returns     : None
  229. *********************************************************************************************************
  230. */
  231. void PC_DispChar (INT8U x, INT8U y, INT8U cc, INT8U color) KCREENTRANT
  232. {
  233.     INT8U  far *pscr;
  234.     INT16U      offset;
  235.     offset  = (INT16U)y * DISP_MAX_X * 2 + (INT16U)x * 2;  /* Calculate position on the screen         */
  236.     pscr    = MK_FP(DISP_BASE, offset);
  237.     *pscr++ = cc;                                           /* Put character in video RAM               */
  238.     *pscr   = color;                                       /* Put video attribute in video RAM         */
  239. }
  240. /*$PAGE*/
  241. /*
  242. *********************************************************************************************************
  243. *                                 DISPLAY A STRING  AT 'X' & 'Y' COORDINATE
  244. *
  245. * Description : This function writes an ASCII string anywhere on the PC's screen.  This function writes
  246. *               directly to video RAM instead of using the BIOS for speed reasons.  It assumed that the 
  247. *               video adapter is VGA compatible.  Video RAM starts at absolute address 0x000B8000.  Each 
  248. *               character on the screen is composed of two bytes: the ASCII character to appear on the 
  249. *               screen followed by a video attribute.  An attribute of 0x07 displays the character in 
  250. *               WHITE with a black background.
  251. *
  252. * Arguments   : x      corresponds to the desired column on the screen.  Valid columns numbers are from
  253. *                      0 to 79.  Column 0 corresponds to the leftmost column.
  254. *               y      corresponds to the desired row on the screen.  Valid row numbers are from 0 to 24.
  255. *                      Line 0 corresponds to the topmost row.
  256. *               s      Is the ASCII string to display.  You can also specify a string containing 
  257. *                      characters with numeric values higher than 128.  In this case, special character 
  258. *                      based graphics will be displayed.
  259. *               color  specifies the foreground/background color to use (see PC.H for available choices)
  260. *                      and whether the characters will blink or not.
  261. *
  262. * Returns     : None
  263. *********************************************************************************************************
  264. */
  265. void PC_DispStr (INT8U x, INT8U y, INT8U *s, INT8U color) KCREENTRANT
  266. {
  267.     INT8U  far *pscr;
  268.     INT16U      offset;
  269.     offset  = (INT16U)y * DISP_MAX_X * 2 + (INT16U)x * 2;   /* Calculate position of 1st character     */
  270.     pscr    = MK_FP(DISP_BASE, offset);
  271.     while (*s) {
  272.         *pscr++ = *s++;                                     /* Put character in video RAM              */
  273.         *pscr++ = color;                                    /* Put video attribute in video RAM        */
  274.     }
  275. }
  276. /*$PAGE*/
  277. /*
  278. *********************************************************************************************************
  279. *                                             RETURN TO DOS
  280. *
  281. * Description : This functions returns control back to DOS by doing a 'long jump' back to the saved
  282. *               location stored in 'PC_JumpBuf'.  The saved location was established by the function
  283. *               'PC_DOSSaveReturn()'.  After execution of the long jump, execution will resume at the 
  284. *               line following the 'set jump' back in 'PC_DOSSaveReturn()'.  Setting the flag 
  285. *               'PC_ExitFlag' to TRUE ensures that the 'if' statement in 'PC_DOSSaveReturn()' executes.
  286. *
  287. * Arguments   : None
  288. *
  289. * Returns     : None
  290. *********************************************************************************************************
  291. */
  292. void PC_DOSReturn (void) KCREENTRANT
  293. {
  294.     PC_ExitFlag = TRUE;                                    /* Indicate we are returning to DOS         */
  295.     longjmp(PC_JumpBuf, 1);                                /* Jump back to saved environment           */
  296. }
  297. /*$PAGE*/
  298. /*
  299. *********************************************************************************************************
  300. *                                        SAVE DOS RETURN LOCATION
  301. *
  302. * Description : This function saves the location of where we are in DOS so that it can be recovered.
  303. *               This allows us to abort multitasking under uC/OS-II and return back to DOS as if we had
  304. *               never left.  When this function is called by 'main()', it sets 'PC_ExitFlag' to FALSE
  305. *               so that we don't take the 'if' branch.  Instead, the CPU registers are saved in the
  306. *               long jump buffer 'PC_JumpBuf' and we simply return to the caller.  If a 'long jump' is
  307. *               performed using the jump buffer then, execution would resume at the 'if' statement and
  308. *               this time, if 'PC_ExitFlag' is set to TRUE then we would execute the 'if' statements and
  309. *               restore the DOS environment.
  310. *
  311. * Arguments   : None
  312. *
  313. * Returns     : None
  314. *********************************************************************************************************
  315. */
  316. void PC_DOSSaveReturn (void) KCREENTRANT
  317. {
  318. #if OS_CRITICAL_METHOD == 3
  319.     OS_CPU_SR cpu_sr;
  320. #endif
  321.     PC_ExitFlag  = FALSE;                                  /* Indicate that we are not exiting yet!    */
  322.     OSTickDOSCtr =     1;                                  /* Initialize the DOS tick counter          */
  323.     PC_TickISR   = PC_VectGet(VECT_TICK);                  /* Get MS-DOS's tick vector                 */
  324.     
  325.     OS_ENTER_CRITICAL();
  326.     PC_VectSet(VECT_DOS_CHAIN, PC_TickISR);                /* Store MS-DOS's tick to chain             */
  327.     OS_EXIT_CRITICAL();
  328.     
  329.     setjmp(PC_JumpBuf);                                    /* Capture where we are in DOS              */
  330.     if (PC_ExitFlag == TRUE) {                             /* See if we are exiting back to DOS        */
  331.         OS_ENTER_CRITICAL();
  332.         PC_SetTickRate(18);                                /* Restore tick rate to 18.2 Hz             */
  333.         PC_VectSet(VECT_TICK, PC_TickISR);                 /* Restore DOS's tick vector                */
  334.         OS_EXIT_CRITICAL();
  335.         PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);  /* Clear the display                        */
  336.         exit(0);                                           /* Return to DOS                            */
  337.     }
  338. }
  339. /*$PAGE*/
  340. /*
  341. *********************************************************************************************************
  342. *                                       ELAPSED TIME INITIALIZATION
  343. *
  344. * Description : This function initialize the elapsed time module by determining how long the START and
  345. *               STOP functions take to execute.  In other words, this function calibrates this module
  346. *               to account for the processing time of the START and STOP functions.
  347. *
  348. * Arguments   : None.
  349. *
  350. * Returns     : None.
  351. *********************************************************************************************************
  352. */
  353. void PC_ElapsedInit(void) KCREENTRANT
  354. {
  355.     PC_ElapsedOverhead = 0;
  356.     PC_ElapsedStart();
  357.     PC_ElapsedOverhead = PC_ElapsedStop();
  358. }
  359. /*$PAGE*/
  360. /*
  361. *********************************************************************************************************
  362. *                                         INITIALIZE PC'S TIMER #2
  363. *
  364. * Description : This function initialize the PC's Timer #2 to be used to measure the time between events.
  365. *               Timer #2 will be running when the function returns.
  366. *
  367. * Arguments   : None.
  368. *
  369. * Returns     : None.
  370. *********************************************************************************************************
  371. */
  372. data INT16U TickCount;
  373. void UserTickTimer(void) KCREENTRANT
  374. {
  375. TickCount++;
  376. }
  377. void PC_ElapsedStart(void) KCREENTRANT
  378. {
  379. //
  380. // INT8U vdata;
  381. //
  382. //
  383. //    vdata  = (INT8U)inp(0x61);                              /* Disable timer #2                         */
  384. //    vdata &= 0xFE;
  385. //    outp(0x61, vdata);
  386. //    outp(TICK_T0_8254_CWR,  TICK_T0_8254_CTR2_MODE0);      /* Program timer #2 for Mode 0              */
  387. //    outp(TICK_T0_8254_CTR2, 0xFF);
  388. //    outp(TICK_T0_8254_CTR2, 0xFF);
  389. //    vdata |= 0x01;                                          /* Start the timer                          */
  390. //    outp(0x61, vdata);
  391.     TickCount=0;
  392. }
  393. /*$PAGE*/
  394. /*
  395. *********************************************************************************************************
  396. *                                 STOP THE PC'S TIMER #2 AND GET ELAPSED TIME
  397. *
  398. * Description : This function stops the PC's Timer #2, obtains the elapsed counts from when it was
  399. *               started and converts the elapsed counts to micro-seconds.
  400. *
  401. * Arguments   : None.
  402. *
  403. * Returns     : The number of micro-seconds since the timer was last started.
  404. *
  405. * Notes       : - The returned time accounts for the processing time of the START and STOP functions.
  406. *               - 54926 represents 54926S-16 or, 0.838097 which is used to convert timer counts to
  407. *                 micro-seconds.  The clock source for the PC's timer #2 is 1.19318 MHz (or 0.838097 uS)
  408. *********************************************************************************************************
  409. */
  410. INT16U PC_ElapsedStop(void) KCREENTRANT
  411. {
  412.     return TickCount;
  413. //    INT8U  vdata;
  414. //    INT8U  low;
  415. //    INT8U  high;
  416. //    INT16U cnts;
  417. //
  418. //
  419. //    vdata  = inp(0x61);                                           /* Disable the timer                  */
  420. //    vdata &= 0xFE;
  421. //    outp(0x61, vdata);
  422. //    outp(TICK_T0_8254_CWR, TICK_T0_8254_CTR2_LATCH);             /* Latch the timer value              */
  423. //    low  = inp(TICK_T0_8254_CTR2);
  424. //    high = inp(TICK_T0_8254_CTR2);
  425. //    cnts = (INT16U)0xFFFF - (((INT16U)high << 8) + (INT16U)low); /* Compute time it took for operation */
  426. //    return ((INT16U)((ULONG)cnts * 54926L >> 16) - PC_ElapsedOverhead);
  427. }
  428. /*$PAGE*/
  429. /*
  430. *********************************************************************************************************
  431. *                                       GET THE CURRENT DATE AND TIME
  432. *
  433. * Description: This function obtains the current date and time from the PC.
  434. *
  435. * Arguments  : s     is a pointer to where the ASCII string of the current date and time will be stored.
  436. *                    You must allocate at least 19 bytes (includes the NUL) of storage in the return 
  437. *                    string.
  438. *
  439. * Returns    : none
  440. *********************************************************************************************************
  441. */
  442. void PC_GetDateTime (char *s) KCREENTRANT
  443. {
  444.     struct time now;
  445.     struct date today;
  446.     gettime(&now);
  447.     getdate(&today);
  448.     sprintf(s, "%02bd-%02bd-%02bd  %02bd:%02bd:%02bd",
  449.                today.da_mon,
  450.                today.da_day,
  451.                today.da_year,
  452.                now.ti_hour,
  453.                now.ti_min,
  454.                now.ti_sec);
  455. }
  456. /*$PAGE*/
  457. /*
  458. *********************************************************************************************************
  459. *                                        CHECK AND GET KEYBOARD KEY
  460. *
  461. * Description: This function checks to see if a key has been pressed at the keyboard and returns TRUE if
  462. *              so.  Also, if a key is pressed, the key is read and copied where the argument is pointing
  463. *              to.
  464. *
  465. * Arguments  : c     is a pointer to where the read key will be stored.
  466. *
  467. * Returns    : TRUE  if a key was pressed
  468. *              FALSE otherwise
  469. *********************************************************************************************************
  470. */
  471. BOOLEAN PC_GetKey (INT16S *c) KCREENTRANT
  472. {
  473.     if (kbhit()) {                                         /* See if a key has been pressed            */
  474.         *c = getch();                                      /* Get key pressed                          */
  475.         return (TRUE);
  476.     } else {
  477.         *c = 0x00;                                         /* No key pressed                           */
  478.         return (FALSE);
  479.     }
  480. }
  481. /*$PAGE*/
  482. /*
  483. *********************************************************************************************************
  484. *                                      SET THE PC'S TICK FREQUENCY
  485. *
  486. * Description: This function is called to change the tick rate of a PC.
  487. *
  488. * Arguments  : freq      is the desired frequency of the ticker (in Hz)
  489. *
  490. * Returns    : none
  491. *
  492. * Notes      : 1) The magic number 2386360 is actually twice the input frequency of the 8254 chip which
  493. *                 is always 1.193180 MHz.
  494. *              2) The equation computes the counts needed to load into the 8254.  The strange equation
  495. *                 is actually used to round the number using integer arithmetic.  This is equivalent to
  496. *                 the floating point equation:
  497. *
  498. *                             1193180.0 Hz
  499. *                     count = ------------ + 0.5
  500. *                                 freq
  501. *********************************************************************************************************
  502. */
  503. void PC_SetTickRate (INT16U freq) KCREENTRANT
  504. {
  505.     INT16U count;
  506.     if (freq == 18) {                            /* See if we need to restore the DOS frequency        */
  507.         count = 0;
  508.     } else if (freq > 0) {                        
  509.                                                  /* Compute 8254 counts for desired frequency and ...  */
  510.                                                  /* ... round to nearest count                         */
  511.         count = (INT16U)(((INT32U)2386360L / freq + 1) >> 1); 
  512.     } else {
  513.         count = 0;
  514.     }
  515.     outp(TICK_T0_8254_CWR,  TICK_T0_8254_CTR0_MODE3); /* Load the 8254 with desired frequency          */  
  516.     outp(TICK_T0_8254_CTR0, count & 0xFF);            /* Low  byte                                     */
  517.     outp(TICK_T0_8254_CTR0, (count >> 8) & 0xFF);     /* High byte                                     */
  518. }
  519. /*$PAGE*/
  520. /*
  521. *********************************************************************************************************
  522. *                                        OBTAIN INTERRUPT VECTOR
  523. *
  524. * Description: This function reads the pointer stored at the specified vector.
  525. *
  526. * Arguments  : vect  is the desired interrupt vector number, a number between 0 and 255.
  527. *
  528. * Returns    : none
  529. *********************************************************************************************************
  530. */
  531. void *PC_VectGet (INT8U vect) KCREENTRANT
  532. {
  533.     return (getvect(vect));
  534. }
  535. /*
  536. *********************************************************************************************************
  537. *                                        INSTALL INTERRUPT VECTOR
  538. *
  539. * Description: This function sets an interrupt vector in the interrupt vector table.
  540. *
  541. * Arguments  : vect  is the desired interrupt vector number, a number between 0 and 255.
  542. *              isr   is a pointer to a function to execute when the interrupt or exception occurs.
  543. *
  544. * Returns    : none
  545. *********************************************************************************************************
  546. */
  547. void PC_VectSet (INT8U vect, void (*isr)(void)) KCREENTRANT
  548. {
  549.     setvect(vect, (void interrupt (*)(void))isr);
  550. }