/*****************************************************************
 *   Mouse driver access library for MS-DOS (FM-TOWNS) : mouse   *
 *                    Program made by K,Ajima                    *
 *                 Copyright  ajiyan soft l.t.d.                 *
 *****************************************************************/



#if 0
/*** mouse ***************************************************************

  ＦＭ−Ｒ  マウスドライバにアクセスするライブラリです。

ｍｏｓ＿ｘｘｘｘｘ（）			：  メイン関数
ｅｍｏｓ＿ｘｘｘｘｘ（）		：  エンハンスド関数

**************************************************************************/
#endif



#include <dos.h>



/********************************************************************
 *
 *		mos_xxxxx() 関数群
 *
 *
 *
 *
 *



				/* BIOS エラーコード */
#define MOS_NO_ERR	0



				/* mos_cursor() 引数 */
#define MOS_CURSOR_ON	1
#define MOS_CURSOR_OFF	0



				/* マウスボタン情報 */
#define	MOS_LEFT	1
#define	MOS_RIGHT	2



				/* コール条件 */
#define MOS_IF_POSITION		1
#define MOS_IF_LEFT_ON		2
#define MOS_IF_LEFT_OFF		4
#define MOS_IF_RIGHT_ON		8
#define MOS_IF_RIGHT_OFF	16



/********************************************************************
 *	マウスドライバ初期化
 *		ret: MOS_NO_ERR 正常終了
 *			 MOS_ERR    エラー
 ********************************************************************/
int _cdecl mos_init(void)
{
	union REGS regs;

	regs.h.ah=0x00;

	int86(0x99,& regs,& regs);

	return(regs.h.ah!=0);
}



/********************************************************************
 *	マウスドライバ終了
 *		ret: MOS_NO_ERR 正常終了
 *			 MOS_ERR    エラー
 ********************************************************************/
int _cdecl mos_end(void)
{
	union REGS regs;

	regs.h.ah=0x01;

	int86(0x99,& regs,& regs);

	return(regs.h.ah!=0);
}



/********************************************************************
 *	マウスカーソル ON/OFF 設定
 *		1. MOS_CURSOR_ON/MOS_CURSOR_OFF
 ********************************************************************/
void _fastcall mos_cursor(int mos_mode)
{
	union REGS regs;

	regs.h.ah=0x02;
	regs.h.al=(char)mos_mode;

	int86(0x99,& regs,& regs);
}



/********************************************************************
 *	マウス状態取得
 *		1. ボタン情報を格納するポインタ
 *		2. x 位置を格納するポインタ
 *		3. y 位置を格納するポインタ
 ********************************************************************/
void _fastcall mos_get_stat(int * mos_button,int * mos_x,int * mos_y)
{
	union REGS regs;

	regs.h.ah=0x03;

	int86(0x99,& regs,& regs);

	* mos_button = (int)regs.h.ch;
	* mos_x      =      regs.x.dx;
	* mos_y      =      regs.x.bx;
}



/********************************************************************
 *	マウス位置設定
 *		1. x 位置
 *		2. y 位置
 ********************************************************************/
void _fastcall mos_set_stat(int mos_x,int mos_y)
{
	union REGS regs;

	regs.h.ah=0x04;
	regs.x.dx=mos_x;
	regs.x.bx=mos_y;

	int86(0x99,& regs,& regs);
}



/********************************************************************
 *	マウスカーソル移動範囲設定
 *		1. x 最小値
 *		2. x 最大値
 *		3. y 最小値
 *		4. y 最大値
 ********************************************************************/
void _fastcall mos_set_movearea(
					int mos_xmin,int mos_xmax,
					int mos_ymin,int mos_ymax)
{
	union REGS regs;

	regs.h.ah=0x07;
	regs.x.dx=mos_xmax;
	regs.x.bx=mos_xmin;

	int86(0x99,& regs,& regs);



	regs.h.ah=0x08;
	regs.x.dx=mos_ymax;
	regs.x.bx=mos_ymin;

	int86(0x99,& regs,& regs);
}



/********************************************************************
 *	マウスカーソル形状設定
 *		1. x カーソル中心位置
 *		2. y カーソル中心位置
 *		3. カーソル形状データ
 *			+-------+---+-----------------------------------------+
 *			| ofset | s | mean                                    |
 *			+-------+---+-----------------------------------------+
 *			| 0000h | B | x ドット数                              |
 *			| 0001h | B | y ドット数                              |
 *			| 0002h | W | パレット番号                            |
 *			| 0004h | ? | AND パターン |_ ( x*y )/8 _| bytes      |
 *			| ????h | ? | XOR パターン          〃                |
 *			+-------+---+-----------------------------------------+
 ********************************************************************/
void _fastcall mos_set_cursorpat(int mos_x,int mos_y,void * mos_data)
{
	union REGS regs;
	struct SREGS sregs;

	regs.h.ah=0x09;
	regs.h.dh=(char)mos_x;
	regs.h.dl=(char)mos_y;
	regs.x.di=FP_OFF(mos_data);
	sregs.ds =FP_SEG(mos_data);

	int86x(0x99,& regs,& regs,& sregs);
}



/********************************************************************
 *	ユーザー割り込み処理登録
 *		1. コール条件
 *		2. 関数のポインタ
 ********************************************************************/
void _fastcall mos_set_func(int mos_mode,void (_cdecl _far * mos_func)(void) )
{
	union REGS regs;
	struct SREGS sregs;

	regs.h.ah=0x0b;
	regs.x.dx=mos_mode;
	regs.x.di=FP_OFF(mos_func);
	sregs.ds =FP_SEG(mos_func);

	int86x(0x99,& regs,& regs,& sregs);
}



/********************************************************************
 *	移動速度設定
 *		1. x 移動速度 (1-255)
 *		2. y 移動速度 (1-255)
 ********************************************************************/
void _fastcall mos_set_speed(int mos_x,int mos_y)
{
	union REGS regs;

	regs.h.ah=0x0c;
	regs.h.dh=(unsigned char)mos_x;
	regs.h.dl=(unsigned char)mos_y;

	int86(0x99,& regs,& regs);
}

