#include    <stdio.h>
#include    <stdlib.h>
#include	<string.h>
#include	<ctype.h>
#include    <mos.h>

#define	ERR		(-1)

#define	FRACOL	15
#define	BAKCOL	8
#define	CHRCOL	15

int		MENU_sub(lx,ly,rx,ry,fra,bak)
int		lx,ly,rx,ry,fra,bak;
{
	int		no,i,y;
	int		sw,mosx,mosy;

	MOS_rdpos(&sw,&mosx,&mosy);
	if ( mosx >= lx && mosx <= rx && mosy > ly && mosy < ry ) {
		no = (mosy - ly) / 16;
		y = ly + no * 16;
	} else
		no = ERR;

	do {
		if ( no != ERR )
			fbox(lx,y,rx,y+15,fra,bak,4);
		do {
			MOS_rdpos(&sw,&mosx,&mosy);
			if ( mosx >= lx && mosx <= rx &&
				 mosy > ly && mosy <  ry )
				i = (mosy - ly) / 16;
			else
				i = ERR;
		} while ( sw != 0 && no == i );
		if ( no != ERR )
			fbox(lx,y,rx,y+15,fra,bak,4);
		if ( (no = i) != ERR )
			y = ly + no * 16;
	} while ( sw != 0 );

/*****************
	if ( no >= 0 ) {
		fbox(lx,y,rx,y+15,fra,bak,4);
		if ( mosclip(sw,mosx,mosy) == 0 )
			no = ERR;
		fbox(lx,y,rx,y+15,fra,bak,4);
	}
****************/
	return no;
}
int		MENU_select(menu)
char	*menu[];
{
	int		len,max,no,i;
	int		sw,mosx,mosy;
	int		lx,ly,rx,ry,sx,sy;
	char	*bkvram;

	MOS_rdpos(&sw,&mosx,&mosy);

	for ( len = max = 0 ; menu[max] != NULL ; max++ ) {
		if ( len < strlen(menu[max]) )
			len = strlen(menu[max]);
	}
	sx = len * 8 + 16;
	sy = max * 16 + 8;
	if ( (lx = mosx - sx / 2) < 0 )
		lx = 0;
	if ( (rx = lx + sx) >= 1024 ) {
		lx = 1023 - sx; rx = 1023;
	}
	if ( (ly = mosy - 8) < 0 )
		ly = 0;
	if ( (ry = ly + sy) >= 512 ) {
		ly = 511 - sy; ry = 511;
	}
	lx &= 0xfffe; rx &= 0xfffe;

	bkvram = (char *)getvram(lx,ly,rx,ry);
	fbox(lx,ly,rx,ry,FRACOL,BAKCOL,0);

	for ( i=0 ; i < max ; i++ )
		wrtstr(menu[i],lx + 8,ly + 4 + i * 16,0,CHRCOL,BAKCOL);

	do {
		MOS_rdpos(&sw,&mosx,&mosy);
	} while ( sw == 0 && 
			  mosx >= lx && mosx <= rx &&
			  mosy >= ly && mosy <= ry );

	if ( sw != 0 )
		no = MENU_sub(lx + 4,ly + 4,rx - 4,ry - 4,FRACOL,FRACOL);
	else
		no = ERR;

	putvram(bkvram,lx,ly,rx,ry);
	free(bkvram);
	return no;
}
void	MSG_disp(char *str,int col)
{
	int		i,b,x,y;
	int		lx,ly,rx,ry,sx;
	char	*bkvram;

	MOS_rdpos(&b,&x,&y);

	sx = strlen(str) * 8 + 16;
	if ( (lx = x - sx / 2) < 0 )
		lx = 0;
	if ( (rx = lx + sx) >= 1024 ) {
		lx = 1023 - sx; rx = 1023;
	}
	if ( (ly = y - 8) < 0 )
		ly = 0;
	if ( (ry = ly + 24) >= 512 ) {
		ly = 480 ; ry = 504;
	}
	lx &= 0xfffe; rx &= 0xfffe;

	bkvram = (char *)getvram(lx,ly,rx,ry);
	fbox(lx,ly,rx,ry,col,BAKCOL,0);
	wrtstr(str,lx + 8,ly + 4,0,col,BAKCOL);

	i = 50000;
	do {
		MOS_rdpos(&b,&x,&y);
		i--;
	} while ( i > 0 && x >= lx && x <= rx && y >= ly && y <= ry );

	putvram(bkvram,lx,ly,rx,ry);
	free(bkvram);
}
void	DSP_error(char *frm,char *para)
{
	char	tmp[256];

	sprintf(tmp,frm,para);
	MSG_disp(tmp,10);
}
