/* master.lib 		98雑用ライブラリ
 * Version 0.22j
 *
 *	mgr.h - master.lib を gr.lib用プログラムで使うヘッダファイル
 *
 *	master.lib 0.22d:	(C)1994 恋塚,Kazumi,steelman
 *	gr.lib 1.02:		(C)1990-92 metys, TAKA, Danna
 *
 *		※ gr.lib のすべての機能をカバーするわけではありません。
 *		   また、正しく互換をとっているとも限りません。
 *
 *		※ マクロでカバーするために引数を数回評価しているものが
 *		   あるので、その場合意図しない動作をする場合もあります。
 *
 *		※ あくまでもその場しのぎ的マクロなので、実行効率は
 *		   master.lib を直接使用する方が良くなるでせう。
 *
 *		※ master.lib の全機能が併用できます。まあ注意がいるのも
 *		   あるかもしれないけど。
 */
#ifndef __MGR_H
#define __MGR_H

#ifndef __MASTER_H
# include "master.h"
#endif

#if __MASTER_VERSION < 22
# error master.lib 0.22以上が必要です!!
#endif

/*
 *	type define
 */
#ifndef	_UNSIGNED_DEFINED
typedef unsigned char BYTE ;
typedef unsigned int WORD ;
typedef unsigned long DWORD ;
typedef char * PSTR ;
typedef char far * LPSTR ;
typedef int far * LPINT ;
typedef unsigned char far * LPBYTE ;
#define	_UNSIGNED_DEFINED
#endif

#define _MOUSE_INFO_DEFINED
typedef struct mouse_info MOUSE_INFO ;

#define	_FILE_INFO_DEFINED
#if __TURBOC__ > 0 && __TURBOC__ < 0x300
typedef struct find_t {
    char reserved[21] ;
    char attrib ;
    unsigned wr_time ;
    unsigned wr_date ;
    long size ;
    char name[13] ;
} ;
#endif
typedef struct find_t FILE_INFO ;

typedef	struct{
	WORD	seg,
			no;
} EMS_PHYS_PAGE;

/*
 *	error code
 */
#define		OK			0
#define		ER			-1
#define		CANCEL		0x1b
enum GR_ERROR {
	FILE_ER		= 0x100,
	OPEN_ER,
	READ_ER,
	WRITE_ER,
	FILEEND,
	FILECHG,
	MEMORY_ER	= 0x200,
	DATA_ER		= 0x300
};

/*	(旧バージョン互換用)	*/
#define		NG				1
#define		BFNT_NOTFOUND	-11
#define		BFNT_ILLIGAL	-12

/*
 * colors and attributes of TEXT VRAM
 */
#define	TXT_BLACK		TX_BLACK
#define	TXT_BLUE		TX_BLUE
#define	TXT_RED			TX_RED
#define	TXT_MAGENTA		TX_MAGENTA
#define	TXT_GREEN		TX_GREEN
#define	TXT_CYAN		TX_CYAN
#define	TXT_YELLOW		TX_YELLOW
#define	TXT_WHITE		TX_WHITE

#define	TXT_UNDERLINE	TX_UNDERLINE
#define	TXT_REVERSE		TX_REVERSE
#define	TXT_BLINK		TX_BLINK

/*
 *	"SetKey" set key code
 */
#define	KEY_ESC			K_ESC
#define	KEY_CR			K_CR
#define	KEY_TAB			K_TAB
#define	KEY_ROLLUP		K_ROLLUP
#define	KEY_ROLLDOWN	K_ROLLDOWN
#define	KEY_INS			K_INS
#define	KEY_DEL			K_DEL
#define	KEY_HELP		K_HELP
#define	KEY_HOMECLR		K_HOMECLR
#define	KEY_BS			K_BS
#define	KEY_UP			K_UP
#define	KEY_DOWN		K_DOWN
#define	KEY_LEFT		K_LEFT
#define	KEY_RIGHT		K_RIGHT

#define	KEY_SHIFT		K_SHIFT
#define	KEY_CAPS		K_CAPS
#define	KEY_KANA		K_KANA
#define	KEY_GRPH		K_GRPH
#define	KEY_CTRL		K_CTRL

#define	KEY_S_UP		K_S_UP
#define	KEY_S_DOWN		K_S_DOWN
#define	KEY_S_LEFT		K_S_LEFT
#define	KEY_S_RIGHT		K_S_RIGHT

/*
 *	graphic VRAM segment address
 */
