#include <sys/bios.h>
#include "fontcode.h"
#include "linefunc.h"
#include "fontkey.h"


#define CURSOL 510  /*カーソル*/
#define CLEAR1 511 /*空白（SCREEN1用）*/
#define CLEAR2 512 /*空白（SCREEN2用*/


void constructor(unsigned *sjis_code);
void modeChange(int keyPress, int keyHit);


/*関数にポインタを渡す変数はグローバルにした*/
unsigned charanum[28*18+1];
unsigned char font[8];
int mode=0;		/*0:ひらがな 1:カタカナ 2:数字 3:移動*/
int x=0, y=0;		/*縦モード文字座標　0<=x<=17　0<=y<=26	２７行目はモード表示等*/

int main(void)
{

/*初期化部*/

	int keyPress=0;
	int keyHit=0;


	unsigned sjis_code[177];	/*sjisのコードをキャラ番号に割り当てる*/
	constructor(sjis_code);

	screen_set_char(SCREEN1,0,17,1,1,charanum+1);/*あ：デフォはひらがなモード*/

/*初期化終了*/

/*メインループ*/
	while(1)
	{
		keyPress = key_press_check();
		keyPress &= 0x0ffe;	/*未定領域をマスク*/
		keyHit = keyhitchk(keyPress);

		if(keyHit)	/*キーヒットがあった場合再チェックする（同時押し検知の為）*/
		{
			sys_wait(5);
			keyPress = key_press_check();
			keyPress &= 0x0ffe;	/*未定領域をマスク*/
			keyHit |= keyhitchk(keyPress);	/*or代入*/
		}

		/*スタートボタンが押されたら終了*/
		if(keyPress&KEY_START)
			return 0;

		/*モード変更*/
		modeChange(keyPress, keyHit);


		/*スクリーン１に文字を表示*/
		if(mode==2)
			screen_set_char(SCREEN1,27-y,x,1,1,charanum+numkeySelect(keyPress,keyHit));/*数字*/
		else if(mode!=3)
			screen_set_char(SCREEN1,27-y,x,1,1,charanum+keySelect(keyPress,keyHit,mode));/*仮名*/

		/*スクリーン２のカーソルを消す*/
		screen_set_char(SCREEN2,27-y,x,1,1,charanum+CLEAR2);

		/*カーソル位置移動*/
		if(keyHit == (KEY_X1|KEY_X2)) /*バックスペース（キーリピート付き）*/
		{
			int repeat=0;	/*ブロック変数*/

			do
			{
				
				if(x>0)
					x--;
				else if(y>0)
				{
					y--;
					if((x = lineEndCheck(y))==-1)
						x = 17;
				}
				screen_set_char(SCREEN1,27-y,x,1,1,charanum+CLEAR1);
				sys_wait(15);
				
				if(repeat==0)   /*最初の一回だけウエイトを長くする*/
				{
					repeat = 1;
					if((key_press_check()&0xffe) == (KEY_X1|KEY_X2))
						sys_wait(20);
				}

			}while((key_press_check()&0xffe) == (KEY_X1|KEY_X2));
		}
		else if(keyHit == (KEY_X1|KEY_X4))
		{
			if((y<26)&&(lineCharCheck(26) == 0))
			{
				int k;
				for(k=25; k>y; k--)
					lineMove(k, k+1);
				lineNewPara(y, x);
				y++;
				x = lineEndCheck(y);
				if(x=-1)
					x=0;
			}
		}
		else if(((mode==0)||(mode==1))&&
				(((keyPress&0x0f00) == (KEY_Y1|KEY_Y2|KEY_Y3|KEY_Y4))
				||((keyPress&0x0f00) == (KEY_Y1|KEY_Y2|KEY_Y3))
				||((keyPress&0x0f00) == (KEY_Y1|KEY_Y2|KEY_Y4))
				||((keyPress&0x0f00) == (KEY_Y2|KEY_Y3|KEY_Y4))
				||((keyPress&0x0f00) == (KEY_Y1|KEY_Y3|KEY_Y4)))
			   )
		{
			if(keyHit == KEY_X1)
			{
				if(x==0 && y>0)
				{
					if(isableSmall(y-1,17))
						changeSmall(y-1,17);
				}
				else if(x>0)
				{
					if(isableSmall(y,x-1))
						changeSmall(y,x-1);
				}
			}
			else if(keyHit == KEY_X3)
			{
				if(x==0 && y>0)
				{
					if(isableDaku(y-1,17))
						changeDaku(y-1,17);
				}
				else if(x>0)
				{
					if(isableDaku(y,x-1))
						changeDaku(y,x-1);
				}
			}
			else if(keyHit == KEY_X4)
			{
				if(x==0 && y>0)
				{
					if(isableHandaku(y-1,17))
						changeHandaku(y-1,17);
				}
				else if(x>0)
				{
					if(isableHandaku(y,x-1))
						changeHandaku(y,x-1);
				}
			}
			else if(keyHit&0x00f0 && (x<17))
				x++;
			else if(keyHit&0x00f0 && (y<26))
			{
				x=0;
				y++;
			}
		}
		else if(mode==3)
		{
			switch(keyHit&0x0f00)
			{
				case KEY_Y1	:{
								if(x>0)
									x--;
								else if(y>0)
								{
									x=17;
									y--;
								}
							 } break;

				case KEY_Y2	:{
								if(y>0)
									y--;
							 } break;

				case KEY_Y3	:{
								if(x<17)
									x++;
								else if(y<26)
								{
									x=0;
									y++;
								}
							 } break;

				case KEY_Y4	:{
								if(y<26)
									y++;
							 } break;
			}
		}
		else if(keyHit&0x00f0 && (x<17))/*Ｘが押されたらカーソルを右に移動*/
			x++;
		else if(keyHit&0x00f0 && (y<26))/*表示位置が右端で下段が空いていたら改行する*/
		{
			x=0;
			y++;
		}

		/*スクリーン２にカーソルを表示*/
		screen_set_char(SCREEN2,27-y,x,1,1,charanum+CURSOL);

		sys_wait(1);
	}
/*メインループ終了*/

	return 0;
}


