Index: Kernel/Core/Console.cs
===================================================================
--- Kernel/Core/Console.cs	(revision 457)
+++ Kernel/Core/Console.cs	(working copy)
@@ -11,6 +11,7 @@
 using System;
 using SharpOS;
 using SharpOS.ADC;
+using SharpOS.Foundation;
 
 namespace SharpOS 
 {
@@ -34,8 +35,16 @@
 		public const string CONSOLE_KEY_UP_HANDLER		= "CONSOLE_KEY_UP_HANDLER";
 		public const string CONSOLE_KEY_DOWN_HANDLER	= "CONSOLE_KEY_DOWN_HANDLER";
 		public const string	CONSOLE_TIMER_HANDLER		= "CONSOLE_TIMER_HANDLER";
+        private const string PROMPT = "SharpOS >";
 
-		private static bool initialized = false;
+        // TODO: UURGLY HARDCODE
+        private static uint CONSOLE_MAXLEN = 259;
+        private static int CONSOLE_MAXLENi = 259;
+        public static PString8* currentCommand;
+        private static int count = 0;
+        private static bool wait = false;
+
+        private static bool initialized = false;
 		private static bool overwrite	= false;
 
 		public static void Setup ()
@@ -48,7 +57,22 @@
 			TextMode.RefreshCursor ();
 			SetOverwrite(overwrite);
 
+            //start = TextMode.GetWritePosition();
+            byte* buf = Kernel.StaticAlloc(50);
+            currentCommand = PString8.Wrap(buf, 50);
+            Header();
 		}
