/* << 386ASM V2.0 & High C V1.4 >> ********************************************
**
**	ﾊﾟｵﾊﾟｵのﾗｲﾌﾞﾗﾘ用ﾍｯﾀﾞ
**
**	1991.04.13 : CREATE
**	1991.05.11 : FINISH
**
**	< History >
**	1991.04.13 : CREATE
**
**	< note > : TABS = 4
**
**	☆ 注意 ☆
**	  HC.LIBを使用する時は、ﾘﾝｸ時に以下の点に気をつけて下さい.
**	  (ﾘｱﾙｺｰﾄﾞとﾈｲﾃｨﾌﾞｺｰﾄﾞが混在するため. 詳細はDOS-Extenderﾕｰｻﾞｰｽﾞﾏﾆｭｱﾙを参照)
**	1.  最初にREALHEAD.OBJをﾘﾝｸすること. (FMC.LIBを使用する時等に必要)
**	2.  HC.LIBは最後にﾘﾝｸするようにすること.
**		また,次のｽｲｯﾁをﾘﾝｸ時に指定して下さい. (ﾘｱﾙ関係)
**		-realbreak _realend
**		-callbufs 2          ← 2〜64の範囲内でｱﾌﾟﾘで必要な値を設定します.
**		-maxibuf 62          ← これが最適ですが,ﾒﾓﾘの空き状況によっては減らし
**		                        た方がいいでしょう.
**		-maxreal 2000h       ← この例では,128KBのﾘｱﾙ領域を空けておきます. 
**		                        指定値は,ｱﾌﾟﾘで別のﾘｱﾙﾌﾟﾛｸﾞﾗﾑをEXECする場合に
**		                        必要な値とします. 通常は,0fffh でいいでしょう.
**  ※  ﾘｱﾙｺｰﾄﾞとﾈｲﾃｨﾌﾞｺｰﾄﾞが混在する処理をする時には、上記2点を守って下さい.
**	    まぁ、ﾘﾝｸ時にｴﾗｰにならなければ大丈夫だとは思いますが･･･
**
**	Programmed by Y.Hirata ( Nifty ID : NAB03321 )
******************************************************************************/

#define	TRUE		1
#define	FALSE		0
#define	ERROR		1
#define	NOERROR		0

/*-----------------------------------------------------------------------------
**	ﾃﾞｰﾀ型定義
-----------------------------------------------------------------------------*/
typedef unsigned char	uchar ;
typedef unsigned short	ushort ;
typedef unsigned long	ulong ;
typedef unsigned int	uint ;
typedef signed   char	schar ;
typedef signed   short	sshort ;
typedef signed   long	slong ;
typedef signed   int	sint ;

/*-----------------------------------------------------------------------------
**	乱数処理用
**	乱数のﾏｸﾛを使用する側で、stdio.h, stdlib.h, time.h を include して下さい！
-----------------------------------------------------------------------------*/
#define	RANDINIT		srand((unsigned int)clock())		/*  乱数初期化	*/
#define	RANDOM(x)		(rand()%(x))						/*  乱数 : 0〜x	*/

/*-----------------------------------------------------------------------------
**	ﾏｳｽ処理用
-----------------------------------------------------------------------------*/
#define	MOS_LEFT	1							/*  ﾏｳｽ左ｸﾘｯｸ				*/
#define	MOS_RIGHT	2							/*  ﾏｳｽ右ｸﾘｯｸ				*/
#define	MOS_BOTH	3							/*  ﾏｳｽ左右ｸﾘｯｸ				*/

/*-----------------------------------------------------------------------------
**	ｸﾞﾗﾌｨｯｸ処理用(ﾃｷｽﾄ処理含む)
-----------------------------------------------------------------------------*/
enum Values_for_ColorNo {
		C_BLACK, C_BLUE, C_RED, C_PURPLE,					/*  0 -  3	*/
		C_GREEN, C_LIGHTBLUE, C_YELLOW, C_WHITE,			/*  4 -  7	*/
		C_HBLACK, C_HBLUE, C_HRED, C_HPURPLE,				/*  8 - 11	*/
		C_HGREEN, C_HLIGHTBLUE, C_HYELLOW, C_HWHITE			/* 12 - 15	*/
	} ;

enum Values_for_Write_Mode {
		PSET, PRESET, OR, AND, XOR, NOT, MATTE, PASTEL,		/*  0 〜 7	*/
															/*  8 〜 15	*/
		DUMMY_1, OPAQUE, IMPSET, INPNOT, MASKSET, MASKRESET, MASKNOT
	} ;

