#include <stdio.h>
#include <stdlib.h>
#include <egb.h>

extern	char	*work;


//	47a	VC3 regs指定
//	47c	VC3 regsデータ内容指定
//	47d	VC3 regsデータ内容指定
//	47e	VC3 regsデータ内容指定
//	47f	VC3 regsデータ内容指定

//	VC3 regs
//		2000	色数
//		2010	ビデオ表示開始/表示状態取得/表示フィールド/指定
//			47e bit2-3	表示フィールド指定
//			47e bit0	表示開始
//		2011	表示倍率指定
//			47c		倍率指定
//			47d		倍率指定
//		2027	ソースビデオ映像のx1
//		2028	ソースビデオ映像のx2
//		2029	ソースビデオ映像のy1
//		202a	ソースビデオ映像のy2
//		202b	表示開始位置のx
//		202c	表示開始位置のy
//		202d	vramオフセット(1ラインのバイト数)
//

/***********************
void set_mid(int sw)
{
	int	i;
	outp(0x47d,0x11);

	outpw(0x47a,0x2010);
	i = inp(0x47c) & 0x7f;
	outp(0x47c,i);
	outp(0x47c,0);
	outp(0x47c,0x80);
	outp(0x47f,0);

	switch(sw){
	case 0:
		i = 4;
		break;
	case 1:
		i = 0;
		break;
	case 2:
		i = 8;
		break;
	}
	outp(0x47e,i);


	outpw(0x47a,0x2011);
	outp(0x47c,0);
	outp(0x47d,0x80);
	outp(0x47f,9);

	outpw(0x47a,0x2020);
	outpw(0x47c,0xfb7);

	outpw(0x47a,0x2022);
	outpw(0x47c,0x137);

	outpw(0x47a,0x2023);
	outpw(0x47c,0x7ff);

	outpw(0x47a,0x2024);
	outpw(0x47c,0xff1);

	outpw(0x47a,0x2026);
	outpw(0x47c,0x7ff);

	outpw(0x47a,0x2027);
	outpw(0x47c,0);

	outpw(0x47a,0x2028);
	outpw(0x47c,0x27f);

	outpw(0x47a,0x2029);
	outpw(0x47c,0);

	outpw(0x47a,0x202a);
	outpw(0x47c,0xef);

	outpw(0x47a,0x202b);
	outpw(0x47c,0);

	outpw(0x47a,0x202c);
	outpw(0x47c,0);

	outpw(0x47a,0x202d);
	outpw(0x47c,0x200);

	outpw(0x47a,0x2010);
	i = inp(0x47e) | 1;
	outp(0x47e,i);

}
*************************/
void set_high(int sw,int sw2)
{
	int	i;
	outpw(0x47a,0);
	outp(0x47d,2);

	outpw(0x47a,0x2000);
	outp(0x47c,1);
	i = inp(0x47c) & 0x80;

	outp(0x47d,0x11);
	outp(0x47f,9);

	outpw(0x47a,0x2010);
	i = inp(0x47c) & 0x7f;
	outp(0x47c,i);
	outp(0x47c,0);
	outp(0x47c,0x80);
	outp(0x47f,0);

	/* 高解像度時の表示モード設定 */

	switch(sw){
	case 0: /* 奇数／偶数両フィールド表示 */
		i = 4;
		break;
	case 1: /* 奇数フィールド表示 */
		i = 0;
		break;
	case 2: /* 偶数フィールド表示 */
		i = 8;
		break;
	case 3: /* フレーム表示 */
		i = 12;
		break;
	}
	outp(0x47e,i);


	outpw(0x47a,0x2011);
	outp(0x47f,9);

	/* 高解像度時の表示サイズ */
	switch(sw2){
	case 0: /* 切り抜き表示(画面中央の５１２×３８４) */
		outp(0x47c,0);
		outp(0x47d,0);
		break;
	case 1: /* 縮小表示(５１２×３８４に間引き縮小) */
		outp(0x47c,0xcd);
		outp(0x47d,0xcd);
		break;
	case 2: /* 縮小表示(３２０×２４０に縮小) */
		outp(0x47c,0);
		outp(0x47d,0x80);
		break;
	}


	outpw(0x47a,0x2020);
	outpw(0x47c,0xfb4);

	outpw(0x47a,0x2022);
	outpw(0x47c,0x137);

	outpw(0x47a,0x2023);
	outpw(0x47c,0x7ff);

	outpw(0x47a,0x2024);
	outpw(0x47c,0xfef);

	outpw(0x47a,0x2026);
	outpw(0x47c,0x7ff);

	if (sw2==0) { /* 切り抜き表示(画面中央の５１２×３８４) */

		outpw(0x47a,0x2027);
		outpw(0x47c,0x40);		/* x1 */

		outpw(0x47a,0x2028);
		outpw(0x47c,0x23f);		/* x2 */

		outpw(0x47a,0x2029);
		outpw(0x47c,0x18);		/* y1 */

		outpw(0x47a,0x202a);
		outpw(0x47c,0xd7);		/* y2 */

	}else{
		outpw(0x47a,0x2027);
		outpw(0x47c,0);

		outpw(0x47a,0x2028);
		outpw(0x47c,0x27f);
	
		outpw(0x47a,0x2029);
		outpw(0x47c,0);

		outpw(0x47a,0x202a);
		outpw(0x47c,0xef);
	}
/********
	if (sw2==2) {

		outpw(0x47a,0x202b);
		outpw(0x47c,0x60);

		outpw(0x47a,0x202c);
		outpw(0x47c,0x48);

	}else{
********/

		outpw(0x47a,0x202b);
		outpw(0x47c,0x60*2);

		outpw(0x47a,0x202c);
		outpw(0x47c,0);
/********
	}
********/

	outpw(0x47a,0x202d);
	outpw(0x47c,0x200);

	outpw(0x47a,0x2010);
	i = inp(0x47e) | 1;
	outp(0x47e,i);

}

