home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix Heaven Sunny 2
/
APPARE2.BIN
/
oh_towns
/
his
/
sample
/
key.c
next >
Wrap
C/C++ Source or Header
|
1995-06-20
|
3KB
|
137 lines
/***********************************************************************
キーボード割り込みサンプル
1995.6.12 by ちょもらんま
***********************************************************************/
#include <stdio.h>
#include <his.h>
#include <egb.h>
/****************** キーボード割り込みハンドラ *******************/
#define KEYintNumber 1
#define KEYRegister 0x600
#define LEFT 0x4f
#define RIGHT 0x51
#define BLACK 0
#define WHITE 15
#define X0 310
#define Y_LEVEL 150
#define TOWNS 73
#define MOVE 10
#define ICONSIZE 32
#define ICONOFF 0x28000
#define SYSROM 0x108
void putIcon( int number , int x , int y );
void eraseIcon( int x , int y );
int x;
#define EGB_worksize 1536
char EGB_work[ EGB_worksize ];
#define Stacksize 1000
char stackArea[ Stacksize ];
/************************* 割り込みハンドラ **********************/
void KEYhandler( void )
{
static int preCode,old_x;
int k;
k = _inb( KEYRegister );
if( ( k & 0x80 ) != 0 )
{
/* 1バイト目のキーデータ */
preCode = k;
return;
}
/* 2バイト目のキーデータ */
if( ( ( preCode & 0x10 ) == 0 ) || ( ( preCode & 0xf0 ) == 0xf0 ) )
{
old_x = x;
/* メイクコードのときのみ動かす */
if( k == LEFT )
{
x -= MOVE;
}
else if( k == RIGHT )
{
x += MOVE;
}
eraseIcon( old_x , Y_LEVEL );
putIcon( TOWNS , x , Y_LEVEL );
}
}
void main( void )
{
/*-------------------- 画面初期化 -----------------------*/
EGB_init( EGB_work , EGB_worksize );
x = X0;
putIcon( TOWNS , x , Y_LEVEL );
printf( "\f" );
printf( "[←]キーで左に移動\n" );
printf( "[→]キーで右に移動\n" );
printf( "画面の端に達したら終了\n" );
/******************** 割り込み設定 ***********************/
HIS_stackArea( stackArea , Stacksize );
HIS_setHandler( KEYintNumber , KEYhandler );
HIS_enableInterrupt( KEYintNumber );
/***************** 割り込みハンドラの処理 ****************/
while( ( 0 < x ) && ( x < 640 - ICONSIZE ) );
/****************** 割り込み処理の終了 *******************/
HIS_detachHandler( KEYintNumber );
}
/*------------------------- アイコン表示 ---------------------------*/
void putIcon( int number , int x , int y )
{
static char parameter[ 4 + 2 + 2*4 ];
DWORD( parameter + 0 ) = ICONOFF+number*ICONSIZE*ICONSIZE/4;
WORD( parameter + 4 ) = SYSROM;
WORD( parameter + 6 ) = x ;
WORD( parameter + 8 ) = y ;
WORD( parameter + 10 ) = x + ICONSIZE - 1 ;
WORD( parameter + 12 ) = y + ICONSIZE - 1 ;
EGB_color ( EGB_work , 0 , WHITE );
EGB_paintMode ( EGB_work , 0x02 );
EGB_putBlockColor( EGB_work , 0 , parameter );
return;
}
/*------------------------- アイコン消去 ---------------------------*/
void eraseIcon( int x , int y )
{
static char parameter[ 8 ];
WORD( parameter + 0 ) = x ;
WORD( parameter + 2 ) = y ;
WORD( parameter + 4 ) = x + ICONSIZE;
WORD( parameter + 6 ) = y + ICONSIZE;
EGB_paintMode( EGB_work , 0x22 );
EGB_color ( EGB_work , 0 , BLACK );
EGB_color ( EGB_work , 2 , BLACK );
EGB_rectangle( EGB_work , parameter );
return;
}