/*
 * Copyright (c) 2002, Adam Dunkels.
 * All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution. 
 * 3. The name of the author may not be used to endorse or promote
 *    products derived from this software without specific prior
 *    written permission.  
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 *
 * This file is part of the Contiki desktop environment
 *
 * $Id: libconio.c,v 1.6 2004/09/12 20:24:55 adamdunkels Exp $
 *
 */

#include <string.h>
#include "libconio.h"

#include "Resource.h"

static unsigned char cursx, cursy;
static unsigned char color;

unsigned int vram[2048];
unsigned int vram_attr[1024];


#define make_color(r, g, b) ((r << 10) | (g << 5) | (b << 0))
#define VRAM_WIDTH 64

void conio_init(void)
{
	static volatile int* const PPU_BG1_SCROLL_X = 0x2810;
	static volatile int* const PPU_BG1_SCROLL_Y = 0x2811;
	static volatile int* const PPU_BG1_ATTR = 0x2812;
	static volatile int* const PPU_BG1_CTRL = 0x2813;
	static volatile int* const PPU_BG1_TILE_ADDR = 0x2814;
	static volatile int* const PPU_BG1_ATTR_ADDR = 0x2815;

	static volatile int* const PPU_BG2_CTRL = 0x2819;

	static volatile int* const PPU_BG1_SEGMENT_ADDR = 0x2820;

	static volatile int* const PPU_SPRITE_CTRL = 0x2842;
	static volatile int* const PPU_COLOR = 0x2B00;
	int i;

	*PPU_BG1_SCROLL_X = 0;
	*PPU_BG1_SCROLL_Y = 0;
	*PPU_BG1_ATTR = 0;
	*PPU_BG1_CTRL = 0x08;
	*PPU_BG2_CTRL = 0;
	*PPU_SPRITE_CTRL = 0;
	
	*PPU_BG1_TILE_ADDR = vram;
	*PPU_BG1_ATTR_ADDR = vram_attr;
	*PPU_BG1_SEGMENT_ADDR = RES_FONT_BIN_SA >> 6;
	
	PPU_COLOR[0] = make_color(0, 0, 0); // Border, unused?
	PPU_COLOR[1] = make_color(31, 31, 31);
	
	PPU_COLOR[16] = make_color(0, 0, 0); // Screen
	PPU_COLOR[17] = make_color(18, 18, 31);
	
	PPU_COLOR[32] = make_color(0, 0, 0); // Windows, widgets, menu
	PPU_COLOR[33] = make_color(15, 15, 15);

	PPU_COLOR[48] = make_color(0, 0, 0); // Open menu
	PPU_COLOR[49] = make_color(31, 15, 15);

	PPU_COLOR[64] = make_color(0, 0, 0); // Active menu item
	PPU_COLOR[65] = make_color(30, 30, 30);
	
	PPU_COLOR[80] = make_color(12, 12, 31); // Focused window/dialog
	PPU_COLOR[81] = make_color(31, 31, 15);

	PPU_COLOR[96] = make_color(0, 0, 8); // Hyperlinks
	PPU_COLOR[97] = make_color(24, 24, 31);

	PPU_COLOR[112] = make_color(12, 12, 12); // Focused widget
	PPU_COLOR[113] = make_color(24, 24, 24);
	
	PPU_COLOR[129] = make_color(0, 0, 0); // Border, unused?
	PPU_COLOR[128] = make_color(31, 31, 31);
	
	PPU_COLOR[129+16] = make_color(0, 0, 0); // Screen
	PPU_COLOR[128+16] = make_color(18, 18, 31);
	
	PPU_COLOR[129+32] = make_color(0, 0, 0); // Windows, widgets, menu
	PPU_COLOR[128+32] = make_color(15, 15, 15);

	PPU_COLOR[129+48] = make_color(0, 0, 0); // Open menu
	PPU_COLOR[128+48] = make_color(31, 15, 15);

	PPU_COLOR[129+64] = make_color(0, 0, 0); // Active menu item
	PPU_COLOR[128+64] = make_color(30, 30, 30);
	
	PPU_COLOR[129+80] = make_color(12, 12, 31); // Focused window/dialog
	PPU_COLOR[128+80] = make_color(31, 31, 15);

	PPU_COLOR[129+96] = make_color(0, 0, 8); // Hyperlinks
	PPU_COLOR[128+96] = make_color(24, 24, 31);

	PPU_COLOR[129+112] = make_color(12, 12, 12); // Focused widget
	PPU_COLOR[128+112] = make_color(24, 24, 24);
	
	PPU_COLOR[0] = make_color(0, 0, 0); // Border
	PPU_COLOR[1] = make_color(18, 18, 31); // Screen
	PPU_COLOR[3] = make_color(31, 31, 31); // Menu
	PPU_COLOR[4] = make_color(31, 15, 15); // Active menu item
	PPU_COLOR[5] = make_color(30, 30, 30); // Dialogs
	PPU_COLOR[6] = make_color(12, 12, 31); // Hyperlinks
	PPU_COLOR[7] = make_color(24, 24, 31); // Moving window
	PPU_COLOR[8] = make_color(24, 24, 24); // Inactive window
	
	PPU_COLOR[2+16] = make_color(31, 31, 31);
	PPU_COLOR[6+16] = make_color(0, 0, 31);
	PPU_COLOR[7+16] = make_color(31, 0, 31);
}

