/*
	猫の目ビュア for WonderWitch (on WonderSwan, WonderSwanColor)
			
		Copyright (c) 2000,2001, B-soft. All rights reserved.
		Programmed by KAKKO
	
	SCREEN1とSCREEN2を使った12行テキスト表示のアイデアとサンプルソース
	コードはEffectさん(http://www2s.biglobe.ne.jp/~effect/index.cgi)から
	頂き参考にさせて頂きました。感謝しております。
*/

#include <stdio.h>
#include <string.h>
#include <sys/bios.h>
#include <sys/key.h>
#include <sys/process.h>
#include <fcntl.h>
#include <resource.h>
#include <sys/libwwc.h>

#include "neko_view.h"


extern void drw_neko(void);
extern void drw_date(void);
extern void drw_time(void);
extern void drw_fname(char *fname);
extern void clr_header(void);
extern int drw_menu(void);
extern void set_default_color(void);
extern void drw_header(void);

extern int opn_fil(char *fname);
extern int cls_fil(void);
extern int rea_txt(void);
extern int rea_prv_txt(void);
extern int rea_now_txt(void);

extern int get_filename(char *fname);

extern int rcv_txt(char *fname);

static char fname[30];
static int my_pcbid = 0;
/*
static ProcIL procIL;
*/

/* enabel(:0)/disabel(:1) flag of drw_date */
static int date_flg = 0;

res_t far *find_resource(WORD type, int index)
{
	res_t far *res = _pc->_resource;
	BYTE far *p;
	while(res->magic == RESID){
		if((res->type == type) && ((index--) == 0)){
			return res;
		}
		p = (BYTE far *)res;
		p += (res->size << 4);
		res = (res_t far *)p;
	}
	return NULL;
}


void ini_palette(void)
{
	if(wwc_get_hardarch() == HARDARCH_WS){	/* for WonderSwan */
		palette_set_color(0, 0x0417);	/* main palette color */
/*		palette_set_color(1, 0x0476);	*/
/*		palette_set_color(2, 0x6666);	*/
		palette_set_color(3, 0x037f);	/* neko color */
		palette_set_color(4, 0x0000);	/* CLEAR PALETTE */
		palette_set_color(5, 0xf55f);	/* menu border*/
	}
	else{		/* for WonderSwanColor */
		wwc_palette_set_color(0, 0, 0x00f);	/* back color */
		wwc_palette_set_color(0, 1, 0xfff);	/* char color */
		wwc_palette_set_color(0, 2, 0xff0);	/* header back color */
		wwc_palette_set_color(0, 3, 0x000);	/* header char color */
/*
		wwc_palette_set_color(1, 0, 0xfff);
		wwc_palette_set_color(1, 1, 0xfff);
		wwc_palette_set_color(1, 2, 0xf00);
		wwc_palette_set_color(1, 3, 0x000);

		wwc_palette_set_color(2, 0, 0xaaa);
		wwc_palette_set_color(2, 1, 0xff0);
		wwc_palette_set_color(2, 2, 0x0ff);
		wwc_palette_set_color(2, 3, 0xf0f);
*/
		/* NEKO COLOR */
		wwc_palette_set_color(3, 0, 0x00f);		/* back ground */
		wwc_palette_set_color(3, 1, 0xfff);		/* body */
		wwc_palette_set_color(3, 2, 0xf00);		/* eyes */
		wwc_palette_set_color(3, 3, 0x000);		/* line */

		/* CLEAR COLOR */
		wwc_palette_set_color(4, 0, 0xf00);
		wwc_palette_set_color(4, 1, 0xff0);
		wwc_palette_set_color(4, 2, 0xfff);
		wwc_palette_set_color(4, 3, 0xfff);

		/* MENU BORDER */
		wwc_palette_set_color(5, 0, 0x000);
		wwc_palette_set_color(5, 1, 0xfff);
		wwc_palette_set_color(5, 2, 0xff0);
		wwc_palette_set_color(5, 3, 0x00f);
	}
	
	lcd_set_color(0x9bdf, 0x0357);
}

void ini_font(void)
{
	res_image_t far *img;
	unsigned short far *p;
	static unsigned short cdata[16] = {
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00,
			0x00, 0x00, 0x00, 0x00
	};
	static unsigned char cdata1[16] = {
			0xff, 0xff, 0x00, 0xff,
			0xff, 0xff, 0xff, 0xff,
			0xff, 0xff, 0xff, 0xff,
			0xff, 0xff, 0xff, 0xff
	};
	static unsigned char cdata2[16] = {
			0xff, 0xff, 0xff, 0xff,
			0xff, 0xff, 0xff, 0xff,
			0xff, 0xff, 0xff, 0xff,
			0xff, 0xff, 0xff, 0xff
	};
	
	img = (res_image_t far *)find_resource(RESID_IMAGE, 1);  /* neko_hed1.bmp */
	p = (unsigned short far *)img;
	font_set_colordata(140 + 8, 10, p);
	
	img = (res_image_t far *)find_resource(RESID_IMAGE, 2);  /* neko_hed2.bmp */
	p = (unsigned short far *)img;
	font_set_colordata(150 + 8, 10, p);
	
	font_set_colordata(0, 1, cdata);
	font_set_colordata(1, 1, cdata1);
	font_set_colordata(2, 1, cdata2);
	
	/*
	text_put_numeric(0, 0, 2, NUM_HEXA, img->width);
	text_put_numeric(2, 0, 2, NUM_HEXA, img->height);
	text_put_numeric(4, 0, 2, NUM_HEXA, img->format);
	*/

}

