/* ファイルの中身をグラフィックとして無理やり見るプログラム */

#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<egb.h>
#include	<mos.h>

#include	"inc\ysuty2.h"

char	gwork[1536];
char	mwork[4096];


/* 画面モード別ｂｉｔ／ｄｏｔ */
int		bpd[19]={0, 4,4,4,4, 16,16,16,16, 16,16,16, 8,8,8, 16,16,16,16};
/* 画面モード別 仮想画面の縦サイズ */
int		vysz[19]={0,400,400, 512,512, 512,512,512,512,
					256,256,256, 512,512,512, 512,512,512,512 };
/* 画面モード別 表示画面の縦サイズ */
int		ysz[19]={0,400,200, 480,400, 256,256,240,240, 240,240,240,
					480,480,480, 480,480,480,480 };


void	usage()
{
	puts("run386 muriview ファイル名 [画面モード] [横ドット数] [オフセット]");
	puts("[]内は省略可。デフォルトは 16色640*480モード,オフセット0");
	exit(1);
}




int		main(int argc,char **argv)
{
	char	fname[80];
	char	*endptr;
	FILE	*fp;
	int		i;
	static	int		p[3]={3,640,0};	/* デフォルトパラメータ */
	int		mode,x,ofs;
	int		ry=0,dy;			/* スクロール用 と 表示用*/
	int		Bpl;				/* Byte per line */
	char	*buf;
	int		a,b,c;
	
	if (argc<2 || argc>5)
		usage();
	
	strcpy(fname,argv[1]);
	if ((fp=fopen(fname,"rb"))==NULL)
	{
		puts("ファイルが無いよ〜");
		exit(1);
	}
	
	for (i=2; i<argc; i++)		/* パラメータの取得 */
		p[i-2]=strtol(argv[i],&endptr,10);
	mode=p[0];	x=p[1];	ofs=p[2];
	
	printf("%d,%d,%d",mode,x,ofs);
	YGB_init(gwork,mode,mode);
	MOS_start(mwork,4096);
	
	/* ここから本番 */
	Bpl=x*bpd[mode]/8;
	if ((buf=malloc(Bpl*32))==NULL)
	{	puts("メモリが足りません");	exit(1);	}
	
	fseek(fp,ofs,SEEK_SET);
	
	EGB_displayStart(gwork,1,0,vysz[mode]-ysz[mode]);
	while (feof(fp)==0)
	{
		EGB_displayStart(gwork,1,0,ry);
		fread(buf,Bpl,32,fp);
		dy=(ry+vysz[mode]-32)%vysz[mode];
		YGB_putPattern(gwork,buf,0,dy,x-1,dy+31);
		ry+=32;	ry=ry%vysz[mode];
		MOS_rdpos(&a,&b,&c);
		while(a&1)
		{
			MOS_rdpos(&a,&b,&c);
			if (a&2)
				goto loopend;
		}
	}
	for(;;)
	{
		MOS_rdpos(&a,&b,&c);
		if (a)
			break;
	}
	loopend:;
	MOS_end();
	return(0);
}