#define		BLUE_P		0xa800		/*	青プレーン	*/
#define		RED_P		0xb000		/*	赤プレーン	*/
#define		GREEN_P		0xb800		/*	緑プレーン	*/
#define		INTENSITY_P	0xe000		/*	輝度プレーン*/

/*
 *	plane value defines for GRCG
 */
#define		GRCG_BLUE		1		/*	青プレーン	*/
#define		GRCG_RED		2		/*	赤プレーン	*/
#define		GRCG_GREEN		4		/*	緑プレーン	*/
#define		GRCG_INTENSITY	8		/*	輝度プレーン*/

#define cline(x1,y1,x2,y2,color)	grcg_setcolor(GC_RMW,color),\
									grcg_line(x1,y1,x2,y2),grcg_off()
#define gbox(x1,y1,x2,y2,color)		grcg_setcolor(GC_RMW,color),\
									grcg_boxfill(x1,y1,x2,y2),grcg_off()

#define timeStart()		vsync_start()
#define	timeStop()		vsync_end()
#define	timeSpent()		vsync_Count1
#define	timeSpent2()	vsync_Count2
#define	timeReset()		vsync_reset1()
#define	timeReset2()	vsync_reset2()
#define COUNT			vsync_Count1
#define COUNT2			vsync_Count2
#define	WaitVsync()		vsync_wait()

#define circlex(x,y,r,color)	grcg_setcolor(GC_RMW,color),\
								grcg_circle_x(x,y,r),grcg_off()

/*
 *	graphic
 */
#define	grVPage(page)		graph_showpage(page)
#define	grAPage(page)		graph_accesspage(page)
#define grStart()			bios30_push(),(bios30_tt_exist()&BIOS30_TT ? \
					bios30_setmode(BIOS30_NORMAL) : \
					(bios30_setline(25),bios30_setmode(BIOS30_NORMALLINE))),\
					graph_start(),memcpy(Palettes[8],Palettes[0],sizeof (Palettes[0])*8),palette_show()
#define grEnd()				graph_end(),bios30_pop()
#define	grOn()				graph_show()
#define	grOff()				graph_hide()
#define grPal(pal)			palette_set_all_16(pal),palette_show()
#define grPalTone(pal,tone)	palette_set_all_16(pal),\
							palette_settone((tone)*100/128),(PaletteTone=100)
#define	grPal1(color,r,g,b)	palette_set(color,(r)*17,(g)*17,(b)*17),\
							palette_show()
#define gr200(lower)		graph_200line(lower)
#define gr400()				graph_400line()
#define grCls()				graph_clear()
#define grBox(x1,y1,x2,y2,color)	gbox(x1,y1,x2,y2,color)
#define grByteBox(x1,y1,x2,y2,color) grcg_setcolor(GC_RMW,color),\
								grcg_byteboxfill_x(x1,y1,x2,y2),grcg_off()
#define grCircle(x,y,r,color)	grcg_setcolor(GC_RMW,color),\
								grcg_circle(x,y,r),grcg_off()
#define grCircleFill(x,y,r,color)	grcg_setcolor(GC_RMW,color),\
								grcg_circlefill(x,y,r),grcg_off()
#define	grCirclexFill(x,y,r,color)	grCircleFill(x,y,r,color)
#define grRectangle(x1,y1,x2,y2,color) grcg_setcolor(GC_RMW,color),\
								grcg_hline(x1,x2,y1),grcg_hline(x1,x2,y2),\
								grcg_vline(x1,y1,y2),grcg_vline(x2,y1,y2),\
								grcg_off()
#define grHLine(x1,x2,y,color)	grcg_setcolor(GC_RMW,color),\
								grcg_hline(x1,x2,y),grcg_off()
#define grVLine(x,y1,y2,color )	grcg_setcolor(GC_RMW,color),\
								grcg_vline(x,y1,y2),grcg_off()
#define grPSet(x,y,color)		grcg_setcolor(GC_RMW,color),\
								grcg_pset(x,y),grcg_off()
#define grPGet(x,y)				graph_readdot(x,y)
#define grBlank(x,y)			(graph_readdot(x,y)==0)
#define grStoreVram(useMain)	!graph_backup(G_PAGE0)
#define grRestoreVram()			graph_restore()
#define grCopyPage(from,to)		graph_copy_page(to)
#define grScrollY(y)			graph_scrollup(y)
#define grScrollX(x)			graph_scroll(graph_VramLines,(x),0)
#define grScrollXY(x,y)			graph_scroll(graph_VramLines-(y),(x)+(y)*40,(x))
#define grSetResPal(makeNew)	(makenew ? respal_create() : respal_exist()),\
								respal_set_palettes()