void set_screen_mode1(void)
{
	int i, j;
	int buff[28];
	
	ini_font();

	screen_set_scroll(0, -4, 0);
	screen_set_scroll(1, -4, -4);
	set_default_color();
	
	screen_fill_char(0, 0, 0, MAX_CHAR_NUM_OF_ONELINE, 29, 0 + PALETTE_NO0);
	screen_fill_char(1, 0, 0, MAX_CHAR_NUM_OF_ONELINE, 32, 0 + CLEAR_PALETTE);

	for(i = 0; i < 18; i++){
		screen_fill_char(1, 0, i, MAX_CHAR_NUM_OF_ONELINE, 1, 0 + CLEAR_PALETTE);
	}

	/* SCREEN1 set char */
	for(j = 3; j < 18; j += 3){
		for(i = 0; i < MAX_CHAR_NUM_OF_ONELINE; i++){
			buff[i] = (MAX_CHAR_NUM_OF_ONELINE * j) + 8 + i;
		}
		screen_set_char(0, 0, j, MAX_CHAR_NUM_OF_ONELINE, 1, buff);
	}
	for(j = 0; j < 2; j++){			/* for header */
		for(i = 0; i < MAX_CHAR_NUM_OF_ONELINE; i++){
			buff[i] = (MAX_CHAR_NUM_OF_ONELINE * j) + 8 + i + 20;
		}
		screen_set_char(0, 0, j, MAX_CHAR_NUM_OF_ONELINE, 1, buff);
	}
	
	/* SCREEN2 set char */
	for(j = 4; j < 18; j += 3){
		for(i = 0; i < MAX_CHAR_NUM_OF_ONELINE; i++){
			buff[i] = (MAX_CHAR_NUM_OF_ONELINE * j) + 8 + i;
		}
		screen_set_char(1, 0, j, MAX_CHAR_NUM_OF_ONELINE, 1, buff);
	}

}


void set_screen_mode0(void)
{
	int i, j;
	int buff[CHAR_NUM_OF_ONELINE];

	text_set_screen(0);
	text_screen_init();
	
	screen_set_scroll(0, -4, 0);
	screen_set_scroll(1, -4, -4);
	
	screen_fill_char(1, 0, 0, CHAR_NUM_OF_ONELINE, 32, 0 + CLEAR_PALETTE);
	
	/* SCREEN1 set char */
	for(j = 0; j < MAX_LINE_NUM; j++){
		for(i = 0; i < CHAR_NUM_OF_ONELINE; i++){
			buff[i] = (MAX_CHAR_NUM_OF_ONELINE * j) + 8 + i;
		}
		screen_set_char(0, 0, j, CHAR_NUM_OF_ONELINE, 1, buff);
	}
}


/*	interrupt function	*/

void far vtimer_callback()
{
	if(date_flg == 0){
		drw_time();
	}
}


int _asm_inline(char near *asm);
#define _CS _asm_inline("\tmov\tax,cs");
#define _DS _asm_inline("\tmov\tax,ds");


void main(int argc, char *argv[])
{
	int key;
	int rtn;
	int end_flg = 0;
	static intvector_t vector;
	
	vector.callback = (void (near *)())FP_OFF(vtimer_callback);
	vector.cs = _CS;
	vector.ds = _DS;
	
	
	wwc_set_color_mode(COLOR_MODE_4COLOR);
	
	ini_palette();
	display_control(0x23);
	display_control(0x03);
	text_set_screen(0);
	text_screen_init();

	set_screen_mode1();
	set_screen_mode0();
	
	if(argc > 1){
		strcpy(fname, argv[1]);
	}
	else{
		rtn = get_filename(fname);
		if(rtn < 0){
			return;
		}
	}
	
	set_screen_mode1();
	opn_fil(fname);

display_control(0x03);
	
	clr_header();
	rea_txt();
	drw_date();
	drw_time();	
	drw_fname(&fname[6]);
	
	sys_interrupt_set_hook(SYS_INT_TIMER_COUNTUP, &vector, NULL);
	timer_enable(TIMER_VBLANK, TIMER_AUTOPRESET, 5);
	end_flg = 0;
	while(1){
		date_flg = 0;		/* enable drw_date */
		key = key_wait();
		date_flg = 1;		/* disable drw_date */
		if((key & KEY_X1) != 0){			/* prev page */
			rea_prv_txt();
			drw_fname(&fname[6]);
		}
		else if((key & KEY_X3) != 0){		/* next page */
			rea_txt();
			drw_fname(&fname[6]);
		}
		else if((key & KEY_B) != 0){		/* menue */
			rtn = drw_menu();
			switch(rtn){
				case SELECT_FILE :			/* File	*/
					set_screen_mode0();
					rtn = get_filename(fname);
					set_screen_mode1();
					if(rtn >= 0){
						opn_fil(fname);
						rea_txt();
						drw_fname(&fname[6]);
					}
					else{
						rea_now_txt();
					}
					drw_header();
					break;
				case SELECT_TRANS :		/* Trans	*/
					set_screen_mode0();
					rtn = rcv_txt(fname);
					set_screen_mode1();
					if(rtn < 0){
						rea_now_txt();
					}
					else{
						cls_fil();
						opn_fil(fname);
						rea_txt();
					}
					drw_header();
					drw_fname(&fname[6]);
					break;
				case SELECT_END :		/* End		*/
					end_flg = SELECT_END;
					break;
				
			}
		}
		else if((key & KEY_START) != 0){
			end_flg = SELECT_END;
		}
		
		if(end_flg == SELECT_END){
			break;
		}
		drw_time();
	}
	
	timer_disable(TIMER_VBLANK);
	
	cls_fil();
}
