#include <sys\bios.h>
#define _SCREEN1 0
#define _SCREEN2 1
#define _CURSOR_ON 1
#define _CURSOR_OFF 0
#define _DX_END (224/8-1)
#define _DY_END (144/8-1)
#define _DX_MIN 3
#define _DX_MAX 19
#define _DY_MIN 2
#define _DY_MAX 18

void KeyHelp ()
{
	int y=6;
	text_put_string(_DX_END-6, y++, "ST: 終了");
	y++;
	text_put_string(_DX_END-6, y++, "A :ON");
	text_put_string(_DX_END-6, y++, "B :OFF");
	text_put_string(_DX_END-6, y++, "Y2:次頁");
	text_put_string(_DX_END-6, y++, "Y4:前項");
	text_put_string(_DX_END-6, y++, "Y1:１行上");
	text_put_string(_DX_END-6, y++, "Y3:１行下");
	text_put_string(_DX_END-6, y++, "X1: ↑");
	text_put_string(_DX_END-6, y++, "X2: →");
	text_put_string(_DX_END-6, y++, "X3: ↓");
	text_put_string(_DX_END-6, y++, "X4: ←");

	return;
}
void Cursor (int x,int y,int OnOff)
{
	if (OnOff!=0) {
		cursor_set_location(x,y,1,1);
		text_put_char(x,y,' ');
		cursor_display(_CURSOR_ON);
	}
	else {
		cursor_display(_CURSOR_OFF);
	}
	return;
}
void Disp (unsigned int page, int x_c, int y_c, int OnOff)
{
	int x,y;
	text_put_string(_DX_END-6, 0,   "文字コード表");
	text_put_string(_DX_MIN,_DY_MIN-1,"0123456789ABCDEF");
	for(y=_DY_MIN;y<_DY_MAX;y++) {
		text_put_numeric(0,y,3,NUM_HEXA,(page+(y-_DY_MIN)*(_DX_MAX-_DX_MIN))/0x10);
		for(x=_DX_MIN;x<_DX_MAX;x++) {
			text_put_char(x,y,page+(x-_DX_MIN)+(y-_DY_MIN)*(_DX_MAX-_DX_MIN));
		}
	}
	KeyHelp();
	text_put_numeric(_DX_END-6,2,4,NUM_HEXA,page+(x_c-_DX_MIN)+(y_c-_DY_MIN)*(_DX_MAX-_DX_MIN));
	text_put_char(_DX_END-1,2,page+(x_c-_DX_MIN)+(y_c-_DY_MIN)*(_DX_MAX-_DX_MIN));
	Cursor(x_c,y_c,OnOff);
	return;
}
void main(int argc, char *argv[])
{
	int key,x=_DX_MIN,y=_DY_MIN,OnOff=_CURSOR_ON;
	unsigned int page=0;

	text_set_screen(_SCREEN2);
	text_screen_init();
	Disp(page,x,y,OnOff);

	while((key=key_wait())!=KEY_START) {
		switch (key) {
			case KEY_A :
				OnOff=_CURSOR_ON;
				break;
			case KEY_B :
				OnOff=_CURSOR_OFF;
				break;
			case KEY_X1 :
				y--;
				if(y<_DY_MIN) y=_DY_MAX-1;
				break;
			case KEY_X2 :
				x++;
				if(x>=_DX_MAX) x=_DX_MIN;
				break;
			case KEY_X3 :
				y++;
				if(y>=_DY_MAX) y=_DY_MIN;
				break;
			case KEY_X4 :
				x--;
				if(x<_DX_MIN) x=_DX_MAX-1;
				break;
			case KEY_Y1 :
				page+=(_DX_MAX-_DX_MIN);
				break;
			case KEY_Y3 :
				page-=(_DX_MAX-_DX_MIN);
				break;
			case KEY_Y2 :
				page+=(_DX_MAX-_DX_MIN)*(_DY_MAX-_DY_MIN);
				break;
			case KEY_Y4 :
				page-=(_DX_MAX-_DX_MIN)*(_DY_MAX-_DY_MIN);
				break;
			default:
				break;
		}
		Disp(page,x,y,OnOff);
	}	    
}