+
+        private static void Header()
+        {
+            TextMode.SetAttributes(TextColor.Green, TextColor.Black);
+            TextMode.ClearScreen();
+            TextMode.WriteLine("SharpOS. Copyright (c) 2007 The SharpOS Project.");
+            TextMode.Write(">");
+            TextMode.SetAttributes(TextColor.White, TextColor.Black);
+            TextMode.SetCursor(1, 1);
+            currentCommand->Clear();
+        }
 		
 		public static unsafe void SetOverwrite (bool _overwrite)
 		{
@@ -69,6 +93,42 @@
 
 		public static uint pos = 0;
 
+        private static unsafe void Memtest()
+        {
+            void* data;
+            void* data2;
+            void* data3;
+            data = ADC.MemoryManager.Allocate(100);
+            data2 = ADC.MemoryManager.Allocate(200);
+            data3 = ADC.MemoryManager.Allocate(400);
+
+            ADC.MemoryManager.Dump();
+
+            ADC.MemoryManager.Free(data);
+            ADC.MemoryManager.Free(data3);
+            ADC.MemoryManager.Free(data2);
+
+            ADC.MemoryManager.Dump();
+
+            data = ADC.MemoryManager.Allocate(400);
+            data2 = ADC.MemoryManager.Allocate(200);
+            data3 = ADC.MemoryManager.Allocate(100);
+
+            ADC.MemoryManager.Dump();
+        }
+
+        private static void Help()
+        {
+            TextMode.WriteLine("Valid commands");
+            TextMode.WriteLine("--------------");
+            TextMode.WriteLine("test.mem      Test memory allocation.");
+            TextMode.WriteLine();
+            TextMode.WriteLine("panic         Cause a kernel panic.");
+            TextMode.WriteLine("halt          Shut the system down.");
+            TextMode.WriteLine("reboot        Reboot the system.");
+            TextMode.WriteLine("cls           Clear the screen.");
+        }
+
 		[SharpOS.AOT.Attributes.Label (CONSOLE_KEY_DOWN_HANDLER)]
 		public static unsafe void KeyDown (uint scancode)
 		{
@@ -79,134 +139,197 @@
 			bool	upperCase	= (Keyboard.LeftShift() || Keyboard.RightShift()) ^ Keyboard.CapsLock();
 
 			TextMode.SetAttributes(TextColor.Yellow, TextColor.Black);
-
 			
 			ADC.Keys key = (ADC.Keys)scancode;
-			// switch statement doesn't for all cases somehow..
-			//switch (key)
-			//{
-			//case Keys.Insert:
-			if (key == Keys.Insert)
-			{
-				overwrite = !overwrite;
-				SetOverwrite(overwrite);
-				return;
-			}
-			//case Keys.Delete:
-			else if (key == Keys.Delete)
-			{
-				return;
-			}
-			//case Keys.PageUp:
-			else if (key == Keys.PageUp)
-			{
-				TextMode.ScrollPage(-1);
-				return;
-			}
-			//case Keys.PageDown:
-			else if (key == Keys.PageDown)
-			{
-				TextMode.ScrollPage(+1);
-				return;
-			}
-			//case Keys.Backspace:
-			else if (key == Keys.Backspace)
-			{
-				int x, y, width, height;
+            //// switch statement doesn't for all cases somehow..
+            ////switch (key)
+            ////{
+            ////case Keys.Insert:
+            //if (key == Keys.Insert)
+            //{
+            //    overwrite = !overwrite;
+            //    SetOverwrite(overwrite);
+            //    return;
+            //}
+            ////case Keys.Delete:
+            //else if (key == Keys.Delete)
+            //{
+            //    return;
+            //}
+            ////case Keys.PageUp:
+            //else if (key == Keys.PageUp)
+            //{
+            //    TextMode.ScrollPage(-1);
+            //    return;
+            //}
+            ////case Keys.PageDown:
+            //else if (key == Keys.PageDown)
+            //{
+            //    TextMode.ScrollPage(+1);
+            //    return;
+            //}
+            ////case Keys.Backspace:
+            //else if (key == Keys.Backspace)
+            //{
+            //    int x, y, width, height;
 
-				TextMode.GetScreenSize(&width, &height);
-				TextMode.GetCursor(&x, &y);
-				x--;
-				if (x < 0)
-				{
-					x = width - 1;
-					y--;
-					if (y < 0)
-					{
-						y = 0;
-						return;
-					}
-				}
-				TextMode.MoveTo(x, y);
-				TextMode.WriteChar((byte)' ');
-				TextMode.MoveTo(x, y);
-				TextMode.RefreshCursor();
-				return;
-			}
-			//case Keys.LeftArrow:
-			else if (key == Keys.LeftArrow)
-			{
-				int x, y, width, height;
+            //    TextMode.GetScreenSize(&width, &height);
+            //    TextMode.GetCursor(&x, &y);
+            //    x--;
+            //    if (x < 0)
+            //    {
+            //        x = width - 1;
+            //        y--;
+            //        if (y < 0)
+            //        {
+            //            y = 0;
+            //            return;
+            //        }
+            //    }
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.WriteChar((byte)' ');
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////case Keys.LeftArrow:
+            //else if (key == Keys.LeftArrow)
+            //{
+            //    int x, y, width, height;
 
-				TextMode.GetScreenSize(&width, &height);
-				TextMode.GetCursor(&x, &y);
-				x = x - 1; if (x < 0) x = 0;
-				TextMode.MoveTo(x, y);
-				TextMode.RefreshCursor();
-				return;
-			}
-			//case Keys.RightArrow:
-			else if (key == Keys.RightArrow)
-			{
-				int x, y, width, height;
+            //    TextMode.GetScreenSize(&width, &height);
+            //    TextMode.GetCursor(&x, &y);
+            //    x = x - 1; if (x < 0) x = 0;
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////case Keys.RightArrow:
+            //else if (key == Keys.RightArrow)
+            //{
+            //    int x, y, width, height;
 
-				TextMode.GetScreenSize(&width, &height);
-				TextMode.GetCursor(&x, &y);
-				x = x + 1; if (x >= width) x = width - 1;
-				TextMode.MoveTo(x, y);
-				TextMode.RefreshCursor();
-				return;
-			}
-			//case Keys.UpArrow:
-			else if (key == Keys.UpArrow)
-			{
-				int x, y, width, height;
+            //    TextMode.GetScreenSize(&width, &height);
+            //    TextMode.GetCursor(&x, &y);
+            //    x = x + 1; if (x >= width) x = width - 1;
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////case Keys.UpArrow:
+            //else if (key == Keys.UpArrow)
+            //{
+            //    int x, y, width, height;
 
-				TextMode.GetScreenSize(&width, &height);
-				TextMode.GetCursor(&x, &y);
-				y = y - 1; if (y < 0) y = 0;
-				TextMode.MoveTo(x, y);
-				TextMode.RefreshCursor();
-				return;
-			}
-			//case Keys.DownArrow:
-			else if (key == Keys.DownArrow)
-			{
-				int x, y, width, height;
+            //    TextMode.GetScreenSize(&width, &height);
+            //    TextMode.GetCursor(&x, &y);
+            //    y = y - 1; if (y < 0) y = 0;
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////case Keys.DownArrow:
+            //else if (key == Keys.DownArrow)
+            //{
+            //    int x, y, width, height;
 
-				TextMode.GetScreenSize(&width, &height);
-				TextMode.GetCursor(&x, &y);
-				y = y + 1; if (y >= height) y = height - 1;
-				TextMode.MoveTo(x, y);
-				TextMode.RefreshCursor();
-				return;
-			}
-			//case Keys.Enter:
-			else if (key == Keys.Enter)
-			{
-				TextMode.WriteLine();
-				TextMode.ClearToEndOfLine();
-				TextMode.RefreshCursor();
-				return;
-			}
-			//}
+            //    TextMode.GetScreenSize(&width, &height);
+            //    TextMode.GetCursor(&x, &y);
+            //    y = y + 1; if (y >= height) y = height - 1;
+            //    TextMode.MoveTo(x, y);
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////case Keys.Enter:
+            //else if (key == Keys.Enter)
+            //{
+            //    TextMode.WriteLine();
+            //    TextMode.ClearToEndOfLine();
+            //    TextMode.RefreshCursor();
+            //    return;
+            //}
+            ////}
 
+            if (key == Keys.Enter)
+            {
+                int mem = currentCommand->Compare("test.mem");
+                int panic = currentCommand->Compare("panic");
+                int reboot = currentCommand->Compare("reboot");
+                int shutdown = currentCommand->Compare("halt");
+                int help = currentCommand->Compare("help");
+                int cls = currentCommand->Compare("cls");
+                TextMode.WriteLine();
+                /*TextMode.Write(currentCommand);
+                TextMode.Write("'");
+                TextMode.Write(cls);
+                TextMode.WriteLine();*/
+
+                if (mem == 0)
+                {
+                    Memtest();
+                }
+                else if (panic == 0)
+                {
+                    TextMode.WriteLine("You paniced. Just calm down.");
+                    Kernel.Panic("PANIC");
+                    return;
+                }
+                else if (reboot == 0)
+                {
+                    Kernel.Reboot();
+                    return;
+                }
+                else if (shutdown == 0)
+                {
+                    Kernel.Halt();
+                    return;
+                }
+                else if (help == 0)
+                {
+                    Help();
+                }
+                else if (cls == 0)
+                {
+                    Header();
+                }
+                else
+                {
+                    TextMode.WriteLine("Type help for a list of valid commands.");
+                }
+
+                TextMode.Write(">");
+                currentCommand->Clear();
+                return;
+            }
+
 			byte character = Keyboard.Translate(scancode, upperCase);
 			if (character == 0)
 			{
 				// just so that you can actually see that keyboard input works (& we simply don't know what character you just pressed)...
-				TextMode.WriteChar((byte)'?');
-				TextMode.Write((int)scancode);
-				TextMode.RefreshCursor();
+                //TextMode.WriteChar((byte)'?');
+                //TextMode.Write((int)scancode);
+                //TextMode.RefreshCursor();
 				return;
 			}
 
-			int read = TextMode.GetReadPosition();
-			int write = TextMode.GetWritePosition();
-			if (read != write)
-				TextMode.SetReadPos(write);
+            //int read = TextMode.GetReadPosition();
+            //int write = TextMode.GetWritePosition();
+            //if (read != write)
+            //    TextMode.SetReadPos(write);
 
-			TextMode.WriteChar(character);
+            //currentCommand += (char)character;
+
+            //TextMode.WriteLine(currentCommand);
+            
+            int startX, startY;
+            int rx, ry;
+
+            TextMode.GetCursor(&startX, &startY);
+            currentCommand->Concat(character);
+            TextMode.Write(currentCommand);
+            TextMode.SetCursor(startX, startY);
+
+			//TextMode.WriteChar(character);
 			TextMode.RefreshCursor ();
 		}
 
