Improved support for vm86 mode.

diff --git a/debugger/memory.c b/debugger/memory.c
index 6f7083c..416788d 100644
--- a/debugger/memory.c
+++ b/debugger/memory.c
@@ -15,10 +15,7 @@
 #include "winbase.h"
 
 #ifdef __i386__
-#include "wine/winbase16.h"
-
-#define DBG_V86_MODULE(seg) ((seg)>>16)
-#define IS_SELECTOR_V86(seg) DBG_V86_MODULE(seg)
+#define IS_VM86_MODE() (DEBUG_context.EFlags & V86_FLAG)
 #endif
 
 static	void	DEBUG_Die(const char* msg)
@@ -52,41 +49,33 @@
    return res;
 }
 
+enum dbg_mode DEBUG_GetSelectorType( WORD sel )
+{
+#ifdef __i386__
+    LDT_ENTRY	le;
+
+    if (IS_VM86_MODE()) return MODE_VM86;
+    if (sel == 0) return MODE_32;
+    if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le)) 
+        return le.HighWord.Bits.Default_Big ? MODE_32 : MODE_16;
+    /* selector doesn't exist */
+    return MODE_INVALID;
+#else
+    return MODE_32;
+#endif
+}
 #ifdef __i386__
 void DEBUG_FixAddress( DBG_ADDR *addr, DWORD def) 
 {
    if (addr->seg == 0xffffffff) addr->seg = def;
-   if (!IS_SELECTOR_V86(addr->seg) && DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
-}
-
-BOOL  DEBUG_FixSegment( DBG_ADDR* addr )
-{
-   /* V86 mode ? */
-   if (DEBUG_context.EFlags & V86_FLAG) {
-      addr->seg |= (DWORD)(GetExePtr(GetCurrentTask())) << 16;
-      return TRUE;
-   }
-   return FALSE;
-}
-
-int	DEBUG_GetSelectorType( WORD sel )
-{
-    LDT_ENTRY	le;
-
-    if (sel == 0)
-        return 32;
-    if (IS_SELECTOR_V86(sel))
-        return 16;
-    if (GetThreadSelectorEntry( DEBUG_CurrThread->handle, sel, &le)) 
-        return le.HighWord.Bits.Default_Big ? 32 : 16;
-	 /* selector doesn't exist */
-    return 0;
+   if (DEBUG_IsSelectorSystem(addr->seg)) addr->seg = 0;
 }
 
 /* Determine if sel is a system selector (i.e. not managed by Wine) */
 BOOL	DEBUG_IsSelectorSystem(WORD sel)
 {
-   return !(sel & 4) || (((sel & 0xFFFF) >> 3) < 17);
+    if (IS_VM86_MODE()) return FALSE;  /* no system selectors in vm86 mode */
+    return !(sel & 4) || ((sel >> 3) < 17);
 }
 #endif /* __i386__ */
 
@@ -95,10 +84,8 @@
 #ifdef __i386__
    LDT_ENTRY	le;
    
-#if 0
-   if (IS_SELECTOR_V86(addr->seg))
-      return (DWORD) DOSMEM_MemoryBase(DBG_V86_MODULE(addr->seg)) + (((addr->seg)&0xFFFF)<<4) + addr->off;
-#endif
+   if (IS_VM86_MODE()) return (DWORD)(LOWORD(addr->seg) << 4) + addr->off;
+
    if (DEBUG_IsSelectorSystem(addr->seg))
       return addr->off;
    
@@ -116,7 +103,7 @@
 #ifdef __i386__
     addr->seg  = DEBUG_context.SegCs;
 
-    if (!DEBUG_FixSegment( addr ) && DEBUG_IsSelectorSystem(addr->seg)) 
+    if (DEBUG_IsSelectorSystem(addr->seg))
        addr->seg = 0;
     addr->off  = DEBUG_context.Eip;
 #elif defined(__sparc__)