Fill in the VSmile port
diff --git a/contiki-vsmile/ctk/conio.c b/contiki-vsmile/ctk/conio.c
new file mode 100644
index 0000000..938cb62
--- /dev/null
+++ b/contiki-vsmile/ctk/conio.c
@@ -0,0 +1,232 @@
+/*
+ * 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 = 0x0a; // TODO 0x08 so that vram_attr is actually used for something. Once we can figure out how it works. There will be only 4 possible "colors" this way...
+	*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;
+	
+	for (i = 0; i < 255; i++)
+		PPU_COLOR[i] = i;
+	
+	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, 0, VRAM_WIDTH * LIBCONIO_SCREEN_HEIGHT);
+  memset(vram_attr, 0, VRAM_WIDTH * LIBCONIO_SCREEN_HEIGHT / 2);
+}
+/*-----------------------------------------------------------------------------------*/
+void
+revers(unsigned char c)
+{
+	if (c != 0) color |= 16;
+	else color &= ~16;
+}
+/*-----------------------------------------------------------------------------------*/
+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, 0, length);
+	memset(vram_attr + ((cursy * VRAM_WIDTH + cursx) >> 1), color, length >> 1);
+	cursx += length;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+chline(unsigned char length)
+{
+	memset(vram + cursy * VRAM_WIDTH + cursx, 196, length);
+	memset(vram_attr + ((cursy * VRAM_WIDTH + cursx) >> 1), color, length >> 1);
+	cursx += length;
+}
+/*-----------------------------------------------------------------------------------*/
+void
+cvline(unsigned char length)
+{
+  int i;
+  for(i = 0; i < length; ++i) {
+    vram_attr[(cursy * VRAM_WIDTH + cursx) >> 1] = color;
+    vram[cursy++ * VRAM_WIDTH + cursx] = 179;
+  }
+}
+/*-----------------------------------------------------------------------------------*/
+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 &= 16;
+  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;
+}
+/*-----------------------------------------------------------------------------------*/