#define grGetResPal()			respal_get_palettes()
#define grSetID()

#define	gr_psetnext(x,y)	grcg_pset(x,y)
#define	gdcset()

/*
 *	青プレーン描画
 */
#define	bpCls()					grcg_fill()
#define bpPSet(x,y)				grcg_pset(x,y)
#define bpBox(x1,y1,x2,y2)		grcg_boxfill(x1,y1,x2,y2)
#define bpByteBox(x1,y1,x2,y2)	grcg_byteboxfill_x(x1,y1,x2,y2)
#define bpCircle(x,y,r)			grcg_circle(x,y,r)
#define bpCircleFill(x,y,r)		grcg_circlefill(x,y,r)
#define bpCirclexFill(x,y,r)	grcg_circlefill(x,y,r)
#define bpHLine(x1,x2,y)		grcg_hline(x1,x2,y)
#define bpVLine(x,y1,y2)		grcg_vline(x,y1,y2)

/*
 *	GRCG mode set
 */
#define grcgColor(color)			grcg_setcolor(GC_RMW,color)
#define grcgPlane(activeplane)		grcg_setcolor(GC_RMW |(~(activeplane) & 0x0f),15)
#define grcgPlaneRev(activeplane)	grcg_setcolor(GC_RMW |(~(activeplane) & 0x0f),0)
#define grcgPlaneColor(activeplane,color)	grcg_setcolor(GC_RMW |(~(activeplane) & 0x0f),(color))
#define	grcgOff()					grcg_off()
#define grcgPlaneTDW(activeplane)	grcg_setcolor(GC_TDW |(~(activeplane) & 0x0f),15)
#define grcgPlaneRevTDW(activeplane)	grcg_setcolor(GC_TDW |(~(activeplane) & 0x0f),0)

/*
 *	外字 BFNT 表示
 */
#define gfLoad(fontfile,no)	gaiji_backup(),(gaiji_entry_bfnt(fontfile)?0:DATA_ER)
#define gfStore()		gaiji_backup()
#define gfRestore()		gaiji_restore()
#if 0
int		gfExchange( void );
#endif
#define gfDisp(y,x,attr,str)	gaiji_putsa(x,y,str,attr)
#define	gfDispBig(y,x,attr,str)	gfDisp(y,x,attr,str)		/* 小さいぞ */
#define gfDispChr(y,x,attr,c)	gaiji_putca(x,y,c,attr)
#define gfDispTime(y,x,attr,num)	gaiji_putnia(x,y,num,2,attr)
#define gfDispScore(y,x,attr,num)	gaiji_putnia(x,y,num,5,attr)

/*
 *	外字 + グラフィック単色背景 BFNT 表示
 */
#define gfDispEdg(y,x,attr,col2,str) gfDisp(y,x,attr,str)
#define gfDispSdw(y,x,attr,col2,str) gfDisp(y,x,attr,str)
#define gfDispChrEdg(y,x,attr,col2,c) gfDispChr(y,x,attr,c)
#define gfDispChrSdw(y,x,attr,col2,c) gfDispChr(y,x,attr,c)
#define gfDispScoreEdg(y,x,attr,col2,num)	gfDispScore(y,x,attr,num)
#define gfDispScoreSdw(y,x,attr,col2,num)	gfDispScore(y,x,attr,num)
#if 0
void	gfDispEdg3(	int row, int col, int attribute, int color2, PSTR str );
#endif

/*
 *	グラフィック単色BFNT表示
 */
#define	mfDisp(x,y,color,str)	graph_gaiji_puts((x)*8,y,16,str,color)
#define	mfDispChr(x,y,color,c)	graph_gaiji_putc((x)*8,y,c,color)
#define mfDispEdg(x,y,col,col2,str) mfDisp(x,y,col,str)
#define mfDispSdw(x,y,col,col2,str) graph_gaiji_puts((x)*8+1,(y)+1,16,str,col2),mfDisp(x,y,col,str)
#define mfDispChrEdg(x,y,col,col2,c) mfDispChr(x,y,col,c)
#define mfDispChrSdw(x,y,col,col2,c) graph_gaiji_putc((x)*8+1,(y)+1,c,col2),mfDispChr(x,y,col,c)
#if 0
void	mfDispScoreEdg( int row, int col, int color1, int color2, WORD num);
void	mfDispScoreSdw( int row, int col, int color1, int color2, WORD num);
void	bpDisp( int x, int y, BYTE *str );
void	grDisp( int x, int y, int color, PSTR str );
void	grDispWide( int x, int y, int color, PSTR str );
#endif
#define bpDisp(x,y,str)		graph_gaiji_puts((x)*8,y,16,str,4)