int vc3_check()
{
	int	i;

	i = inp(0x479) & 0x40;
	if (i!=0) return 1;

	outpw(0x47A,0x2000);
	i = inp(0x47c) & 1;
	if (i!=1) return 1;

	outpw(0x50a0,4);
	i = inp(0x50a2) & 0x80;
	if (i!=0) return 1;

	return 0;
}
int vbus_check()
{
	int	i;

	outpw(0x47A,0x2010);
	i = inp(0x47E) & 1;
	return i;
}

void reset_vbus()
{
	int	i;

	outpw(0x47A,0x2010);
	outp(0x47F,2);

	i=0;
	while(i<1000000 && ((inp(0x47E) & 1) != 0)) i++;

	outp(0x47F,0);
	outpw(0x47A,0x2000);
	outp(0x47C,1);
}

/**************
void set_vbus()
{
	int	i;

	outpw(0x47A,0);
	outp(0x47C,2);
	outpw(0x47A,0x2000);
	outp(0x47C,0x1);

	i=0;
	while(i<1000000 && ((inp(0x47C) & 0x80) != 0)) i++;

	outp(0x47D,0x11);
	outpw(0x47A,0x2010);
	
	i = inp(0x47C) & 0x7f;
	outp(0x47C,i);
	outp(0x47C,0);
	outp(0x47C,0x80);
	outp(0x47E,0);
	outp(0x47F,0);


	outpw(0x47A,0x2011);
	outp(0x47F,9);
	outp(0x47C,0);
	outp(0x47D,0x80);

	outpw(0x47A,0x2020);
	outpw(0x47C,0xfb4);

	outpw(0x47A,0x2022);
	outpw(0x47C,0x137);

	outpw(0x47A,0x2023);
	outpw(0x47C,0x7ff);

	outpw(0x47A,0x2024);
	outpw(0x47C,0xfef);

	outpw(0x47A,0x2026);
	outpw(0x47C,0x7ff);

	outpw(0x47A,0x2027);
	outpw(0x47C,0x14);

	outpw(0x47A,0x2028);
	outpw(0x47C,0x26b);

	outpw(0x47A,0x2029);
	outpw(0x47C,0x8);

	outpw(0x47A,0x202A);
	outpw(0x47C,0xE8);

	outpw(0x47A,0x202B);
	outpw(0x47C,0x2);

	outpw(0x47A,0x202C);
	outpw(0x47C,0x2);

	outpw(0x47A,0x202D);
	outpw(0x47C,0x200);

	outpw(0x47A,0x2010);
	i = inp(0x47E) | 1;
	outpw(0x47E,i);
}
*****************/
int	video_flg;
void VC_on()
{
	if (vc3_check()) return;
	if (vbus_check()) reset_vbus();

	EGB_writePage(work,1);
	EGB_displayStart(work,0,512,32);
	set_high(0,2);
	EGB_writePage(work,0);
	video_flg = 1;
}
void VC_off()
{
	if (vbus_check()) reset_vbus();
	EGB_writePage(work,1);
	EGB_color(work,1,0);
	EGB_clearScreen(work);
	EGB_writePage(work,0);
	video_flg = 0;
}