/*-----------------------------------------------------------------------------------*/
unsigned char
wherex(void)
{
  return cursx;
}
/*-----------------------------------------------------------------------------------*/
unsigned char
wherey(void)
{
  return cursy;
}
/*-----------------------------------------------------------------------------------*/
void
clrscr(void)
{
  memset(vram, 32, VRAM_WIDTH * LIBCONIO_SCREEN_HEIGHT);
  memset(vram_attr, 0, VRAM_WIDTH * LIBCONIO_SCREEN_HEIGHT / 2);
}
/*-----------------------------------------------------------------------------------*/
void
revers(unsigned char c)
{
	if (c != 0) color |= 8;
	else color &= ~8;
}
/*-----------------------------------------------------------------------------------*/
void
cputc(char c)
{
  ctk_arch_draw_char(c, cursx, cursy, 0, color);
  ++cursx;
}
/*-----------------------------------------------------------------------------------*/
void
cputs(char *str)
{
	int i;
	for (i = 0; str[i]; i++) {
	    cputc(str[i]);	
	}
}
/*-----------------------------------------------------------------------------------*/
void
cclear(unsigned char length)
{
	memset(vram + cursy * VRAM_WIDTH + cursx, 32, length);
	memset(vram_attr + ((cursy * VRAM_WIDTH + cursx) >> 1), (color | color << 8), length >> 1);
	cursx += length;
}
/*-----------------------------------------------------------------------------------*/
void
chline(unsigned char length)
{
	memset(vram + cursy * VRAM_WIDTH + cursx, '-', length);
	memset(vram_attr + ((cursy * VRAM_WIDTH + cursx) >> 1), (color |color << 8), length >> 1);
	cursx += length;
}
/*-----------------------------------------------------------------------------------*/
void
cvline(unsigned char length)
{
  int i;
  if (cursx & 1) {
  	for(i = 0; i < length; ++i) {
  		vram_attr[(cursy * VRAM_WIDTH + cursx) >> 1] &= 0xff;
    	vram_attr[(cursy * VRAM_WIDTH + cursx) >> 1] |= color << 8;
    	vram[cursy++ * VRAM_WIDTH + cursx] = '|';
  	}
  } else {
  	for(i = 0; i < length; ++i) {
  		vram_attr[(cursy * VRAM_WIDTH + cursx) >> 1] &= 0xff00;
    	vram_attr[(cursy * VRAM_WIDTH + cursx) >> 1] |= color;
    	vram[cursy++ * VRAM_WIDTH + cursx] = '|';
  	}
  }
}
/*-----------------------------------------------------------------------------------*/
void
gotoxy(unsigned char x, unsigned char y)
{
  cursx = x;
  cursy = y;
}
/*-----------------------------------------------------------------------------------*/
void
cclearxy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  cclear(length);
}
/*-----------------------------------------------------------------------------------*/
void
chlinexy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  chline(length);
}
/*-----------------------------------------------------------------------------------*/
void
cvlinexy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  cvline(length);
}
/*-----------------------------------------------------------------------------------*/
void
cputsxy(unsigned char x, unsigned char y, char *str)
{
  gotoxy(x, y);
  cputs(str);
}
/*-----------------------------------------------------------------------------------*/
void
cputcxy(unsigned char x, unsigned char y, char c)
{
  gotoxy(x, y);
  cputc(c);
}
/*-----------------------------------------------------------------------------------*/
void
textcolor(unsigned char c)
{
  color = c;
}
/*-----------------------------------------------------------------------------------*/
void
bgcolor(unsigned char c)
{

}
/*-----------------------------------------------------------------------------------*/
void
bordercolor(unsigned char c)
{

}
/*-----------------------------------------------------------------------------------*/
void
screensize(unsigned char *x, unsigned char *y)
{
  *x = LIBCONIO_SCREEN_WIDTH;
  *y = LIBCONIO_SCREEN_HEIGHT;
}
/*-----------------------------------------------------------------------------------*/