/*
 *	マウス
 */
#define	mouseStart()				mouse_vstart(0,4)
#define mouseStop()					mouse_vend()
#define	mouseSetCsrMode(mode)		((mode) ? (void)cursor_show() : (cursor_hide(),cursor_init()))
#define mouseGetInfo(mi)			mouse_get(mi)
#define	mouseSetInfo(mi)			mouse_cmoveto((mi)->x,(mi)->y)
#define mouseSetArea(x1,y1,x2,y2)	mouse_setrect(x1,y1,x2,y2)
#define mouseSetSpeed(sp)			mouse_setmickey((sp)*4,(sp)*4)	/* ? */
#define mouseSetMask(ox,oy,mask)	cursor_pattern2(ox,oy,4,mask)

/*
 *	EMS
 */
int		emsGetStatus( void );
#define	emsGetUnallocatedPages()	(int)(ems_space()/(16384))
#define emsAllocatePages(pageNum)	ems_allocate((pageNum)*16384L)
#define emsDeallocatePages(handle)	ems_free(handle)
#define emsReallocatePages(handle,pageNum)	ems_reallocate(handle,(pageNum)*16384L)
#define emsMapHandlePage(frame,handle,page)	ems_maphandlepage(frame,handle,page)
#define emsSavePageMap(handle)		ems_savepagemap(handle)
#define	emsRestorePageMap(handle)	ems_restorepagemap(handle)
int		emsGetPhysicalAddress( EMS_PHYS_PAGE frame[4] );
#define	emsSetHandleName(handle,name)	ems_setname(handle,name)

/*
 *	テキスト画面
 */
#define txtStore()					!text_backup(1)
#define txtRestore()				text_restore()
#define txtCls()					text_fillca(0,TX_WHITE)
#define txtClearLine(line)			text_putnsa(0,line,"",80,TX_WHITE)
#define	txtDisp(row,col,attr,str)	text_putsa(col,row,str,attr)
#define	txtDispChr(row,col,attr,c)	text_putca(col,row,c,attr)

/*
 *	文字入出力
 */
#define fastPuts(str)	dos_cputs2(str)
#define fastPutc(c)		(((c) == '\n') ? (dos_putch('\r'),dos_putch('\n')) : dos_putch(c))
#define conPuts(str)	dos_puts2(str)
#define conPutc(c)		(((c) == '\n') ? (dos_putc('\r'),dos_putc('\n')) : dos_putc(c))
#define	GetKey()		key_wait()
#define	ScanKey()		(key_pressed() ? key_scan() : 0)
#define	grGetKey()		GetKey()
#define grScanKey()		ScanKey()
#define ScanShift()		key_shift()
#define	SetKey()		key_start()
#define ResetKey()		key_end()
#define biosGetKey()	key_wait_bios()
#define biosSenseKey()	key_sense_bios()

/*
 *	その他
 */
#define	SinVal(t)			(SinDeg(t) * 127 / 256)
#define	CosVal(t)			(CosDeg(t) * 127 / 256)
#define	DisableKeyBeep()	key_beep_off()	/* ちょっと意味が違うけど */
#define	EnableKeyBeep()		key_beep_on()
#define	DisableCtrlC()		dos_ignore_break()
#define	EnableCtrlC()		dos_accept_break()

#define strGetEnv(env,buf) (buf ? strcpy(buf, dos_getenv(0,env)) : dos_getenv(0,env))
#define GetMem(bytes)	  hmem_allocbyte(bytes)
#define GetLargeMem(para) hmem_lallocate((long)(para) << 4)
#define FreeMem(seg)      hmem_free(seg)

#define GetDosVersion()				(((unsigned)_osmajor << 8) | _osminor)
#define FindFirst(path,attr,finfo)	_dos_findfirst(path,attr,finfo)
#define FindNext(finfo)				_dos_findnext(finfo)

/*
 *	変数
 */
#define	GDCMODE		((unsigned char *)&graph_VramZoom)[1]
#define grPalDefault PalettesInit

/*
 * その他
 */
#define cputs(s)	dos_cputs(s)

#endif
