Introduced DBG_VALUE struct to manipulate debugger/debuggee address space.
Added watch (hardware assisted debugging) and whatis (type of expr) commands.
Fixed some issues in local vars handling (stabs parsing & registers optimization).

diff --git a/debugger/stack.c b/debugger/stack.c
index 46a2d1d..07f2a95 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -57,23 +57,24 @@
 void DEBUG_InfoStack(void)
 {
 #ifdef __i386__
-    DBG_ADDR addr;
-
-    addr.type = NULL;
-    addr.seg = DEBUG_context.SegSs;
-    addr.off = DEBUG_context.Esp;
+    DBG_VALUE	value;
+    
+    value.type = NULL;
+    value.cookie = DV_TARGET;
+    value.addr.seg = DEBUG_context.SegSs;
+    value.addr.off = DEBUG_context.Esp;
 
     fprintf(stderr,"Stack dump:\n");
-    switch (DEBUG_GetSelectorType(addr.seg)) {
+    switch (DEBUG_GetSelectorType(value.addr.seg)) {
     case 32: /* 32-bit mode */
-       DEBUG_ExamineMemory( &addr, 24, 'x' );
+       DEBUG_ExamineMemory( &value, 24, 'x' );
        break;
     case 16:  /* 16-bit mode */
-        addr.off &= 0xffff;
-        DEBUG_ExamineMemory( &addr, 24, 'w' );
+        value.addr.off &= 0xffff;
+        DEBUG_ExamineMemory( &value, 24, 'w' );
 	break;
     default:
-       fprintf(stderr, "Bad segment (%ld)\n", addr.seg);
+       fprintf(stderr, "Bad segment (%ld)\n", value.addr.seg);
     }
     fprintf(stderr,"\n");
 #endif
@@ -317,7 +318,7 @@
 		  if (noisy) fprintf( stderr, "Bad stack frame %p\n", (STACK32FRAME*)next_switch );
 		  return;
 	       }
-	       code.type = NULL;
+
 	       code.seg  = 0;
 	       code.off  = frame32.retaddr;
 	       
@@ -352,7 +353,6 @@
 		  return;
 	      }
 	      
-	      code.type = NULL;
 	      code.seg  = frame16.cs;
 	      code.off  = frame16.ip;