#define	XCDOT		8							/*  文字ｻｲｽﾞ(x方向)			*/
#define	YCDOT		16							/*  文字ｻｲｽﾞ(y方向)			*/
#define	MAXLINE		30							/*  画面枠内最大行数		*/
#define	MAXVLINE	32							/*  描画領域内最大行数		*/
#define	MAXCOLM		80							/*  最大文字数( ANK文字 )	*/
#define	MAXVCOLM	128							/*  描画領域内最大文字数	*/

#define CRT_CTRL	   0x0FDA0					/*  CRTｺﾝﾄﾛｰﾙﾚｼﾞｽﾀ			*/
#define PALETTE_ADDR   0x0FD90					/*  ﾊﾟﾚｯﾄｺｰﾄﾞﾚｼﾞｽﾀ			*/
#define PALETTE_B_DATA 0x0FD92					/*  青色ﾊﾟﾚｯﾄﾃﾞｰﾀﾚｼﾞｽﾀ		*/
#define PALETTE_R_DATA 0x0FD94					/*  赤色ﾊﾟﾚｯﾄﾃﾞｰﾀﾚｼﾞｽﾀ		*/
#define PALETTE_G_DATA 0x0FD96					/*  緑色ﾊﾟﾚｯﾄﾃﾞｰﾀﾚｼﾞｽﾀ		*/

/*-----------------------------------------------------------------------------
**	致命的ｴﾗｰ処理用
-----------------------------------------------------------------------------*/
/*
**	INT24発生時の詳細情報格納用
*/
#ifndef _DOSERROR_DEFINED
	struct _DOSERROR {
	    short int	exterror ;					/*  拡張ｴﾗｰｺｰﾄﾞ				*/
	    char	class ;							/*  ｴﾗｰｸﾗｽ					*/
	    char	action ;						/*  ｴﾗｰ対処					*/
	    char	locus ;							/*  ｴﾗｰ発生場所				*/
    } ;
	#define _DOSERROR_DEFINED
#endif
/*
**	INT24復帰時の処理
*/
#define	INT24_IGNORE	0						/*  無視					*/
#define	INT24_RETRY		1						/*  再試行					*/
#define	INT24_ABORT		2						/*  ﾌﾟﾛｸﾞﾗﾑ中止				*/
#define	INT24_FAIL		3						/*  ﾌｧﾝｸｼｮﾝｺｰﾙ失敗			*/

/*-----------------------------------------------------------------------------
**	ﾄﾞﾗｲﾌﾞ種別定義
-----------------------------------------------------------------------------*/
#define	DRV_FD			0x00					/*  ﾌﾛｯﾋﾟｨﾃﾞｨｽｸ				*/
#define	DRV_HD			0x02					/*  ﾊｰﾄﾞﾃﾞｨｽｸ				*/
#define	DRV_RAM			0x03					/*  RAMﾃﾞｨｽｸ				*/
#define	DRV_ROM			0x05					/*  ROMﾄﾞﾗｲﾌﾞ				*/

/*-----------------------------------------------------------------------------
**	ﾃﾞﾊﾞｲｽ種別定義 (LOW 4bit:ﾕﾆｯﾄ番号)
-----------------------------------------------------------------------------*/
#define	DEV_FD			0x20					/*  ﾌﾛｯﾋﾟｨﾃﾞｨｽｸ				*/
#define	DEV_RAM			0x40					/*  RAMﾃﾞｨｽｸ				*/
#define	DEV_ROM			0x42					/*  ROMﾄﾞﾗｲﾌﾞ				*/
#define	DEV_HD			0xB0					/*  ﾊｰﾄﾞﾃﾞｨｽｸ				*/
#define	DEV_ERR			0xFF					/*  ???						*/

/*-----------------------------------------------------------------------------
**	ﾌｧｲﾙ関係用
-----------------------------------------------------------------------------*/
#define YEAR(d)			((((d) >> 9) & 0x7f) + 80)
#define MONTH(d)		(((d) >> 5) & 0x0f)
#define DATE(d)			((d) & 0x1f)
#define HOUR(d)			(((d) >> 11) & 0x1f)
#define MINUTE(d)		(((d) >> 5) & 0x3f)
#define SEC(d)			(((d) & 0x1f) * 2)

/*  ﾌｧｲﾙ属性	*/
#define DIR_RO			0x0001					/*  読出専用(書き込み不可)	*/
#define DIR_HID			0x0002					/*  隠しﾌｧｲﾙ(DIRｺﾏﾝﾄﾞ不可視)*/
#define DIR_SYS			0x0004					/*  ｼｽﾃﾑﾌｧｲﾙ				*/
#define DIR_VOL			0x0008					/*  ﾎﾞﾘｭｰﾑ名				*/
#define DIR_DIR			0x0010					/*  ｻﾌﾞﾃﾞｨﾚｸﾄﾘ				*/
#define DIR_ARC			0x0020					/*  ｱｰｶｲﾌﾞﾋﾞｯﾄ				*/

