home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / his / sample / key.c next >
C/C++ Source or Header  |  1995-06-20  |  3KB  |  137 lines

  1. /***********************************************************************
  2.  
  3.                         キーボード割り込みサンプル
  4.  
  5.           1995.6.12                                by ちょもらんま
  6.  
  7. ***********************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <his.h>
  11. #include <egb.h>
  12.  
  13. /****************** キーボード割り込みハンドラ *******************/
  14.  
  15. #define KEYintNumber 1
  16. #define KEYRegister  0x600
  17. #define LEFT         0x4f
  18. #define RIGHT        0x51
  19. #define BLACK        0
  20. #define WHITE        15
  21.  
  22. #define X0           310
  23. #define Y_LEVEL      150
  24. #define TOWNS        73
  25. #define MOVE         10
  26.  
  27. #define ICONSIZE     32
  28. #define ICONOFF      0x28000
  29. #define SYSROM       0x108
  30.  
  31. void putIcon( int number , int x , int y );
  32. void eraseIcon( int x , int y );
  33.  
  34. int x;
  35.  
  36. #define EGB_worksize 1536
  37. char EGB_work[ EGB_worksize ];
  38.  
  39. #define Stacksize 1000
  40. char stackArea[ Stacksize ];
  41.  
  42. /************************* 割り込みハンドラ **********************/
  43.  
  44. void KEYhandler( void )
  45. {
  46.     static int preCode,old_x;
  47.     int k;
  48.  
  49.     k = _inb( KEYRegister );
  50.  
  51.     if( ( k & 0x80 ) != 0 )
  52.     {
  53.         /* 1バイト目のキーデータ */
  54.         preCode = k;
  55.         return;
  56.     }
  57.  
  58.     /* 2バイト目のキーデータ */
  59.     if( ( ( preCode & 0x10 ) == 0 ) || ( ( preCode & 0xf0 ) == 0xf0 ) )
  60.     {
  61.         old_x = x;
  62.         /* メイクコードのときのみ動かす */
  63.         if( k == LEFT )
  64.         {
  65.             x -= MOVE;
  66.         }
  67.         else if( k == RIGHT )
  68.         {
  69.             x += MOVE;
  70.         }
  71.         eraseIcon( old_x , Y_LEVEL );
  72.         putIcon( TOWNS , x , Y_LEVEL );
  73.     }
  74. }
  75.  
  76. void main( void )
  77. {
  78.     /*-------------------- 画面初期化 -----------------------*/
  79.     EGB_init( EGB_work , EGB_worksize );
  80.     x = X0;
  81.     putIcon( TOWNS , x , Y_LEVEL );
  82.  
  83.     printf( "\f" );
  84.     printf( "[←]キーで左に移動\n" );
  85.     printf( "[→]キーで右に移動\n" );
  86.     printf( "画面の端に達したら終了\n" );
  87.  
  88.     /******************** 割り込み設定 ***********************/
  89.     HIS_stackArea( stackArea , Stacksize );
  90.     HIS_setHandler( KEYintNumber , KEYhandler );
  91.     HIS_enableInterrupt( KEYintNumber );
  92.  
  93.     /***************** 割り込みハンドラの処理 ****************/
  94.     while( ( 0 < x ) && ( x < 640 - ICONSIZE ) );
  95.  
  96.     /****************** 割り込み処理の終了 *******************/
  97.     HIS_detachHandler( KEYintNumber );
  98. }
  99.  
  100.  
  101. /*------------------------- アイコン表示 ---------------------------*/
  102.  
  103. void putIcon( int number , int x , int y )
  104. {
  105.     static char parameter[ 4 + 2 + 2*4 ];
  106.  
  107.     DWORD( parameter +  0 ) = ICONOFF+number*ICONSIZE*ICONSIZE/4;
  108.     WORD(  parameter +  4 ) = SYSROM;
  109.     WORD(  parameter +  6 ) = x ;
  110.     WORD(  parameter +  8 ) = y ;
  111.     WORD(  parameter + 10 ) = x + ICONSIZE - 1 ;
  112.     WORD(  parameter + 12 ) = y + ICONSIZE - 1 ;
  113.     EGB_color        ( EGB_work , 0 , WHITE );
  114.     EGB_paintMode    ( EGB_work , 0x02 );
  115.     EGB_putBlockColor( EGB_work , 0 , parameter    );
  116.  
  117.     return;
  118. }
  119.  
  120. /*------------------------- アイコン消去 ---------------------------*/
  121.  
  122. void eraseIcon( int x , int y )
  123. {
  124.     static char parameter[ 8 ];
  125.  
  126.     WORD(  parameter +  0 ) = x ;
  127.     WORD(  parameter +  2 ) = y ;
  128.     WORD(  parameter +  4 ) = x + ICONSIZE;
  129.     WORD(  parameter +  6 ) = y + ICONSIZE;
  130.     EGB_paintMode( EGB_work , 0x22 );
  131.     EGB_color    ( EGB_work , 0 , BLACK );
  132.     EGB_color    ( EGB_work , 2 , BLACK );
  133.     EGB_rectangle( EGB_work , parameter    );
  134.  
  135.     return;
  136. }
  137.