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;
+}
+/*-----------------------------------------------------------------------------------*/