/*  ﾌｧｲﾙ検索情報	*/
#ifndef _FIND_T_DEFINED
	struct _find_t {
		char	reserved[21] ;					/*  MS-DOSが使用			*/
		char	attrib ;						/*  属性					*/
		ushort	wr_time ;						/*  更新時刻				*/
		ushort	wr_date ;						/*  更新日付				*/
		long	size ;							/*  ﾌｧｲﾙｻｲｽﾞ(ﾊﾞｲﾄ)			*/
		char	name[13] ;						/*  検索されたﾌｧｲﾙ名		*/
	} ;
	#define _FIND_T_DEFINED
#endif

#define	ERRSIZE		-1						/*  ﾌｧｲﾙが見つからない時のｻｲｽﾞ	*/

/*  ﾃﾞｨｽｸ情報		*/
#ifndef _DISKFREE_T_DEFINED
	struct _diskfree_t {
		unsigned	total_clusters ;			/*  全ｸﾗｽﾀ数				*/
		unsigned	avail_clusters ;			/*  使用可能ｸﾗｽﾀ数			*/
		unsigned	sectors_per_cluster ;		/*  ｾｸﾀ数/ｸﾗｽﾀ				*/
		unsigned	bytes_per_sector ;			/*  ﾊﾞｲﾄ数/ｾｸﾀ				*/
	};
	#define _DISKFREE_T_DEFINED
#endif

/*-----------------------------------------------------------------------------
**	関数ﾌﾟﾛﾄﾀｲﾌﾟ宣言
-----------------------------------------------------------------------------*/

