#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <guidbg.h>

#include <kh.h>

char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/

int	iconDialogID = -1 ;
int	dummyDButtonID = -1 ;
int	iconQuitIconID = -1 ;
int	barIconID = -1 ;
int	minIconID = -1 ;
int	maxIconID = -1 ;

//#define DEBUG

unsigned char beforeLevel = 1 ;
unsigned char nowLevel = 0 ;

int quitFuncRet = ILLEGAL_FUNCTION ;

int userFunc(apliId, messId, info, data)
int	apliId;
int	messId;
int	info;
int	data;
{
	register int	ret;

	ret = ILLEGAL_FUNCTION;

	switch(messId)
	{
		case	GM_QUIT :
			MMI_SendMessage(iconQuitIconID,MM_EXEC,2,0,0);
			ret = quitFuncRet ;
			break;
	}

	return(ret);
}

void main(int argc,char *argv[])
{
	int x=276;
	int y=225;

	if(argc>1)
	{
		x = ((argv[1])[0])*1000 + ((argv[1])[1])*100
					+ ((argv[1])[2])*10 + (argv[1])[3] - ('0'*1111);
		if(argc>2)
			y = ((argv[2])[0])*1000 + ((argv[2])[1])*100
						+ ((argv[2])[2])*10 + (argv[2])[3] - ('0'*1111);
	}
	#ifdef DEBUG
	printf("(%d,%d)\n",x,y);
	#endif

	static MMICTRL mmi ={
				SCREEN16|SCREENIGNORE,		// ページ0側解像度
				SCREENUNUSED,				// ページ1側解像度
				0, 							// 書き込みページ
				SCREENAVAILABLE, 			// 表示ページ
				0, 							// 表示プライオリティ
				SCREENAVAILABLE,			// 色数
				SCREENEXPAND, 				// VRAMの横の長さ
				0, 							// メモリ領域の大きさ
				NULL, 						// メモリ領域のアドレス
				0, 							// ユーザ領域の大きさ
				NULL, 						// ユーザ領域のアドレス
				0, 0, 						// 画面枠	lupx,lupy
				0, 0,						//			rdwx,rdwy
				-16384, -16384,				// 移動枠	lupx,lupy
				16383, 16383,				//			rdwx,rdwy
				15, 						// 白色
				8,  						// 黒色
				7,  						// 灰色
				6	 						// 反転色
	};

	extern int APL_init() ;

	/*	初期化処理	*/
	if (MMI_Open( &mmi ) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init(x,y) == NOERR)
			MMI_ExecSystem() ;
	}

	/*	終了処理	*/
	MMI_Close() ;

}

int APL_init(int sx,int sy)
{
	extern MMIINIT	initDataGUI ;

	register int	ret ;

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;

	/*	ユーザアイコン設定		*/
	extern unsigned char *iconTbl[];
	extern int iconMaxId;
	MMI_SetIconTable(iconTbl, iconMaxId);

	/*	ハイパ型部品の初期化			*/
	if ((ret = MMI_initHyper()) < 0)
		return ret ;
	/*	ダイアログ型部品の初期化		*/
	if ((ret = MMI_initDialogL40()) < 0)
		return ret ;
	/*	ボタン型部品の初期化			*/
	if ((ret = MMI_initButtonL40()) < 0)
		return ret ;
	/*	ドロウボタン型部品の初期化		*/
	if ((ret = MMI_initDrawButtonL40()) < 0)
		return ret ;
	/*	アイコンボタン型部品の初期化	*/
	if ((ret = MMI_initIconL40()) < 0)
		return ret ;

	/*	背景データの初期化						*/

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataGUI)) < 0)
		return ret ;

	//	Tmenuにパレットを合わせる
	KH_initGuiColor();

	//	初期位置に移動
	HYPER hyp;
	FRAME fr;
	MMI_SendMessage(iconDialogID,MM_GETHYPER,1,&hyp);
	fr.lupx = sx ;
	fr.lupy = sy ;
	fr.rdwx = sx + (hyp.fr.rdwx-hyp.fr.lupx) ;
	fr.rdwy = sy + (hyp.fr.rdwy-hyp.fr.lupy) ;
	MMI_SendMessage(iconDialogID,MM_MOVE,1,&fr);

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc);
	MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)"vl                              By 機拡", 0);

	extern void	userIdleTask();
	MMI_SetIdleTaskFunc( userIdleTask );
	_outb(0x04e8,0x00);	//ADSD FIFO flash
	userIdleTask();

	return NOERR ;
}

void userIdleTask(void)
{

	nowLevel = (_inb(0x04e7) & 0x7f)>>3;

	if(nowLevel==beforeLevel) return ;
	if(nowLevel<beforeLevel) beforeLevel-- ;
		else beforeLevel = nowLevel ;

	MMI_SendMessage(barIconID,MM_SETSHAPE,1,513+beforeLevel);
	MMI_SendMessage(barIconID,MM_SHOW,0);

	return ;
}

/*	initDataGUI:iconQuitIconID:MJ_ICONL40の呼び出し関数	*/
int	iconQuitFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag(TRUE);
	quitFuncRet = NOERR ;

	return NOERR ;
}

