/* << MSC V5.1 >> *************************************************************
**
**	KEY.LIB  for FMRｼﾘｰｽﾞ & PC98
**
**	CREATE : 1990.07.03
**	FINISH : 1990.07.03
**
**	< NOTES >
**	TABS = 4
**
**	< HISTORY >
**	1990.07.03 : CREATE
**	1991.01.17 : FMR用とPC98用を同じｿｰｽにした。
**
**	All Rights Reserved, Copyright (C) Y.Hirata 1990-1991.
**
**	Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include "kyb.h"

#ifdef FMR

/****************************  10us 単位でのWAIT  ****************************/
void soft_time( unsigned short waitcount )
{
	union	REGS	regs ;

	regs.x.cx = waitcount ;

	int86( 0xFD,&regs,&regs ) ;

	return ;
}

/******************************************************************************
	KEY_read : 一文字入力(キーボード)
	< RETURN >
	文字コード, 入力なしの場合には 0 を返す｡
******************************************************************************/
unsigned KEY_read( waitsw, encode )
unsigned	waitsw ;	/*  キー入力待ち指定 : 0 - 入力待ち				*/
						/*					 : 1 - 入力待ちなし			*/
unsigned	*encode ;	/*  エンコード情報								*/
{
	union	REGS	regs ;

	regs.h.ah = 0x09 ;
	regs.h.al = waitsw ;

	int86( KEY_INT,&regs,&regs ) ;

	if ( regs.h.ah==0x00 ) {
		if ( regs.h.dh==0xff ) {			/*  入力文字なし	*/
			*encode = 0 ;
			return(0) ;
		} else {							/*  入力文字あり	*/
			*encode = regs.x.bx ;
			return( regs.h.dl ) ;
		}
	}
	*encode = 0 ;
	return(0) ;
}

#endif

/******************************************************************************
	KEY_matrix : マトリクス入力
******************************************************************************/
int KEY_matrix( matrix )
char	*matrix ;		/*  マトリクス情報( 16 ﾊﾞｲﾄ )					*/
{
	union	REGS	regs ;
	struct	SREGS	sregs ;
	char	matx[16] ;
#ifdef PC98
	int		c ;
#endif

#ifdef FMR

	regs.h.ah = 0x0A ;
	regs.h.al = 0x00 ;
	regs.x.di = (unsigned int)matx ;

	segread( &sregs ) ;
	int86x( KEY_INT,&regs,&regs,&sregs ) ;

	memcpy( matrix,matx,16 ) ;

	return( regs.h.ah ) ;

#elif defined( PC98 )

	for ( c=0; c<16; c++ ) {
		regs.h.ah = 0x04 ;
		regs.h.al = c ;
		segread( &sregs ) ;
		int86x( KEY_INT,&regs,&regs,&sregs ) ;
		matx[c] = regs.h.ah ;
	}

	memcpy( matrix,matx,16 ) ;

	return( ZERO ) ;

#endif
}

/******************************************************************************
	KEY_test : マトリクスからキーが押されているかどうかをチェックする。
******************************************************************************/
int KEY_test( matrix,keyadrs )
char	*matrix ;		/*  マトリクス情報( 16 ﾊﾞｲﾄ )					*/
char	keyadrs ;		/*  キーアドレス								*/
{
	unsigned char	testbit ;
	int		c ;
	int		byteoff ;

	testbit = 0x01 ;
	for ( c=0; c<(keyadrs%8); c++ ) testbit <<= 1 ;
	byteoff = keyadrs / 8 ;
	if ( (matrix[byteoff] & testbit) == testbit ) return( TRUE ) ;

	return( FALSE ) ;
}

/******************************************************************************
	KEY_bufcls : バッファクリア
******************************************************************************/
int KEY_bufcls()
{
#ifdef FMR

	union	REGS	regs ;

	regs.h.ah = 0x06 ;
	regs.h.al = 0x00 ;

	int86( KEY_INT,&regs,&regs ) ;

	return( regs.h.ah ) ;

#elif defined( PC98 )

	bdos( 12,0,0 ) ;

	return( ZERO ) ;

#endif
}

/******************************  ｷｰBREAK 待ち  *******************************/
void KEY_break( char keyadrs )
{
	char	matrix[16] ;

	do {
		KEY_bufcls() ;
		KEY_matrix( matrix ) ;
	} while ( KEY_test( matrix,keyadrs ) ) ;

}

/*******************************  ｷｰ押下ﾁｪｯｸ  ********************************/
int KEY_hitchk()
{
	char	matrix[16] ;
	char	keyon ;
	int		c ;

	KEY_matrix( matrix ) ;

	keyon = FALSE ;
	for ( c=0; c<16; c++ ) {
		if ( matrix[c] ) keyon = TRUE ;
	}

	return( keyon ) ;
}

/****************************  Yes/No ｷｰ入力する  ****************************/
int KEY_yesno()
{
	int		ret ;
	char	matrix[16] ;
	char	keyend ;

	ret = 0 ;
	keyend = FALSE ;

	KEY_break( KEY_CR ) ;

#ifdef FMR
	KEY_break( TKEY_CR ) ;
	KEY_break( KEY_EXEC ) ;
#endif

	KEY_bufcls() ;
	do {
		KEY_matrix( matrix ) ;
		if ( KEY_test( matrix,KEY_N ) ||
				KEY_test( matrix,KEY_ESC ) ) {
			ret = FALSE ;
			keyend = KEY_N ;
			KEY_break( KEY_N ) ;
			KEY_break( KEY_ESC ) ;
		} else if ( KEY_test( matrix,KEY_Y ) ||
#ifdef FMR
				KEY_test( matrix,KEY_EXEC ) ||
				KEY_test( matrix,TKEY_CR ) ||
#endif
				KEY_test( matrix,KEY_CR ) ) {
			ret = TRUE ;
			keyend = KEY_Y ;
			KEY_break( KEY_Y ) ;
			KEY_break( KEY_CR ) ;
#ifdef FMR
			KEY_break( TKEY_CR ) ;
			KEY_break( KEY_EXEC ) ;
#endif
		} else if ( KEY_test( matrix,KEY_BREAK ) ) {
			ret = FALSE ;
			keyend = KEY_BREAK ;
			KEY_break( KEY_BREAK ) ;
		}
	} while ( !keyend ) ;

	KEY_bufcls() ;

	return( ret ) ;
}

