home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / his / source / hisl10.c < prev    next >
C/C++ Source or Header  |  1995-06-20  |  4KB  |  152 lines

  1. /***********************************************************************
  2.  *                                                                     *
  3.  *                    ハードウェア割り込み支援ライブラリ               *
  4.  *                                                                     *
  5.  *        1995.6.12                                  by ちょもらんま   *
  6.  *                                                                     *
  7.  ***********************************************************************/
  8.  
  9. #include <hisinner.h>
  10.  
  11. /******************************* 外部変数 ******************************/
  12.  
  13. /*----------------- ユーザー割り込みハンドラ記録用構造体 --------------*/
  14.  
  15. userHandler_t userHandler[ HardwareIntTypes ];
  16.  
  17.  
  18. /*--- 旧割り込みハンドラアドレス&割り込みマスクレジスタの記録状態 ----*/
  19.  
  20. intInfo *topIntInfo[ HardwareIntTypes ] =
  21. {
  22.     NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  23.     NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
  24. };
  25.  
  26.  
  27. /************************ 割り込みハンドラの登録 ***********************/
  28.  
  29. int HIS_setHandler( int intnum, void (*handler)() )
  30. {
  31.     int retValue = HIS_OtherHandler;
  32.     intInfo *newInfo,*preInfo;
  33.     _Handler HardIntEntryX;
  34.  
  35.     /*--------------- 割り込み番号は正常か? --------------*/
  36.     if( HIS_checkIntNumber( intnum ) == HIS_IllegalIntNumber )
  37.     {
  38.         return HIS_IllegalIntNumber;
  39.     }
  40.  
  41.     /*----- 割り込みハンドラ記録変数のサイズは予定通り(8バイト)か?-----*/
  42.     if( sizeof( userHandler_t ) != 8 )
  43.     {
  44.         return HIS_UnexpectedSize;
  45.     }
  46.  
  47.     /*--------- 旧割り込みハンドラを退避する場所を確保 ------*/
  48.     if( ( newInfo = malloc( sizeof( intInfo ) ) ) == NULL )
  49.     {
  50.         return HIS_OutofMemory;
  51.     }
  52.     newInfo->nextInfo = NULL;
  53.  
  54.     /*--------------- 旧割り込みハンドラを退避 --------------*/
  55.     if( topIntInfo[ intnum ] == NULL )
  56.     {
  57.         /* 初めての場合 */
  58.         topIntInfo[ intnum ] = newInfo;
  59.         retValue = HIS_NoError;
  60.  
  61.         /* リアル側ハンドラ退避     */
  62.         newInfo->RealHandler   = _getrvect( intnum + HardVector );
  63.         /* ネイティブ側ハンドラ退避 */
  64.         newInfo->NativeHandler = _getpvect( intnum + HardVector );
  65.     }
  66.     else
  67.     {
  68.         /* 先客がいる場合 */
  69.         preInfo = topIntInfo[ intnum ];
  70.         while( preInfo->nextInfo != NULL )
  71.         {
  72.             preInfo = preInfo->nextInfo;
  73.         }
  74.         preInfo->nextInfo = newInfo;
  75.         retValue = HIS_OtherHandler;
  76.  
  77.         /* 旧ユーザハンドラ退避 */
  78.         newInfo->NativeHandler = (_Handler)(userHandler[ intnum ].handlerAdr);
  79.         newInfo->dataSegment = userHandler[ intnum ].dataSegment;
  80.     }
  81.  
  82.     /*--------------------- IMR退避 --------------------*/
  83.     newInfo->IMR = HIS_checkMask( intnum );
  84.  
  85.     /*----------------- 割り込みの一時禁止 ----------------*/
  86.     HIS_disableAllInt();
  87.  
  88.     /*--------------- ユーザのハンドラを登録 --------------*/
  89.     _FP_OFF( userHandler[ intnum ].handlerAdr ) = (unsigned)handler;
  90.     _FP_SEG( userHandler[ intnum ].handlerAdr ) = HIS_getCS();
  91.     userHandler[ intnum ].dataSegment = HIS_getDS();
  92.  
  93.     switch( intnum )
  94.     {
  95.         case 0 :
  96.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry0;
  97.             break;
  98.         case 1 :
  99.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry1;
  100.             break;
  101.         case 2 :
  102.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry2;
  103.             break;
  104.         case 3 :
  105.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry3;
  106.             break;
  107.         case 4 :
  108.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry4;
  109.             break;
  110.         case 5 :
  111.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry5;
  112.             break;
  113.         case 6 :
  114.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry6;
  115.             break;
  116.         case 7 :
  117.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry7;
  118.             break;
  119.         case 8 :
  120.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry8;
  121.             break;
  122.         case 9 :
  123.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry9;
  124.             break;
  125.         case 10 :
  126.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry10;
  127.             break;
  128.         case 11 :
  129.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry11;
  130.             break;
  131.         case 12 :
  132.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry12;
  133.             break;
  134.         case 13 :
  135.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry13;
  136.             break;
  137.         case 14 :
  138.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry14;
  139.             break;
  140.         case 15 :
  141.             _FP_OFF( HardIntEntryX ) = (unsigned int)HardIntEntry15;
  142.             break;
  143.     }
  144.     _FP_SEG( HardIntEntryX ) = HIS_getCS();
  145.     _setrpvectp( intnum + HardVector , HardIntEntryX );
  146.  
  147.     /*------------------- 割り込みの許可 ------------------*/
  148.     HIS_enableAllInt();
  149.  
  150.     return retValue;
  151. }
  152.