// lib_video_megalopa動作テストプログラム

#include "lib_video_megalopa.h"
#include <plib.h>

//外付けクリスタル with PLL (20/3倍)
//クリスタルは3.579545×4＝14.31818MHz
#pragma config FSRSSEL = PRIORITY_7
#pragma config PMDL1WAY = OFF
#pragma config IOL1WAY = OFF
//#pragma config FUSBIDIO = OFF
//#pragma config FVBUSONIO = OFF
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLMUL = MUL_20
//#pragma config UPLLIDIV = DIV_1
//#pragma config UPLLEN = OFF
#pragma config FPLLODIV = DIV_1
#pragma config FNOSC = PRIPLL
#pragma config FSOSCEN = OFF
#pragma config IESO = OFF
#pragma config POSCMOD = XT
#pragma config OSCIOFNC = OFF
#pragma config FPBDIV = DIV_1
#pragma config FCKSM = CSECME
#pragma config FWDTEN = OFF
#pragma config DEBUG = OFF
#pragma config PWP = OFF
#pragma config BWP = OFF
#pragma config CP = OFF
#pragma config JTAGEN = OFF

// 入力ボタンのポート、ビット定義
#define KEYPORT PORTD
#define KEYDOWN 0x0001
#define KEYLEFT 0x0002
#define KEYUP 0x0004
#define KEYRIGHT 0x0008
#define KEYSTART 0x0010
#define KEYFIRE 0x0020

unsigned char GRAM[384*216];
unsigned char PCGRAM[8*256];

const unsigned char bmp[14*13]={
	0,0,0,0,0,2,2,2,2,0,0,0,0,0,
	0,0,0,2,2,2,2,2,2,2,2,0,0,0,
	0,0,2,2,2,2,2,2,2,2,2,2,0,0,
	0,2,2,2,7,7,2,2,2,2,7,7,2,0,
	0,2,2,7,7,7,7,2,2,7,7,7,7,0,
	0,2,2,7,7,8,8,2,2,7,7,8,8,0,
	2,2,2,7,7,8,8,2,2,7,7,8,8,2,
	2,2,2,2,7,7,2,2,2,2,7,7,2,2,
	2,2,2,2,2,2,2,2,2,2,2,2,2,2,
	2,2,2,2,2,2,2,2,2,2,2,2,2,2,
	2,2,2,2,2,2,2,2,2,2,2,2,2,2,
	2,2,0,2,2,2,0,0,2,2,2,0,2,2,
	2,0,0,0,2,2,0,0,2,2,0,0,0,2
};
void wait60thsec(int n){
	drawcount=0;
	while(drawcount<n) asm("wait");
}
unsigned char *vmodestring[]={
	"StandardText30x27",
	"StandardText36x27",
	"StandardText40x27(6dot font)",
	"WideText48x27",
	"WideText64x27(6dot font)",
	"WideText80x27(B&W)",
	0,0,0,0,0,0,0,0,0,0,
	"ZoeaGrph256x224(16color)",
	"StandardGrph&Text288x216",
	"WideGrph&Text384x216"
};
int main(void){

	/* ポートの初期設定 */
	TRISB = 0x0000; // PORTB全て出力
	TRISC = 0x0000; // PORTC全て出力
	TRISD = KEYSTART | KEYFIRE | KEYUP | KEYDOWN | KEYLEFT | KEYRIGHT;// ボタン接続ポート入力設定
	TRISE = 0x0000; // PORTE全て出力
	TRISF = 0x0000; // PORTF全て出力
	TRISG = 0x0000; // PORTG全て出力

	ANSELB = 0x0000; // 全てデジタル
	ANSELD = 0x0000; // 全てデジタル
	ANSELE = 0x0000; // 全てデジタル
	ANSELG = 0x0000; // 全てデジタル
	CNPUDSET=KEYSTART | KEYFIRE | KEYUP | KEYDOWN | KEYLEFT | KEYRIGHT;// プルアップ設定

	// 周辺機能ピン割り当て
	SDI2R = 1; //RPG7にSDI2を割り当て
	RPG8R = 6; //RPG8にSDO2を割り当て

	int i,color,v;
	unsigned char c;

	init_composite(); // ビデオメモリクリア、割り込み初期化、カラービデオ出力開始
	while(1){
		for(v=0;v<=5;v++){
			set_videomode(v,0);
			set_bgcolor(0,0,0);
			setcursor(0,0,7);
			printstr("Video Mode:");
			printnum(v);
			printchar('\n');
			printstr(vmodestring[v]);
			printchar('\n');
			for(i=0;i<twidth;i++) printnum(i/10);
			for(i=0;i<twidth;i++) printnum(i%10);
			color=1;
			c=0x1c;
			for(i=0;i<twidth*23;i++){
				if(i%(twidth*2)==0) setcursorcolor(color++);
				printchar(c++);
				if(c==0xf8) c=0x1c;
			}
			wait60thsec(120);
			for(i=6;i>=0;i--){
				set_bgcolor((i&1)*255,((i&2)>>1)*255,(i>>2)*255);
				wait60thsec(20);
			}
			if(videomode==VMODE_MONOTEXT) color=128;
			for(i=0;i<twidth*5;i++){
				if(i%(twidth*2)==0) setcursorcolor(color++);
				printchar(c++);
				if(c==0xf8) c=0x1c;
				wait60thsec(2);
			}
			wait60thsec(120);
		}

		for(v=16;v<=18;v++){
			set_videomode(v,GRAM);
			//テストパターン
			for(i=1;i<=7;i++){
				g_boxfill(i*gwidth/8,0,(i+1)*gwidth/8-1,30,8-i);
			}
			//線分
			for(i=1;i<=7;i++){
				g_gline(60,40,i*15,120,i);
			}
			//円
			for(i=1;i<=7;i++){
				g_circle(180,75,i*6,i);
			}
			//塗りつぶし円と数字（色見本）
			for(i=0;i<=7;i++){
				g_circlefill(i*30+15,150,15,i);
				g_printnum(i*30+8,146,7,-1,i);
			}
			for(i=0;i<=7;i++){
				g_circlefill(i*30+15,180,15,i+8);
				g_printnum(i*30+8,176,7,-1,i+8);
			}
			//キャラクター表示
			for(i=1;i<=10;i++){
				g_putbmpmn(i*20,215-13,14,13,bmp);
			}
			g_printstr(0,32,7,-1,"Video Mode:");
			g_printnum(12*8,32,7,-1,v);
			g_printstr(0,40,7,-1,vmodestring[v]);
			wait60thsec(120);
			if(videomode==VMODE_ZOEAGRPH) continue;
			setcursor(0,6,7);
			for(i=0;i<twidth;i++) printnum(i/10);
			for(i=0;i<twidth;i++) printnum(i%10);
			color=1;
			c=0x1c;
			for(i=0;i<twidth*19;i++){
				if(i%(twidth*2)==0) setcursorcolor(color++);
				printchar(c++);
				if(c==0xf8) c=0x1c;
			}
			wait60thsec(120);
			for(i=0;i<twidth*5;i++){
				if(i%(twidth*2)==0) setcursorcolor(color++);
				printchar(c++);
				if(c==0xf8) c=0x1c;
				wait60thsec(2);
			}
			wait60thsec(120);
		}
	}
	while(1) asm("wait"); //停止
}