/*初期化用*/
void constructor(unsigned *sjis_code)
{
	int i,j;

	display_control(DCM_SCR1|DCM_SCR2);	/*スクリーン１と２を使用*/

	for(i=0;i<8;i++)	/*空白をキャラ登録*/
		font[i] = 0;
	font_set_monodata(CLEAR1,1,font);

	/*キャラ番号パレット設定*/
	for(i=0; i<510; i++)
		charanum[i] = i;
	charanum[510] = 0x9fe;	/*キャラ番510 パレット４（透過あり）*/
	charanum[511] = 0x1ff;	/*キャラ番511 パレット０（透過なし）*/
	charanum[512] = 0x9ff;	/*キャラ番511 パレット４（透過あり）*/


	/*画面クリア*/
	screen_fill_char(SCREEN1, 0, 0, 28, 18, CLEAR1);
	for(i=0; i<28; i++)
		for(j=0; j<18; j++)
			screen_set_char(SCREEN2, i, j, 1, 1, charanum+CLEAR2);


	/*sjisのコードを登録*/
	for(i=0; i<=82; i++)
		sjis_code[i] = 0x829f + i;		/*ぁ(0x829f)〜ん(0x82f1)まで登録*/

	for(i=0; i<=62; i++)
		sjis_code[83+i] = 0x8340 + i;	/*ァ(0x8340)〜ミ(0x837e)まで登録*/

	for(i=0; i<=20; i++)
		sjis_code[146+i] = 0x8380 + i;	/*ム(0x8380)〜ヴ(0x8394)まで登録*/

	for(i=0; i<=9; i++)
		sjis_code[167+i] = 0x824f + i;	/*０(0x824f)〜９(0x8258)まで登録*/

	/*文字コードをフォントデータに変換して登録*/
	/*縦画面用に９０度回転させておく*/
	for(i=0; i<177; i++)
	{
		fontcode_to_fontdata(sjis_code[i], font);
		font_set_monodata(i,1,fontrotate(font,0));
	}

	for(i=1;i<=6;i++)	/*カーソルをキャラ登録*/
		font[i] = 0xC0;
	font[0] = 0;
	font[7] = 0;
	font_set_monodata(CURSOL,1,font);

	return;
}


/*モード変更*/
void modeChange(int keyPress, int keyHit)
{
	static modetmp=0;

	keyPress &= 0x00f0;	/*Ｘボタンのみチェック*/
	
	if((keyPress == (KEY_X1|KEY_X2|KEY_X3|KEY_X4))
			||(keyPress == (KEY_X1|KEY_X2|KEY_X3))
			||(keyPress == (KEY_X1|KEY_X2|KEY_X4))
			||(keyPress == (KEY_X2|KEY_X3|KEY_X4))
			||(keyPress == (KEY_X1|KEY_X3|KEY_X4)))
	{
		if(mode!=3)
			modetmp = mode;
		mode = 3;
		return;
	}

	mode = modetmp;

	if(keyHit == (KEY_Y1|KEY_Y3))
	{
		sys_wait(3); /*３ボタン同時押しと区別しやすくする*/
		if((key_press_check()&0x0ffe) == (KEY_Y1|KEY_Y3))
		{
			if(mode==0)
				mode=1;
			else if(mode==1)
				mode=2;
			else if(mode==2)
				mode=0;
		}
	}

	switch(mode)
	{
		case 0 : screen_set_char(SCREEN1,0,17,1,1,charanum+1); break;/*あ*/
		case 1 : screen_set_char(SCREEN1,0,17,1,1,charanum+84); break;/*ア*/
		case 2 : screen_set_char(SCREEN1,0,17,1,1,charanum+167); break;/*０*/
	}
	
	modetmp = mode;
	return;
}


/* 備忘メモ*/
/* &array[0] == array						*/
/* &array[i] == array+i						*/
/* array[i] == *(array+i)					*/
/* ただし配列のポインタは右辺値（代入不可	*/
/* array = p   BAD							*/
/* p = array   OK							*/
/* p[i] == *(p+i) == array[i]				*/