/*･････････････････････････････････････････････････････････････････････････････
**	< FILE.C >
**	ﾌｧｲﾙ関係
･････････････････････････････････････････････････････････････････････････････*/
unsigned chmod( char *path,unsigned attr ) ;
void getdrive( unsigned *drv ) ;
void setdrive( unsigned drv,unsigned *maxdrv ) ;
int chdir( char *path ) ;
int mkdir( char *path ) ;
int rmdir( char *path ) ;
char *getcwd( char *path,int n ) ;
void setdta( struct _find_t *dta ) ;
unsigned findfirst( char *path,unsigned attr,struct _find_t *dta ) ;
unsigned findnext( struct _find_t *dta ) ;
long filesize( char *path ) ;
unsigned getdiskfree( unsigned drv,struct _diskfree_t *disk ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< REALCALL.ASM >
**	High C から REALﾌﾟﾛｼｼﾞｬを呼ぶ
･････････････････････････････････････････････････････････････････････････････*/
extern RealCall() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< CTRL.ASM >
**	CONTROLへのパラメタ転送
･････････････････････････････････････････････････････････････････････････････*/
extern CTRL_cmdline() ;
extern char CTRL_cmdline_data[] ;

/*･････････････････････････････････････････････････････････････････････････････
**	< INTR.ASM >
**	割り込みの禁止/解除
･････････････････････････････････････････････････････････････････････････････*/
extern _disable() ;
extern _enable() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< INOUTP.ASM >
**	ﾎﾟｰﾄ入出力
･････････････････････････････････････････････････････････････････････････････*/
extern unsigned short int inp( unsigned short int port ) ;
extern outp( unsigned short int port,unsigned short int value ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< VSYNC.ASM >
**	VSYNC割り込みの登録/解除
･････････････････････････････････････････････････････････････････････････････*/
extern int (*VSYNC_entry)() ;
extern VSYNC_init() ;
extern VSYNC_end() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< VKILL.ASM >
**	TBIOSのVSYNCﾁｪｯｸ処理へのﾊﾟｯﾁ
･････････････････････････････････････････････････････････････････････････････*/
extern int VSYNC_KILL_init() ;
extern int VSYNC_KILL_start() ;
extern int VSYNC_KILL_end() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< SYSINF.ASM >
**	ｼｽﾃﾑ(SETUP)情報の取得
･････････････････････････････････････････････････････････････････････････････*/
extern int SYS_getinf( unsigned char *sysbuf ) ;
extern int DRV_single() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< DRV.C >
**	ﾄﾞﾗｲﾌﾞ情報の取得
･････････････････････････････････････････････････････････････････････････････*/
uchar DRV_status( uchar drvno ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< POFF.ASM >
**	POFF / REBOOT
･････････････････････････････････････････････････････････････････････････････*/
extern poff() ;
extern reboot() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< SOFTIME.ASM >
**	10us単位でのWAIT
･････････････････････････････････････････････････････････････････････････････*/
extern SOFT_timer( unsigned short ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< INT24.ASM >
**	致命的ｴﾗｰの処理用(CTRL+Cﾏｽｸ設定含む)
･････････････････････････････････････････････････････････････････････････････*/
extern INT24errno ;
extern struct _DOSERROR INT24err ;
extern int (*INT24_entry)( unsigned,unsigned ) ;
extern INT24_init() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< VRAM.ASM >
**	VRAM直接書き込みﾙｰﾁﾝ
･････････････････････････････････････････････････････････････････････････････*/
extern int VRAM_color( int fcol,int bcol ) ;
extern int VRAM_page( int page ) ;
extern int VRAM_putstr( int x,int y,char *str ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< GRP.C >
**	ｸﾞﾗﾌｨｯｸﾙｰﾁﾝ
･････････････････････････････････････････････････････････････････････････････*/
extern char	*GRPwork ;
extern int	GRPpmode ;
extern int	GRPwmode ;
extern int	GRPfcolor ;
extern int	GRPbcolor ;
extern int	GRPpcolor ;
extern int	GRPmcolor ;
extern int	GRPwpage ;
int GRP_init( char *egbwork,int size ) ;
int GRP_paintMode( int mode ) ;
int GRP_writeMode( int mode ) ;
int GRP_color( int n,int color ) ;
int GRP_writePage( int page ) ;
int GRP_viewport( int x1,int y1,int x2,int y2 ) ;
void GRP_textatr( int t_sp,int f_st ) ;
void GRP_locate( int row,int column ) ;
int GRP_putstr( char *str ) ;
int GRP_printf( char *str,... ) ;
int GRP_get( int x1,int y1,int x2,int y2,unsigned int p,int bpp ) ;
int GRP_put( int x1,int y1,int x2,int y2,unsigned int p,int bpp ) ;
int GRP_line( int x1,int y1,int x2,int y2 ) ;
int GRP_box( int x1,int y1,int x2,int y2 ) ;
int GRP_triangle( int x1,int y1,int x2,int y2,int x3,int y3 ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< TEXT.C >
**	ﾃｷｽﾄ表示ﾙｰﾁﾝ(16色ﾓｰﾄﾞ:480line用)
･････････････････････････････････････････････････････････････････････････････*/
extern int	TEXTtabs ;
extern char	TEXTcrflg ;
int TEXT_init( char *egbwork,int size ) ;
void TEXT_pos( int *x,int *y ) ;
void TEXT_control( int sw ) ;
void TEXT_color( int col ) ;
void TEXT_backcolor( int col ) ;
void _TEXT_cursor( int x,int y ) ;
void TEXT_cursor( int sw ) ;
void TEXT_locate( int row,int column ) ;
void TEXT_cls( void ) ;
char _TEXT_gets( char *str ) ;
void TEXT_puts( char *str ) ;
void TEXT_scroll( char * ) ;
void TEXT_revscroll( char * ) ;
void _TEXT_cr( int mark ) ;
void TEXT_cr( void ) ;
void TEXT_bs( void ) ;
void TEXT_movecursor( char cursor ) ;
void _TEXT_putc( char c ) ;
void TEXT_putc( char c ) ;
void _TEXT_beep( int time,int count ) ;
void TEXT_beep( void ) ;
void TEXT_linecls( int mode ) ;
void TEXT_escattr( int mode ) ;
void _TEXT_putch( char c ) ;
int TEXT_esc( char c ) ;
void TEXT_putch( char c ) ;
void TEXT_putstr( char *str ) ;
int TEXT_printf( char *str,... ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< CONINIT.C >
**	ｺﾝｿｰﾙ初期化
･････････････････････････････････････････････････････････････････････････････*/
void coninit() ;

/*･････････････････････････････････････････････････････････････････････････････
**	< KEY.C >
**	ｷｰﾎﾞｰﾄﾞ処理( FMC関数ﾗｲﾌﾞﾗﾘ使用:link時にFMC関数ﾗｲﾌﾞﾗﾘを一緒にﾘﾝｸすること )
**	ｷｰｱﾄﾞﾚｽ等は、"KEY.H" を使用のこと.
･････････････････････････････････････････････････････････････････････････････*/
int KEY_test( char *matrix,char keyadrs ) ;
void KEY_make( char keyadrs ) ;
void KEY_break( char keyadrs ) ;
int KEY_hitchk( void ) ;
int KEY_matrix_check( char *matrix ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< WAIT.C >
**	時間待ち
･････････････････････････････････････････････････････････････････････････････*/
void wait( int sec ) ;

/*･････････････････････････････････････････････････････････････････････････････
**	< PAL.C >
**	ﾊﾟﾚｯﾄﾃﾞｰﾀの取得/設定
･････････････････････････････････････････････････････････････････････････････*/
void vsyncwait( void ) ;
void getpal( int palno,unsigned char *blue,unsigned char *red,unsigned char *green ) ;
void setpal( int palno,unsigned char blue,unsigned char red,unsigned char green,int sw ) ;

